Skip to content

Instantly share code, notes, and snippets.

@aliou
Created April 30, 2026 18:06
Show Gist options
  • Select an option

  • Save aliou/7fe2ed220359a79a8e9f8d9841edc446 to your computer and use it in GitHub Desktop.

Select an option

Save aliou/7fe2ed220359a79a8e9f8d9841edc446 to your computer and use it in GitHub Desktop.
Fix bug in package manager and config selector
This file has been truncated, but you can view the full file.
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>Session Export</title>
<style>
:root {
--accent: #4a5e81;
--border: #606060;
--borderAccent: #7d7163;
--borderMuted: #e0d8d0;
--success: #3d6c25;
--error: #cc0000;
--warning: #a36000;
--muted: #645c54;
--dim: #757a82;
--text: #252525;
--thinkingText: #645c54;
--selectedBg: #e8e0d5;
--userMessageBg: #e0d8d0;
--userMessageText: #252525;
--customMessageBg: #d8c8b8;
--customMessageText: #252525;
--customMessageLabel: #7d7163;
--toolPendingBg: #e0d8d0;
--toolSuccessBg: #d7c8b8;
--toolErrorBg: #ffe5ea;
--toolTitle: #4a5e81;
--toolOutput: #252525;
--mdHeading: #7d7163;
--mdLink: #4a5e81;
--mdLinkUrl: #757a82;
--mdCode: #555555;
--mdCodeBlock: #252525;
--mdCodeBlockBorder: #777777;
--mdQuote: #505860;
--mdQuoteBorder: #777777;
--mdHr: #777777;
--mdListBullet: #4a5e81;
--toolDiffAdded: #3d6c25;
--toolDiffRemoved: #cc0000;
--toolDiffContext: #645c54;
--syntaxComment: #909090;
--syntaxKeyword: #787878;
--syntaxFunction: #4a5e81;
--syntaxVariable: #252525;
--syntaxString: #796858;
--syntaxNumber: #7d7163;
--syntaxType: #7d7163;
--syntaxOperator: #777777;
--syntaxPunctuation: #555555;
--thinkingOff: #e0d8d0;
--thinkingMinimal: #645c54;
--thinkingLow: #757a82;
--thinkingMedium: #7d7163;
--thinkingHigh: #4a5e81;
--thinkingXhigh: #a36000;
--bashMode: #a36000;
--exportPageBg: rgb(215, 207, 200);
--exportCardBg: #e0d8d0;
--exportInfoBg: rgb(234, 221, 188);
--body-bg: rgb(215, 207, 200);
--container-bg: #e0d8d0;
--info-bg: rgb(234, 221, 188);
}
* { margin: 0; padding: 0; box-sizing: border-box; }
:root {
--line-height: 18px; /* 12px font * 1.5 */
--sidebar-width: 400px;
--sidebar-min-width: 240px;
--sidebar-max-width: 840px;
--sidebar-resizer-width: 6px;
}
body {
font-family: ui-monospace, 'Cascadia Code', 'Source Code Pro', Menlo, Consolas, 'DejaVu Sans Mono', monospace;
font-size: 12px;
line-height: var(--line-height);
color: var(--text);
background: var(--body-bg);
}
body.sidebar-resizing {
cursor: col-resize;
user-select: none;
}
#app {
display: flex;
min-height: 100vh;
}
/* Sidebar */
#sidebar {
width: var(--sidebar-width);
min-width: var(--sidebar-width);
max-width: var(--sidebar-width);
background: var(--container-bg);
flex-shrink: 0;
display: flex;
flex-direction: column;
position: sticky;
top: 0;
height: 100vh;
border-right: 1px solid var(--dim);
}
#sidebar-resizer {
width: var(--sidebar-resizer-width);
flex-shrink: 0;
position: sticky;
top: 0;
height: 100vh;
cursor: col-resize;
touch-action: none;
background: transparent;
border-right: 1px solid transparent;
}
#sidebar-resizer:hover,
body.sidebar-resizing #sidebar-resizer {
background: var(--selectedBg);
border-right-color: var(--dim);
}
.sidebar-header {
padding: 8px 12px;
flex-shrink: 0;
}
.sidebar-controls {
padding: 8px 8px 4px 8px;
}
.sidebar-search {
width: 100%;
box-sizing: border-box;
padding: 4px 8px;
font-size: 11px;
font-family: inherit;
background: var(--body-bg);
color: var(--text);
border: 1px solid var(--dim);
border-radius: 3px;
}
.sidebar-filters {
display: flex;
padding: 4px 8px 8px 8px;
gap: 4px;
align-items: center;
flex-wrap: wrap;
}
.sidebar-search:focus {
outline: none;
border-color: var(--accent);
}
.sidebar-search::placeholder {
color: var(--muted);
}
.filter-btn {
padding: 3px 8px;
font-size: 10px;
font-family: inherit;
background: transparent;
color: var(--muted);
border: 1px solid var(--dim);
border-radius: 3px;
cursor: pointer;
}
.filter-btn:hover {
color: var(--text);
border-color: var(--text);
}
.filter-btn.active {
background: var(--accent);
color: var(--body-bg);
border-color: var(--accent);
}
.sidebar-close {
display: none;
padding: 3px 8px;
font-size: 12px;
font-family: inherit;
background: transparent;
color: var(--muted);
border: 1px solid var(--dim);
border-radius: 3px;
cursor: pointer;
margin-left: auto;
}
.sidebar-close:hover {
color: var(--text);
border-color: var(--text);
}
.tree-container {
flex: 1;
overflow: auto;
padding: 4px 0;
}
.tree-node {
padding: 0 8px;
cursor: pointer;
display: flex;
align-items: baseline;
font-size: 11px;
line-height: 13px;
white-space: nowrap;
}
.tree-node:hover {
background: var(--selectedBg);
}
.tree-node.active {
background: var(--selectedBg);
}
.tree-node.active .tree-content {
font-weight: bold;
}
.tree-node.in-path {
background: color-mix(in srgb, var(--accent) 10%, transparent);
}
.tree-node:not(.in-path) {
opacity: 0.5;
}
.tree-node:not(.in-path):hover {
opacity: 1;
}
.tree-prefix {
color: var(--muted);
flex-shrink: 0;
font-family: monospace;
white-space: pre;
}
.tree-marker {
color: var(--accent);
flex-shrink: 0;
}
.tree-content {
color: var(--text);
}
.tree-role-user {
color: var(--accent);
}
.tree-role-assistant {
color: var(--success);
}
.tree-role-tool {
color: var(--muted);
}
.tree-muted {
color: var(--muted);
}
.tree-error {
color: var(--error);
}
.tree-compaction {
color: var(--borderAccent);
}
.tree-branch-summary {
color: var(--warning);
}
.tree-custom-message {
color: var(--customMessageLabel);
}
.tree-status {
padding: 4px 12px;
font-size: 10px;
color: var(--muted);
flex-shrink: 0;
}
/* Main content */
#content {
flex: 1;
min-width: 0;
overflow-y: auto;
padding: var(--line-height) calc(var(--line-height) * 2);
display: flex;
flex-direction: column;
align-items: center;
}
#content > * {
width: 100%;
max-width: 800px;
}
/* Help bar */
.help-bar {
font-size: 11px;
color: var(--warning);
margin-bottom: var(--line-height);
display: flex;
align-items: center;
justify-content: space-between;
flex-wrap: wrap;
gap: 12px;
}
.help-hint {
flex: 1 1 240px;
}
.help-actions {
display: flex;
align-items: center;
flex-wrap: wrap;
gap: 8px;
}
.header-toggle-btn,
.download-json-btn {
font-size: 10px;
padding: 2px 8px;
background: var(--container-bg);
border: 1px solid var(--border);
border-radius: 3px;
color: var(--text);
cursor: pointer;
font-family: inherit;
}
.header-toggle-btn:hover,
.download-json-btn:hover {
background: var(--hover);
border-color: var(--borderAccent);
}
/* Header */
.header {
background: var(--container-bg);
border-radius: 4px;
padding: var(--line-height);
margin-bottom: var(--line-height);
}
.header h1 {
font-size: 12px;
font-weight: bold;
color: var(--borderAccent);
margin-bottom: var(--line-height);
}
.header-info {
display: flex;
flex-direction: column;
gap: 0;
font-size: 11px;
}
.info-item {
color: var(--dim);
display: flex;
align-items: baseline;
}
.info-label {
font-weight: 600;
margin-right: 8px;
min-width: 100px;
}
.info-value {
color: var(--text);
flex: 1;
}
/* Messages */
#messages {
display: flex;
flex-direction: column;
gap: var(--line-height);
}
.message-timestamp {
font-size: 10px;
color: var(--dim);
opacity: 0.8;
}
.user-message {
background: var(--userMessageBg);
color: var(--userMessageText);
padding: var(--line-height);
border-radius: 4px;
position: relative;
}
.assistant-message {
padding: 0;
position: relative;
}
/* Copy link button - appears on hover */
.copy-link-btn {
position: absolute;
top: 8px;
right: 8px;
width: 28px;
height: 28px;
padding: 6px;
background: var(--container-bg);
border: 1px solid var(--dim);
border-radius: 4px;
color: var(--muted);
cursor: pointer;
opacity: 0;
transition: opacity 0.15s, background 0.15s, color 0.15s;
display: flex;
align-items: center;
justify-content: center;
z-index: 10;
}
.user-message:hover .copy-link-btn,
.assistant-message:hover .copy-link-btn {
opacity: 1;
}
.copy-link-btn:hover {
background: var(--accent);
color: var(--body-bg);
border-color: var(--accent);
}
.copy-link-btn.copied {
background: var(--success, #22c55e);
color: white;
border-color: var(--success, #22c55e);
}
/* Highlight effect for deep-linked messages */
.user-message.highlight,
.assistant-message.highlight {
animation: highlight-pulse 2s ease-out;
}
@keyframes highlight-pulse {
0% {
box-shadow: 0 0 0 3px var(--accent);
}
100% {
box-shadow: 0 0 0 0 transparent;
}
}
.assistant-message > .message-timestamp {
padding-left: var(--line-height);
}
.assistant-text {
padding: var(--line-height);
padding-bottom: 0;
}
.message-timestamp + .assistant-text,
.message-timestamp + .thinking-block {
padding-top: 0;
}
.thinking-block + .assistant-text {
padding-top: 0;
}
.thinking-text {
padding: var(--line-height);
color: var(--thinkingText);
font-style: italic;
white-space: pre-wrap;
}
.message-timestamp + .thinking-block .thinking-text,
.message-timestamp + .thinking-block .thinking-collapsed {
padding-top: 0;
}
.thinking-collapsed {
display: none;
padding: var(--line-height);
color: var(--thinkingText);
font-style: italic;
}
/* Tool execution */
.tool-execution {
padding: var(--line-height);
border-radius: 4px;
}
.tool-execution + .tool-execution {
margin-top: var(--line-height);
}
.assistant-text + .tool-execution {
margin-top: var(--line-height);
}
.tool-execution.pending { background: var(--toolPendingBg); }
.tool-execution.success { background: var(--toolSuccessBg); }
.tool-execution.error { background: var(--toolErrorBg); }
.tool-header, .tool-name {
font-weight: bold;
}
.tool-path {
color: var(--accent);
word-break: break-all;
}
.line-numbers {
color: var(--warning);
}
.line-count {
color: var(--dim);
}
.tool-command {
font-weight: bold;
white-space: pre-wrap;
word-wrap: break-word;
overflow-wrap: break-word;
word-break: break-word;
}
.tool-output {
margin-top: var(--line-height);
color: var(--toolOutput);
word-wrap: break-word;
overflow-wrap: break-word;
word-break: break-word;
font-family: inherit;
overflow-x: auto;
}
.tool-output > div,
.output-preview > div,
.output-full > div {
margin: 0;
padding: 0;
line-height: var(--line-height);
}
.tool-output > div:not(.output-preview):not(.output-full),
.output-preview > div:not(.expand-hint),
.output-full > div:not(.expand-hint) {
white-space: pre-wrap;
}
.tool-output pre {
margin: 0;
padding: 0;
font-family: inherit;
color: inherit;
white-space: pre-wrap;
word-wrap: break-word;
overflow-wrap: break-word;
}
.tool-output code {
padding: 0;
background: none;
color: var(--text);
}
.tool-output.expandable {
cursor: pointer;
}
.tool-output.expandable:hover {
opacity: 0.9;
}
.tool-output.expandable .output-full {
display: none;
}
.tool-output.expandable.expanded .output-preview {
display: none;
}
.tool-output.expandable.expanded .output-full {
display: block;
}
.ansi-line {
white-space: pre;
}
.tool-images {
}
.tool-image {
max-width: 100%;
max-height: 500px;
border-radius: 4px;
margin: var(--line-height) 0;
}
.expand-hint {
color: var(--toolOutput);
}
/* Diff */
.tool-diff {
font-size: 11px;
overflow-x: auto;
white-space: pre;
}
.diff-added { color: var(--toolDiffAdded); }
.diff-removed { color: var(--toolDiffRemoved); }
.diff-context { color: var(--toolDiffContext); }
/* Model change */
.model-change {
padding: 0 var(--line-height);
color: var(--dim);
font-size: 11px;
}
.model-name {
color: var(--borderAccent);
font-weight: bold;
}
/* Compaction / Branch Summary - matches customMessage colors from TUI */
.compaction {
background: var(--customMessageBg);
border-radius: 4px;
padding: var(--line-height);
cursor: pointer;
}
.compaction-label {
color: var(--customMessageLabel);
font-weight: bold;
}
.compaction-collapsed {
color: var(--customMessageText);
}
.compaction-content {
display: none;
color: var(--customMessageText);
white-space: pre-wrap;
margin-top: var(--line-height);
}
.compaction.expanded .compaction-collapsed {
display: none;
}
.compaction.expanded .compaction-content {
display: block;
}
/* System prompt */
.system-prompt {
background: var(--customMessageBg);
padding: var(--line-height);
border-radius: 4px;
margin-bottom: var(--line-height);
}
.system-prompt.expandable {
cursor: pointer;
}
.system-prompt-header {
font-weight: bold;
color: var(--customMessageLabel);
}
.system-prompt-preview {
color: var(--customMessageText);
white-space: pre-wrap;
word-wrap: break-word;
font-size: 11px;
margin-top: var(--line-height);
}
.system-prompt-expand-hint {
color: var(--muted);
font-style: italic;
margin-top: 4px;
}
.system-prompt-full {
display: none;
color: var(--customMessageText);
white-space: pre-wrap;
word-wrap: break-word;
font-size: 11px;
margin-top: var(--line-height);
}
.system-prompt.expanded .system-prompt-preview,
.system-prompt.expanded .system-prompt-expand-hint {
display: none;
}
.system-prompt.expanded .system-prompt-full {
display: block;
}
.system-prompt.provider-prompt {
border-left: 3px solid var(--warning);
}
.system-prompt-note {
font-size: 10px;
font-style: italic;
color: var(--muted);
margin-top: 4px;
}
/* Tools list */
.tools-list {
background: var(--customMessageBg);
padding: var(--line-height);
border-radius: 4px;
margin-bottom: var(--line-height);
}
.tools-header {
font-weight: bold;
color: var(--customMessageLabel);
margin-bottom: var(--line-height);
}
.tool-item {
font-size: 11px;
}
.tool-item-name {
font-weight: bold;
color: var(--text);
}
.tool-item-desc {
color: var(--dim);
}
.tool-params-hint {
color: var(--muted);
font-style: italic;
}
.tool-item:has(.tool-params-hint) {
cursor: pointer;
}
.tool-params-hint::after {
content: '[click to show parameters]';
}
.tool-item.params-expanded .tool-params-hint::after {
content: '[hide parameters]';
}
.tool-params-content {
display: none;
margin-top: 4px;
margin-left: 12px;
padding-left: 8px;
border-left: 1px solid var(--dim);
}
.tool-item.params-expanded .tool-params-content {
display: block;
}
.tool-param {
margin-bottom: 4px;
font-size: 11px;
}
.tool-param-name {
font-weight: bold;
color: var(--text);
}
.tool-param-type {
color: var(--dim);
font-style: italic;
}
.tool-param-required {
color: var(--warning, #e8a838);
font-size: 10px;
}
.tool-param-optional {
color: var(--dim);
font-size: 10px;
}
.tool-param-desc {
color: var(--dim);
margin-left: 8px;
}
/* Hook/custom messages */
.hook-message {
background: var(--customMessageBg);
color: var(--customMessageText);
padding: var(--line-height);
border-radius: 4px;
}
.hook-type {
color: var(--customMessageLabel);
font-weight: bold;
}
/* Branch summary */
.branch-summary {
background: var(--customMessageBg);
padding: var(--line-height);
border-radius: 4px;
}
.branch-summary-header {
font-weight: bold;
color: var(--borderAccent);
}
/* Error */
.error-text {
color: var(--error);
padding: 0 var(--line-height);
}
.tool-error {
color: var(--error);
}
/* Images */
.message-images {
margin-bottom: 12px;
}
.message-image {
max-width: 100%;
max-height: 400px;
border-radius: 4px;
margin: var(--line-height) 0;
}
/* Markdown content */
.markdown-content h1,
.markdown-content h2,
.markdown-content h3,
.markdown-content h4,
.markdown-content h5,
.markdown-content h6 {
color: var(--mdHeading);
margin: var(--line-height) 0 0 0;
font-weight: bold;
}
.markdown-content h1 { font-size: 1em; }
.markdown-content h2 { font-size: 1em; }
.markdown-content h3 { font-size: 1em; }
.markdown-content h4 { font-size: 1em; }
.markdown-content h5 { font-size: 1em; }
.markdown-content h6 { font-size: 1em; }
.markdown-content p { margin: 0; }
.markdown-content p + p { margin-top: var(--line-height); }
.markdown-content a {
color: var(--mdLink);
text-decoration: underline;
}
.markdown-content code {
background: rgba(128, 128, 128, 0.2);
color: var(--mdCode);
padding: 0 4px;
border-radius: 3px;
font-family: inherit;
}
.markdown-content pre {
background: transparent;
margin: var(--line-height) 0;
overflow-x: auto;
}
.markdown-content pre code {
display: block;
background: none;
color: var(--text);
}
.markdown-content blockquote {
border-left: 3px solid var(--mdQuoteBorder);
padding-left: var(--line-height);
margin: var(--line-height) 0;
color: var(--mdQuote);
font-style: italic;
}
.markdown-content ul,
.markdown-content ol {
margin: var(--line-height) 0;
padding-left: calc(var(--line-height) * 2);
}
.markdown-content li { margin: 0; }
.markdown-content li::marker { color: var(--mdListBullet); }
.markdown-content hr {
border: none;
border-top: 1px solid var(--mdHr);
margin: var(--line-height) 0;
}
.markdown-content table {
border-collapse: collapse;
margin: 0.5em 0;
width: 100%;
}
.markdown-content th,
.markdown-content td {
border: 1px solid var(--mdCodeBlockBorder);
padding: 6px 10px;
text-align: left;
}
.markdown-content th {
background: rgba(128, 128, 128, 0.1);
font-weight: bold;
}
.markdown-content img {
max-width: 100%;
border-radius: 4px;
}
/* Syntax highlighting */
.hljs { background: transparent; color: var(--text); }
.hljs-comment, .hljs-quote { color: var(--syntaxComment); }
.hljs-keyword, .hljs-selector-tag { color: var(--syntaxKeyword); }
.hljs-number, .hljs-literal { color: var(--syntaxNumber); }
.hljs-string, .hljs-doctag { color: var(--syntaxString); }
/* Function names: hljs v11 uses .hljs-title.function_ compound class */
.hljs-function, .hljs-title, .hljs-title.function_, .hljs-section, .hljs-name { color: var(--syntaxFunction); }
/* Types: hljs v11 uses .hljs-title.class_ for class names */
.hljs-type, .hljs-class, .hljs-title.class_, .hljs-built_in { color: var(--syntaxType); }
.hljs-attr, .hljs-variable, .hljs-variable.language_, .hljs-params, .hljs-property { color: var(--syntaxVariable); }
.hljs-meta, .hljs-meta .hljs-keyword, .hljs-meta .hljs-string { color: var(--syntaxKeyword); }
.hljs-operator { color: var(--syntaxOperator); }
.hljs-punctuation { color: var(--syntaxPunctuation); }
.hljs-subst { color: var(--text); }
/* Footer */
.footer {
margin-top: 48px;
padding: 20px;
text-align: center;
color: var(--dim);
font-size: 10px;
}
/* Mobile */
#hamburger {
display: none;
position: fixed;
top: 10px;
left: 10px;
z-index: 100;
padding: 3px 8px;
font-size: 12px;
font-family: inherit;
background: transparent;
color: var(--muted);
border: 1px solid var(--dim);
border-radius: 3px;
cursor: pointer;
}
#hamburger:hover {
color: var(--text);
border-color: var(--text);
}
#sidebar-overlay {
display: none;
position: fixed;
top: 0;
left: 0;
right: 0;
bottom: 0;
background: rgba(0, 0, 0, 0.5);
z-index: 98;
}
@media (max-width: 900px) {
#sidebar {
position: fixed;
left: 0;
width: min(var(--sidebar-width), 100vw);
min-width: min(var(--sidebar-width), 100vw);
max-width: min(var(--sidebar-width), 100vw);
top: 0;
bottom: 0;
height: 100vh;
z-index: 99;
transform: translateX(-100%);
transition: transform 0.3s;
}
#sidebar.open {
transform: translateX(0);
}
#sidebar-resizer {
display: none;
}
#sidebar-overlay.open {
display: block;
}
#hamburger {
display: block;
}
.sidebar-close {
display: block;
}
#content {
padding: var(--line-height) 16px;
}
#content > * {
max-width: 100%;
}
}
@media print {
#sidebar, #sidebar-resizer, #sidebar-toggle { display: none !important; }
body { background: white; color: black; }
#content { max-width: none; }
}
</style>
<style>
#sidebar, #sidebar-overlay, #hamburger, #sidebar-stubs { display: none !important; }
#content { margin-left: 0 !important; }
</style>
</head>
<body>
<div id="app">
<div id="sidebar-resizer" role="separator" aria-orientation="vertical" aria-label="Resize session tree sidebar"></div>
<main id="content">
<div id="header-container"></div>
<div id="messages"></div>
</main>
<div id="image-modal" class="image-modal">
<img id="modal-image" src="" alt="">
</div>
</div>
<script id="session-data" type="application/json">
eyJoZWFkZXIiOnsidHlwZSI6InNlc3Npb24iLCJ2ZXJzaW9uIjozLCJpZCI6IjAxOWRkZjEzLWYxNTMtNzcxYy04YTE2LTExNzVlNzBjY2JjYiIsInRpbWVzdGFtcCI6IjIwMjYtMDQtMzBUMTU6NDg6MzkuMzc5WiIsImN3ZCI6Ii9Vc2Vycy9hbGlvdWRpYWxsby9jb2RlL3NyYy9naXRodWIuY29tL2FsaW91L3BpLW1vbm8iLCJwYXJlbnRTZXNzaW9uIjoiL1VzZXJzL2FsaW91ZGlhbGxvLy5waS9hZ2VudC9zZXNzaW9ucy8tLVVzZXJzLWFsaW91ZGlhbGxvLWNvZGUtc3JjLWdpdGh1Yi5jb20tYWxpb3UtcGktbW9uby0tLzIwMjYtMDQtMzBUMDctNTUtNDMtMTEwWl8wMTlkZGQ2Mi1mNDg2LTcxMmQtODcyYy1lMzU4N2RiNzkxNmQuanNvbmwifSwiZW50cmllcyI6W3sidHlwZSI6ImN1c3RvbV9tZXNzYWdlIiwiY3VzdG9tVHlwZSI6InNlc3Npb24tbGluay1zb3VyY2UiLCJjb250ZW50IjoiU2Vzc2lvbiBzcGF3bmVkIGZyb20gMDE5ZGRkNjItZjQ4Ni03MTJkLTg3MmMtZTM1ODdkYjc5MTZkLlxuXG4jIyBMYXN0IG1lc3NhZ2UgaW4gcGFyZW50IHNlc3Npb25cblxuQnVnIHN1bW1hcnk6XG5cbmBwaSBjb25maWdgIGdyb3VwcyBhdXRvLWRpc2NvdmVyZWQgc2tpbGxzIGZyb20gYH4vLmFnZW50cy9za2lsbHNgIHVuZGVyIGBVc2VyICh+Ly5waS9hZ2VudC8pYCwgYmVjYXVzZSBwYWNrYWdlLW1hbmFnZXIgZ2l2ZXMgYm90aCBkaXJlY3RvcmllcyBpZGVudGljYWwgbWV0YWRhdGEuXG5cbkN1cnJlbnQgYmVoYXZpb3I6XG5cbkluIGBwYWNrYWdlcy9jb2RpbmctYWdlbnQvc3JjL2NvcmUvcGFja2FnZS1tYW5hZ2VyLnRzYCwgYGFkZEF1dG9EaXNjb3ZlcmVkUmVzb3VyY2VzKClgIGRlZmluZXM6XG5cbmBgYHRzXG5jb25zdCB1c2VyTWV0YWRhdGE6IFBhdGhNZXRhZGF0YSA9IHtcbiAgc291cmNlOiBcImF1dG9cIixcbiAgc2NvcGU6IFwidXNlclwiLFxuICBvcmlnaW46IFwidG9wLWxldmVsXCIsXG4gIGJhc2VEaXI6IGdsb2JhbEJhc2VEaXIsXG59O1xuYGBgXG5cbmBnbG9iYWxCYXNlRGlyYCBpcyBgYWdlbnREaXJgLCB1c3VhbGx5IGB+Ly5waS9hZ2VudGAuXG5cblRoZW4gaXQgY29tYmluZXMgYm90aCB1c2VyIHNraWxsIHJvb3RzIGludG8gb25lIGNhbGw6XG5cbmBgYHRzXG5hZGRSZXNvdXJjZXMoXG4gIFwic2tpbGxzXCIsXG4gIFsuLi5jb2xsZWN0QXV0b1NraWxsRW50cmllcyh1c2VyRGlycy5za2lsbHMsIFwicGlcIiksIC4uLmNvbGxlY3RBdXRvU2tpbGxFbnRyaWVzKHVzZXJBZ2VudHNTa2lsbHNEaXIsIFwiYWdlbnRzXCIpXSxcbiAgdXNlck1ldGFkYXRhLFxuICB1c2VyT3ZlcnJpZGVzLnNraWxscyxcbiAgZ2xvYmFsQmFzZURpcixcbik7XG5gYGBcblxuU28gc2tpbGxzIHBoeXNpY2FsbHkgdW5kZXIgYH4vLmFnZW50cy9za2lsbHNgIGdldDpcblxuYGBgdHNcbm1ldGFkYXRhLmJhc2VEaXIgPT09IH4vLnBpL2FnZW50XG5tZXRhZGF0YS5zb3VyY2UgPT09IFwiYXV0b1wiXG5tZXRhZGF0YS5zY29wZSA9PT0gXCJ1c2VyXCJcbm1ldGFkYXRhLm9yaWdpbiA9PT0gXCJ0b3AtbGV2ZWxcIlxuYGBgXG5cblNhbWUgaXNzdWUgZXhpc3RzIGZvciBwcm9qZWN0IGAuYWdlbnRzL3NraWxsc2AuIFByb2plY3QgYC5hZ2VudHNgIHNraWxscyBhcmUgY29sbGVjdGVkIGZyb20gYW5jZXN0b3IgZGlyczpcblxuYGBgdHNcbmNvbnN0IHByb2plY3RBZ2VudHNTa2lsbERpcnMgPSBjb2xsZWN0QW5jZXN0b3JBZ2VudHNTa2lsbERpcnModGhpcy5jd2QpXG5gYGBcblxuVGhpcyBjYW4gcHJvZHVjZSBtdWx0aXBsZSByb290czpcblxuYGBgdHh0XG5jd2QvLmFnZW50cy9za2lsbHNcbnBhcmVudC8uYWdlbnRzL3NraWxsc1xucmVwby1yb290Ly5hZ2VudHMvc2tpbGxzXG5gYGBcblxuQnV0IGFsbCBhcmUgY3VycmVudGx5IGZsYXR0ZW5lZCBpbnRvIHRoZSBzYW1lIGBhZGRSZXNvdXJjZXMoKWAgY2FsbCBhcyBgLnBpL3NraWxsc2AsIHNvIHRoZXkgYWxsIGdldCBgYmFzZURpciA9PT0gY3dkLy5waWAuXG5cbkRpc3BsYXkgYnVnOlxuXG5JbiBgcGFja2FnZXMvY29kaW5nLWFnZW50L3NyYy9tb2Rlcy9pbnRlcmFjdGl2ZS9jb21wb25lbnRzL2NvbmZpZy1zZWxlY3Rvci50c2AsIGdyb3VwaW5nIGN1cnJlbnRseSB1c2VzOlxuXG5gYGB0c1xuY29uc3QgZ3JvdXBLZXkgPSBgJHttZXRhZGF0YS5vcmlnaW59OiR7bWV0YWRhdGEuc2NvcGV9OiR7bWV0YWRhdGEuc291cmNlfWA7XG5gYGBcblxuQW5kIGxhYmVsIHJlbmRlcmluZyBoYXJkY29kZXM6XG5cbmBgYHRzXG5pZiAobWV0YWRhdGEuc291cmNlID09PSBcImF1dG9cIikge1xuICByZXR1cm4gbWV0YWRhdGEuc2NvcGUgPT09IFwidXNlclwiID8gXCJVc2VyICh+Ly5waS9hZ2VudC8pXCIgOiBcIlByb2plY3QgKC5waS8pXCI7XG59XG5gYGBcblxuU28gZXZlbiBpZiBgLmFnZW50c2AgcGF0aHMgYXJlIHJlc29sdmVkLCBjb25maWcgVUkgY2Fubm90IGRpc3Rpbmd1aXNoIHRoZW0gYmVjYXVzZSBtZXRhZGF0YSBpcyBpZGVudGljYWwgYW5kIGxhYmVsIGlnbm9yZXMgYGJhc2VEaXJgLlxuXG5GYWlsaW5nIHRlc3RzIGFkZGVkOlxuXG5gcGFja2FnZXMvY29kaW5nLWFnZW50L3Rlc3QvcGFja2FnZS1tYW5hZ2VyLnRlc3QudHNgXG5cbk5ldyB0ZXN0cyB1bmRlcjpcblxuYGBgdHNcbmRlc2NyaWJlKFwiYXV0by1kaXNjb3ZlcmVkIHNraWxsIG1ldGFkYXRhXCIsIC4uLilcbmBgYFxuXG5UaGV5IGFzc2VydDpcbi0gdXNlciBgLnBpL2FnZW50L3NraWxsc2Aga2VlcHMgYG1ldGFkYXRhLmJhc2VEaXIgPT09IGFnZW50RGlyYCBwYXNzZXMgbm93XG4tIHByb2plY3QgYC5waS9za2lsbHNgIGtlZXBzIGBtZXRhZGF0YS5iYXNlRGlyID09PSBjd2QvLnBpYCBwYXNzZXMgbm93XG4tIHVzZXIgYH4vLmFnZW50cy9za2lsbHNgIHNob3VsZCBoYXZlIGBtZXRhZGF0YS5iYXNlRGlyID09PSB+Ly5hZ2VudHNgIGZhaWxzIG5vd1xuLSBwcm9qZWN0IGAuYWdlbnRzL3NraWxsc2Agc2hvdWxkIGhhdmUgYG1ldGFkYXRhLmJhc2VEaXIgPT09IGVhY2ggLmFnZW50cyBkaXJgIGZhaWxzIG5vd1xuXG5SdW4gd2l0aDpcblxuYGBgYmFzaFxuY2QgcGFja2FnZXMvY29kaW5nLWFnZW50XG5ucHggdHN4IC4uLy4uL25vZGVfbW9kdWxlcy92aXRlc3QvZGlzdC9jbGkuanMgLS1ydW4gdGVzdC9wYWNrYWdlLW1hbmFnZXIudGVzdC50cyAtdCBcImF1dG8tZGlzY292ZXJlZCBza2lsbCBtZXRhZGF0YVwiXG5gYGBcblxuRXhwZWN0ZWQgY3VycmVudCByZXN1bHQ6IDIgcGFzcywgMiBmYWlsLlxuXG5GaXggZGlyZWN0aW9uOlxuXG5EbyBub3QgYWRkIGEgbmV3IGBzb3VyY2VgIHZhbHVlLiBLZWVwIGBzb3VyY2U6IFwiYXV0b1wiYC4gVXNlIGBiYXNlRGlyYCBhcyB0aGUgcHJvdmVuYW5jZS5cblxuQ2xlYW4gZml4OlxuXG4xLiBQcmVzZXJ2ZSByb290IHByb3ZlbmFuY2UgYmVmb3JlIGZsYXR0ZW5pbmcgYXV0by1kaXNjb3ZlcmVkIHJlc291cmNlcy5cblxuQ3VycmVudCBgYWRkUmVzb3VyY2VzKClgIGFjY2VwdHMgb25lIG1ldGFkYXRhIG9iamVjdCBhbmQgb25lIGJhc2VEaXIgZm9yIGEgd2hvbGUgYmF0Y2guIFRoYXQgaXMgdGhlIHJvb3QgcHJvYmxlbS4gRm9yIGAuYWdlbnRzYCwgZWFjaCByb290IG5lZWRzIGl0cyBvd24gbWV0YWRhdGEvYmFzZURpci5cblxuTWluaW1hbCBjbGVhbiBzaGFwZTpcblxuYGBgdHNcbmludGVyZmFjZSBBdXRvUmVzb3VyY2VTb3VyY2Uge1xuICBwYXRoczogc3RyaW5nW107XG4gIG1ldGFkYXRhOiBQYXRoTWV0YWRhdGE7XG4gIGJhc2VEaXI6IHN0cmluZztcbn1cbmBgYFxuXG5UaGVuIGJ1aWxkIGJhdGNoZXMgbGlrZTpcblxuVXNlciBza2lsbHM6XG5gYGB0c1xuY29uc3QgdXNlckFnZW50c0Jhc2VEaXIgPSBqb2luKGdldEhvbWVEaXIoKSwgXCIuYWdlbnRzXCIpO1xuY29uc3QgdXNlckFnZW50c1NraWxsc0RpciA9IGpvaW4odXNlckFnZW50c0Jhc2VEaXIsIFwic2tpbGxzXCIpO1xuXG5jb25zdCB1c2VyU2tpbGxTb3VyY2VzOiBBdXRvUmVzb3VyY2VTb3VyY2VbXSA9IFtcbiAge1xuICAgIHBhdGhzOiBjb2xsZWN0QXV0b1NraWxsRW50cmllcyh1c2VyRGlycy5za2lsbHMsIFwicGlcIiksXG4gICAgbWV0YWRhdGE6IHVzZXJNZXRhZGF0YSxcbiAgICBiYXNlRGlyOiBnbG9iYWxCYXNlRGlyLFxuICB9LFxuICB7XG4gICAgcGF0aHM6IGNvbGxlY3RBdXRvU2tpbGxFbnRyaWVzKHVzZXJBZ2VudHNTa2lsbHNEaXIsIFwiYWdlbnRzXCIpLFxuICAgIG1ldGFkYXRhOiB7IC4uLnVzZXJNZXRhZGF0YSwgYmFzZURpcjogdXNlckFnZW50c0Jhc2VEaXIgfSxcbiAgICBiYXNlRGlyOiB1c2VyQWdlbnRzQmFzZURpcixcbiAgfSxcbl07XG5gYGBcblxuUHJvamVjdCBza2lsbHM6XG5gYGB0c1xuY29uc3QgcHJvamVjdFNraWxsU291cmNlczogQXV0b1Jlc291cmNlU291cmNlW10gPSBbXG4gIHtcbiAgICBwYXRoczogY29sbGVjdEF1dG9Ta2lsbEVudHJpZXMocHJvamVjdERpcnMuc2tpbGxzLCBcInBpXCIpLFxuICAgIG1ldGFkYXRhOiBwcm9qZWN0TWV0YWRhdGEsXG4gICAgYmFzZURpcjogcHJvamVjdEJhc2VEaXIsXG4gIH0sXG4gIC4uLnByb2plY3RBZ2VudHNTa2lsbERpcnMubWFwKChza2lsbHNEaXIpID0+IHtcbiAgICBjb25zdCBiYXNlRGlyID0gZGlybmFtZShza2lsbHNEaXIpOyAvLyB0aGUgLmFnZW50cyBkaXJcbiAgICByZXR1cm4ge1xuICAgICAgcGF0aHM6IGNvbGxlY3RBdXRvU2tpbGxFbnRyaWVzKHNraWxsc0RpciwgXCJhZ2VudHNcIiksXG4gICAgICBtZXRhZGF0YTogeyAuLi5wcm9qZWN0TWV0YWRhdGEsIGJhc2VEaXIgfSxcbiAgICAgIGJhc2VEaXIsXG4gICAgfTtcbiAgfSksXG5dO1xuYGBgXG5cblRoZW4gbG9vcDpcblxuYGBgdHNcbmZvciAoY29uc3Qgc291cmNlIG9mIHByb2plY3RTa2lsbFNvdXJjZXMpIHtcbiAgYWRkUmVzb3VyY2VzKFwic2tpbGxzXCIsIHNvdXJjZS5wYXRocywgc291cmNlLm1ldGFkYXRhLCBwcm9qZWN0T3ZlcnJpZGVzLnNraWxscywgc291cmNlLmJhc2VEaXIpO1xufVxuXG5mb3IgKGNvbnN0IHNvdXJjZSBvZiB1c2VyU2tpbGxTb3VyY2VzKSB7XG4gIGFkZFJlc291cmNlcyhcInNraWxsc1wiLCBzb3VyY2UucGF0aHMsIHNvdXJjZS5tZXRhZGF0YSwgdXNlck92ZXJyaWRlcy5za2lsbHMsIHNvdXJjZS5iYXNlRGlyKTtcbn1cbmBgYFxuXG5UaGlzIGFsc28gbWFrZXMgdG9nZ2xlIHBhdHRlcm5zIGNsZWFuZXIuIGBhZGRSZXNvdXJjZXMoLi4uLCBiYXNlRGlyKWAgZmVlZHMgYGlzRW5hYmxlZEJ5T3ZlcnJpZGVzKClgLiBGb3IgYC5hZ2VudHNgLCBiYXNlRGlyIHNob3VsZCBiZSBgLmFnZW50c2AsIG5vdCBgLnBpYC5cblxuMi4gVXBkYXRlIGNvbmZpZyBncm91cGluZy5cblxuSW4gYGNvbmZpZy1zZWxlY3Rvci50c2AsIGdyb3VwIGtleSBtdXN0IGluY2x1ZGUgYGJhc2VEaXJgOlxuXG5gYGB0c1xuY29uc3QgZ3JvdXBLZXkgPSBgJHttZXRhZGF0YS5vcmlnaW59OiR7bWV0YWRhdGEuc2NvcGV9OiR7bWV0YWRhdGEuc291cmNlfToke21ldGFkYXRhLmJhc2VEaXIgPz8gXCJcIn1gO1xuYGBgXG5cbk90aGVyd2lzZSBgfi8ucGkvYWdlbnRgIGFuZCBgfi8uYWdlbnRzYCBzdGlsbCBjb2xsYXBzZSBpbnRvIHRoZSBzYW1lIGdyb3VwIGJlY2F1c2UgYm90aCBhcmUgYHRvcC1sZXZlbDp1c2VyOmF1dG9gLlxuXG4zLiBVcGRhdGUgZ3JvdXAgbGFiZWxzLlxuXG5SZXBsYWNlIGhhcmRjb2RlZCBhdXRvIGxhYmVscyB3aXRoIGxhYmVscyBiYXNlZCBvbiBgbWV0YWRhdGEuYmFzZURpcmAgd2hlbiBhdmFpbGFibGUuXG5cbkV4cGVjdGVkIHVzZXIgbGFiZWxzOlxuLSBgVXNlciAofi8ucGkvYWdlbnQvKWBcbi0gYFVzZXIgKH4vLmFnZW50cy8pYFxuXG5OZWVkIGhlbHBlciB0byBmb3JtYXQgcGF0aHMsIHByb2JhYmx5IGhvbWUtcmVsYXRpdmU6XG5cbmBgYHRzXG5mdW5jdGlvbiBmb3JtYXRCYXNlRGlyKGJhc2VEaXI6IHN0cmluZyk6IHN0cmluZyB7XG4gIGNvbnN0IGhvbWVEaXIgPSBob21lZGlyKCk7XG4gIGNvbnN0IGRpc3BsYXlQYXRoID1cbiAgICBiYXNlRGlyID09PSBob21lRGlyXG4gICAgICA/IFwiflwiXG4gICAgICA6IGJhc2VEaXIuc3RhcnRzV2l0aChgJHtob21lRGlyfS9gKVxuICAgICAgICA/IGB+LyR7cmVsYXRpdmUoaG9tZURpciwgYmFzZURpcil9YFxuICAgICAgICA6IGJhc2VEaXI7XG5cbiAgcmV0dXJuIGRpc3BsYXlQYXRoLmVuZHNXaXRoKFwiL1wiKSA/IGRpc3BsYXlQYXRoIDogYCR7ZGlzcGxheVBhdGh9L2A7XG59XG5gYGBcblxuVGhlbjpcblxuYGBgdHNcbmlmIChtZXRhZGF0YS5zb3VyY2UgPT09IFwiYXV0b1wiKSB7XG4gIGlmIChtZXRhZGF0YS5iYXNlRGlyKSB7XG4gICAgcmV0dXJuIG1ldGFkYXRhLnNjb3BlID09PSBcInVzZXJcIlxuICAgICAgPyBgVXNlciAoJHtmb3JtYXRCYXNlRGlyKG1ldGFkYXRhLmJhc2VEaXIpfSlgXG4gICAgICA6IGBQcm9qZWN0ICgke2Zvcm1hdEJhc2VEaXIobWV0YWRhdGEuYmFzZURpcil9KWA7XG4gIH1cbiAgcmV0dXJuIG1ldGFkYXRhLnNjb3BlID09PSBcInVzZXJcIiA/IFwiVXNlciAofi8ucGkvYWdlbnQvKVwiIDogXCJQcm9qZWN0ICgucGkvKVwiO1xufVxuYGBgXG5cblBvdGVudGlhbCByZWZpbmVtZW50OlxuLSBGb3IgcHJvamVjdCBsYWJlbHMsIHRoaXMgd2lsbCBzaG93IGFic29sdXRlIHBhdGhzIHVubGVzcyB1bmRlciBob21lLlxuLSBJZiB3ZSB3YW50IGBQcm9qZWN0ICgucGkvKWAgLyBgUHJvamVjdCAoLmFnZW50cy8pYCByZWxhdGl2ZSB0byBjd2QsIGBidWlsZEdyb3VwcygpYCBuZWVkcyBhY2Nlc3MgdG8gYGN3ZGAuIEN1cnJlbnQgaGVscGVyIGRvZXMgbm90LiBNaW5pbWFsIGZpeCBjYW4gdXNlIGFic29sdXRlL2hvbWUtcmVsYXRpdmUgcGF0aHMuXG5cbkRvIG5vdDpcbi0gQWRkIGBzb3VyY2U6IFwiYWdlbnRzXCJgOyBgc291cmNlYCBjdXJyZW50bHkgbWVhbnMgYFwiYXV0b1wiYCwgYFwibG9jYWxcImAsIGBcImNsaVwiYCwgb3IgcGFja2FnZSBzb3VyY2Ugc3RyaW5nLiBBZGRpbmcgYFwiYWdlbnRzXCJgIG92ZXJsb2FkcyB0aGUgbWVhbmluZy5cbi0gRmxhdHRlbiBgLmFnZW50c2AgcGF0aHMgYmVmb3JlIGFzc2lnbmluZyBtZXRhZGF0YSwgYmVjYXVzZSB0aGF0IGxvc2VzIHdoaWNoIHJvb3QgZWFjaCBwYXRoIGNhbWUgZnJvbS4iLCJkaXNwbGF5Ijp0cnVlLCJkZXRhaWxzIjp7InBhcmVudFNlc3Npb25JZCI6IjAxOWRkZDYyLWY0ODYtNzEyZC04NzJjLWUzNTg3ZGI3OTE2ZCIsImdvYWwiOiIiLCJsaW5rVHlwZSI6ImNvbnRpbnVlIn0sImlkIjoiZDNkN2MzMGIiLCJwYXJlbnRJZCI6bnVsbCwidGltZXN0YW1wIjoiMjAyNi0wNC0zMFQxNTo0ODozOS45NjFaIiwic2Vzc2lvbkxpbmsiOnsibmFtZSI6IkludmVzdGlnYXRlIGhlYWRlcnMgZGlzcGxheSBpc3N1ZSIsInVybCI6Imh0dHBzOi8vcGkuZGV2L3Nlc3Npb24vI2E0Yjg5YjVhM2Y5MGE0Y2Q3ZDNmZjk5ZTExZTI0YTczIn19LHsidHlwZSI6Im1lc3NhZ2UiLCJpZCI6Ijc4ZmQ3NDkzIiwicGFyZW50SWQiOiJkM2Q3YzMwYiIsInRpbWVzdGFtcCI6IjIwMjYtMDQtMzBUMTU6NDk6MjUuMDgyWiIsIm1lc3NhZ2UiOnsicm9sZSI6InVzZXIiLCJjb250ZW50IjpbeyJ0eXBlIjoidGV4dCIsInRleHQiOiJpbXBsZW1lbnQgdGhlIGZpeCB0byB0aGUgYnVnIHVzaW5nIHRoZSBmaXggZGlyZWN0aW9uIGFuZCBjaGVjayB0aGF0IGFsbCBvZiB0aGUgdGVzdHMgcGFzcyJ9XSwidGltZXN0YW1wIjoxNzc3NTY0MTY1MDAzfX0seyJ0eXBlIjoibWVzc2FnZSIsImlkIjoiMjRjNTNmNmUiLCJwYXJlbnRJZCI6Ijc4ZmQ3NDkzIiwidGltZXN0YW1wIjoiMjAyNi0wNC0zMFQxNTo0OTozNi4wOTZaIiwibWVzc2FnZSI6eyJyb2xlIjoiYXNzaXN0YW50IiwiY29udGVudCI6W3sidHlwZSI6InRoaW5raW5nIiwidGhpbmtpbmciOiJMZXQgbWUgYW5hbHl6ZSB0aGlzIGJ1ZyBmaXggdGFzay4gSSBuZWVkIHRvOlxuXG4xLiBSZWFkIHRoZSBjdXJyZW50IGltcGxlbWVudGF0aW9uIGZpbGVzXG4yLiBSZWFkIHRoZSBmYWlsaW5nIHRlc3RzXG4zLiBJbXBsZW1lbnQgdGhlIGZpeCBhcyBkZXNjcmliZWRcbjQuIFJ1biB0aGUgdGVzdHMgdG8gdmVyaWZ5XG5cbkxldCBtZSBzdGFydCBieSByZWFkaW5nIHRoZSByZWxldmFudCBmaWxlcyBpbiBwYXJhbGxlbC4iLCJ0aGlua2luZ1NpZ25hdHVyZSI6InJlYXNvbmluZyJ9LHsidHlwZSI6InRvb2xDYWxsIiwiaWQiOiJyZWFkOjAiLCJuYW1lIjoicmVhZCIsImFyZ3VtZW50cyI6eyJwYXRoIjoicGFja2FnZXMvY29kaW5nLWFnZW50L3NyYy9jb3JlL3BhY2thZ2UtbWFuYWdlci50cyJ9fSx7InR5cGUiOiJ0b29sQ2FsbCIsImlkIjoicmVhZDoxIiwibmFtZSI6InJlYWQiLCJhcmd1bWVudHMiOnsicGF0aCI6InBhY2thZ2VzL2NvZGluZy1hZ2VudC9zcmMvbW9kZXMvaW50ZXJhY3RpdmUvY29tcG9uZW50cy9jb25maWctc2VsZWN0b3IudHMifX0seyJ0eXBlIjoidG9vbENhbGwiLCJpZCI6ImdyZXA6MiIsIm5hbWUiOiJncmVwIiwiYXJndW1lbnRzIjp7InBhdHRlcm4iOiJhdXRvLWRpc2NvdmVyZWQgc2tpbGwgbWV0YWRhdGEiLCJwYXRoIjoicGFja2FnZXMvY29kaW5nLWFnZW50L3Rlc3QvcGFja2FnZS1tYW5hZ2VyLnRlc3QudHMiLCJjb250ZXh0Ijo1fX1dLCJhcGkiOiJvcGVuYWktY29tcGxldGlvbnMiLCJwcm92aWRlciI6Im9wZW5jb2RlLWdvIiwibW9kZWwiOiJraW1pLWsyLjYiLCJ1c2FnZSI6eyJpbnB1dCI6MTE4ODIsIm91dHB1dCI6MTQyLCJjYWNoZVJlYWQiOjAsImNhY2hlV3JpdGUiOjAsInRvdGFsVG9rZW5zIjoxMjAyNCwiY29zdCI6eyJpbnB1dCI6MC4wMDM4MDIyNCwib3V0cHV0IjowLjAwMDE5MDI4LCJjYWNoZVJlYWQiOjAsImNhY2hlV3JpdGUiOjAsInRvdGFsIjowLjAwMzk5MjUyfX0sInN0b3BSZWFzb24iOiJ0b29sVXNlIiwidGltZXN0YW1wIjoxNzc3NTY0MTY1MDgyLCJyZXNwb25zZUlkIjoiZ2VuLTE3Nzc1NjQxNjUtaTlreER2SFZMd0ZEZFQ0QkdYOVgifX0seyJ0eXBlIjoibWVzc2FnZSIsImlkIjoiZTYzY2Q1MTYiLCJwYXJlbnRJZCI6IjI0YzUzZjZlIiwidGltZXN0YW1wIjoiMjAyNi0wNC0zMFQxNTo0OTozNi4yNzNaIiwibWVzc2FnZSI6eyJyb2xlIjoidG9vbFJlc3VsdCIsInRvb2xDYWxsSWQiOiJyZWFkOjAiLCJ0b29sTmFtZSI6InJlYWQiLCJjb250ZW50IjpbeyJ0eXBlIjoidGV4dCIsInRleHQiOiJpbXBvcnQgeyB0eXBlIENoaWxkUHJvY2VzcywgdHlwZSBDaGlsZFByb2Nlc3NCeVN0ZGlvLCBzcGF3biwgc3Bhd25TeW5jIH0gZnJvbSBcIm5vZGU6Y2hpbGRfcHJvY2Vzc1wiO1xuaW1wb3J0IHsgY3JlYXRlSGFzaCB9IGZyb20gXCJub2RlOmNyeXB0b1wiO1xuaW1wb3J0IHsgZXhpc3RzU3luYywgbWtkaXJTeW5jLCByZWFkZGlyU3luYywgcmVhZEZpbGVTeW5jLCBybVN5bmMsIHN0YXRTeW5jLCB3cml0ZUZpbGVTeW5jIH0gZnJvbSBcIm5vZGU6ZnNcIjtcbmltcG9ydCB7IGhvbWVkaXIsIHRtcGRpciB9IGZyb20gXCJub2RlOm9zXCI7XG5cbmZ1bmN0aW9uIGdldEVudigpOiBOb2RlSlMuUHJvY2Vzc0VudiB7XG5cdGlmIChwcm9jZXNzLnBsYXRmb3JtICE9PSBcImxpbnV4XCIgfHwgT2JqZWN0LmtleXMocHJvY2Vzcy5lbnYpLmxlbmd0aCA+IDApIHtcblx0XHRyZXR1cm4gcHJvY2Vzcy5lbnY7XG5cdH1cblx0dHJ5IHtcblx0XHRjb25zdCBkYXRhID0gcmVhZEZpbGVTeW5jKFwiL3Byb2Mvc2VsZi9lbnZpcm9uXCIsIFwidXRmLThcIik7XG5cdFx0Y29uc3QgZW52OiBOb2RlSlMuUHJvY2Vzc0VudiA9IHt9O1xuXHRcdGZvciAoY29uc3QgZW50cnkgb2YgZGF0YS5zcGxpdChcIlxcMFwiKSkge1xuXHRcdFx0Y29uc3QgaWR4ID0gZW50cnkuaW5kZXhPZihcIj1cIik7XG5cdFx0XHRpZiAoaWR4ID4gMCkge1xuXHRcdFx0XHRlbnZbZW50cnkuc2xpY2UoMCwgaWR4KV0gPSBlbnRyeS5zbGljZShpZHggKyAxKTtcblx0XHRcdH1cblx0XHR9XG5cdFx0cmV0dXJuIGVudjtcblx0fSBjYXRjaCB7XG5cdFx0cmV0dXJuIHByb2Nlc3MuZW52O1xuXHR9XG59XG5cbmltcG9ydCB7IGJhc2VuYW1lLCBkaXJuYW1lLCBqb2luLCByZWxhdGl2ZSwgcmVzb2x2ZSwgc2VwIH0gZnJvbSBcIm5vZGU6cGF0aFwiO1xuaW1wb3J0IHR5cGUgeyBSZWFkYWJsZSB9IGZyb20gXCJub2RlOnN0cmVhbVwiO1xuaW1wb3J0IHsgZ2xvYlN5bmMgfSBmcm9tIFwiZ2xvYlwiO1xuaW1wb3J0IGlnbm9yZSBmcm9tIFwiaWdub3JlXCI7XG5pbXBvcnQgeyBtaW5pbWF0Y2ggfSBmcm9tIFwibWluaW1hdGNoXCI7XG5pbXBvcnQgeyBDT05GSUdfRElSX05BTUUgfSBmcm9tIFwiLi4vY29uZmlnLmpzXCI7XG5pbXBvcnQgeyB0eXBlIEdpdFNvdXJjZSwgcGFyc2VHaXRVcmwgfSBmcm9tIFwiLi4vdXRpbHMvZ2l0LmpzXCI7XG5pbXBvcnQgeyBjYW5vbmljYWxpemVQYXRoLCBpc0xvY2FsUGF0aCB9IGZyb20gXCIuLi91dGlscy9wYXRocy5qc1wiO1xuaW1wb3J0IHsgaXNTdGRvdXRUYWtlbk92ZXIgfSBmcm9tIFwiLi9vdXRwdXQtZ3VhcmQuanNcIjtcbmltcG9ydCB0eXBlIHsgUGFja2FnZVNvdXJjZSwgU2V0dGluZ3NNYW5hZ2VyIH0gZnJvbSBcIi4vc2V0dGluZ3MtbWFuYWdlci5qc1wiO1xuXG5jb25zdCBORVRXT1JLX1RJTUVPVVRfTVMgPSAxMDAwMDtcbmNvbnN0IFVQREFURV9DSEVDS19DT05DVVJSRU5DWSA9IDQ7XG5jb25zdCBHSVRfVVBEQVRFX0NPTkNVUlJFTkNZID0gNDtcblxuZnVuY3Rpb24gaXNPZmZsaW5lTW9kZUVuYWJsZWQoKTogYm9vbGVhbiB7XG5cdGNvbnN0IHZhbHVlID0gcHJvY2Vzcy5lbnYuUElfT0ZGTElORTtcblx0aWYgKCF2YWx1ZSkgcmV0dXJuIGZhbHNlO1xuXHRyZXR1cm4gdmFsdWUgPT09IFwiMVwiIHx8IHZhbHVlLnRvTG93ZXJDYXNlKCkgPT09IFwidHJ1ZVwiIHx8IHZhbHVlLnRvTG93ZXJDYXNlKCkgPT09IFwieWVzXCI7XG59XG5cbmV4cG9ydCBpbnRlcmZhY2UgUGF0aE1ldGFkYXRhIHtcblx0c291cmNlOiBzdHJpbmc7XG5cdHNjb3BlOiBTb3VyY2VTY29wZTtcblx0b3JpZ2luOiBcInBhY2thZ2VcIiB8IFwidG9wLWxldmVsXCI7XG5cdGJhc2VEaXI/OiBzdHJpbmc7XG59XG5cbmV4cG9ydCBpbnRlcmZhY2UgUmVzb2x2ZWRSZXNvdXJjZSB7XG5cdHBhdGg6IHN0cmluZztcblx0ZW5hYmxlZDogYm9vbGVhbjtcblx0bWV0YWRhdGE6IFBhdGhNZXRhZGF0YTtcbn1cblxuZXhwb3J0IGludGVyZmFjZSBSZXNvbHZlZFBhdGhzIHtcblx0ZXh0ZW5zaW9uczogUmVzb2x2ZWRSZXNvdXJjZVtdO1xuXHRza2lsbHM6IFJlc29sdmVkUmVzb3VyY2VbXTtcblx0cHJvbXB0czogUmVzb2x2ZWRSZXNvdXJjZVtdO1xuXHR0aGVtZXM6IFJlc29sdmVkUmVzb3VyY2VbXTtcbn1cblxuZXhwb3J0IHR5cGUgTWlzc2luZ1NvdXJjZUFjdGlvbiA9IFwiaW5zdGFsbFwiIHwgXCJza2lwXCIgfCBcImVycm9yXCI7XG5cbmV4cG9ydCBpbnRlcmZhY2UgUHJvZ3Jlc3NFdmVudCB7XG5cdHR5cGU6IFwic3RhcnRcIiB8IFwicHJvZ3Jlc3NcIiB8IFwiY29tcGxldGVcIiB8IFwiZXJyb3JcIjtcblx0YWN0aW9uOiBcImluc3RhbGxcIiB8IFwicmVtb3ZlXCIgfCBcInVwZGF0ZVwiIHwgXCJjbG9uZVwiIHwgXCJwdWxsXCI7XG5cdHNvdXJjZTogc3RyaW5nO1xuXHRtZXNzYWdlPzogc3RyaW5nO1xufVxuXG5leHBvcnQgdHlwZSBQcm9ncmVzc0NhbGxiYWNrID0gKGV2ZW50OiBQcm9ncmVzc0V2ZW50KSA9PiB2b2lkO1xuXG5leHBvcnQgaW50ZXJmYWNlIFBhY2thZ2VVcGRhdGUge1xuXHRzb3VyY2U6IHN0cmluZztcblx0ZGlzcGxheU5hbWU6IHN0cmluZztcblx0dHlwZTogXCJucG1cIiB8IFwiZ2l0XCI7XG5cdHNjb3BlOiBFeGNsdWRlPFNvdXJjZVNjb3BlLCBcInRlbXBvcmFyeVwiPjtcbn1cblxuZXhwb3J0IGludGVyZmFjZSBDb25maWd1cmVkUGFja2FnZSB7XG5cdHNvdXJjZTogc3RyaW5nO1xuXHRzY29wZTogXCJ1c2VyXCIgfCBcInByb2plY3RcIjtcblx0ZmlsdGVyZWQ6IGJvb2xlYW47XG5cdGluc3RhbGxlZFBhdGg/OiBzdHJpbmc7XG59XG5cbmV4cG9ydCBpbnRlcmZhY2UgUGFja2FnZU1hbmFnZXIge1xuXHRyZXNvbHZlKG9uTWlzc2luZz86IChzb3VyY2U6IHN0cmluZykgPT4gUHJvbWlzZTxNaXNzaW5nU291cmNlQWN0aW9uPik6IFByb21pc2U8UmVzb2x2ZWRQYXRocz47XG5cdGluc3RhbGwoc291cmNlOiBzdHJpbmcsIG9wdGlvbnM/OiB7IGxvY2FsPzogYm9vbGVhbiB9KTogUHJvbWlzZTx2b2lkPjtcblx0aW5zdGFsbEFuZFBlcnNpc3Qoc291cmNlOiBzdHJpbmcsIG9wdGlvbnM/OiB7IGxvY2FsPzogYm9vbGVhbiB9KTogUHJvbWlzZTx2b2lkPjtcblx0cmVtb3ZlKHNvdXJjZTogc3RyaW5nLCBvcHRpb25zPzogeyBsb2NhbD86IGJvb2xlYW4gfSk6IFByb21pc2U8dm9pZD47XG5cdHJlbW92ZUFuZFBlcnNpc3Qoc291cmNlOiBzdHJpbmcsIG9wdGlvbnM/OiB7IGxvY2FsPzogYm9vbGVhbiB9KTogUHJvbWlzZTxib29sZWFuPjtcblx0dXBkYXRlKHNvdXJjZT86IHN0cmluZyk6IFByb21pc2U8dm9pZD47XG5cdGxpc3RDb25maWd1cmVkUGFja2FnZXMoKTogQ29uZmlndXJlZFBhY2thZ2VbXTtcblx0cmVzb2x2ZUV4dGVuc2lvblNvdXJjZXMoXG5cdFx0c291cmNlczogc3RyaW5nW10sXG5cdFx0b3B0aW9ucz86IHsgbG9jYWw/OiBib29sZWFuOyB0ZW1wb3Jhcnk/OiBib29sZWFuIH0sXG5cdCk6IFByb21pc2U8UmVzb2x2ZWRQYXRocz47XG5cdGFkZFNvdXJjZVRvU2V0dGluZ3Moc291cmNlOiBzdHJpbmcsIG9wdGlvbnM/OiB7IGxvY2FsPzogYm9vbGVhbiB9KTogYm9vbGVhbjtcblx0cmVtb3ZlU291cmNlRnJvbVNldHRpbmdzKHNvdXJjZTogc3RyaW5nLCBvcHRpb25zPzogeyBsb2NhbD86IGJvb2xlYW4gfSk6IGJvb2xlYW47XG5cdHNldFByb2dyZXNzQ2FsbGJhY2soY2FsbGJhY2s6IFByb2dyZXNzQ2FsbGJhY2sgfCB1bmRlZmluZWQpOiB2b2lkO1xuXHRnZXRJbnN0YWxsZWRQYXRoKHNvdXJjZTogc3RyaW5nLCBzY29wZTogXCJ1c2VyXCIgfCBcInByb2plY3RcIik6IHN0cmluZyB8IHVuZGVmaW5lZDtcbn1cblxuaW50ZXJmYWNlIFBhY2thZ2VNYW5hZ2VyT3B0aW9ucyB7XG5cdGN3ZDogc3RyaW5nO1xuXHRhZ2VudERpcjogc3RyaW5nO1xuXHRzZXR0aW5nc01hbmFnZXI6IFNldHRpbmdzTWFuYWdlcjtcbn1cblxudHlwZSBTb3VyY2VTY29wZSA9IFwidXNlclwiIHwgXCJwcm9qZWN0XCIgfCBcInRlbXBvcmFyeVwiO1xuXG50eXBlIE5wbVNvdXJjZSA9IHtcblx0dHlwZTogXCJucG1cIjtcblx0c3BlYzogc3RyaW5nO1xuXHRuYW1lOiBzdHJpbmc7XG5cdHBpbm5lZDogYm9vbGVhbjtcbn07XG5cbnR5cGUgTG9jYWxTb3VyY2UgPSB7XG5cdHR5cGU6IFwibG9jYWxcIjtcblx0cGF0aDogc3RyaW5nO1xufTtcblxudHlwZSBQYXJzZWRTb3VyY2UgPSBOcG1Tb3VyY2UgfCBHaXRTb3VyY2UgfCBMb2NhbFNvdXJjZTtcblxudHlwZSBJbnN0YWxsZWRTb3VyY2VTY29wZSA9IEV4Y2x1ZGU8U291cmNlU2NvcGUsIFwidGVtcG9yYXJ5XCI+O1xuXG5pbnRlcmZhY2UgQ29uZmlndXJlZFVwZGF0ZVNvdXJjZSB7XG5cdHNvdXJjZTogc3RyaW5nO1xuXHRzY29wZTogSW5zdGFsbGVkU291cmNlU2NvcGU7XG59XG5cbmludGVyZmFjZSBOcG1VcGRhdGVUYXJnZXQgZXh0ZW5kcyBDb25maWd1cmVkVXBkYXRlU291cmNlIHtcblx0cGFyc2VkOiBOcG1Tb3VyY2U7XG59XG5cbmludGVyZmFjZSBHaXRVcGRhdGVUYXJnZXQgZXh0ZW5kcyBDb25maWd1cmVkVXBkYXRlU291cmNlIHtcblx0cGFyc2VkOiBHaXRTb3VyY2U7XG59XG5cbmludGVyZmFjZSBQaU1hbmlmZXN0IHtcblx0ZXh0ZW5zaW9ucz86IHN0cmluZ1tdO1xuXHRza2lsbHM/OiBzdHJpbmdbXTtcblx0cHJvbXB0cz86IHN0cmluZ1tdO1xuXHR0aGVtZXM/OiBzdHJpbmdbXTtcbn1cblxuaW50ZXJmYWNlIFJlc291cmNlQWNjdW11bGF0b3Ige1xuXHRleHRlbnNpb25zOiBNYXA8c3RyaW5nLCB7IG1ldGFkYXRhOiBQYXRoTWV0YWRhdGE7IGVuYWJsZWQ6IGJvb2xlYW4gfT47XG5cdHNraWxsczogTWFwPHN0cmluZywgeyBtZXRhZGF0YTogUGF0aE1ldGFkYXRhOyBlbmFibGVkOiBib29sZWFuIH0+O1xuXHRwcm9tcHRzOiBNYXA8c3RyaW5nLCB7IG1ldGFkYXRhOiBQYXRoTWV0YWRhdGE7IGVuYWJsZWQ6IGJvb2xlYW4gfT47XG5cdHRoZW1lczogTWFwPHN0cmluZywgeyBtZXRhZGF0YTogUGF0aE1ldGFkYXRhOyBlbmFibGVkOiBib29sZWFuIH0+O1xufVxuXG4vKipcbiAqIENvbXB1dGUgYSBudW1lcmljIHByZWNlZGVuY2UgcmFuayBmb3IgYSByZXNvdXJjZSBiYXNlZCBvbiBpdHMgbWV0YWRhdGEuXG4gKiBMb3dlciByYW5rID0gaGlnaGVyIHByZWNlZGVuY2UuIFVzZWQgdG8gc29ydCByZXNvbHZlZCByZXNvdXJjZXMgc28gdGhhdFxuICogbmFtZS1jb2xsaXNpb24gcmVzb2x1dGlvbiAoXCJmaXJzdCB3aW5zXCIpIHByb2R1Y2VzIHRoZSBjb3JyZWN0IG91dGNvbWUuXG4gKlxuICogUHJlY2VkZW5jZSAoaGlnaGVzdCB0byBsb3dlc3QpOlxuICogICAwICBwcm9qZWN0ICsgc2V0dGluZ3MgZW50cnkgKHNvdXJjZTogXCJsb2NhbFwiLCBzY29wZTogXCJwcm9qZWN0XCIpXG4gKiAgIDEgIHByb2plY3QgKyBhdXRvLWRpc2NvdmVyZWQgKHNvdXJjZTogXCJhdXRvXCIsIHNjb3BlOiBcInByb2plY3RcIilcbiAqICAgMiAgdXNlciArIHNldHRpbmdzIGVudHJ5IChzb3VyY2U6IFwibG9jYWxcIiwgc2NvcGU6IFwidXNlclwiKVxuICogICAzICB1c2VyICsgYXV0by1kaXNjb3ZlcmVkIChzb3VyY2U6IFwiYXV0b1wiLCBzY29wZTogXCJ1c2VyXCIpXG4gKiAgIDQgIHBhY2thZ2UgcmVzb3VyY2UgKG9yaWdpbjogXCJwYWNrYWdlXCIpXG4gKi9cbmZ1bmN0aW9uIHJlc291cmNlUHJlY2VkZW5jZVJhbmsobTogUGF0aE1ldGFkYXRhKTogbnVtYmVyIHtcblx0aWYgKG0ub3JpZ2luID09PSBcInBhY2thZ2VcIikgcmV0dXJuIDQ7XG5cdGNvbnN0IHNjb3BlQmFzZSA9IG0uc2NvcGUgPT09IFwicHJvamVjdFwiID8gMCA6IDI7XG5cdHJldHVybiBzY29wZUJhc2UgKyAobS5zb3VyY2UgPT09IFwibG9jYWxcIiA/IDAgOiAxKTtcbn1cblxuaW50ZXJmYWNlIFBhY2thZ2VGaWx0ZXIge1xuXHRleHRlbnNpb25zPzogc3RyaW5nW107XG5cdHNraWxscz86IHN0cmluZ1tdO1xuXHRwcm9tcHRzPzogc3RyaW5nW107XG5cdHRoZW1lcz86IHN0cmluZ1tdO1xufVxuXG50eXBlIFJlc291cmNlVHlwZSA9IFwiZXh0ZW5zaW9uc1wiIHwgXCJza2lsbHNcIiB8IFwicHJvbXB0c1wiIHwgXCJ0aGVtZXNcIjtcblxuY29uc3QgUkVTT1VSQ0VfVFlQRVM6IFJlc291cmNlVHlwZVtdID0gW1wiZXh0ZW5zaW9uc1wiLCBcInNraWxsc1wiLCBcInByb21wdHNcIiwgXCJ0aGVtZXNcIl07XG5cbmNvbnN0IEZJTEVfUEFUVEVSTlM6IFJlY29yZDxSZXNvdXJjZVR5cGUsIFJlZ0V4cD4gPSB7XG5cdGV4dGVuc2lvbnM6IC9cXC4odHN8anMpJC8sXG5cdHNraWxsczogL1xcLm1kJC8sXG5cdHByb21wdHM6IC9cXC5tZCQvLFxuXHR0aGVtZXM6IC9cXC5qc29uJC8sXG59O1xuXG5jb25zdCBJR05PUkVfRklMRV9OQU1FUyA9IFtcIi5naXRpZ25vcmVcIiwgXCIuaWdub3JlXCIsIFwiLmZkaWdub3JlXCJdO1xuXG50eXBlIElnbm9yZU1hdGNoZXIgPSBSZXR1cm5UeXBlPHR5cGVvZiBpZ25vcmU+O1xuXG5mdW5jdGlvbiB0b1Bvc2l4UGF0aChwOiBzdHJpbmcpOiBzdHJpbmcge1xuXHRyZXR1cm4gcC5zcGxpdChzZXApLmpvaW4oXCIvXCIpO1xufVxuXG5mdW5jdGlvbiBnZXRIb21lRGlyKCk6IHN0cmluZyB7XG5cdHJldHVybiBwcm9jZXNzLmVudi5IT01FIHx8IGhvbWVkaXIoKTtcbn1cblxuZnVuY3Rpb24gcHJlZml4SWdub3JlUGF0dGVybihsaW5lOiBzdHJpbmcsIHByZWZpeDogc3RyaW5nKTogc3RyaW5nIHwgbnVsbCB7XG5cdGNvbnN0IHRyaW1tZWQgPSBsaW5lLnRyaW0oKTtcblx0aWYgKCF0cmltbWVkKSByZXR1cm4gbnVsbDtcblx0aWYgKHRyaW1tZWQuc3RhcnRzV2l0aChcIiNcIikgJiYgIXRyaW1tZWQuc3RhcnRzV2l0aChcIlxcXFwjXCIpKSByZXR1cm4gbnVsbDtcblxuXHRsZXQgcGF0dGVybiA9IGxpbmU7XG5cdGxldCBuZWdhdGVkID0gZmFsc2U7XG5cblx0aWYgKHBhdHRlcm4uc3RhcnRzV2l0aChcIiFcIikpIHtcblx0XHRuZWdhdGVkID0gdHJ1ZTtcblx0XHRwYXR0ZXJuID0gcGF0dGVybi5zbGljZSgxKTtcblx0fSBlbHNlIGlmIChwYXR0ZXJuLnN0YXJ0c1dpdGgoXCJcXFxcIVwiKSkge1xuXHRcdHBhdHRlcm4gPSBwYXR0ZXJuLnNsaWNlKDEpO1xuXHR9XG5cblx0aWYgKHBhdHRlcm4uc3RhcnRzV2l0aChcIi9cIikpIHtcblx0XHRwYXR0ZXJuID0gcGF0dGVybi5zbGljZSgxKTtcblx0fVxuXG5cdGNvbnN0IHByZWZpeGVkID0gcHJlZml4ID8gYCR7cHJlZml4fSR7cGF0dGVybn1gIDogcGF0dGVybjtcblx0cmV0dXJuIG5lZ2F0ZWQgPyBgISR7cHJlZml4ZWR9YCA6IHByZWZpeGVkO1xufVxuXG5mdW5jdGlvbiBhZGRJZ25vcmVSdWxlcyhpZzogSWdub3JlTWF0Y2hlciwgZGlyOiBzdHJpbmcsIHJvb3REaXI6IHN0cmluZyk6IHZvaWQge1xuXHRjb25zdCByZWxhdGl2ZURpciA9IHJlbGF0aXZlKHJvb3REaXIsIGRpcik7XG5cdGNvbnN0IHByZWZpeCA9IHJlbGF0aXZlRGlyID8gYCR7dG9Qb3NpeFBhdGgocmVsYXRpdmVEaXIpfS9gIDogXCJcIjtcblxuXHRmb3IgKGNvbnN0IGZpbGVuYW1lIG9mIElHTk9SRV9GSUxFX05BTUVTKSB7XG5cdFx0Y29uc3QgaWdub3JlUGF0aCA9IGpvaW4oZGlyLCBmaWxlbmFtZSk7XG5cdFx0aWYgKCFleGlzdHNTeW5jKGlnbm9yZVBhdGgpKSBjb250aW51ZTtcblx0XHR0cnkge1xuXHRcdFx0Y29uc3QgY29udGVudCA9IHJlYWRGaWxlU3luYyhpZ25vcmVQYXRoLCBcInV0Zi04XCIpO1xuXHRcdFx0Y29uc3QgcGF0dGVybnMgPSBjb250ZW50XG5cdFx0XHRcdC5zcGxpdCgvXFxyP1xcbi8pXG5cdFx0XHRcdC5tYXAoKGxpbmUpID0+IHByZWZpeElnbm9yZVBhdHRlcm4obGluZSwgcHJlZml4KSlcblx0XHRcdFx0LmZpbHRlcigobGluZSk6IGxpbmUgaXMgc3RyaW5nID0+IEJvb2xlYW4obGluZSkpO1xuXHRcdFx0aWYgKHBhdHRlcm5zLmxlbmd0aCA+IDApIHtcblx0XHRcdFx0aWcuYWRkKHBhdHRlcm5zKTtcblx0XHRcdH1cblx0XHR9IGNhdGNoIHt9XG5cdH1cbn1cblxuZnVuY3Rpb24gaXNQYXR0ZXJuKHM6IHN0cmluZyk6IGJvb2xlYW4ge1xuXHRyZXR1cm4gcy5zdGFydHNXaXRoKFwiIVwiKSB8fCBzLnN0YXJ0c1dpdGgoXCIrXCIpIHx8IHMuc3RhcnRzV2l0aChcIi1cIikgfHwgcy5pbmNsdWRlcyhcIipcIikgfHwgcy5pbmNsdWRlcyhcIj9cIik7XG59XG5cbmZ1bmN0aW9uIGlzT3ZlcnJpZGVQYXR0ZXJuKHM6IHN0cmluZyk6IGJvb2xlYW4ge1xuXHRyZXR1cm4gcy5zdGFydHNXaXRoKFwiIVwiKSB8fCBzLnN0YXJ0c1dpdGgoXCIrXCIpIHx8IHMuc3RhcnRzV2l0aChcIi1cIik7XG59XG5cbmZ1bmN0aW9uIGhhc0dsb2JQYXR0ZXJuKHM6IHN0cmluZyk6IGJvb2xlYW4ge1xuXHRyZXR1cm4gcy5pbmNsdWRlcyhcIipcIikgfHwgcy5pbmNsdWRlcyhcIj9cIik7XG59XG5cbmZ1bmN0aW9uIHNwbGl0UGF0dGVybnMoZW50cmllczogc3RyaW5nW10pOiB7IHBsYWluOiBzdHJpbmdbXTsgcGF0dGVybnM6IHN0cmluZ1tdIH0ge1xuXHRjb25zdCBwbGFpbjogc3RyaW5nW10gPSBbXTtcblx0Y29uc3QgcGF0dGVybnM6IHN0cmluZ1tdID0gW107XG5cdGZvciAoY29uc3QgZW50cnkgb2YgZW50cmllcykge1xuXHRcdGlmIChpc1BhdHRlcm4oZW50cnkpKSB7XG5cdFx0XHRwYXR0ZXJucy5wdXNoKGVudHJ5KTtcblx0XHR9IGVsc2Uge1xuXHRcdFx0cGxhaW4ucHVzaChlbnRyeSk7XG5cdFx0fVxuXHR9XG5cdHJldHVybiB7IHBsYWluLCBwYXR0ZXJucyB9O1xufVxuXG5mdW5jdGlvbiBjb2xsZWN0RmlsZXMoXG5cdGRpcjogc3RyaW5nLFxuXHRmaWxlUGF0dGVybjogUmVnRXhwLFxuXHRza2lwTm9kZU1vZHVsZXMgPSB0cnVlLFxuXHRpZ25vcmVNYXRjaGVyPzogSWdub3JlTWF0Y2hlcixcblx0cm9vdERpcj86IHN0cmluZyxcbik6IHN0cmluZ1tdIHtcblx0Y29uc3QgZmlsZXM6IHN0cmluZ1tdID0gW107XG5cdGlmICghZXhpc3RzU3luYyhkaXIpKSByZXR1cm4gZmlsZXM7XG5cblx0Y29uc3Qgcm9vdCA9IHJvb3REaXIgPz8gZGlyO1xuXHRjb25zdCBpZyA9IGlnbm9yZU1hdGNoZXIgPz8gaWdub3JlKCk7XG5cdGFkZElnbm9yZVJ1bGVzKGlnLCBkaXIsIHJvb3QpO1xuXG5cdHRyeSB7XG5cdFx0Y29uc3QgZW50cmllcyA9IHJlYWRkaXJTeW5jKGRpciwgeyB3aXRoRmlsZVR5cGVzOiB0cnVlIH0pO1xuXHRcdGZvciAoY29uc3QgZW50cnkgb2YgZW50cmllcykge1xuXHRcdFx0aWYgKGVudHJ5Lm5hbWUuc3RhcnRzV2l0aChcIi5cIikpIGNvbnRpbnVlO1xuXHRcdFx0aWYgKHNraXBOb2RlTW9kdWxlcyAmJiBlbnRyeS5uYW1lID09PSBcIm5vZGVfbW9kdWxlc1wiKSBjb250aW51ZTtcblxuXHRcdFx0Y29uc3QgZnVsbFBhdGggPSBqb2luKGRpciwgZW50cnkubmFtZSk7XG5cdFx0XHRsZXQgaXNEaXIgPSBlbnRyeS5pc0RpcmVjdG9yeSgpO1xuXHRcdFx0bGV0IGlzRmlsZSA9IGVudHJ5LmlzRmlsZSgpO1xuXG5cdFx0XHRpZiAoZW50cnkuaXNTeW1ib2xpY0xpbmsoKSkge1xuXHRcdFx0XHR0cnkge1xuXHRcdFx0XHRcdGNvbnN0IHN0YXRzID0gc3RhdFN5bmMoZnVsbFBhdGgpO1xuXHRcdFx0XHRcdGlzRGlyID0gc3RhdHMuaXNEaXJlY3RvcnkoKTtcblx0XHRcdFx0XHRpc0ZpbGUgPSBzdGF0cy5pc0ZpbGUoKTtcblx0XHRcdFx0fSBjYXRjaCB7XG5cdFx0XHRcdFx0Y29udGludWU7XG5cdFx0XHRcdH1cblx0XHRcdH1cblxuXHRcdFx0Y29uc3QgcmVsUGF0aCA9IHRvUG9zaXhQYXRoKHJlbGF0aXZlKHJvb3QsIGZ1bGxQYXRoKSk7XG5cdFx0XHRjb25zdCBpZ25vcmVQYXRoID0gaXNEaXIgPyBgJHtyZWxQYXRofS9gIDogcmVsUGF0aDtcblx0XHRcdGlmIChpZy5pZ25vcmVzKGlnbm9yZVBhdGgpKSBjb250aW51ZTtcblxuXHRcdFx0aWYgKGlzRGlyKSB7XG5cdFx0XHRcdGZpbGVzLnB1c2goLi4uY29sbGVjdEZpbGVzKGZ1bGxQYXRoLCBmaWxlUGF0dGVybiwgc2tpcE5vZGVNb2R1bGVzLCBpZywgcm9vdCkpO1xuXHRcdFx0fSBlbHNlIGlmIChpc0ZpbGUgJiYgZmlsZVBhdHRlcm4udGVzdChlbnRyeS5uYW1lKSkge1xuXHRcdFx0XHRmaWxlcy5wdXNoKGZ1bGxQYXRoKTtcblx0XHRcdH1cblx0XHR9XG5cdH0gY2F0Y2gge1xuXHRcdC8vIElnbm9yZSBlcnJvcnNcblx0fVxuXG5cdHJldHVybiBmaWxlcztcbn1cblxudHlwZSBTa2lsbERpc2NvdmVyeU1vZGUgPSBcInBpXCIgfCBcImFnZW50c1wiO1xuXG5mdW5jdGlvbiBjb2xsZWN0U2tpbGxFbnRyaWVzKFxuXHRkaXI6IHN0cmluZyxcblx0bW9kZTogU2tpbGxEaXNjb3ZlcnlNb2RlLFxuXHRpZ25vcmVNYXRjaGVyPzogSWdub3JlTWF0Y2hlcixcblx0cm9vdERpcj86IHN0cmluZyxcbik6IHN0cmluZ1tdIHtcblx0Y29uc3QgZW50cmllczogc3RyaW5nW10gPSBbXTtcblx0aWYgKCFleGlzdHNTeW5jKGRpcikpIHJldHVybiBlbnRyaWVzO1xuXG5cdGNvbnN0IHJvb3QgPSByb290RGlyID8/IGRpcjtcblx0Y29uc3QgaWcgPSBpZ25vcmVNYXRjaGVyID8/IGlnbm9yZSgpO1xuXHRhZGRJZ25vcmVSdWxlcyhpZywgZGlyLCByb290KTtcblxuXHR0cnkge1xuXHRcdGNvbnN0IGRpckVudHJpZXMgPSByZWFkZGlyU3luYyhkaXIsIHsgd2l0aEZpbGVUeXBlczogdHJ1ZSB9KTtcblxuXHRcdGZvciAoY29uc3QgZW50cnkgb2YgZGlyRW50cmllcykge1xuXHRcdFx0aWYgKGVudHJ5Lm5hbWUgIT09IFwiU0tJTEwubWRcIikge1xuXHRcdFx0XHRjb250aW51ZTtcblx0XHRcdH1cblxuXHRcdFx0Y29uc3QgZnVsbFBhdGggPSBqb2luKGRpciwgZW50cnkubmFtZSk7XG5cdFx0XHRsZXQgaXNGaWxlID0gZW50cnkuaXNGaWxlKCk7XG5cdFx0XHRpZiAoZW50cnkuaXNTeW1ib2xpY0xpbmsoKSkge1xuXHRcdFx0XHR0cnkge1xuXHRcdFx0XHRcdGlzRmlsZSA9IHN0YXRTeW5jKGZ1bGxQYXRoKS5pc0ZpbGUoKTtcblx0XHRcdFx0fSBjYXRjaCB7XG5cdFx0XHRcdFx0Y29udGludWU7XG5cdFx0XHRcdH1cblx0XHRcdH1cblxuXHRcdFx0Y29uc3QgcmVsUGF0aCA9IHRvUG9zaXhQYXRoKHJlbGF0aXZlKHJvb3QsIGZ1bGxQYXRoKSk7XG5cdFx0XHRpZiAoaXNGaWxlICYmICFpZy5pZ25vcmVzKHJlbFBhdGgpKSB7XG5cdFx0XHRcdGVudHJpZXMucHVzaChmdWxsUGF0aCk7XG5cdFx0XHRcdHJldHVybiBlbnRyaWVzO1xuXHRcdFx0fVxuXHRcdH1cblxuXHRcdGZvciAoY29uc3QgZW50cnkgb2YgZGlyRW50cmllcykge1xuXHRcdFx0aWYgKGVudHJ5Lm5hbWUuc3RhcnRzV2l0aChcIi5cIikpIGNvbnRpbnVlO1xuXHRcdFx0aWYgKGVudHJ5Lm5hbWUgPT09IFwibm9kZV9tb2R1bGVzXCIpIGNvbnRpbnVlO1xuXG5cdFx0XHRjb25zdCBmdWxsUGF0aCA9IGpvaW4oZGlyLCBlbnRyeS5uYW1lKTtcblx0XHRcdGxldCBpc0RpciA9IGVudHJ5LmlzRGlyZWN0b3J5KCk7XG5cdFx0XHRsZXQgaXNGaWxlID0gZW50cnkuaXNGaWxlKCk7XG5cblx0XHRcdGlmIChlbnRyeS5pc1N5bWJvbGljTGluaygpKSB7XG5cdFx0XHRcdHRyeSB7XG5cdFx0XHRcdFx0Y29uc3Qgc3RhdHMgPSBzdGF0U3luYyhmdWxsUGF0aCk7XG5cdFx0XHRcdFx0aXNEaXIgPSBzdGF0cy5pc0RpcmVjdG9yeSgpO1xuXHRcdFx0XHRcdGlzRmlsZSA9IHN0YXRzLmlzRmlsZSgpO1xuXHRcdFx0XHR9IGNhdGNoIHtcblx0XHRcdFx0XHRjb250aW51ZTtcblx0XHRcdFx0fVxuXHRcdFx0fVxuXG5cdFx0XHRjb25zdCByZWxQYXRoID0gdG9Qb3NpeFBhdGgocmVsYXRpdmUocm9vdCwgZnVsbFBhdGgpKTtcblx0XHRcdGlmIChtb2RlID09PSBcInBpXCIgJiYgZGlyID09PSByb290ICYmIGlzRmlsZSAmJiBlbnRyeS5uYW1lLmVuZHNXaXRoKFwiLm1kXCIpICYmICFpZy5pZ25vcmVzKHJlbFBhdGgpKSB7XG5cdFx0XHRcdGVudHJpZXMucHVzaChmdWxsUGF0aCk7XG5cdFx0XHRcdGNvbnRpbnVlO1xuXHRcdFx0fVxuXG5cdFx0XHRpZiAoIWlzRGlyKSBjb250aW51ZTtcblx0XHRcdGlmIChpZy5pZ25vcmVzKGAke3JlbFBhdGh9L2ApKSBjb250aW51ZTtcblxuXHRcdFx0ZW50cmllcy5wdXNoKC4uLmNvbGxlY3RTa2lsbEVudHJpZXMoZnVsbFBhdGgsIG1vZGUsIGlnLCByb290KSk7XG5cdFx0fVxuXHR9IGNhdGNoIHtcblx0XHQvLyBJZ25vcmUgZXJyb3JzXG5cdH1cblxuXHRyZXR1cm4gZW50cmllcztcbn1cblxuZnVuY3Rpb24gY29sbGVjdEF1dG9Ta2lsbEVudHJpZXMoZGlyOiBzdHJpbmcsIG1vZGU6IFNraWxsRGlzY292ZXJ5TW9kZSk6IHN0cmluZ1tdIHtcblx0cmV0dXJuIGNvbGxlY3RTa2lsbEVudHJpZXMoZGlyLCBtb2RlKTtcbn1cblxuZnVuY3Rpb24gZmluZEdpdFJlcG9Sb290KHN0YXJ0RGlyOiBzdHJpbmcpOiBzdHJpbmcgfCBudWxsIHtcblx0bGV0IGRpciA9IHJlc29sdmUoc3RhcnREaXIpO1xuXHR3aGlsZSAodHJ1ZSkge1xuXHRcdGlmIChleGlzdHNTeW5jKGpvaW4oZGlyLCBcIi5naXRcIikpKSB7XG5cdFx0XHRyZXR1cm4gZGlyO1xuXHRcdH1cblx0XHRjb25zdCBwYXJlbnQgPSBkaXJuYW1lKGRpcik7XG5cdFx0aWYgKHBhcmVudCA9PT0gZGlyKSB7XG5cdFx0XHRyZXR1cm4gbnVsbDtcblx0XHR9XG5cdFx0ZGlyID0gcGFyZW50O1xuXHR9XG59XG5cbmZ1bmN0aW9uIGNvbGxlY3RBbmNlc3RvckFnZW50c1NraWxsRGlycyhzdGFydERpcjogc3RyaW5nKTogc3RyaW5nW10ge1xuXHRjb25zdCBza2lsbERpcnM6IHN0cmluZ1tdID0gW107XG5cdGNvbnN0IHJlc29sdmVkU3RhcnREaXIgPSByZXNvbHZlKHN0YXJ0RGlyKTtcblx0Y29uc3QgZ2l0UmVwb1Jvb3QgPSBmaW5kR2l0UmVwb1Jvb3QocmVzb2x2ZWRTdGFydERpcik7XG5cblx0bGV0IGRpciA9IHJlc29sdmVkU3RhcnREaXI7XG5cdHdoaWxlICh0cnVlKSB7XG5cdFx0c2tpbGxEaXJzLnB1c2goam9pbihkaXIsIFwiLmFnZW50c1wiLCBcInNraWxsc1wiKSk7XG5cdFx0aWYgKGdpdFJlcG9Sb290ICYmIGRpciA9PT0gZ2l0UmVwb1Jvb3QpIHtcblx0XHRcdGJyZWFrO1xuXHRcdH1cblx0XHRjb25zdCBwYXJlbnQgPSBkaXJuYW1lKGRpcik7XG5cdFx0aWYgKHBhcmVudCA9PT0gZGlyKSB7XG5cdFx0XHRicmVhaztcblx0XHR9XG5cdFx0ZGlyID0gcGFyZW50O1xuXHR9XG5cblx0cmV0dXJuIHNraWxsRGlycztcbn1cblxuZnVuY3Rpb24gY29sbGVjdEF1dG9Qcm9tcHRFbnRyaWVzKGRpcjogc3RyaW5nKTogc3RyaW5nW10ge1xuXHRjb25zdCBlbnRyaWVzOiBzdHJpbmdbXSA9IFtdO1xuXHRpZiAoIWV4aXN0c1N5bmMoZGlyKSkgcmV0dXJuIGVudHJpZXM7XG5cblx0Y29uc3QgaWcgPSBpZ25vcmUoKTtcblx0YWRkSWdub3JlUnVsZXMoaWcsIGRpciwgZGlyKTtcblxuXHR0cnkge1xuXHRcdGNvbnN0IGRpckVudHJpZXMgPSByZWFkZGlyU3luYyhkaXIsIHsgd2l0aEZpbGVUeXBlczogdHJ1ZSB9KTtcblx0XHRmb3IgKGNvbnN0IGVudHJ5IG9mIGRpckVudHJpZXMpIHtcblx0XHRcdGlmIChlbnRyeS5uYW1lLnN0YXJ0c1dpdGgoXCIuXCIpKSBjb250aW51ZTtcblx0XHRcdGlmIChlbnRyeS5uYW1lID09PSBcIm5vZGVfbW9kdWxlc1wiKSBjb250aW51ZTtcblxuXHRcdFx0Y29uc3QgZnVsbFBhdGggPSBqb2luKGRpciwgZW50cnkubmFtZSk7XG5cdFx0XHRsZXQgaXNGaWxlID0gZW50cnkuaXNGaWxlKCk7XG5cdFx0XHRpZiAoZW50cnkuaXNTeW1ib2xpY0xpbmsoKSkge1xuXHRcdFx0XHR0cnkge1xuXHRcdFx0XHRcdGlzRmlsZSA9IHN0YXRTeW5jKGZ1bGxQYXRoKS5pc0ZpbGUoKTtcblx0XHRcdFx0fSBjYXRjaCB7XG5cdFx0XHRcdFx0Y29udGludWU7XG5cdFx0XHRcdH1cblx0XHRcdH1cblxuXHRcdFx0Y29uc3QgcmVsUGF0aCA9IHRvUG9zaXhQYXRoKHJlbGF0aXZlKGRpciwgZnVsbFBhdGgpKTtcblx0XHRcdGlmIChpZy5pZ25vcmVzKHJlbFBhdGgpKSBjb250aW51ZTtcblxuXHRcdFx0aWYgKGlzRmlsZSAmJiBlbnRyeS5uYW1lLmVuZHNXaXRoKFwiLm1kXCIpKSB7XG5cdFx0XHRcdGVudHJpZXMucHVzaChmdWxsUGF0aCk7XG5cdFx0XHR9XG5cdFx0fVxuXHR9IGNhdGNoIHtcblx0XHQvLyBJZ25vcmUgZXJyb3JzXG5cdH1cblxuXHRyZXR1cm4gZW50cmllcztcbn1cblxuZnVuY3Rpb24gY29sbGVjdEF1dG9UaGVtZUVudHJpZXMoZGlyOiBzdHJpbmcpOiBzdHJpbmdbXSB7XG5cdGNvbnN0IGVudHJpZXM6IHN0cmluZ1tdID0gW107XG5cdGlmICghZXhpc3RzU3luYyhkaXIpKSByZXR1cm4gZW50cmllcztcblxuXHRjb25zdCBpZyA9IGlnbm9yZSgpO1xuXHRhZGRJZ25vcmVSdWxlcyhpZywgZGlyLCBkaXIpO1xuXG5cdHRyeSB7XG5cdFx0Y29uc3QgZGlyRW50cmllcyA9IHJlYWRkaXJTeW5jKGRpciwgeyB3aXRoRmlsZVR5cGVzOiB0cnVlIH0pO1xuXHRcdGZvciAoY29uc3QgZW50cnkgb2YgZGlyRW50cmllcykge1xuXHRcdFx0aWYgKGVudHJ5Lm5hbWUuc3RhcnRzV2l0aChcIi5cIikpIGNvbnRpbnVlO1xuXHRcdFx0aWYgKGVudHJ5Lm5hbWUgPT09IFwibm9kZV9tb2R1bGVzXCIpIGNvbnRpbnVlO1xuXG5cdFx0XHRjb25zdCBmdWxsUGF0aCA9IGpvaW4oZGlyLCBlbnRyeS5uYW1lKTtcblx0XHRcdGxldCBpc0ZpbGUgPSBlbnRyeS5pc0ZpbGUoKTtcblx0XHRcdGlmIChlbnRyeS5pc1N5bWJvbGljTGluaygpKSB7XG5cdFx0XHRcdHRyeSB7XG5cdFx0XHRcdFx0aXNGaWxlID0gc3RhdFN5bmMoZnVsbFBhdGgpLmlzRmlsZSgpO1xuXHRcdFx0XHR9IGNhdGNoIHtcblx0XHRcdFx0XHRjb250aW51ZTtcblx0XHRcdFx0fVxuXHRcdFx0fVxuXG5cdFx0XHRjb25zdCByZWxQYXRoID0gdG9Qb3NpeFBhdGgocmVsYXRpdmUoZGlyLCBmdWxsUGF0aCkpO1xuXHRcdFx0aWYgKGlnLmlnbm9yZXMocmVsUGF0aCkpIGNvbnRpbnVlO1xuXG5cdFx0XHRpZiAoaXNGaWxlICYmIGVudHJ5Lm5hbWUuZW5kc1dpdGgoXCIuanNvblwiKSkge1xuXHRcdFx0XHRlbnRyaWVzLnB1c2goZnVsbFBhdGgpO1xuXHRcdFx0fVxuXHRcdH1cblx0fSBjYXRjaCB7XG5cdFx0Ly8gSWdub3JlIGVycm9yc1xuXHR9XG5cblx0cmV0dXJuIGVudHJpZXM7XG59XG5cbmZ1bmN0aW9uIHJlYWRQaU1hbmlmZXN0RmlsZShwYWNrYWdlSnNvblBhdGg6IHN0cmluZyk6IFBpTWFuaWZlc3QgfCBudWxsIHtcblx0dHJ5IHtcblx0XHRjb25zdCBjb250ZW50ID0gcmVhZEZpbGVTeW5jKHBhY2thZ2VKc29uUGF0aCwgXCJ1dGYtOFwiKTtcblx0XHRjb25zdCBwa2cgPSBKU09OLnBhcnNlKGNvbnRlbnQpIGFzIHsgcGk/OiBQaU1hbmlmZXN0IH07XG5cdFx0cmV0dXJuIHBrZy5waSA/PyBudWxsO1xuXHR9IGNhdGNoIHtcblx0XHRyZXR1cm4gbnVsbDtcblx0fVxufVxuXG5mdW5jdGlvbiByZXNvbHZlRXh0ZW5zaW9uRW50cmllcyhkaXI6IHN0cmluZyk6IHN0cmluZ1tdIHwgbnVsbCB7XG5cdGNvbnN0IHBhY2thZ2VKc29uUGF0aCA9IGpvaW4oZGlyLCBcInBhY2thZ2UuanNvblwiKTtcblx0aWYgKGV4aXN0c1N5bmMocGFja2FnZUpzb25QYXRoKSkge1xuXHRcdGNvbnN0IG1hbmlmZXN0ID0gcmVhZFBpTWFuaWZlc3RGaWxlKHBhY2thZ2VKc29uUGF0aCk7XG5cdFx0aWYgKG1hbmlmZXN0Py5leHRlbnNpb25zPy5sZW5ndGgpIHtcblx0XHRcdGNvbnN0IGVudHJpZXM6IHN0cmluZ1tdID0gW107XG5cdFx0XHRmb3IgKGNvbnN0IGV4dFBhdGggb2YgbWFuaWZlc3QuZXh0ZW5zaW9ucykge1xuXHRcdFx0XHRjb25zdCByZXNvbHZlZEV4dFBhdGggPSByZXNvbHZlKGRpciwgZXh0UGF0aCk7XG5cdFx0XHRcdGlmIChleGlzdHNTeW5jKHJlc29sdmVkRXh0UGF0aCkpIHtcblx0XHRcdFx0XHRlbnRyaWVzLnB1c2gocmVzb2x2ZWRFeHRQYXRoKTtcblx0XHRcdFx0fVxuXHRcdFx0fVxuXHRcdFx0aWYgKGVudHJpZXMubGVuZ3RoID4gMCkge1xuXHRcdFx0XHRyZXR1cm4gZW50cmllcztcblx0XHRcdH1cblx0XHR9XG5cdH1cblxuXHRjb25zdCBpbmRleFRzID0gam9pbihkaXIsIFwiaW5kZXgudHNcIik7XG5cdGNvbnN0IGluZGV4SnMgPSBqb2luKGRpciwgXCJpbmRleC5qc1wiKTtcblx0aWYgKGV4aXN0c1N5bmMoaW5kZXhUcykpIHtcblx0XHRyZXR1cm4gW2luZGV4VHNdO1xuXHR9XG5cdGlmIChleGlzdHNTeW5jKGluZGV4SnMpKSB7XG5cdFx0cmV0dXJuIFtpbmRleEpzXTtcblx0fVxuXG5cdHJldHVybiBudWxsO1xufVxuXG5mdW5jdGlvbiBjb2xsZWN0QXV0b0V4dGVuc2lvbkVudHJpZXMoZGlyOiBzdHJpbmcpOiBzdHJpbmdbXSB7XG5cdGNvbnN0IGVudHJpZXM6IHN0cmluZ1tdID0gW107XG5cdGlmICghZXhpc3RzU3luYyhkaXIpKSByZXR1cm4gZW50cmllcztcblxuXHQvLyBGaXJzdCBjaGVjayBpZiB0aGlzIGRpcmVjdG9yeSBpdHNlbGYgaGFzIGV4cGxpY2l0IGV4dGVuc2lvbiBlbnRyaWVzIChwYWNrYWdlLmpzb24gb3IgaW5kZXgpXG5cdGNvbnN0IHJvb3RFbnRyaWVzID0gcmVzb2x2ZUV4dGVuc2lvbkVudHJpZXMoZGlyKTtcblx0aWYgKHJvb3RFbnRyaWVzKSB7XG5cdFx0cmV0dXJuIHJvb3RFbnRyaWVzO1xuXHR9XG5cblx0Ly8gT3RoZXJ3aXNlLCBkaXNjb3ZlciBleHRlbnNpb25zIGZyb20gZGlyZWN0b3J5IGNvbnRlbnRzXG5cdGNvbnN0IGlnID0gaWdub3JlKCk7XG5cdGFkZElnbm9yZVJ1bGVzKGlnLCBkaXIsIGRpcik7XG5cblx0dHJ5IHtcblx0XHRjb25zdCBkaXJFbnRyaWVzID0gcmVhZGRpclN5bmMoZGlyLCB7IHdpdGhGaWxlVHlwZXM6IHRydWUgfSk7XG5cdFx0Zm9yIChjb25zdCBlbnRyeSBvZiBkaXJFbnRyaWVzKSB7XG5cdFx0XHRpZiAoZW50cnkubmFtZS5zdGFydHNXaXRoKFwiLlwiKSkgY29udGludWU7XG5cdFx0XHRpZiAoZW50cnkubmFtZSA9PT0gXCJub2RlX21vZHVsZXNcIikgY29udGludWU7XG5cblx0XHRcdGNvbnN0IGZ1bGxQYXRoID0gam9pbihkaXIsIGVudHJ5Lm5hbWUpO1xuXHRcdFx0bGV0IGlzRGlyID0gZW50cnkuaXNEaXJlY3RvcnkoKTtcblx0XHRcdGxldCBpc0ZpbGUgPSBlbnRyeS5pc0ZpbGUoKTtcblxuXHRcdFx0aWYgKGVudHJ5LmlzU3ltYm9saWNMaW5rKCkpIHtcblx0XHRcdFx0dHJ5IHtcblx0XHRcdFx0XHRjb25zdCBzdGF0cyA9IHN0YXRTeW5jKGZ1bGxQYXRoKTtcblx0XHRcdFx0XHRpc0RpciA9IHN0YXRzLmlzRGlyZWN0b3J5KCk7XG5cdFx0XHRcdFx0aXNGaWxlID0gc3RhdHMuaXNGaWxlKCk7XG5cdFx0XHRcdH0gY2F0Y2gge1xuXHRcdFx0XHRcdGNvbnRpbnVlO1xuXHRcdFx0XHR9XG5cdFx0XHR9XG5cblx0XHRcdGNvbnN0IHJlbFBhdGggPSB0b1Bvc2l4UGF0aChyZWxhdGl2ZShkaXIsIGZ1bGxQYXRoKSk7XG5cdFx0XHRjb25zdCBpZ25vcmVQYXRoID0gaXNEaXIgPyBgJHtyZWxQYXRofS9gIDogcmVsUGF0aDtcblx0XHRcdGlmIChpZy5pZ25vcmVzKGlnbm9yZVBhdGgpKSBjb250aW51ZTtcblxuXHRcdFx0aWYgKGlzRmlsZSAmJiAoZW50cnkubmFtZS5lbmRzV2l0aChcIi50c1wiKSB8fCBlbnRyeS5uYW1lLmVuZHNXaXRoKFwiLmpzXCIpKSkge1xuXHRcdFx0XHRlbnRyaWVzLnB1c2goZnVsbFBhdGgpO1xuXHRcdFx0fSBlbHNlIGlmIChpc0Rpcikge1xuXHRcdFx0XHRjb25zdCByZXNvbHZlZEVudHJpZXMgPSByZXNvbHZlRXh0ZW5zaW9uRW50cmllcyhmdWxsUGF0aCk7XG5cdFx0XHRcdGlmIChyZXNvbHZlZEVudHJpZXMpIHtcblx0XHRcdFx0XHRlbnRyaWVzLnB1c2goLi4ucmVzb2x2ZWRFbnRyaWVzKTtcblx0XHRcdFx0fVxuXHRcdFx0fVxuXHRcdH1cblx0fSBjYXRjaCB7XG5cdFx0Ly8gSWdub3JlIGVycm9yc1xuXHR9XG5cblx0cmV0dXJuIGVudHJpZXM7XG59XG5cbi8qKlxuICogQ29sbGVjdCByZXNvdXJjZSBmaWxlcyBmcm9tIGEgZGlyZWN0b3J5IGJhc2VkIG9uIHJlc291cmNlIHR5cGUuXG4gKiBFeHRlbnNpb25zIHVzZSBzbWFydCBkaXNjb3ZlcnkgKGluZGV4LnRzIGluIHN1YmRpcnMpLCBvdGhlcnMgdXNlIHJlY3Vyc2l2ZSBjb2xsZWN0aW9uLlxuICovXG5mdW5jdGlvbiBjb2xsZWN0UmVzb3VyY2VGaWxlcyhkaXI6IHN0cmluZywgcmVzb3VyY2VUeXBlOiBSZXNvdXJjZVR5cGUpOiBzdHJpbmdbXSB7XG5cdGlmIChyZXNvdXJjZVR5cGUgPT09IFwic2tpbGxzXCIpIHtcblx0XHRyZXR1cm4gY29sbGVjdFNraWxsRW50cmllcyhkaXIsIFwicGlcIik7XG5cdH1cblx0aWYgKHJlc291cmNlVHlwZSA9PT0gXCJleHRlbnNpb25zXCIpIHtcblx0XHRyZXR1cm4gY29sbGVjdEF1dG9FeHRlbnNpb25FbnRyaWVzKGRpcik7XG5cdH1cblx0cmV0dXJuIGNvbGxlY3RGaWxlcyhkaXIsIEZJTEVfUEFUVEVSTlNbcmVzb3VyY2VUeXBlXSk7XG59XG5cbmZ1bmN0aW9uIG1hdGNoZXNBbnlQYXR0ZXJuKGZpbGVQYXRoOiBzdHJpbmcsIHBhdHRlcm5zOiBzdHJpbmdbXSwgYmFzZURpcjogc3RyaW5nKTogYm9vbGVhbiB7XG5cdGNvbnN0IHJlbCA9IHRvUG9zaXhQYXRoKHJlbGF0aXZlKGJhc2VEaXIsIGZpbGVQYXRoKSk7XG5cdGNvbnN0IG5hbWUgPSBiYXNlbmFtZShmaWxlUGF0aCk7XG5cdGNvbnN0IGZpbGVQYXRoUG9zaXggPSB0b1Bvc2l4UGF0aChmaWxlUGF0aCk7XG5cdGNvbnN0IGlzU2tpbGxGaWxlID0gbmFtZSA9PT0gXCJTS0lMTC5tZFwiO1xuXHRjb25zdCBwYXJlbnREaXIgPSBpc1NraWxsRmlsZSA/IGRpcm5hbWUoZmlsZVBhdGgpIDogdW5kZWZpbmVkO1xuXHRjb25zdCBwYXJlbnRSZWwgPSBpc1NraWxsRmlsZSA/IHRvUG9zaXhQYXRoKHJlbGF0aXZlKGJhc2VEaXIsIHBhcmVudERpciEpKSA6IHVuZGVmaW5lZDtcblx0Y29uc3QgcGFyZW50TmFtZSA9IGlzU2tpbGxGaWxlID8gYmFzZW5hbWUocGFyZW50RGlyISkgOiB1bmRlZmluZWQ7XG5cdGNvbnN0IHBhcmVudERpclBvc2l4ID0gaXNTa2lsbEZpbGUgPyB0b1Bvc2l4UGF0aChwYXJlbnREaXIhKSA6IHVuZGVmaW5lZDtcblxuXHRyZXR1cm4gcGF0dGVybnMuc29tZSgocGF0dGVybikgPT4ge1xuXHRcdGNvbnN0IG5vcm1hbGl6ZWRQYXR0ZXJuID0gdG9Qb3NpeFBhdGgocGF0dGVybik7XG5cdFx0aWYgKFxuXHRcdFx0bWluaW1hdGNoKHJlbCwgbm9ybWFsaXplZFBhdHRlcm4pIHx8XG5cdFx0XHRtaW5pbWF0Y2gobmFtZSwgbm9ybWFsaXplZFBhdHRlcm4pIHx8XG5cdFx0XHRtaW5pbWF0Y2goZmlsZVBhdGhQb3NpeCwgbm9ybWFsaXplZFBhdHRlcm4pXG5cdFx0KSB7XG5cdFx0XHRyZXR1cm4gdHJ1ZTtcblx0XHR9XG5cdFx0aWYgKCFpc1NraWxsRmlsZSkgcmV0dXJuIGZhbHNlO1xuXHRcdHJldHVybiAoXG5cdFx0XHRtaW5pbWF0Y2gocGFyZW50UmVsISwgbm9ybWFsaXplZFBhdHRlcm4pIHx8XG5cdFx0XHRtaW5pbWF0Y2gocGFyZW50TmFtZSEsIG5vcm1hbGl6ZWRQYXR0ZXJuKSB8fFxuXHRcdFx0bWluaW1hdGNoKHBhcmVudERpclBvc2l4ISwgbm9ybWFsaXplZFBhdHRlcm4pXG5cdFx0KTtcblx0fSk7XG59XG5cbmZ1bmN0aW9uIG5vcm1hbGl6ZUV4YWN0UGF0dGVybihwYXR0ZXJuOiBzdHJpbmcpOiBzdHJpbmcge1xuXHRjb25zdCBub3JtYWxpemVkID0gcGF0dGVybi5zdGFydHNXaXRoKFwiLi9cIikgfHwgcGF0dGVybi5zdGFydHNXaXRoKFwiLlxcXFxcIikgPyBwYXR0ZXJuLnNsaWNlKDIpIDogcGF0dGVybjtcblx0cmV0dXJuIHRvUG9zaXhQYXRoKG5vcm1hbGl6ZWQpO1xufVxuXG5mdW5jdGlvbiBtYXRjaGVzQW55RXhhY3RQYXR0ZXJuKGZpbGVQYXRoOiBzdHJpbmcsIHBhdHRlcm5zOiBzdHJpbmdbXSwgYmFzZURpcjogc3RyaW5nKTogYm9vbGVhbiB7XG5cdGlmIChwYXR0ZXJucy5sZW5ndGggPT09IDApIHJldHVybiBmYWxzZTtcblx0Y29uc3QgcmVsID0gdG9Qb3NpeFBhdGgocmVsYXRpdmUoYmFzZURpciwgZmlsZVBhdGgpKTtcblx0Y29uc3QgbmFtZSA9IGJhc2VuYW1lKGZpbGVQYXRoKTtcblx0Y29uc3QgZmlsZVBhdGhQb3NpeCA9IHRvUG9zaXhQYXRoKGZpbGVQYXRoKTtcblx0Y29uc3QgaXNTa2lsbEZpbGUgPSBuYW1lID09PSBcIlNLSUxMLm1kXCI7XG5cdGNvbnN0IHBhcmVudERpciA9IGlzU2tpbGxGaWxlID8gZGlybmFtZShmaWxlUGF0aCkgOiB1bmRlZmluZWQ7XG5cdGNvbnN0IHBhcmVudFJlbCA9IGlzU2tpbGxGaWxlID8gdG9Qb3NpeFBhdGgocmVsYXRpdmUoYmFzZURpciwgcGFyZW50RGlyISkpIDogdW5kZWZpbmVkO1xuXHRjb25zdCBwYXJlbnREaXJQb3NpeCA9IGlzU2tpbGxGaWxlID8gdG9Qb3NpeFBhdGgocGFyZW50RGlyISkgOiB1bmRlZmluZWQ7XG5cblx0cmV0dXJuIHBhdHRlcm5zLnNvbWUoKHBhdHRlcm4pID0+IHtcblx0XHRjb25zdCBub3JtYWxpemVkID0gbm9ybWFsaXplRXhhY3RQYXR0ZXJuKHBhdHRlcm4pO1xuXHRcdGlmIChub3JtYWxpemVkID09PSByZWwgfHwgbm9ybWFsaXplZCA9PT0gZmlsZVBhdGhQb3NpeCkge1xuXHRcdFx0cmV0dXJuIHRydWU7XG5cdFx0fVxuXHRcdGlmICghaXNTa2lsbEZpbGUpIHJldHVybiBmYWxzZTtcblx0XHRyZXR1cm4gbm9ybWFsaXplZCA9PT0gcGFyZW50UmVsIHx8IG5vcm1hbGl6ZWQgPT09IHBhcmVudERpclBvc2l4O1xuXHR9KTtcbn1cblxuZnVuY3Rpb24gZ2V0T3ZlcnJpZGVQYXR0ZXJucyhlbnRyaWVzOiBzdHJpbmdbXSk6IHN0cmluZ1tdIHtcblx0cmV0dXJuIGVudHJpZXMuZmlsdGVyKChwYXR0ZXJuKSA9PiBwYXR0ZXJuLnN0YXJ0c1dpdGgoXCIhXCIpIHx8IHBhdHRlcm4uc3RhcnRzV2l0aChcIitcIikgfHwgcGF0dGVybi5zdGFydHNXaXRoKFwiLVwiKSk7XG59XG5cbmZ1bmN0aW9uIGlzRW5hYmxlZEJ5T3ZlcnJpZGVzKGZpbGVQYXRoOiBzdHJpbmcsIHBhdHRlcm5zOiBzdHJpbmdbXSwgYmFzZURpcjogc3RyaW5nKTogYm9vbGVhbiB7XG5cdGNvbnN0IG92ZXJyaWRlcyA9IGdldE92ZXJyaWRlUGF0dGVybnMocGF0dGVybnMpO1xuXHRjb25zdCBleGNsdWRlcyA9IG92ZXJyaWRlcy5maWx0ZXIoKHBhdHRlcm4pID0+IHBhdHRlcm4uc3RhcnRzV2l0aChcIiFcIikpLm1hcCgocGF0dGVybikgPT4gcGF0dGVybi5zbGljZSgxKSk7XG5cdGNvbnN0IGZvcmNlSW5jbHVkZXMgPSBvdmVycmlkZXMuZmlsdGVyKChwYXR0ZXJuKSA9PiBwYXR0ZXJuLnN0YXJ0c1dpdGgoXCIrXCIpKS5tYXAoKHBhdHRlcm4pID0+IHBhdHRlcm4uc2xpY2UoMSkpO1xuXHRjb25zdCBmb3JjZUV4Y2x1ZGVzID0gb3ZlcnJpZGVzLmZpbHRlcigocGF0dGVybikgPT4gcGF0dGVybi5zdGFydHNXaXRoKFwiLVwiKSkubWFwKChwYXR0ZXJuKSA9PiBwYXR0ZXJuLnNsaWNlKDEpKTtcblxuXHRsZXQgZW5hYmxlZCA9IHRydWU7XG5cdGlmIChleGNsdWRlcy5sZW5ndGggPiAwICYmIG1hdGNoZXNBbnlQYXR0ZXJuKGZpbGVQYXRoLCBleGNsdWRlcywgYmFzZURpcikpIHtcblx0XHRlbmFibGVkID0gZmFsc2U7XG5cdH1cblx0aWYgKGZvcmNlSW5jbHVkZXMubGVuZ3RoID4gMCAmJiBtYXRjaGVzQW55RXhhY3RQYXR0ZXJuKGZpbGVQYXRoLCBmb3JjZUluY2x1ZGVzLCBiYXNlRGlyKSkge1xuXHRcdGVuYWJsZWQgPSB0cnVlO1xuXHR9XG5cdGlmIChmb3JjZUV4Y2x1ZGVzLmxlbmd0aCA+IDAgJiYgbWF0Y2hlc0FueUV4YWN0UGF0dGVybihmaWxlUGF0aCwgZm9yY2VFeGNsdWRlcywgYmFzZURpcikpIHtcblx0XHRlbmFibGVkID0gZmFsc2U7XG5cdH1cblx0cmV0dXJuIGVuYWJsZWQ7XG59XG5cbi8qKlxuICogQXBwbHkgcGF0dGVybnMgdG8gcGF0aHMgYW5kIHJldHVybiBhIFNldCBvZiBlbmFibGVkIHBhdGhzLlxuICogUGF0dGVybiB0eXBlczpcbiAqIC0gUGxhaW4gcGF0dGVybnM6IGluY2x1ZGUgbWF0Y2hpbmcgcGF0aHNcbiAqIC0gYCFwYXR0ZXJuYDogZXhjbHVkZSBtYXRjaGluZyBwYXRoc1xuICogLSBgK3BhdGhgOiBmb3JjZS1pbmNsdWRlIGV4YWN0IHBhdGggKG92ZXJyaWRlcyBleGNsdXNpb25zKVxuICogLSBgLXBhdGhgOiBmb3JjZS1leGNsdWRlIGV4YWN0IHBhdGggKG92ZXJyaWRlcyBmb3JjZS1pbmNsdWRlcylcbiAqL1xuZnVuY3Rpb24gYXBwbHlQYXR0ZXJucyhhbGxQYXRoczogc3RyaW5nW10sIHBhdHRlcm5zOiBzdHJpbmdbXSwgYmFzZURpcjogc3RyaW5nKTogU2V0PHN0cmluZz4ge1xuXHRjb25zdCBpbmNsdWRlczogc3RyaW5nW10gPSBbXTtcblx0Y29uc3QgZXhjbHVkZXM6IHN0cmluZ1tdID0gW107XG5cdGNvbnN0IGZvcmNlSW5jbHVkZXM6IHN0cmluZ1tdID0gW107XG5cdGNvbnN0IGZvcmNlRXhjbHVkZXM6IHN0cmluZ1tdID0gW107XG5cblx0Zm9yIChjb25zdCBwIG9mIHBhdHRlcm5zKSB7XG5cdFx0aWYgKHAuc3RhcnRzV2l0aChcIitcIikpIHtcblx0XHRcdGZvcmNlSW5jbHVkZXMucHVzaChwLnNsaWNlKDEpKTtcblx0XHR9IGVsc2UgaWYgKHAuc3RhcnRzV2l0aChcIi1cIikpIHtcblx0XHRcdGZvcmNlRXhjbHVkZXMucHVzaChwLnNsaWNlKDEpKTtcblx0XHR9IGVsc2UgaWYgKHAuc3RhcnRzV2l0aChcIiFcIikpIHtcblx0XHRcdGV4Y2x1ZGVzLnB1c2gocC5zbGljZSgxKSk7XG5cdFx0fSBlbHNlIHtcblx0XHRcdGluY2x1ZGVzLnB1c2gocCk7XG5cdFx0fVxuXHR9XG5cblx0Ly8gU3RlcCAxOiBBcHBseSBpbmNsdWRlcyAob3IgYWxsIGlmIG5vIGluY2x1ZGVzKVxuXHRsZXQgcmVzdWx0OiBzdHJpbmdbXTtcblx0aWYgKGluY2x1ZGVzLmxlbmd0aCA9PT0gMCkge1xuXHRcdHJlc3VsdCA9IFsuLi5hbGxQYXRoc107XG5cdH0gZWxzZSB7XG5cdFx0cmVzdWx0ID0gYWxsUGF0aHMuZmlsdGVyKChmaWxlUGF0aCkgPT4gbWF0Y2hlc0FueVBhdHRlcm4oZmlsZVBhdGgsIGluY2x1ZGVzLCBiYXNlRGlyKSk7XG5cdH1cblxuXHQvLyBTdGVwIDI6IEFwcGx5IGV4Y2x1ZGVzXG5cdGlmIChleGNsdWRlcy5sZW5ndGggPiAwKSB7XG5cdFx0cmVzdWx0ID0gcmVzdWx0LmZpbHRlcigoZmlsZVBhdGgpID0+ICFtYXRjaGVzQW55UGF0dGVybihmaWxlUGF0aCwgZXhjbHVkZXMsIGJhc2VEaXIpKTtcblx0fVxuXG5cdC8vIFN0ZXAgMzogRm9yY2UtaW5jbHVkZSAoYWRkIGJhY2sgZnJvbSBhbGxQYXRocywgb3ZlcnJpZGluZyBleGNsdXNpb25zKVxuXHRpZiAoZm9yY2VJbmNsdWRlcy5sZW5ndGggPiAwKSB7XG5cdFx0Zm9yIChjb25zdCBmaWxlUGF0aCBvZiBhbGxQYXRocykge1xuXHRcdFx0aWYgKCFyZXN1bHQuaW5jbHVkZXMoZmlsZVBhdGgpICYmIG1hdGNoZXNBbnlFeGFjdFBhdHRlcm4oZmlsZVBhdGgsIGZvcmNlSW5jbHVkZXMsIGJhc2VEaXIpKSB7XG5cdFx0XHRcdHJlc3VsdC5wdXNoKGZpbGVQYXRoKTtcblx0XHRcdH1cblx0XHR9XG5cdH1cblxuXHQvLyBTdGVwIDQ6IEZvcmNlLWV4Y2x1ZGUgKHJlbW92ZSBldmVuIGlmIGluY2x1ZGVkIG9yIGZvcmNlLWluY2x1ZGVkKVxuXHRpZiAoZm9yY2VFeGNsdWRlcy5sZW5ndGggPiAwKSB7XG5cdFx0cmVzdWx0ID0gcmVzdWx0LmZpbHRlcigoZmlsZVBhdGgpID0+ICFtYXRjaGVzQW55RXhhY3RQYXR0ZXJuKGZpbGVQYXRoLCBmb3JjZUV4Y2x1ZGVzLCBiYXNlRGlyKSk7XG5cdH1cblxuXHRyZXR1cm4gbmV3IFNldChyZXN1bHQpO1xufVxuXG5leHBvcnQgY2xhc3MgRGVmYXVsdFBhY2thZ2VNYW5hZ2VyIGltcGxlbWVudHMgUGFja2FnZU1hbmFnZXIge1xuXHRwcml2YXRlIGN3ZDogc3RyaW5nO1xuXHRwcml2YXRlIGFnZW50RGlyOiBzdHJpbmc7XG5cdHByaXZhdGUgc2V0dGluZ3NNYW5hZ2VyOiBTZXR0aW5nc01hbmFnZXI7XG5cdHByaXZhdGUgZ2xvYmFsTnBtUm9vdDogc3RyaW5nIHwgdW5kZWZpbmVkO1xuXHRwcml2YXRlIGdsb2JhbE5wbVJvb3RDb21tYW5kS2V5OiBzdHJpbmcgfCB1bmRlZmluZWQ7XG5cdHByaXZhdGUgcHJvZ3Jlc3NDYWxsYmFjazogUHJvZ3Jlc3NDYWxsYmFjayB8IHVuZGVmaW5lZDtcblxuXHRjb25zdHJ1Y3RvcihvcHRpb25zOiBQYWNrYWdlTWFuYWdlck9wdGlvbnMpIHtcblx0XHR0aGlzLmN3ZCA9IG9wdGlvbnMuY3dkO1xuXHRcdHRoaXMuYWdlbnREaXIgPSBvcHRpb25zLmFnZW50RGlyO1xuXHRcdHRoaXMuc2V0dGluZ3NNYW5hZ2VyID0gb3B0aW9ucy5zZXR0aW5nc01hbmFnZXI7XG5cdH1cblxuXHRzZXRQcm9ncmVzc0NhbGxiYWNrKGNhbGxiYWNrOiBQcm9ncmVzc0NhbGxiYWNrIHwgdW5kZWZpbmVkKTogdm9pZCB7XG5cdFx0dGhpcy5wcm9ncmVzc0NhbGxiYWNrID0gY2FsbGJhY2s7XG5cdH1cblxuXHRhZGRTb3VyY2VUb1NldHRpbmdzKHNvdXJjZTogc3RyaW5nLCBvcHRpb25zPzogeyBsb2NhbD86IGJvb2xlYW4gfSk6IGJvb2xlYW4ge1xuXHRcdGNvbnN0IHNjb3BlOiBTb3VyY2VTY29wZSA9IG9wdGlvbnM/LmxvY2FsID8gXCJwcm9qZWN0XCIgOiBcInVzZXJcIjtcblx0XHRjb25zdCBjdXJyZW50U2V0dGluZ3MgPVxuXHRcdFx0c2NvcGUgPT09IFwicHJvamVjdFwiID8gdGhpcy5zZXR0aW5nc01hbmFnZXIuZ2V0UHJvamVjdFNldHRpbmdzKCkgOiB0aGlzLnNldHRpbmdzTWFuYWdlci5nZXRHbG9iYWxTZXR0aW5ncygpO1xuXHRcdGNvbnN0IGN1cnJlbnRQYWNrYWdlcyA9IGN1cnJlbnRTZXR0aW5ncy5wYWNrYWdlcyA/PyBbXTtcblx0XHRjb25zdCBub3JtYWxpemVkU291cmNlID0gdGhpcy5ub3JtYWxpemVQYWNrYWdlU291cmNlRm9yU2V0dGluZ3Moc291cmNlLCBzY29wZSk7XG5cdFx0Y29uc3QgZXhpc3RzID0gY3VycmVudFBhY2thZ2VzLnNvbWUoKGV4aXN0aW5nKSA9PiB0aGlzLnBhY2thZ2VTb3VyY2VzTWF0Y2goZXhpc3RpbmcsIHNvdXJjZSwgc2NvcGUpKTtcblx0XHRpZiAoZXhpc3RzKSB7XG5cdFx0XHRyZXR1cm4gZmFsc2U7XG5cdFx0fVxuXHRcdGNvbnN0IG5leHRQYWNrYWdlcyA9IFsuLi5jdXJyZW50UGFja2FnZXMsIG5vcm1hbGl6ZWRTb3VyY2VdO1xuXHRcdGlmIChzY29wZSA9PT0gXCJwcm9qZWN0XCIpIHtcblx0XHRcdHRoaXMuc2V0dGluZ3NNYW5hZ2VyLnNldFByb2plY3RQYWNrYWdlcyhuZXh0UGFja2FnZXMpO1xuXHRcdH0gZWxzZSB7XG5cdFx0XHR0aGlzLnNldHRpbmdzTWFuYWdlci5zZXRQYWNrYWdlcyhuZXh0UGFja2FnZXMpO1xuXHRcdH1cblx0XHRyZXR1cm4gdHJ1ZTtcblx0fVxuXG5cdHJlbW92ZVNvdXJjZUZyb21TZXR0aW5ncyhzb3VyY2U6IHN0cmluZywgb3B0aW9ucz86IHsgbG9jYWw/OiBib29sZWFuIH0pOiBib29sZWFuIHtcblx0XHRjb25zdCBzY29wZTogU291cmNlU2NvcGUgPSBvcHRpb25zPy5sb2NhbCA/IFwicHJvamVjdFwiIDogXCJ1c2VyXCI7XG5cdFx0Y29uc3QgY3VycmVudFNldHRpbmdzID1cblx0XHRcdHNjb3BlID09PSBcInByb2plY3RcIiA/IHRoaXMuc2V0dGluZ3NNYW5hZ2VyLmdldFByb2plY3RTZXR0aW5ncygpIDogdGhpcy5zZXR0aW5nc01hbmFnZXIuZ2V0R2xvYmFsU2V0dGluZ3MoKTtcblx0XHRjb25zdCBjdXJyZW50UGFja2FnZXMgPSBjdXJyZW50U2V0dGluZ3MucGFja2FnZXMgPz8gW107XG5cdFx0Y29uc3QgbmV4dFBhY2thZ2VzID0gY3VycmVudFBhY2thZ2VzLmZpbHRlcigoZXhpc3RpbmcpID0+ICF0aGlzLnBhY2thZ2VTb3VyY2VzTWF0Y2goZXhpc3RpbmcsIHNvdXJjZSwgc2NvcGUpKTtcblx0XHRjb25zdCBjaGFuZ2VkID0gbmV4dFBhY2thZ2VzLmxlbmd0aCAhPT0gY3VycmVudFBhY2thZ2VzLmxlbmd0aDtcblx0XHRpZiAoIWNoYW5nZWQpIHtcblx0XHRcdHJldHVybiBmYWxzZTtcblx0XHR9XG5cdFx0aWYgKHNjb3BlID09PSBcInByb2plY3RcIikge1xuXHRcdFx0dGhpcy5zZXR0aW5nc01hbmFnZXIuc2V0UHJvamVjdFBhY2thZ2VzKG5leHRQYWNrYWdlcyk7XG5cdFx0fSBlbHNlIHtcblx0XHRcdHRoaXMuc2V0dGluZ3NNYW5hZ2VyLnNldFBhY2thZ2VzKG5leHRQYWNrYWdlcyk7XG5cdFx0fVxuXHRcdHJldHVybiB0cnVlO1xuXHR9XG5cblx0Z2V0SW5zdGFsbGVkUGF0aChzb3VyY2U6IHN0cmluZywgc2NvcGU6IFwidXNlclwiIHwgXCJwcm9qZWN0XCIpOiBzdHJpbmcgfCB1bmRlZmluZWQge1xuXHRcdGNvbnN0IHBhcnNlZCA9IHRoaXMucGFyc2VTb3VyY2Uoc291cmNlKTtcblx0XHRpZiAocGFyc2VkLnR5cGUgPT09IFwibnBtXCIpIHtcblx0XHRcdGNvbnN0IHBhdGggPSB0aGlzLmdldE5wbUluc3RhbGxQYXRoKHBhcnNlZCwgc2NvcGUpO1xuXHRcdFx0cmV0dXJuIGV4aXN0c1N5bmMocGF0aCkgPyBwYXRoIDogdW5kZWZpbmVkO1xuXHRcdH1cblx0XHRpZiAocGFyc2VkLnR5cGUgPT09IFwiZ2l0XCIpIHtcblx0XHRcdGNvbnN0IHBhdGggPSB0aGlzLmdldEdpdEluc3RhbGxQYXRoKHBhcnNlZCwgc2NvcGUpO1xuXHRcdFx0cmV0dXJuIGV4aXN0c1N5bmMocGF0aCkgPyBwYXRoIDogdW5kZWZpbmVkO1xuXHRcdH1cblx0XHRpZiAocGFyc2VkLnR5cGUgPT09IFwibG9jYWxcIikge1xuXHRcdFx0Y29uc3QgYmFzZURpciA9IHRoaXMuZ2V0QmFzZURpckZvclNjb3BlKHNjb3BlKTtcblx0XHRcdGNvbnN0IHBhdGggPSB0aGlzLnJlc29sdmVQYXRoRnJvbUJhc2UocGFyc2VkLnBhdGgsIGJhc2VEaXIpO1xuXHRcdFx0cmV0dXJuIGV4aXN0c1N5bmMocGF0aCkgPyBwYXRoIDogdW5kZWZpbmVkO1xuXHRcdH1cblx0XHRyZXR1cm4gdW5kZWZpbmVkO1xuXHR9XG5cblx0cHJpdmF0ZSBlbWl0UHJvZ3Jlc3MoZXZlbnQ6IFByb2dyZXNzRXZlbnQpOiB2b2lkIHtcblx0XHR0aGlzLnByb2dyZXNzQ2FsbGJhY2s/LihldmVudCk7XG5cdH1cblxuXHRwcml2YXRlIGFzeW5jIHdpdGhQcm9ncmVzcyhcblx0XHRhY3Rpb246IFByb2dyZXNzRXZlbnRbXCJhY3Rpb25cIl0sXG5cdFx0c291cmNlOiBzdHJpbmcsXG5cdFx0bWVzc2FnZTogc3RyaW5nLFxuXHRcdG9wZXJhdGlvbjogKCkgPT4gUHJvbWlzZTx2b2lkPixcblx0KTogUHJvbWlzZTx2b2lkPiB7XG5cdFx0dGhpcy5lbWl0UHJvZ3Jlc3MoeyB0eXBlOiBcInN0YXJ0XCIsIGFjdGlvbiwgc291cmNlLCBtZXNzYWdlIH0pO1xuXHRcdHRyeSB7XG5cdFx0XHRhd2FpdCBvcGVyYXRpb24oKTtcblx0XHRcdHRoaXMuZW1pdFByb2dyZXNzKHsgdHlwZTogXCJjb21wbGV0ZVwiLCBhY3Rpb24sIHNvdXJjZSB9KTtcblx0XHR9IGNhdGNoIChlcnJvcikge1xuXHRcdFx0Y29uc3QgZXJyb3JNZXNzYWdlID0gZXJyb3IgaW5zdGFuY2VvZiBFcnJvciA/IGVycm9yLm1lc3NhZ2UgOiBTdHJpbmcoZXJyb3IpO1xuXHRcdFx0dGhpcy5lbWl0UHJvZ3Jlc3MoeyB0eXBlOiBcImVycm9yXCIsIGFjdGlvbiwgc291cmNlLCBtZXNzYWdlOiBlcnJvck1lc3NhZ2UgfSk7XG5cdFx0XHR0aHJvdyBlcnJvcjtcblx0XHR9XG5cdH1cblxuXHRhc3luYyByZXNvbHZlKG9uTWlzc2luZz86IChzb3VyY2U6IHN0cmluZykgPT4gUHJvbWlzZTxNaXNzaW5nU291cmNlQWN0aW9uPik6IFByb21pc2U8UmVzb2x2ZWRQYXRocz4ge1xuXHRcdGNvbnN0IGFjY3VtdWxhdG9yID0gdGhpcy5jcmVhdGVBY2N1bXVsYXRvcigpO1xuXHRcdGNvbnN0IGdsb2JhbFNldHRpbmdzID0gdGhpcy5zZXR0aW5nc01hbmFnZXIuZ2V0R2xvYmFsU2V0dGluZ3MoKTtcblx0XHRjb25zdCBwcm9qZWN0U2V0dGluZ3MgPSB0aGlzLnNldHRpbmdzTWFuYWdlci5nZXRQcm9qZWN0U2V0dGluZ3MoKTtcblxuXHRcdC8vIENvbGxlY3QgYWxsIHBhY2thZ2VzIHdpdGggc2NvcGUgKHByb2plY3QgZmlyc3Qgc28gY3dkIHJlc291cmNlcyB3aW4gY29sbGlzaW9ucylcblx0XHRjb25zdCBhbGxQYWNrYWdlczogQXJyYXk8eyBwa2c6IFBhY2thZ2VTb3VyY2U7IHNjb3BlOiBTb3VyY2VTY29wZSB9PiA9IFtdO1xuXHRcdGZvciAoY29uc3QgcGtnIG9mIHByb2plY3RTZXR0aW5ncy5wYWNrYWdlcyA/PyBbXSkge1xuXHRcdFx0YWxsUGFja2FnZXMucHVzaCh7IHBrZywgc2NvcGU6IFwicHJvamVjdFwiIH0pO1xuXHRcdH1cblx0XHRmb3IgKGNvbnN0IHBrZyBvZiBnbG9iYWxTZXR0aW5ncy5wYWNrYWdlcyA/PyBbXSkge1xuXHRcdFx0YWxsUGFja2FnZXMucHVzaCh7IHBrZywgc2NvcGU6IFwidXNlclwiIH0pO1xuXHRcdH1cblxuXHRcdC8vIERlZHVwZTogcHJvamVjdCBzY29wZSB3aW5zIG92ZXIgZ2xvYmFsIGZvciBzYW1lIHBhY2thZ2UgaWRlbnRpdHlcblx0XHRjb25zdCBwYWNrYWdlU291cmNlcyA9IHRoaXMuZGVkdXBlUGFja2FnZXMoYWxsUGFja2FnZXMpO1xuXHRcdGF3YWl0IHRoaXMucmVzb2x2ZVBhY2thZ2VTb3VyY2VzKHBhY2thZ2VTb3VyY2VzLCBhY2N1bXVsYXRvciwgb25NaXNzaW5nKTtcblxuXHRcdGNvbnN0IGdsb2JhbEJhc2VEaXIgPSB0aGlzLmFnZW50RGlyO1xuXHRcdGNvbnN0IHByb2plY3RCYXNlRGlyID0gam9pbih0aGlzLmN3ZCwgQ09ORklHX0RJUl9OQU1FKTtcblxuXHRcdGZvciAoY29uc3QgcmVzb3VyY2VUeXBlIG9mIFJFU09VUkNFX1RZUEVTKSB7XG5cdFx0XHRjb25zdCB0YXJnZXQgPSB0aGlzLmdldFRhcmdldE1hcChhY2N1bXVsYXRvciwgcmVzb3VyY2VUeXBlKTtcblx0XHRcdGNvbnN0IGdsb2JhbEVudHJpZXMgPSAoZ2xvYmFsU2V0dGluZ3NbcmVzb3VyY2VUeXBlXSA/PyBbXSkgYXMgc3RyaW5nW107XG5cdFx0XHRjb25zdCBwcm9qZWN0RW50cmllcyA9IChwcm9qZWN0U2V0dGluZ3NbcmVzb3VyY2VUeXBlXSA/PyBbXSkgYXMgc3RyaW5nW107XG5cdFx0XHR0aGlzLnJlc29sdmVMb2NhbEVudHJpZXMoXG5cdFx0XHRcdHByb2plY3RFbnRyaWVzLFxuXHRcdFx0XHRyZXNvdXJjZVR5cGUsXG5cdFx0XHRcdHRhcmdldCxcblx0XHRcdFx0e1xuXHRcdFx0XHRcdHNvdXJjZTogXCJsb2NhbFwiLFxuXHRcdFx0XHRcdHNjb3BlOiBcInByb2plY3RcIixcblx0XHRcdFx0XHRvcmlnaW46IFwidG9wLWxldmVsXCIsXG5cdFx0XHRcdH0sXG5cdFx0XHRcdHByb2plY3RCYXNlRGlyLFxuXHRcdFx0KTtcblx0XHRcdHRoaXMucmVzb2x2ZUxvY2FsRW50cmllcyhcblx0XHRcdFx0Z2xvYmFsRW50cmllcyxcblx0XHRcdFx0cmVzb3VyY2VUeXBlLFxuXHRcdFx0XHR0YXJnZXQsXG5cdFx0XHRcdHtcblx0XHRcdFx0XHRzb3VyY2U6IFwibG9jYWxcIixcblx0XHRcdFx0XHRzY29wZTogXCJ1c2VyXCIsXG5cdFx0XHRcdFx0b3JpZ2luOiBcInRvcC1sZXZlbFwiLFxuXHRcdFx0XHR9LFxuXHRcdFx0XHRnbG9iYWxCYXNlRGlyLFxuXHRcdFx0KTtcblx0XHR9XG5cblx0XHR0aGlzLmFkZEF1dG9EaXNjb3ZlcmVkUmVzb3VyY2VzKGFjY3VtdWxhdG9yLCBnbG9iYWxTZXR0aW5ncywgcHJvamVjdFNldHRpbmdzLCBnbG9iYWxCYXNlRGlyLCBwcm9qZWN0QmFzZURpcik7XG5cblx0XHRyZXR1cm4gdGhpcy50b1Jlc29sdmVkUGF0aHMoYWNjdW11bGF0b3IpO1xuXHR9XG5cblx0YXN5bmMgcmVzb2x2ZUV4dGVuc2lvblNvdXJjZXMoXG5cdFx0c291cmNlczogc3RyaW5nW10sXG5cdFx0b3B0aW9ucz86IHsgbG9jYWw/OiBib29sZWFuOyB0ZW1wb3Jhcnk/OiBib29sZWFuIH0sXG5cdCk6IFByb21pc2U8UmVzb2x2ZWRQYXRocz4ge1xuXHRcdGNvbnN0IGFjY3VtdWxhdG9yID0gdGhpcy5jcmVhdGVBY2N1bXVsYXRvcigpO1xuXHRcdGNvbnN0IHNjb3BlOiBTb3VyY2VTY29wZSA9IG9wdGlvbnM/LnRlbXBvcmFyeSA/IFwidGVtcG9yYXJ5XCIgOiBvcHRpb25zPy5sb2NhbCA/IFwicHJvamVjdFwiIDogXCJ1c2VyXCI7XG5cdFx0Y29uc3QgcGFja2FnZVNvdXJjZXMgPSBzb3VyY2VzLm1hcCgoc291cmNlKSA9PiAoeyBwa2c6IHNvdXJjZSBhcyBQYWNrYWdlU291cmNlLCBzY29wZSB9KSk7XG5cdFx0YXdhaXQgdGhpcy5yZXNvbHZlUGFja2FnZVNvdXJjZXMocGFja2FnZVNvdXJjZXMsIGFjY3VtdWxhdG9yKTtcblx0XHRyZXR1cm4gdGhpcy50b1Jlc29sdmVkUGF0aHMoYWNjdW11bGF0b3IpO1xuXHR9XG5cblx0bGlzdENvbmZpZ3VyZWRQYWNrYWdlcygpOiBDb25maWd1cmVkUGFja2FnZVtdIHtcblx0XHRjb25zdCBnbG9iYWxTZXR0aW5ncyA9IHRoaXMuc2V0dGluZ3NNYW5hZ2VyLmdldEdsb2JhbFNldHRpbmdzKCk7XG5cdFx0Y29uc3QgcHJvamVjdFNldHRpbmdzID0gdGhpcy5zZXR0aW5nc01hbmFnZXIuZ2V0UHJvamVjdFNldHRpbmdzKCk7XG5cdFx0Y29uc3QgY29uZmlndXJlZFBhY2thZ2VzOiBDb25maWd1cmVkUGFja2FnZVtdID0gW107XG5cblx0XHRmb3IgKGNvbnN0IHBrZyBvZiBnbG9iYWxTZXR0aW5ncy5wYWNrYWdlcyA/PyBbXSkge1xuXHRcdFx0Y29uc3Qgc291cmNlID0gdHlwZW9mIHBrZyA9PT0gXCJzdHJpbmdcIiA/IHBrZyA6IHBrZy5zb3VyY2U7XG5cdFx0XHRjb25maWd1cmVkUGFja2FnZXMucHVzaCh7XG5cdFx0XHRcdHNvdXJjZSxcblx0XHRcdFx0c2NvcGU6IFwidXNlclwiLFxuXHRcdFx0XHRmaWx0ZXJlZDogdHlwZW9mIHBrZyA9PT0gXCJvYmplY3RcIixcblx0XHRcdFx0aW5zdGFsbGVkUGF0aDogdGhpcy5nZXRJbnN0YWxsZWRQYXRoKHNvdXJjZSwgXCJ1c2VyXCIpLFxuXHRcdFx0fSk7XG5cdFx0fVxuXG5cdFx0Zm9yIChjb25zdCBwa2cgb2YgcHJvamVjdFNldHRpbmdzLnBhY2thZ2VzID8/IFtdKSB7XG5cdFx0XHRjb25zdCBzb3VyY2UgPSB0eXBlb2YgcGtnID09PSBcInN0cmluZ1wiID8gcGtnIDogcGtnLnNvdXJjZTtcblx0XHRcdGNvbmZpZ3VyZWRQYWNrYWdlcy5wdXNoKHtcblx0XHRcdFx0c291cmNlLFxuXHRcdFx0XHRzY29wZTogXCJwcm9qZWN0XCIsXG5cdFx0XHRcdGZpbHRlcmVkOiB0eXBlb2YgcGtnID09PSBcIm9iamVjdFwiLFxuXHRcdFx0XHRpbnN0YWxsZWRQYXRoOiB0aGlzLmdldEluc3RhbGxlZFBhdGgoc291cmNlLCBcInByb2plY3RcIiksXG5cdFx0XHR9KTtcblx0XHR9XG5cblx0XHRyZXR1cm4gY29uZmlndXJlZFBhY2thZ2VzO1xuXHR9XG5cblx0YXN5bmMgaW5zdGFsbChzb3VyY2U6IHN0cmluZywgb3B0aW9ucz86IHsgbG9jYWw/OiBib29sZWFuIH0pOiBQcm9taXNlPHZvaWQ+IHtcblx0XHRjb25zdCBwYXJzZWQgPSB0aGlzLnBhcnNlU291cmNlKHNvdXJjZSk7XG5cdFx0Y29uc3Qgc2NvcGU6IFNvdXJjZVNjb3BlID0gb3B0aW9ucz8ubG9jYWwgPyBcInByb2plY3RcIiA6IFwidXNlclwiO1xuXHRcdGF3YWl0IHRoaXMud2l0aFByb2dyZXNzKFwiaW5zdGFsbFwiLCBzb3VyY2UsIGBJbnN0YWxsaW5nICR7c291cmNlfS4uLmAsIGFzeW5jICgpID0+IHtcblx0XHRcdGlmIChwYXJzZWQudHlwZSA9PT0gXCJucG1cIikge1xuXHRcdFx0XHRhd2FpdCB0aGlzLmluc3RhbGxOcG0ocGFyc2VkLCBzY29wZSwgZmFsc2UpO1xuXHRcdFx0XHRyZXR1cm47XG5cdFx0XHR9XG5cdFx0XHRpZiAocGFyc2VkLnR5cGUgPT09IFwiZ2l0XCIpIHtcblx0XHRcdFx0YXdhaXQgdGhpcy5pbnN0YWxsR2l0KHBhcnNlZCwgc2NvcGUpO1xuXHRcdFx0XHRyZXR1cm47XG5cdFx0XHR9XG5cdFx0XHRpZiAocGFyc2VkLnR5cGUgPT09IFwibG9jYWxcIikge1xuXHRcdFx0XHRjb25zdCByZXNvbHZlZCA9IHRoaXMucmVzb2x2ZVBhdGgocGFyc2VkLnBhdGgpO1xuXHRcdFx0XHRpZiAoIWV4aXN0c1N5bmMocmVzb2x2ZWQpKSB7XG5cdFx0XHRcdFx0dGhyb3cgbmV3IEVycm9yKGBQYXRoIGRvZXMgbm90IGV4aXN0OiAke3Jlc29sdmVkfWApO1xuXHRcdFx0XHR9XG5cdFx0XHRcdHJldHVybjtcblx0XHRcdH1cblx0XHRcdHRocm93IG5ldyBFcnJvcihgVW5zdXBwb3J0ZWQgaW5zdGFsbCBzb3VyY2U6ICR7c291cmNlfWApO1xuXHRcdH0pO1xuXHR9XG5cblx0YXN5bmMgaW5zdGFsbEFuZFBlcnNpc3Qoc291cmNlOiBzdHJpbmcsIG9wdGlvbnM/OiB7IGxvY2FsPzogYm9vbGVhbiB9KTogUHJvbWlzZTx2b2lkPiB7XG5cdFx0YXdhaXQgdGhpcy5pbnN0YWxsKHNvdXJjZSwgb3B0aW9ucyk7XG5cdFx0dGhpcy5hZGRTb3VyY2VUb1NldHRpbmdzKHNvdXJjZSwgb3B0aW9ucyk7XG5cdH1cblxuXHRhc3luYyByZW1vdmUoc291cmNlOiBzdHJpbmcsIG9wdGlvbnM/OiB7IGxvY2FsPzogYm9vbGVhbiB9KTogUHJvbWlzZTx2b2lkPiB7XG5cdFx0Y29uc3QgcGFyc2VkID0gdGhpcy5wYXJzZVNvdXJjZShzb3VyY2UpO1xuXHRcdGNvbnN0IHNjb3BlOiBTb3VyY2VTY29wZSA9IG9wdGlvbnM/LmxvY2FsID8gXCJwcm9qZWN0XCIgOiBcInVzZXJcIjtcblx0XHRhd2FpdCB0aGlzLndpdGhQcm9ncmVzcyhcInJlbW92ZVwiLCBzb3VyY2UsIGBSZW1vdmluZyAke3NvdXJjZX0uLi5gLCBhc3luYyAoKSA9PiB7XG5cdFx0XHRpZiAocGFyc2VkLnR5cGUgPT09IFwibnBtXCIpIHtcblx0XHRcdFx0YXdhaXQgdGhpcy51bmluc3RhbGxOcG0ocGFyc2VkLCBzY29wZSk7XG5cdFx0XHRcdHJldHVybjtcblx0XHRcdH1cblx0XHRcdGlmIChwYXJzZWQudHlwZSA9PT0gXCJnaXRcIikge1xuXHRcdFx0XHRhd2FpdCB0aGlzLnJlbW92ZUdpdChwYXJzZWQsIHNjb3BlKTtcblx0XHRcdFx0cmV0dXJuO1xuXHRcdFx0fVxuXHRcdFx0aWYgKHBhcnNlZC50eXBlID09PSBcImxvY2FsXCIpIHtcblx0XHRcdFx0cmV0dXJuO1xuXHRcdFx0fVxuXHRcdFx0dGhyb3cgbmV3IEVycm9yKGBVbnN1cHBvcnRlZCByZW1vdmUgc291cmNlOiAke3NvdXJjZX1gKTtcblx0XHR9KTtcblx0fVxuXG5cdGFzeW5jIHJlbW92ZUFuZFBlcnNpc3Qoc291cmNlOiBzdHJpbmcsIG9wdGlvbnM/OiB7IGxvY2FsPzogYm9vbGVhbiB9KTogUHJvbWlzZTxib29sZWFuPiB7XG5cdFx0YXdhaXQgdGhpcy5yZW1vdmUoc291cmNlLCBvcHRpb25zKTtcblx0XHRyZXR1cm4gdGhpcy5yZW1vdmVTb3VyY2VGcm9tU2V0dGluZ3Moc291cmNlLCBvcHRpb25zKTtcblx0fVxuXG5cdGFzeW5jIHVwZGF0ZShzb3VyY2U/OiBzdHJpbmcpOiBQcm9taXNlPHZvaWQ+IHtcblx0XHRjb25zdCBnbG9iYWxTZXR0aW5ncyA9IHRoaXMuc2V0dGluZ3NNYW5hZ2VyLmdldEdsb2JhbFNldHRpbmdzKCk7XG5cdFx0Y29uc3QgcHJvamVjdFNldHRpbmdzID0gdGhpcy5zZXR0aW5nc01hbmFnZXIuZ2V0UHJvamVjdFNldHRpbmdzKCk7XG5cdFx0Y29uc3QgaWRlbnRpdHkgPSBzb3VyY2UgPyB0aGlzLmdldFBhY2thZ2VJZGVudGl0eShzb3VyY2UpIDogdW5kZWZpbmVkO1xuXHRcdGxldCBtYXRjaGVkID0gZmFsc2U7XG5cdFx0Y29uc3QgdXBkYXRlU291cmNlczogQ29uZmlndXJlZFVwZGF0ZVNvdXJjZVtdID0gW107XG5cblx0XHRmb3IgKGNvbnN0IHBrZyBvZiBnbG9iYWxTZXR0aW5ncy5wYWNrYWdlcyA/PyBbXSkge1xuXHRcdFx0Y29uc3Qgc291cmNlU3RyID0gdHlwZW9mIHBrZyA9PT0gXCJzdHJpbmdcIiA/IHBrZyA6IHBrZy5zb3VyY2U7XG5cdFx0XHRpZiAoaWRlbnRpdHkgJiYgdGhpcy5nZXRQYWNrYWdlSWRlbnRpdHkoc291cmNlU3RyLCBcInVzZXJcIikgIT09IGlkZW50aXR5KSBjb250aW51ZTtcblx0XHRcdG1hdGNoZWQgPSB0cnVlO1xuXHRcdFx0dXBkYXRlU291cmNlcy5wdXNoKHsgc291cmNlOiBzb3VyY2VTdHIsIHNjb3BlOiBcInVzZXJcIiB9KTtcblx0XHR9XG5cdFx0Zm9yIChjb25zdCBwa2cgb2YgcHJvamVjdFNldHRpbmdzLnBhY2thZ2VzID8/IFtdKSB7XG5cdFx0XHRjb25zdCBzb3VyY2VTdHIgPSB0eXBlb2YgcGtnID09PSBcInN0cmluZ1wiID8gcGtnIDogcGtnLnNvdXJjZTtcblx0XHRcdGlmIChpZGVudGl0eSAmJiB0aGlzLmdldFBhY2thZ2VJZGVudGl0eShzb3VyY2VTdHIsIFwicHJvamVjdFwiKSAhPT0gaWRlbnRpdHkpIGNvbnRpbnVlO1xuXHRcdFx0bWF0Y2hlZCA9IHRydWU7XG5cdFx0XHR1cGRhdGVTb3VyY2VzLnB1c2goeyBzb3VyY2U6IHNvdXJjZVN0ciwgc2NvcGU6IFwicHJvamVjdFwiIH0pO1xuXHRcdH1cblxuXHRcdGlmIChzb3VyY2UgJiYgIW1hdGNoZWQpIHtcblx0XHRcdHRocm93IG5ldyBFcnJvcihcblx0XHRcdFx0dGhpcy5idWlsZE5vTWF0Y2hpbmdQYWNrYWdlTWVzc2FnZShzb3VyY2UsIFtcblx0XHRcdFx0XHQuLi4oZ2xvYmFsU2V0dGluZ3MucGFja2FnZXMgPz8gW10pLFxuXHRcdFx0XHRcdC4uLihwcm9qZWN0U2V0dGluZ3MucGFja2FnZXMgPz8gW10pLFxuXHRcdFx0XHRdKSxcblx0XHRcdCk7XG5cdFx0fVxuXG5cdFx0YXdhaXQgdGhpcy51cGRhdGVDb25maWd1cmVkU291cmNlcyh1cGRhdGVTb3VyY2VzKTtcblx0fVxuXG5cdHByaXZhdGUgYXN5bmMgdXBkYXRlQ29uZmlndXJlZFNvdXJjZXMoc291cmNlczogQ29uZmlndXJlZFVwZGF0ZVNvdXJjZVtdKTogUHJvbWlzZTx2b2lkPiB7XG5cdFx0aWYgKGlzT2ZmbGluZU1vZGVFbmFibGVkKCkgfHwgc291cmNlcy5sZW5ndGggPT09IDApIHtcblx0XHRcdHJldHVybjtcblx0XHR9XG5cblx0XHRjb25zdCBucG1DYW5kaWRhdGVzOiBOcG1VcGRhdGVUYXJnZXRbXSA9IFtdO1xuXHRcdGNvbnN0IGdpdENhbmRpZGF0ZXM6IEdpdFVwZGF0ZVRhcmdldFtdID0gW107XG5cblx0XHRmb3IgKGNvbnN0IGVudHJ5IG9mIHNvdXJjZXMpIHtcblx0XHRcdGNvbnN0IHBhcnNlZCA9IHRoaXMucGFyc2VTb3VyY2UoZW50cnkuc291cmNlKTtcblx0XHRcdGlmIChwYXJzZWQudHlwZSA9PT0gXCJsb2NhbFwiIHx8IHBhcnNlZC5waW5uZWQpIHtcblx0XHRcdFx0Y29udGludWU7XG5cdFx0XHR9XG5cdFx0XHRpZiAocGFyc2VkLnR5cGUgPT09IFwibnBtXCIpIHtcblx0XHRcdFx0bnBtQ2FuZGlkYXRlcy5wdXNoKHsgLi4uZW50cnksIHBhcnNlZCB9KTtcblx0XHRcdFx0Y29udGludWU7XG5cdFx0XHR9XG5cdFx0XHRnaXRDYW5kaWRhdGVzLnB1c2goeyAuLi5lbnRyeSwgcGFyc2VkIH0pO1xuXHRcdH1cblxuXHRcdGNvbnN0IG5wbUNoZWNrVGFza3MgPSBucG1DYW5kaWRhdGVzLm1hcCgoZW50cnkpID0+IGFzeW5jICgpID0+ICh7XG5cdFx0XHRlbnRyeSxcblx0XHRcdHNob3VsZFVwZGF0ZTogYXdhaXQgdGhpcy5zaG91bGRVcGRhdGVOcG1Tb3VyY2UoZW50cnkucGFyc2VkLCBlbnRyeS5zY29wZSksXG5cdFx0fSkpO1xuXHRcdGNvbnN0IG5wbUNoZWNrUmVzdWx0cyA9IGF3YWl0IHRoaXMucnVuV2l0aENvbmN1cnJlbmN5KG5wbUNoZWNrVGFza3MsIFVQREFURV9DSEVDS19DT05DVVJSRU5DWSk7XG5cdFx0Y29uc3QgdXNlck5wbVVwZGF0ZXM6IE5wbVVwZGF0ZVRhcmdldFtdID0gW107XG5cdFx0Y29uc3QgcHJvamVjdE5wbVVwZGF0ZXM6IE5wbVVwZGF0ZVRhcmdldFtdID0gW107XG5cdFx0Zm9yIChjb25zdCByZXN1bHQgb2YgbnBtQ2hlY2tSZXN1bHRzKSB7XG5cdFx0XHRpZiAoIXJlc3VsdC5zaG91bGRVcGRhdGUpIHtcblx0XHRcdFx0Y29udGludWU7XG5cdFx0XHR9XG5cdFx0XHRpZiAocmVzdWx0LmVudHJ5LnNjb3BlID09PSBcInVzZXJcIikge1xuXHRcdFx0XHR1c2VyTnBtVXBkYXRlcy5wdXNoKHJlc3VsdC5lbnRyeSk7XG5cdFx0XHR9IGVsc2Uge1xuXHRcdFx0XHRwcm9qZWN0TnBtVXBkYXRlcy5wdXNoKHJlc3VsdC5lbnRyeSk7XG5cdFx0XHR9XG5cdFx0fVxuXG5cdFx0Y29uc3QgdGFza3M6IFByb21pc2U8dm9pZD5bXSA9IFtdO1xuXHRcdGlmICh1c2VyTnBtVXBkYXRlcy5sZW5ndGggPiAwKSB7XG5cdFx0XHR0YXNrcy5wdXNoKHRoaXMudXBkYXRlTnBtQmF0Y2godXNlck5wbVVwZGF0ZXMsIFwidXNlclwiKSk7XG5cdFx0fVxuXHRcdGlmIChwcm9qZWN0TnBtVXBkYXRlcy5sZW5ndGggPiAwKSB7XG5cdFx0XHR0YXNrcy5wdXNoKHRoaXMudXBkYXRlTnBtQmF0Y2gocHJvamVjdE5wbVVwZGF0ZXMsIFwicHJvamVjdFwiKSk7XG5cdFx0fVxuXHRcdGlmIChnaXRDYW5kaWRhdGVzLmxlbmd0aCA+IDApIHtcblx0XHRcdGNvbnN0IGdpdFRhc2tzID0gZ2l0Q2FuZGlkYXRlcy5tYXAoXG5cdFx0XHRcdChlbnRyeSkgPT4gYXN5bmMgKCkgPT5cblx0XHRcdFx0XHR0aGlzLndpdGhQcm9ncmVzcyhcInVwZGF0ZVwiLCBlbnRyeS5zb3VyY2UsIGBVcGRhdGluZyAke2VudHJ5LnNvdXJjZX0uLi5gLCBhc3luYyAoKSA9PiB7XG5cdFx0XHRcdFx0XHRhd2FpdCB0aGlzLnVwZGF0ZUdpdChlbnRyeS5wYXJzZWQsIGVudHJ5LnNjb3BlKTtcblx0XHRcdFx0XHR9KSxcblx0XHRcdCk7XG5cdFx0XHR0YXNrcy5wdXNoKHRoaXMucnVuV2l0aENvbmN1cnJlbmN5KGdpdFRhc2tzLCBHSVRfVVBEQVRFX0NPTkNVUlJFTkNZKS50aGVuKCgpID0+IHt9KSk7XG5cdFx0fVxuXG5cdFx0YXdhaXQgUHJvbWlzZS5hbGwodGFza3MpO1xuXHR9XG5cblx0cHJpdmF0ZSBhc3luYyBzaG91bGRVcGRhdGVOcG1Tb3VyY2Uoc291cmNlOiBOcG1Tb3VyY2UsIHNjb3BlOiBJbnN0YWxsZWRTb3VyY2VTY29wZSk6IFByb21pc2U8Ym9vbGVhbj4ge1xuXHRcdGNvbnN0IGluc3RhbGxlZFBhdGggPSB0aGlzLmdldE5wbUluc3RhbGxQYXRoKHNvdXJjZSwgc2NvcGUpO1xuXHRcdGNvbnN0IGluc3RhbGxlZFZlcnNpb24gPSBleGlzdHNTeW5jKGluc3RhbGxlZFBhdGgpID8gdGhpcy5nZXRJbnN0YWxsZWROcG1WZXJzaW9uKGluc3RhbGxlZFBhdGgpIDogdW5kZWZpbmVkO1xuXHRcdGlmICghaW5zdGFsbGVkVmVyc2lvbikge1xuXHRcdFx0cmV0dXJuIHRydWU7XG5cdFx0fVxuXG5cdFx0dHJ5IHtcblx0XHRcdGNvbnN0IGxhdGVzdFZlcnNpb24gPSBhd2FpdCB0aGlzLmdldExhdGVzdE5wbVZlcnNpb24oc291cmNlLm5hbWUpO1xuXHRcdFx0cmV0dXJuIGxhdGVzdFZlcnNpb24gIT09IGluc3RhbGxlZFZlcnNpb247XG5cdFx0fSBjYXRjaCB7XG5cdFx0XHQvLyBQcmVzZXJ2ZSBleGlzdGluZyB1cGRhdGUgYmVoYXZpb3Igd2hlbiB2ZXJzaW9uIGxvb2t1cCBmYWlscy5cblx0XHRcdHJldHVybiB0cnVlO1xuXHRcdH1cblx0fVxuXG5cdHByaXZhdGUgYXN5bmMgdXBkYXRlTnBtQmF0Y2goc291cmNlczogTnBtVXBkYXRlVGFyZ2V0W10sIHNjb3BlOiBJbnN0YWxsZWRTb3VyY2VTY29wZSk6IFByb21pc2U8dm9pZD4ge1xuXHRcdGlmIChzb3VyY2VzLmxlbmd0aCA9PT0gMCkge1xuXHRcdFx0cmV0dXJuO1xuXHRcdH1cblxuXHRcdGNvbnN0IHNvdXJjZUxhYmVsID0gc291cmNlcy5sZW5ndGggPT09IDEgPyBzb3VyY2VzWzBdLnNvdXJjZSA6IGAke3Njb3BlfSBucG0gcGFja2FnZXNgO1xuXHRcdGNvbnN0IG1lc3NhZ2UgPSBzb3VyY2VzLmxlbmd0aCA9PT0gMSA/IGBVcGRhdGluZyAke3NvdXJjZXNbMF0uc291cmNlfS4uLmAgOiBgVXBkYXRpbmcgJHtzY29wZX0gbnBtIHBhY2thZ2VzLi4uYDtcblx0XHRjb25zdCBzcGVjcyA9IHNvdXJjZXMubWFwKChlbnRyeSkgPT4gYCR7ZW50cnkucGFyc2VkLm5hbWV9QGxhdGVzdGApO1xuXG5cdFx0YXdhaXQgdGhpcy53aXRoUHJvZ3Jlc3MoXCJ1cGRhdGVcIiwgc291cmNlTGFiZWwsIG1lc3NhZ2UsIGFzeW5jICgpID0+IHtcblx0XHRcdGF3YWl0IHRoaXMuaW5zdGFsbE5wbUJhdGNoKHNwZWNzLCBzY29wZSk7XG5cdFx0fSk7XG5cdH1cblxuXHRwcml2YXRlIGFzeW5jIGluc3RhbGxOcG1CYXRjaChzcGVjczogc3RyaW5nW10sIHNjb3BlOiBJbnN0YWxsZWRTb3VyY2VTY29wZSk6IFByb21pc2U8dm9pZD4ge1xuXHRcdGlmIChzY29wZSA9PT0gXCJ1c2VyXCIpIHtcblx0XHRcdGF3YWl0IHRoaXMucnVuTnBtQ29tbWFuZChbXCJpbnN0YWxsXCIsIFwiLWdcIiwgLi4uc3BlY3NdKTtcblx0XHRcdHJldHVybjtcblx0XHR9XG5cdFx0Y29uc3QgaW5zdGFsbFJvb3QgPSB0aGlzLmdldE5wbUluc3RhbGxSb290KHNjb3BlLCBmYWxzZSk7XG5cdFx0dGhpcy5lbnN1cmVOcG1Qcm9qZWN0KGluc3RhbGxSb290KTtcblx0XHRhd2FpdCB0aGlzLnJ1bk5wbUNvbW1hbmQoW1wiaW5zdGFsbFwiLCAuLi5zcGVjcywgXCItLXByZWZpeFwiLCBpbnN0YWxsUm9vdF0pO1xuXHR9XG5cblx0YXN5bmMgY2hlY2tGb3JBdmFpbGFibGVVcGRhdGVzKCk6IFByb21pc2U8UGFja2FnZVVwZGF0ZVtdPiB7XG5cdFx0aWYgKGlzT2ZmbGluZU1vZGVFbmFibGVkKCkpIHtcblx0XHRcdHJldHVybiBbXTtcblx0XHR9XG5cblx0XHRjb25zdCBnbG9iYWxTZXR0aW5ncyA9IHRoaXMuc2V0dGluZ3NNYW5hZ2VyLmdldEdsb2JhbFNldHRpbmdzKCk7XG5cdFx0Y29uc3QgcHJvamVjdFNldHRpbmdzID0gdGhpcy5zZXR0aW5nc01hbmFnZXIuZ2V0UHJvamVjdFNldHRpbmdzKCk7XG5cdFx0Y29uc3QgYWxsUGFja2FnZXM6IEFycmF5PHsgcGtnOiBQYWNrYWdlU291cmNlOyBzY29wZTogU291cmNlU2NvcGUgfT4gPSBbXTtcblx0XHRmb3IgKGNvbnN0IHBrZyBvZiBwcm9qZWN0U2V0dGluZ3MucGFja2FnZXMgPz8gW10pIHtcblx0XHRcdGFsbFBhY2thZ2VzLnB1c2goeyBwa2csIHNjb3BlOiBcInByb2plY3RcIiB9KTtcblx0XHR9XG5cdFx0Zm9yIChjb25zdCBwa2cgb2YgZ2xvYmFsU2V0dGluZ3MucGFja2FnZXMgPz8gW10pIHtcblx0XHRcdGFsbFBhY2thZ2VzLnB1c2goeyBwa2csIHNjb3BlOiBcInVzZXJcIiB9KTtcblx0XHR9XG5cblx0XHRjb25zdCBwYWNrYWdlU291cmNlcyA9IHRoaXMuZGVkdXBlUGFja2FnZXMoYWxsUGFja2FnZXMpO1xuXHRcdGNvbnN0IGNoZWNrcyA9IHBhY2thZ2VTb3VyY2VzXG5cdFx0XHQuZmlsdGVyKFxuXHRcdFx0XHQoZW50cnkpOiBlbnRyeSBpcyB7IHBrZzogUGFja2FnZVNvdXJjZTsgc2NvcGU6IEV4Y2x1ZGU8U291cmNlU2NvcGUsIFwidGVtcG9yYXJ5XCI+IH0gPT5cblx0XHRcdFx0XHRlbnRyeS5zY29wZSAhPT0gXCJ0ZW1wb3JhcnlcIixcblx0XHRcdClcblx0XHRcdC5tYXAoKGVudHJ5KSA9PiBhc3luYyAoKTogUHJvbWlzZTxQYWNrYWdlVXBkYXRlIHwgdW5kZWZpbmVkPiA9PiB7XG5cdFx0XHRcdGNvbnN0IHNvdXJjZSA9IHR5cGVvZiBlbnRyeS5wa2cgPT09IFwic3RyaW5nXCIgPyBlbnRyeS5wa2cgOiBlbnRyeS5wa2cuc291cmNlO1xuXHRcdFx0XHRjb25zdCBwYXJzZWQgPSB0aGlzLnBhcnNlU291cmNlKHNvdXJjZSk7XG5cdFx0XHRcdGlmIChwYXJzZWQudHlwZSA9PT0gXCJsb2NhbFwiIHx8IHBhcnNlZC5waW5uZWQpIHtcblx0XHRcdFx0XHRyZXR1cm4gdW5kZWZpbmVkO1xuXHRcdFx0XHR9XG5cblx0XHRcdFx0aWYgKHBhcnNlZC50eXBlID09PSBcIm5wbVwiKSB7XG5cdFx0XHRcdFx0Y29uc3QgaW5zdGFsbGVkUGF0aCA9IHRoaXMuZ2V0TnBtSW5zdGFsbFBhdGgocGFyc2VkLCBlbnRyeS5zY29wZSk7XG5cdFx0XHRcdFx0aWYgKCFleGlzdHNTeW5jKGluc3RhbGxlZFBhdGgpKSB7XG5cdFx0XHRcdFx0XHRyZXR1cm4gdW5kZWZpbmVkO1xuXHRcdFx0XHRcdH1cblx0XHRcdFx0XHRjb25zdCBoYXNVcGRhdGUgPSBhd2FpdCB0aGlzLm5wbUhhc0F2YWlsYWJsZVVwZGF0ZShwYXJzZWQsIGluc3RhbGxlZFBhdGgpO1xuXHRcdFx0XHRcdGlmICghaGFzVXBkYXRlKSB7XG5cdFx0XHRcdFx0XHRyZXR1cm4gdW5kZWZpbmVkO1xuXHRcdFx0XHRcdH1cblx0XHRcdFx0XHRyZXR1cm4ge1xuXHRcdFx0XHRcdFx0c291cmNlLFxuXHRcdFx0XHRcdFx0ZGlzcGxheU5hbWU6IHBhcnNlZC5uYW1lLFxuXHRcdFx0XHRcdFx0dHlwZTogXCJucG1cIixcblx0XHRcdFx0XHRcdHNjb3BlOiBlbnRyeS5zY29wZSxcblx0XHRcdFx0XHR9O1xuXHRcdFx0XHR9XG5cblx0XHRcdFx0Y29uc3QgaW5zdGFsbGVkUGF0aCA9IHRoaXMuZ2V0R2l0SW5zdGFsbFBhdGgocGFyc2VkLCBlbnRyeS5zY29wZSk7XG5cdFx0XHRcdGlmICghZXhpc3RzU3luYyhpbnN0YWxsZWRQYXRoKSkge1xuXHRcdFx0XHRcdHJldHVybiB1bmRlZmluZWQ7XG5cdFx0XHRcdH1cblx0XHRcdFx0Y29uc3QgaGFzVXBkYXRlID0gYXdhaXQgdGhpcy5naXRIYXNBdmFpbGFibGVVcGRhdGUoaW5zdGFsbGVkUGF0aCk7XG5cdFx0XHRcdGlmICghaGFzVXBkYXRlKSB7XG5cdFx0XHRcdFx0cmV0dXJuIHVuZGVmaW5lZDtcblx0XHRcdFx0fVxuXHRcdFx0XHRyZXR1cm4ge1xuXHRcdFx0XHRcdHNvdXJjZSxcblx0XHRcdFx0XHRkaXNwbGF5TmFtZTogYCR7cGFyc2VkLmhvc3R9LyR7cGFyc2VkLnBhdGh9YCxcblx0XHRcdFx0XHR0eXBlOiBcImdpdFwiLFxuXHRcdFx0XHRcdHNjb3BlOiBlbnRyeS5zY29wZSxcblx0XHRcdFx0fTtcblx0XHRcdH0pO1xuXG5cdFx0Y29uc3QgcmVzdWx0cyA9IGF3YWl0IHRoaXMucnVuV2l0aENvbmN1cnJlbmN5KGNoZWNrcywgVVBEQVRFX0NIRUNLX0NPTkNVUlJFTkNZKTtcblx0XHRyZXR1cm4gcmVzdWx0cy5maWx0ZXIoKHJlc3VsdCk6IHJlc3VsdCBpcyBQYWNrYWdlVXBkYXRlID0+IHJlc3VsdCAhPT0gdW5kZWZpbmVkKTtcblx0fVxuXG5cdHByaXZhdGUgYXN5bmMgcmVzb2x2ZVBhY2thZ2VTb3VyY2VzKFxuXHRcdHNvdXJjZXM6IEFycmF5PHsgcGtnOiBQYWNrYWdlU291cmNlOyBzY29wZTogU291cmNlU2NvcGUgfT4sXG5cdFx0YWNjdW11bGF0b3I6IFJlc291cmNlQWNjdW11bGF0b3IsXG5cdFx0b25NaXNzaW5nPzogKHNvdXJjZTogc3RyaW5nKSA9PiBQcm9taXNlPE1pc3NpbmdTb3VyY2VBY3Rpb24+LFxuXHQpOiBQcm9taXNlPHZvaWQ+IHtcblx0XHRmb3IgKGNvbnN0IHsgcGtnLCBzY29wZSB9IG9mIHNvdXJjZXMpIHtcblx0XHRcdGNvbnN0IHNvdXJjZVN0ciA9IHR5cGVvZiBwa2cgPT09IFwic3RyaW5nXCIgPyBwa2cgOiBwa2cuc291cmNlO1xuXHRcdFx0Y29uc3QgZmlsdGVyID0gdHlwZW9mIHBrZyA9PT0gXCJvYmplY3RcIiA/IHBrZyA6IHVuZGVmaW5lZDtcblx0XHRcdGNvbnN0IHBhcnNlZCA9IHRoaXMucGFyc2VTb3VyY2Uoc291cmNlU3RyKTtcblx0XHRcdGNvbnN0IG1ldGFkYXRhOiBQYXRoTWV0YWRhdGEgPSB7IHNvdXJjZTogc291cmNlU3RyLCBzY29wZSwgb3JpZ2luOiBcInBhY2thZ2VcIiB9O1xuXG5cdFx0XHRpZiAocGFyc2VkLnR5cGUgPT09IFwibG9jYWxcIikge1xuXHRcdFx0XHRjb25zdCBiYXNlRGlyID0gdGhpcy5nZXRCYXNlRGlyRm9yU2NvcGUoc2NvcGUpO1xuXHRcdFx0XHR0aGlzLnJlc29sdmVMb2NhbEV4dGVuc2lvblNvdXJjZShwYXJzZWQsIGFjY3VtdWxhdG9yLCBmaWx0ZXIsIG1ldGFkYXRhLCBiYXNlRGlyKTtcblx0XHRcdFx0Y29udGludWU7XG5cdFx0XHR9XG5cblx0XHRcdGNvbnN0IGluc3RhbGxNaXNzaW5nID0gYXN5bmMgKCk6IFByb21pc2U8Ym9vbGVhbj4gPT4ge1xuXHRcdFx0XHRpZiAoaXNPZmZsaW5lTW9kZUVuYWJsZWQoKSkge1xuXHRcdFx0XHRcdHJldHVybiBmYWxzZTtcblx0XHRcdFx0fVxuXHRcdFx0XHRpZiAoIW9uTWlzc2luZykge1xuXHRcdFx0XHRcdGF3YWl0IHRoaXMuaW5zdGFsbFBhcnNlZFNvdXJjZShwYXJzZWQsIHNjb3BlKTtcblx0XHRcdFx0XHRyZXR1cm4gdHJ1ZTtcblx0XHRcdFx0fVxuXHRcdFx0XHRjb25zdCBhY3Rpb24gPSBhd2FpdCBvbk1pc3Npbmcoc291cmNlU3RyKTtcblx0XHRcdFx0aWYgKGFjdGlvbiA9PT0gXCJza2lwXCIpIHJldHVybiBmYWxzZTtcblx0XHRcdFx0aWYgKGFjdGlvbiA9PT0gXCJlcnJvclwiKSB0aHJvdyBuZXcgRXJyb3IoYE1pc3Npbmcgc291cmNlOiAke3NvdXJjZVN0cn1gKTtcblx0XHRcdFx0YXdhaXQgdGhpcy5pbnN0YWxsUGFyc2VkU291cmNlKHBhcnNlZCwgc2NvcGUpO1xuXHRcdFx0XHRyZXR1cm4gdHJ1ZTtcblx0XHRcdH07XG5cblx0XHRcdGlmIChwYXJzZWQudHlwZSA9PT0gXCJucG1cIikge1xuXHRcdFx0XHRjb25zdCBpbnN0YWxsZWRQYXRoID0gdGhpcy5nZXROcG1JbnN0YWxsUGF0aChwYXJzZWQsIHNjb3BlKTtcblx0XHRcdFx0Y29uc3QgbmVlZHNJbnN0YWxsID1cblx0XHRcdFx0XHQhZXhpc3RzU3luYyhpbnN0YWxsZWRQYXRoKSB8fFxuXHRcdFx0XHRcdChwYXJzZWQucGlubmVkICYmICEoYXdhaXQgdGhpcy5pbnN0YWxsZWROcG1NYXRjaGVzUGlubmVkVmVyc2lvbihwYXJzZWQsIGluc3RhbGxlZFBhdGgpKSk7XG5cdFx0XHRcdGlmIChuZWVkc0luc3RhbGwpIHtcblx0XHRcdFx0XHRjb25zdCBpbnN0YWxsZWQgPSBhd2FpdCBpbnN0YWxsTWlzc2luZygpO1xuXHRcdFx0XHRcdGlmICghaW5zdGFsbGVkKSBjb250aW51ZTtcblx0XHRcdFx0fVxuXHRcdFx0XHRtZXRhZGF0YS5iYXNlRGlyID0gaW5zdGFsbGVkUGF0aDtcblx0XHRcdFx0dGhpcy5jb2xsZWN0UGFja2FnZVJlc291cmNlcyhpbnN0YWxsZWRQYXRoLCBhY2N1bXVsYXRvciwgZmlsdGVyLCBtZXRhZGF0YSk7XG5cdFx0XHRcdGNvbnRpbnVlO1xuXHRcdFx0fVxuXG5cdFx0XHRpZiAocGFyc2VkLnR5cGUgPT09IFwiZ2l0XCIpIHtcblx0XHRcdFx0Y29uc3QgaW5zdGFsbGVkUGF0aCA9IHRoaXMuZ2V0R2l0SW5zdGFsbFBhdGgocGFyc2VkLCBzY29wZSk7XG5cdFx0XHRcdGlmICghZXhpc3RzU3luYyhpbnN0YWxsZWRQYXRoKSkge1xuXHRcdFx0XHRcdGNvbnN0IGluc3RhbGxlZCA9IGF3YWl0IGluc3RhbGxNaXNzaW5nKCk7XG5cdFx0XHRcdFx0aWYgKCFpbnN0YWxsZWQpIGNvbnRpbnVlO1xuXHRcdFx0XHR9IGVsc2UgaWYgKHNjb3BlID09PSBcInRlbXBvcmFyeVwiICYmICFwYXJzZWQucGlubmVkICYmICFpc09mZmxpbmVNb2RlRW5hYmxlZCgpKSB7XG5cdFx0XHRcdFx0YXdhaXQgdGhpcy5yZWZyZXNoVGVtcG9yYXJ5R2l0U291cmNlKHBhcnNlZCwgc291cmNlU3RyKTtcblx0XHRcdFx0fVxuXHRcdFx0XHRtZXRhZGF0YS5iYXNlRGlyID0gaW5zdGFsbGVkUGF0aDtcblx0XHRcdFx0dGhpcy5jb2xsZWN0UGFja2FnZVJlc291cmNlcyhpbnN0YWxsZWRQYXRoLCBhY2N1bXVsYXRvciwgZmlsdGVyLCBtZXRhZGF0YSk7XG5cdFx0XHR9XG5cdFx0fVxuXHR9XG5cblx0cHJpdmF0ZSByZXNvbHZlTG9jYWxFeHRlbnNpb25Tb3VyY2UoXG5cdFx0c291cmNlOiBMb2NhbFNvdXJjZSxcblx0XHRhY2N1bXVsYXRvcjogUmVzb3VyY2VBY2N1bXVsYXRvcixcblx0XHRmaWx0ZXI6IFBhY2thZ2VGaWx0ZXIgfCB1bmRlZmluZWQsXG5cdFx0bWV0YWRhdGE6IFBhdGhNZXRhZGF0YSxcblx0XHRiYXNlRGlyOiBzdHJpbmcsXG5cdCk6IHZvaWQge1xuXHRcdGNvbnN0IHJlc29sdmVkID0gdGhpcy5yZXNvbHZlUGF0aEZyb21CYXNlKHNvdXJjZS5wYXRoLCBiYXNlRGlyKTtcblx0XHRpZiAoIWV4aXN0c1N5bmMocmVzb2x2ZWQpKSB7XG5cdFx0XHRyZXR1cm47XG5cdFx0fVxuXG5cdFx0dHJ5IHtcblx0XHRcdGNvbnN0IHN0YXRzID0gc3RhdFN5bmMocmVzb2x2ZWQpO1xuXHRcdFx0aWYgKHN0YXRzLmlzRmlsZSgpKSB7XG5cdFx0XHRcdG1ldGFkYXRhLmJhc2VEaXIgPSBkaXJuYW1lKHJlc29sdmVkKTtcblx0XHRcdFx0dGhpcy5hZGRSZXNvdXJjZShhY2N1bXVsYXRvci5leHRlbnNpb25zLCByZXNvbHZlZCwgbWV0YWRhdGEsIHRydWUpO1xuXHRcdFx0XHRyZXR1cm47XG5cdFx0XHR9XG5cdFx0XHRpZiAoc3RhdHMuaXNEaXJlY3RvcnkoKSkge1xuXHRcdFx0XHRtZXRhZGF0YS5iYXNlRGlyID0gcmVzb2x2ZWQ7XG5cdFx0XHRcdGNvbnN0IHJlc291cmNlcyA9IHRoaXMuY29sbGVjdFBhY2thZ2VSZXNvdXJjZXMocmVzb2x2ZWQsIGFjY3VtdWxhdG9yLCBmaWx0ZXIsIG1ldGFkYXRhKTtcblx0XHRcdFx0aWYgKCFyZXNvdXJjZXMpIHtcblx0XHRcdFx0XHR0aGlzLmFkZFJlc291cmNlKGFjY3VtdWxhdG9yLmV4dGVuc2lvbnMsIHJlc29sdmVkLCBtZXRhZGF0YSwgdHJ1ZSk7XG5cdFx0XHRcdH1cblx0XHRcdH1cblx0XHR9IGNhdGNoIHtcblx0XHRcdHJldHVybjtcblx0XHR9XG5cdH1cblxuXHRwcml2YXRlIGFzeW5jIGluc3RhbGxQYXJzZWRTb3VyY2UocGFyc2VkOiBQYXJzZWRTb3VyY2UsIHNjb3BlOiBTb3VyY2VTY29wZSk6IFByb21pc2U8dm9pZD4ge1xuXHRcdGlmIChwYXJzZWQudHlwZSA9PT0gXCJucG1cIikge1xuXHRcdFx0YXdhaXQgdGhpcy5pbnN0YWxsTnBtKHBhcnNlZCwgc2NvcGUsIHNjb3BlID09PSBcInRlbXBvcmFyeVwiKTtcblx0XHRcdHJldHVybjtcblx0XHR9XG5cdFx0aWYgKHBhcnNlZC50eXBlID09PSBcImdpdFwiKSB7XG5cdFx0XHRhd2FpdCB0aGlzLmluc3RhbGxHaXQocGFyc2VkLCBzY29wZSk7XG5cdFx0XHRyZXR1cm47XG5cdFx0fVxuXHR9XG5cblx0cHJpdmF0ZSBnZXRQYWNrYWdlU291cmNlU3RyaW5nKHBrZzogUGFja2FnZVNvdXJjZSk6IHN0cmluZyB7XG5cdFx0cmV0dXJuIHR5cGVvZiBwa2cgPT09IFwic3RyaW5nXCIgPyBwa2cgOiBwa2cuc291cmNlO1xuXHR9XG5cblx0cHJpdmF0ZSBnZXRTb3VyY2VNYXRjaEtleUZvcklucHV0KHNvdXJjZTogc3RyaW5nKTogc3RyaW5nIHtcblx0XHRjb25zdCBwYXJzZWQgPSB0aGlzLnBhcnNlU291cmNlKHNvdXJjZSk7XG5cdFx0aWYgKHBhcnNlZC50eXBlID09PSBcIm5wbVwiKSB7XG5cdFx0XHRyZXR1cm4gYG5wbToke3BhcnNlZC5uYW1lfWA7XG5cdFx0fVxuXHRcdGlmIChwYXJzZWQudHlwZSA9PT0gXCJnaXRcIikge1xuXHRcdFx0cmV0dXJuIGBnaXQ6JHtwYXJzZWQuaG9zdH0vJHtwYXJzZWQucGF0aH1gO1xuXHRcdH1cblx0XHRyZXR1cm4gYGxvY2FsOiR7dGhpcy5yZXNvbHZlUGF0aChwYXJzZWQucGF0aCl9YDtcblx0fVxuXG5cdHByaXZhdGUgZ2V0U291cmNlTWF0Y2hLZXlGb3JTZXR0aW5ncyhzb3VyY2U6IHN0cmluZywgc2NvcGU6IFNvdXJjZVNjb3BlKTogc3RyaW5nIHtcblx0XHRjb25zdCBwYXJzZWQgPSB0aGlzLnBhcnNlU291cmNlKHNvdXJjZSk7XG5cdFx0aWYgKHBhcnNlZC50eXBlID09PSBcIm5wbVwiKSB7XG5cdFx0XHRyZXR1cm4gYG5wbToke3BhcnNlZC5uYW1lfWA7XG5cdFx0fVxuXHRcdGlmIChwYXJzZWQudHlwZSA9PT0gXCJnaXRcIikge1xuXHRcdFx0cmV0dXJuIGBnaXQ6JHtwYXJzZWQuaG9zdH0vJHtwYXJzZWQucGF0aH1gO1xuXHRcdH1cblx0XHRjb25zdCBiYXNlRGlyID0gdGhpcy5nZXRCYXNlRGlyRm9yU2NvcGUoc2NvcGUpO1xuXHRcdHJldHVybiBgbG9jYWw6JHt0aGlzLnJlc29sdmVQYXRoRnJvbUJhc2UocGFyc2VkLnBhdGgsIGJhc2VEaXIpfWA7XG5cdH1cblxuXHRwcml2YXRlIGJ1aWxkTm9NYXRjaGluZ1BhY2thZ2VNZXNzYWdlKHNvdXJjZTogc3RyaW5nLCBjb25maWd1cmVkUGFja2FnZXM6IFBhY2thZ2VTb3VyY2VbXSk6IHN0cmluZyB7XG5cdFx0Y29uc3Qgc3VnZ2VzdGlvbiA9IHRoaXMuZmluZFN1Z2dlc3RlZENvbmZpZ3VyZWRTb3VyY2Uoc291cmNlLCBjb25maWd1cmVkUGFja2FnZXMpO1xuXHRcdGlmICghc3VnZ2VzdGlvbikge1xuXHRcdFx0cmV0dXJuIGBObyBtYXRjaGluZyBwYWNrYWdlIGZvdW5kIGZvciAke3NvdXJjZX1gO1xuXHRcdH1cblx0XHRyZXR1cm4gYE5vIG1hdGNoaW5nIHBhY2thZ2UgZm91bmQgZm9yICR7c291cmNlfS4gRGlkIHlvdSBtZWFuICR7c3VnZ2VzdGlvbn0/YDtcblx0fVxuXG5cdHByaXZhdGUgZmluZFN1Z2dlc3RlZENvbmZpZ3VyZWRTb3VyY2Uoc291cmNlOiBzdHJpbmcsIGNvbmZpZ3VyZWRQYWNrYWdlczogUGFja2FnZVNvdXJjZVtdKTogc3RyaW5nIHwgdW5kZWZpbmVkIHtcblx0XHRjb25zdCB0cmltbWVkU291cmNlID0gc291cmNlLnRyaW0oKTtcblx0XHRjb25zdCBzdWdnZXN0aW9ucyA9IG5ldyBTZXQ8c3RyaW5nPigpO1xuXG5cdFx0Zm9yIChjb25zdCBwa2cgb2YgY29uZmlndXJlZFBhY2thZ2VzKSB7XG5cdFx0XHRjb25zdCBzb3VyY2VTdHIgPSB0aGlzLmdldFBhY2thZ2VTb3VyY2VTdHJpbmcocGtnKTtcblx0XHRcdGNvbnN0IHBhcnNlZCA9IHRoaXMucGFyc2VTb3VyY2Uoc291cmNlU3RyKTtcblx0XHRcdGlmIChwYXJzZWQudHlwZSA9PT0gXCJucG1cIikge1xuXHRcdFx0XHRpZiAodHJpbW1lZFNvdXJjZSA9PT0gcGFyc2VkLm5hbWUgfHwgdHJpbW1lZFNvdXJjZSA9PT0gcGFyc2VkLnNwZWMpIHtcblx0XHRcdFx0XHRzdWdnZXN0aW9ucy5hZGQoc291cmNlU3RyKTtcblx0XHRcdFx0fVxuXHRcdFx0XHRjb250aW51ZTtcblx0XHRcdH1cblx0XHRcdGlmIChwYXJzZWQudHlwZSA9PT0gXCJnaXRcIikge1xuXHRcdFx0XHRjb25zdCBzaG9ydGhhbmQgPSBgJHtwYXJzZWQuaG9zdH0vJHtwYXJzZWQucGF0aH1gO1xuXHRcdFx0XHRjb25zdCBzaG9ydGhhbmRXaXRoUmVmID0gcGFyc2VkLnJlZiA/IGAke3Nob3J0aGFuZH1AJHtwYXJzZWQucmVmfWAgOiB1bmRlZmluZWQ7XG5cdFx0XHRcdGlmICh0cmltbWVkU291cmNlID09PSBzaG9ydGhhbmQgfHwgKHNob3J0aGFuZFdpdGhSZWYgJiYgdHJpbW1lZFNvdXJjZSA9PT0gc2hvcnRoYW5kV2l0aFJlZikpIHtcblx0XHRcdFx0XHRzdWdnZXN0aW9ucy5hZGQoc291cmNlU3RyKTtcblx0XHRcdFx0fVxuXHRcdFx0fVxuXHRcdH1cblxuXHRcdHJldHVybiBzdWdnZXN0aW9ucy52YWx1ZXMoKS5uZXh0KCkudmFsdWU7XG5cdH1cblxuXHRwcml2YXRlIHBhY2thZ2VTb3VyY2VzTWF0Y2goZXhpc3Rpbmc6IFBhY2thZ2VTb3VyY2UsIGlucHV0U291cmNlOiBzdHJpbmcsIHNjb3BlOiBTb3VyY2VTY29wZSk6IGJvb2xlYW4ge1xuXHRcdGNvbnN0IGxlZnQgPSB0aGlzLmdldFNvdXJjZU1hdGNoS2V5Rm9yU2V0dGluZ3ModGhpcy5nZXRQYWNrYWdlU291cmNlU3RyaW5nKGV4aXN0aW5nKSwgc2NvcGUpO1xuXHRcdGNvbnN0IHJpZ2h0ID0gdGhpcy5nZXRTb3VyY2VNYXRjaEtleUZvcklucHV0KGlucHV0U291cmNlKTtcblx0XHRyZXR1cm4gbGVmdCA9PT0gcmlnaHQ7XG5cdH1cblxuXHRwcml2YXRlIG5vcm1hbGl6ZVBhY2thZ2VTb3VyY2VGb3JTZXR0aW5ncyhzb3VyY2U6IHN0cmluZywgc2NvcGU6IFNvdXJjZVNjb3BlKTogc3RyaW5nIHtcblx0XHRjb25zdCBwYXJzZWQgPSB0aGlzLnBhcnNlU291cmNlKHNvdXJjZSk7XG5cdFx0aWYgKHBhcnNlZC50eXBlICE9PSBcImxvY2FsXCIpIHtcblx0XHRcdHJldHVybiBzb3VyY2U7XG5cdFx0fVxuXHRcdGNvbnN0IGJhc2VEaXIgPSB0aGlzLmdldEJhc2VEaXJGb3JTY29wZShzY29wZSk7XG5cdFx0Y29uc3QgcmVzb2x2ZWQgPSB0aGlzLnJlc29sdmVQYXRoKHBhcnNlZC5wYXRoKTtcblx0XHRjb25zdCByZWwgPSByZWxhdGl2ZShiYXNlRGlyLCByZXNvbHZlZCk7XG5cdFx0cmV0dXJuIHJlbCB8fCBcIi5cIjtcblx0fVxuXG5cdHByaXZhdGUgcGFyc2VTb3VyY2Uoc291cmNlOiBzdHJpbmcpOiBQYXJzZWRTb3VyY2Uge1xuXHRcdGlmIChzb3VyY2Uuc3RhcnRzV2l0aChcIm5wbTpcIikpIHtcblx0XHRcdGNvbnN0IHNwZWMgPSBzb3VyY2Uuc2xpY2UoXCJucG06XCIubGVuZ3RoKS50cmltKCk7XG5cdFx0XHRjb25zdCB7IG5hbWUsIHZlcnNpb24gfSA9IHRoaXMucGFyc2VOcG1TcGVjKHNwZWMpO1xuXHRcdFx0cmV0dXJuIHtcblx0XHRcdFx0dHlwZTogXCJucG1cIixcblx0XHRcdFx0c3BlYyxcblx0XHRcdFx0bmFtZSxcblx0XHRcdFx0cGlubmVkOiBCb29sZWFuKHZlcnNpb24pLFxuXHRcdFx0fTtcblx0XHR9XG5cblx0XHRpZiAoaXNMb2NhbFBhdGgoc291cmNlKSkge1xuXHRcdFx0cmV0dXJuIHsgdHlwZTogXCJsb2NhbFwiLCBwYXRoOiBzb3VyY2UgfTtcblx0XHR9XG5cblx0XHQvLyBUcnkgcGFyc2luZyBhcyBnaXQgVVJMXG5cdFx0Y29uc3QgZ2l0UGFyc2VkID0gcGFyc2VHaXRVcmwoc291cmNlKTtcblx0XHRpZiAoZ2l0UGFyc2VkKSB7XG5cdFx0XHRyZXR1cm4gZ2l0UGFyc2VkO1xuXHRcdH1cblxuXHRcdHJldHVybiB7IHR5cGU6IFwibG9jYWxcIiwgcGF0aDogc291cmNlIH07XG5cdH1cblxuXHRwcml2YXRlIGFzeW5jIGluc3RhbGxlZE5wbU1hdGNoZXNQaW5uZWRWZXJzaW9uKHNvdXJjZTogTnBtU291cmNlLCBpbnN0YWxsZWRQYXRoOiBzdHJpbmcpOiBQcm9taXNlPGJvb2xlYW4+IHtcblx0XHRjb25zdCBpbnN0YWxsZWRWZXJzaW9uID0gdGhpcy5nZXRJbnN0YWxsZWROcG1WZXJzaW9uKGluc3RhbGxlZFBhdGgpO1xuXHRcdGlmICghaW5zdGFsbGVkVmVyc2lvbikge1xuXHRcdFx0cmV0dXJuIGZhbHNlO1xuXHRcdH1cblxuXHRcdGNvbnN0IHsgdmVyc2lvbjogcGlubmVkVmVyc2lvbiB9ID0gdGhpcy5wYXJzZU5wbVNwZWMoc291cmNlLnNwZWMpO1xuXHRcdGlmICghcGlubmVkVmVyc2lvbikge1xuXHRcdFx0cmV0dXJuIHRydWU7XG5cdFx0fVxuXG5cdFx0cmV0dXJuIGluc3RhbGxlZFZlcnNpb24gPT09IHBpbm5lZFZlcnNpb247XG5cdH1cblxuXHRwcml2YXRlIGFzeW5jIG5wbUhhc0F2YWlsYWJsZVVwZGF0ZShzb3VyY2U6IE5wbVNvdXJjZSwgaW5zdGFsbGVkUGF0aDogc3RyaW5nKTogUHJvbWlzZTxib29sZWFuPiB7XG5cdFx0aWYgKGlzT2ZmbGluZU1vZGVFbmFibGVkKCkpIHtcblx0XHRcdHJldHVybiBmYWxzZTtcblx0XHR9XG5cblx0XHRjb25zdCBpbnN0YWxsZWRWZXJzaW9uID0gdGhpcy5nZXRJbnN0YWxsZWROcG1WZXJzaW9uKGluc3RhbGxlZFBhdGgpO1xuXHRcdGlmICghaW5zdGFsbGVkVmVyc2lvbikge1xuXHRcdFx0cmV0dXJuIGZhbHNlO1xuXHRcdH1cblxuXHRcdHRyeSB7XG5cdFx0XHRjb25zdCBsYXRlc3RWZXJzaW9uID0gYXdhaXQgdGhpcy5nZXRMYXRlc3ROcG1WZXJzaW9uKHNvdXJjZS5uYW1lKTtcblx0XHRcdHJldHVybiBsYXRlc3RWZXJzaW9uICE9PSBpbnN0YWxsZWRWZXJzaW9uO1xuXHRcdH0gY2F0Y2gge1xuXHRcdFx0cmV0dXJuIGZhbHNlO1xuXHRcdH1cblx0fVxuXG5cdHByaXZhdGUgZ2V0SW5zdGFsbGVkTnBtVmVyc2lvbihpbnN0YWxsZWRQYXRoOiBzdHJpbmcpOiBzdHJpbmcgfCB1bmRlZmluZWQge1xuXHRcdGNvbnN0IHBhY2thZ2VKc29uUGF0aCA9IGpvaW4oaW5zdGFsbGVkUGF0aCwgXCJwYWNrYWdlLmpzb25cIik7XG5cdFx0aWYgKCFleGlzdHNTeW5jKHBhY2thZ2VKc29uUGF0aCkpIHJldHVybiB1bmRlZmluZWQ7XG5cdFx0dHJ5IHtcblx0XHRcdGNvbnN0IGNvbnRlbnQgPSByZWFkRmlsZVN5bmMocGFja2FnZUpzb25QYXRoLCBcInV0Zi04XCIpO1xuXHRcdFx0Y29uc3QgcGtnID0gSlNPTi5wYXJzZShjb250ZW50KSBhcyB7IHZlcnNpb24/OiBzdHJpbmcgfTtcblx0XHRcdHJldHVybiBwa2cudmVyc2lvbjtcblx0XHR9IGNhdGNoIHtcblx0XHRcdHJldHVybiB1bmRlZmluZWQ7XG5cdFx0fVxuXHR9XG5cblx0cHJpdmF0ZSBhc3luYyBnZXRMYXRlc3ROcG1WZXJzaW9uKHBhY2thZ2VOYW1lOiBzdHJpbmcpOiBQcm9taXNlPHN0cmluZz4ge1xuXHRcdGNvbnN0IG5wbUNvbW1hbmQgPSB0aGlzLmdldE5wbUNvbW1hbmQoKTtcblx0XHRjb25zdCBzdGRvdXQgPSBhd2FpdCB0aGlzLnJ1bkNvbW1hbmRDYXB0dXJlKFxuXHRcdFx0bnBtQ29tbWFuZC5jb21tYW5kLFxuXHRcdFx0Wy4uLm5wbUNvbW1hbmQuYXJncywgXCJ2aWV3XCIsIHBhY2thZ2VOYW1lLCBcInZlcnNpb25cIiwgXCItLWpzb25cIl0sXG5cdFx0XHR7IGN3ZDogdGhpcy5jd2QsIHRpbWVvdXRNczogTkVUV09SS19USU1FT1VUX01TIH0sXG5cdFx0KTtcblx0XHRjb25zdCByYXcgPSBzdGRvdXQudHJpbSgpO1xuXHRcdGlmICghcmF3KSB0aHJvdyBuZXcgRXJyb3IoXCJFbXB0eSByZXNwb25zZSBmcm9tIG5wbSB2aWV3XCIpO1xuXHRcdHJldHVybiBKU09OLnBhcnNlKHJhdyk7XG5cdH1cblxuXHRwcml2YXRlIGFzeW5jIGdpdEhhc0F2YWlsYWJsZVVwZGF0ZShpbnN0YWxsZWRQYXRoOiBzdHJpbmcpOiBQcm9taXNlPGJvb2xlYW4+IHtcblx0XHRpZiAoaXNPZmZsaW5lTW9kZUVuYWJsZWQoKSkge1xuXHRcdFx0cmV0dXJuIGZhbHNlO1xuXHRcdH1cblxuXHRcdHRyeSB7XG5cdFx0XHRjb25zdCBsb2NhbEhlYWQgPSBhd2FpdCB0aGlzLnJ1bkNvbW1hbmRDYXB0dXJlKFwiZ2l0XCIsIFtcInJldi1wYXJzZVwiLCBcIkhFQURcIl0sIHtcblx0XHRcdFx0Y3dkOiBpbnN0YWxsZWRQYXRoLFxuXHRcdFx0XHR0aW1lb3V0TXM6IE5FVFdPUktfVElNRU9VVF9NUyxcblx0XHRcdH0pO1xuXHRcdFx0Y29uc3QgcmVtb3RlSGVhZCA9IGF3YWl0IHRoaXMuZ2V0UmVtb3RlR2l0SGVhZChpbnN0YWxsZWRQYXRoKTtcblx0XHRcdHJldHVybiBsb2NhbEhlYWQudHJpbSgpICE9PSByZW1vdGVIZWFkLnRyaW0oKTtcblx0XHR9IGNhdGNoIHtcblx0XHRcdHJldHVybiBmYWxzZTtcblx0XHR9XG5cdH1cblxuXHRwcml2YXRlIGFzeW5jIGdldFJlbW90ZUdpdEhlYWQoaW5zdGFsbGVkUGF0aDogc3RyaW5nKTogUHJvbWlzZTxzdHJpbmc+IHtcblx0XHRjb25zdCB1cHN0cmVhbVJlZiA9IGF3YWl0IHRoaXMuZ2V0R2l0VXBzdHJlYW1SZWYoaW5zdGFsbGVkUGF0aCk7XG5cdFx0aWYgKHVwc3RyZWFtUmVmKSB7XG5cdFx0XHRjb25zdCByZW1vdGVIZWFkID0gYXdhaXQgdGhpcy5ydW5HaXRSZW1vdGVDb21tYW5kKGluc3RhbGxlZFBhdGgsIFtcImxzLXJlbW90ZVwiLCBcIm9yaWdpblwiLCB1cHN0cmVhbVJlZl0pO1xuXHRcdFx0Y29uc3QgbWF0Y2ggPSByZW1vdGVIZWFkLm1hdGNoKC9eKFswLTlhLWZdezQwfSlcXHMrL20pO1xuXHRcdFx0aWYgKG1hdGNoPy5bMV0pIHtcblx0XHRcdFx0cmV0dXJuIG1hdGNoWzFdO1xuXHRcdFx0fVxuXHRcdH1cblxuXHRcdGNvbnN0IHJlbW90ZUhlYWQgPSBhd2FpdCB0aGlzLnJ1bkdpdFJlbW90ZUNvbW1hbmQoaW5zdGFsbGVkUGF0aCwgW1wibHMtcmVtb3RlXCIsIFwib3JpZ2luXCIsIFwiSEVBRFwiXSk7XG5cdFx0Y29uc3QgbWF0Y2ggPSByZW1vdGVIZWFkLm1hdGNoKC9eKFswLTlhLWZdezQwfSlcXHMrSEVBRCQvbSk7XG5cdFx0aWYgKCFtYXRjaD8uWzFdKSB7XG5cdFx0XHR0aHJvdyBuZXcgRXJyb3IoXCJGYWlsZWQgdG8gZGV0ZXJtaW5lIHJlbW90ZSBIRUFEXCIpO1xuXHRcdH1cblx0XHRyZXR1cm4gbWF0Y2hbMV07XG5cdH1cblxuXHRwcml2YXRlIGFzeW5jIGdldExvY2FsR2l0VXBkYXRlVGFyZ2V0KFxuXHRcdGluc3RhbGxlZFBhdGg6IHN0cmluZyxcblx0KTogUHJvbWlzZTx7IHJlZjogc3RyaW5nOyBoZWFkOiBzdHJpbmc7IGZldGNoQXJnczogc3RyaW5nW10gfT4ge1xuXHRcdHRyeSB7XG5cdFx0XHRjb25zdCB1cHN0cmVhbSA9IGF3YWl0IHRoaXMucnVuQ29tbWFuZENhcHR1cmUoXCJnaXRcIiwgW1wicmV2LXBhcnNlXCIsIFwiLS1hYmJyZXYtcmVmXCIsIFwiQHt1cHN0cmVhbX1cIl0sIHtcblx0XHRcdFx0Y3dkOiBpbnN0YWxsZWRQYXRoLFxuXHRcdFx0XHR0aW1lb3V0TXM6IE5FVFdPUktfVElNRU9VVF9NUyxcblx0XHRcdH0pO1xuXHRcdFx0Y29uc3QgdHJpbW1lZFVwc3RyZWFtID0gdXBzdHJlYW0udHJpbSgpO1xuXHRcdFx0aWYgKCF0cmltbWVkVXBzdHJlYW0uc3RhcnRzV2l0aChcIm9yaWdpbi9cIikpIHtcblx0XHRcdFx0dGhyb3cgbmV3IEVycm9yKGBVbnN1cHBvcnRlZCB1cHN0cmVhbSByZW1vdGU6ICR7dHJpbW1lZFVwc3RyZWFtfWApO1xuXHRcdFx0fVxuXHRcdFx0Y29uc3QgYnJhbmNoID0gdHJpbW1lZFVwc3RyZWFtLnNsaWNlKFwib3JpZ2luL1wiLmxlbmd0aCk7XG5cdFx0XHRpZiAoIWJyYW5jaCkge1xuXHRcdFx0XHR0aHJvdyBuZXcgRXJyb3IoXCJNaXNzaW5nIHVwc3RyZWFtIGJyYW5jaCBuYW1lXCIpO1xuXHRcdFx0fVxuXHRcdFx0Y29uc3QgaGVhZCA9IGF3YWl0IHRoaXMucnVuQ29tbWFuZENhcHR1cmUoXCJnaXRcIiwgW1wicmV2LXBhcnNlXCIsIFwiQHt1cHN0cmVhbX1cIl0sIHtcblx0XHRcdFx0Y3dkOiBpbnN0YWxsZWRQYXRoLFxuXHRcdFx0XHR0aW1lb3V0TXM6IE5FVFdPUktfVElNRU9VVF9NUyxcblx0XHRcdH0pO1xuXHRcdFx0cmV0dXJuIHtcblx0XHRcdFx0cmVmOiBcIkB7dXBzdHJlYW19XCIsXG5cdFx0XHRcdGhlYWQsXG5cdFx0XHRcdGZldGNoQXJnczogW1xuXHRcdFx0XHRcdFwiZmV0Y2hcIixcblx0XHRcdFx0XHRcIi0tcHJ1bmVcIixcblx0XHRcdFx0XHRcIi0tbm8tdGFnc1wiLFxuXHRcdFx0XHRcdFwib3JpZ2luXCIsXG5cdFx0XHRcdFx0YCtyZWZzL2hlYWRzLyR7YnJhbmNofTpyZWZzL3JlbW90ZXMvb3JpZ2luLyR7YnJhbmNofWAsXG5cdFx0XHRcdF0sXG5cdFx0XHR9O1xuXHRcdH0gY2F0Y2gge1xuXHRcdFx0YXdhaXQgdGhpcy5ydW5Db21tYW5kKFwiZ2l0XCIsIFtcInJlbW90ZVwiLCBcInNldC1oZWFkXCIsIFwib3JpZ2luXCIsIFwiLWFcIl0sIHsgY3dkOiBpbnN0YWxsZWRQYXRoIH0pLmNhdGNoKCgpID0+IHt9KTtcblx0XHRcdGNvbnN0IGhlYWQgPSBhd2FpdCB0aGlzLnJ1bkNvbW1hbmRDYXB0dXJlKFwiZ2l0XCIsIFtcInJldi1wYXJzZVwiLCBcIm9yaWdpbi9IRUFEXCJdLCB7XG5cdFx0XHRcdGN3ZDogaW5zdGFsbGVkUGF0aCxcblx0XHRcdFx0dGltZW91dE1zOiBORVRXT1JLX1RJTUVPVVRfTVMsXG5cdFx0XHR9KTtcblx0XHRcdGNvbnN0IG9yaWdpbkhlYWRSZWYgPSBhd2FpdCB0aGlzLnJ1bkNvbW1hbmRDYXB0dXJlKFwiZ2l0XCIsIFtcInN5bWJvbGljLXJlZlwiLCBcInJlZnMvcmVtb3Rlcy9vcmlnaW4vSEVBRFwiXSwge1xuXHRcdFx0XHRjd2Q6IGluc3RhbGxlZFBhdGgsXG5cdFx0XHRcdHRpbWVvdXRNczogTkVUV09SS19USU1FT1VUX01TLFxuXHRcdFx0fSkuY2F0Y2goKCkgPT4gXCJcIik7XG5cdFx0XHRjb25zdCBicmFuY2ggPSBvcmlnaW5IZWFkUmVmLnRyaW0oKS5yZXBsYWNlKC9ecmVmc1xcL3JlbW90ZXNcXC9vcmlnaW5cXC8vLCBcIlwiKTtcblx0XHRcdGlmIChicmFuY2gpIHtcblx0XHRcdFx0cmV0dXJuIHtcblx0XHRcdFx0XHRyZWY6IFwib3JpZ2luL0hFQURcIixcblx0XHRcdFx0XHRoZWFkLFxuXHRcdFx0XHRcdGZldGNoQXJnczogW1xuXHRcdFx0XHRcdFx0XCJmZXRjaFwiLFxuXHRcdFx0XHRcdFx0XCItLXBydW5lXCIsXG5cdFx0XHRcdFx0XHRcIi0tbm8tdGFnc1wiLFxuXHRcdFx0XHRcdFx0XCJvcmlnaW5cIixcblx0XHRcdFx0XHRcdGArcmVmcy9oZWFkcy8ke2JyYW5jaH06cmVmcy9yZW1vdGVzL29yaWdpbi8ke2JyYW5jaH1gLFxuXHRcdFx0XHRcdF0sXG5cdFx0XHRcdH07XG5cdFx0XHR9XG5cdFx0XHRyZXR1cm4ge1xuXHRcdFx0XHRyZWY6IFwib3JpZ2luL0hFQURcIixcblx0XHRcdFx0aGVhZCxcblx0XHRcdFx0ZmV0Y2hBcmdzOiBbXCJmZXRjaFwiLCBcIi0tcHJ1bmVcIiwgXCItLW5vLXRhZ3NcIiwgXCJvcmlnaW5cIiwgXCIrSEVBRDpyZWZzL3JlbW90ZXMvb3JpZ2luL0hFQURcIl0sXG5cdFx0XHR9O1xuXHRcdH1cblx0fVxuXG5cdHByaXZhdGUgYXN5bmMgZ2V0R2l0VXBzdHJlYW1SZWYoaW5zdGFsbGVkUGF0aDogc3RyaW5nKTogUHJvbWlzZTxzdHJpbmcgfCB1bmRlZmluZWQ+IHtcblx0XHR0cnkge1xuXHRcdFx0Y29uc3QgdXBzdHJlYW0gPSBhd2FpdCB0aGlzLnJ1bkNvbW1hbmRDYXB0dXJlKFwiZ2l0XCIsIFtcInJldi1wYXJzZVwiLCBcIi0tYWJicmV2LXJlZlwiLCBcIkB7dXBzdHJlYW19XCJdLCB7XG5cdFx0XHRcdGN3ZDogaW5zdGFsbGVkUGF0aCxcblx0XHRcdFx0dGltZW91dE1zOiBORVRXT1JLX1RJTUVPVVRfTVMsXG5cdFx0XHR9KTtcblx0XHRcdGNvbnN0IHRyaW1tZWQgPSB1cHN0cmVhbS50cmltKCk7XG5cdFx0XHRpZiAoIXRyaW1tZWQuc3RhcnRzV2l0aChcIm9yaWdpbi9cIikpIHtcblx0XHRcdFx0cmV0dXJuIHVuZGVmaW5lZDtcblx0XHRcdH1cblx0XHRcdGNvbnN0IGJyYW5jaCA9IHRyaW1tZWQuc2xpY2UoXCJvcmlnaW4vXCIubGVuZ3RoKTtcblx0XHRcdHJldHVybiBicmFuY2ggPyBgcmVmcy9oZWFkcy8ke2JyYW5jaH1gIDogdW5kZWZpbmVkO1xuXHRcdH0gY2F0Y2gge1xuXHRcdFx0cmV0dXJuIHVuZGVmaW5lZDtcblx0XHR9XG5cdH1cblxuXHRwcml2YXRlIHJ1bkdpdFJlbW90ZUNvbW1hbmQoaW5zdGFsbGVkUGF0aDogc3RyaW5nLCBhcmdzOiBzdHJpbmdbXSk6IFByb21pc2U8c3RyaW5nPiB7XG5cdFx0cmV0dXJuIHRoaXMucnVuQ29tbWFuZENhcHR1cmUoXCJnaXRcIiwgYXJncywge1xuXHRcdFx0Y3dkOiBpbnN0YWxsZWRQYXRoLFxuXHRcdFx0dGltZW91dE1zOiBORVRXT1JLX1RJTUVPVVRfTVMsXG5cdFx0XHRlbnY6IHtcblx0XHRcdFx0R0lUX1RFUk1JTkFMX1BST01QVDogXCIwXCIsXG5cdFx0XHR9LFxuXHRcdH0pO1xuXHR9XG5cblx0cHJpdmF0ZSBhc3luYyBydW5XaXRoQ29uY3VycmVuY3k8VD4odGFza3M6IEFycmF5PCgpID0+IFByb21pc2U8VD4+LCBsaW1pdDogbnVtYmVyKTogUHJvbWlzZTxUW10+IHtcblx0XHRpZiAodGFza3MubGVuZ3RoID09PSAwKSB7XG5cdFx0XHRyZXR1cm4gW107XG5cdFx0fVxuXG5cdFx0Y29uc3QgcmVzdWx0czogVFtdID0gbmV3IEFycmF5KHRhc2tzLmxlbmd0aCk7XG5cdFx0bGV0IG5leHRJbmRleCA9IDA7XG5cdFx0Y29uc3Qgd29ya2VyQ291bnQgPSBNYXRoLm1heCgxLCBNYXRoLm1pbihsaW1pdCwgdGFza3MubGVuZ3RoKSk7XG5cblx0XHRjb25zdCB3b3JrZXIgPSBhc3luYyAoKSA9PiB7XG5cdFx0XHR3aGlsZSAodHJ1ZSkge1xuXHRcdFx0XHRjb25zdCBpbmRleCA9IG5leHRJbmRleDtcblx0XHRcdFx0bmV4dEluZGV4ICs9IDE7XG5cdFx0XHRcdGlmIChpbmRleCA+PSB0YXNrcy5sZW5ndGgpIHtcblx0XHRcdFx0XHRyZXR1cm47XG5cdFx0XHRcdH1cblx0XHRcdFx0cmVzdWx0c1tpbmRleF0gPSBhd2FpdCB0YXNrc1tpbmRleF0oKTtcblx0XHRcdH1cblx0XHR9O1xuXG5cdFx0YXdhaXQgUHJvbWlzZS5hbGwoQXJyYXkuZnJvbSh7IGxlbmd0aDogd29ya2VyQ291bnQgfSwgKCkgPT4gd29ya2VyKCkpKTtcblx0XHRyZXR1cm4gcmVzdWx0cztcblx0fVxuXG5cdC8qKlxuXHQgKiBHZXQgYSB1bmlxdWUgaWRlbnRpdHkgZm9yIGEgcGFja2FnZSwgaWdub3JpbmcgdmVyc2lvbi9yZWYuXG5cdCAqIFVzZWQgdG8gZGV0ZWN0IHdoZW4gdGhlIHNhbWUgcGFja2FnZSBpcyBpbiBib3RoIGdsb2JhbCBhbmQgcHJvamVjdCBzZXR0aW5ncy5cblx0ICogRm9yIGdpdCBwYWNrYWdlcywgdXNlcyBub3JtYWxpemVkIGhvc3QvcGF0aCB0byBlbnN1cmUgU1NIIGFuZCBIVFRQUyBVUkxzXG5cdCAqIGZvciB0aGUgc2FtZSByZXBvc2l0b3J5IGFyZSB0cmVhdGVkIGFzIGlkZW50aWNhbC5cblx0ICovXG5cdHByaXZhdGUgZ2V0UGFja2FnZUlkZW50aXR5KHNvdXJjZTogc3RyaW5nLCBzY29wZT86IFNvdXJjZVNjb3BlKTogc3RyaW5nIHtcblx0XHRjb25zdCBwYXJzZWQgPSB0aGlzLnBhcnNlU291cmNlKHNvdXJjZSk7XG5cdFx0aWYgKHBhcnNlZC50eXBlID09PSBcIm5wbVwiKSB7XG5cdFx0XHRyZXR1cm4gYG5wbToke3BhcnNlZC5uYW1lfWA7XG5cdFx0fVxuXHRcdGlmIChwYXJzZWQudHlwZSA9PT0gXCJnaXRcIikge1xuXHRcdFx0Ly8gVXNlIGhvc3QvcGF0aCBmb3IgaWRlbnRpdHkgdG8gbm9ybWFsaXplIFNTSCBhbmQgSFRUUFNcblx0XHRcdHJldHVybiBgZ2l0OiR7cGFyc2VkLmhvc3R9LyR7cGFyc2VkLnBhdGh9YDtcblx0XHR9XG5cdFx0aWYgKHNjb3BlKSB7XG5cdFx0XHRjb25zdCBiYXNlRGlyID0gdGhpcy5nZXRCYXNlRGlyRm9yU2NvcGUoc2NvcGUpO1xuXHRcdFx0cmV0dXJuIGBsb2NhbDoke3RoaXMucmVzb2x2ZVBhdGhGcm9tQmFzZShwYXJzZWQucGF0aCwgYmFzZURpcil9YDtcblx0XHR9XG5cdFx0cmV0dXJuIGBsb2NhbDoke3RoaXMucmVzb2x2ZVBhdGgocGFyc2VkLnBhdGgpfWA7XG5cdH1cblxuXHQvKipcblx0ICogRGVkdXBlIHBhY2thZ2VzOiBpZiBzYW1lIHBhY2thZ2UgaWRlbnRpdHkgYXBwZWFycyBpbiBib3RoIGdsb2JhbCBhbmQgcHJvamVjdCxcblx0ICoga2VlcCBvbmx5IHRoZSBwcm9qZWN0IG9uZSAocHJvamVjdCB3aW5zKS5cblx0ICovXG5cdHByaXZhdGUgZGVkdXBlUGFja2FnZXMoXG5cdFx0cGFja2FnZXM6IEFycmF5PHsgcGtnOiBQYWNrYWdlU291cmNlOyBzY29wZTogU291cmNlU2NvcGUgfT4sXG5cdCk6IEFycmF5PHsgcGtnOiBQYWNrYWdlU291cmNlOyBzY29wZTogU291cmNlU2NvcGUgfT4ge1xuXHRcdGNvbnN0IHNlZW4gPSBuZXcgTWFwPHN0cmluZywgeyBwa2c6IFBhY2thZ2VTb3VyY2U7IHNjb3BlOiBTb3VyY2VTY29wZSB9PigpO1xuXG5cdFx0Zm9yIChjb25zdCBlbnRyeSBvZiBwYWNrYWdlcykge1xuXHRcdFx0Y29uc3Qgc291cmNlU3RyID0gdHlwZW9mIGVudHJ5LnBrZyA9PT0gXCJzdHJpbmdcIiA/IGVudHJ5LnBrZyA6IGVudHJ5LnBrZy5zb3VyY2U7XG5cdFx0XHRjb25zdCBpZGVudGl0eSA9IHRoaXMuZ2V0UGFja2FnZUlkZW50aXR5KHNvdXJjZVN0ciwgZW50cnkuc2NvcGUpO1xuXG5cdFx0XHRjb25zdCBleGlzdGluZyA9IHNlZW4uZ2V0KGlkZW50aXR5KTtcblx0XHRcdGlmICghZXhpc3RpbmcpIHtcblx0XHRcdFx0c2Vlbi5zZXQoaWRlbnRpdHksIGVudHJ5KTtcblx0XHRcdH0gZWxzZSBpZiAoZW50cnkuc2NvcGUgPT09IFwicHJvamVjdFwiICYmIGV4aXN0aW5nLnNjb3BlID09PSBcInVzZXJcIikge1xuXHRcdFx0XHQvLyBQcm9qZWN0IHdpbnMgb3ZlciB1c2VyXG5cdFx0XHRcdHNlZW4uc2V0KGlkZW50aXR5LCBlbnRyeSk7XG5cdFx0XHR9XG5cdFx0XHQvLyBJZiBleGlzdGluZyBpcyBwcm9qZWN0IGFuZCBuZXcgaXMgZ2xvYmFsLCBrZWVwIGV4aXN0aW5nIChwcm9qZWN0KVxuXHRcdFx0Ly8gSWYgYm90aCBhcmUgc2FtZSBzY29wZSwga2VlcCBmaXJzdCBvbmVcblx0XHR9XG5cblx0XHRyZXR1cm4gQXJyYXkuZnJvbShzZWVuLnZhbHVlcygpKTtcblx0fVxuXG5cdHByaXZhdGUgcGFyc2VOcG1TcGVjKHNwZWM6IHN0cmluZyk6IHsgbmFtZTogc3RyaW5nOyB2ZXJzaW9uPzogc3RyaW5nIH0ge1xuXHRcdGNvbnN0IG1hdGNoID0gc3BlYy5tYXRjaCgvXihAP1teQF0rKD86XFwvW15AXSspPykoPzpAKC4rKSk/JC8pO1xuXHRcdGlmICghbWF0Y2gpIHtcblx0XHRcdHJldHVybiB7IG5hbWU6IHNwZWMgfTtcblx0XHR9XG5cdFx0Y29uc3QgbmFtZSA9IG1hdGNoWzFdID8/IHNwZWM7XG5cdFx0Y29uc3QgdmVyc2lvbiA9IG1hdGNoWzJdO1xuXHRcdHJldHVybiB7IG5hbWUsIHZlcnNpb24gfTtcblx0fVxuXG5cdHByaXZhdGUgZ2V0TnBtQ29tbWFuZCgpOiB7IGNvbW1hbmQ6IHN0cmluZzsgYXJnczogc3RyaW5nW10gfSB7XG5cdFx0Y29uc3QgY29uZmlndXJlZENvbW1hbmQgPSB0aGlzLnNldHRpbmdzTWFuYWdlci5nZXROcG1Db21tYW5kKCk7XG5cdFx0aWYgKCFjb25maWd1cmVkQ29tbWFuZCB8fCBjb25maWd1cmVkQ29tbWFuZC5sZW5ndGggPT09IDApIHtcblx0XHRcdHJldHVybiB7IGNvbW1hbmQ6IFwibnBtXCIsIGFyZ3M6IFtdIH07XG5cdFx0fVxuXHRcdGNvbnN0IFtjb21tYW5kLCAuLi5hcmdzXSA9IGNvbmZpZ3VyZWRDb21tYW5kO1xuXHRcdGlmICghY29tbWFuZCkge1xuXHRcdFx0dGhyb3cgbmV3IEVycm9yKFwiSW52YWxpZCBucG1Db21tYW5kOiBmaXJzdCBhcnJheSBlbnRyeSBtdXN0IGJlIGEgbm9uLWVtcHR5IGNvbW1hbmRcIik7XG5cdFx0fVxuXHRcdHJldHVybiB7IGNvbW1hbmQsIGFyZ3MgfTtcblx0fVxuXG5cdHByaXZhdGUgYXN5bmMgcnVuTnBtQ29tbWFuZChhcmdzOiBzdHJpbmdbXSwgb3B0aW9ucz86IHsgY3dkPzogc3RyaW5nIH0pOiBQcm9taXNlPHZvaWQ+IHtcblx0XHRjb25zdCBucG1Db21tYW5kID0gdGhpcy5nZXROcG1Db21tYW5kKCk7XG5cdFx0YXdhaXQgdGhpcy5ydW5Db21tYW5kKG5wbUNvbW1hbmQuY29tbWFuZCwgWy4uLm5wbUNvbW1hbmQuYXJncywgLi4uYXJnc10sIG9wdGlvbnMpO1xuXHR9XG5cblx0cHJpdmF0ZSBnZXRHaXREZXBlbmRlbmN5SW5zdGFsbEFyZ3MoKTogc3RyaW5nW10ge1xuXHRcdGNvbnN0IGNvbmZpZ3VyZWRDb21tYW5kID0gdGhpcy5zZXR0aW5nc01hbmFnZXIuZ2V0TnBtQ29tbWFuZCgpO1xuXHRcdGlmIChjb25maWd1cmVkQ29tbWFuZCAmJiBjb25maWd1cmVkQ29tbWFuZC5sZW5ndGggPiAwKSB7XG5cdFx0XHRyZXR1cm4gW1wiaW5zdGFsbFwiXTtcblx0XHR9XG5cdFx0cmV0dXJuIFtcImluc3RhbGxcIiwgXCItLW9taXQ9ZGV2XCJdO1xuXHR9XG5cblx0cHJpdmF0ZSBydW5OcG1Db21tYW5kU3luYyhhcmdzOiBzdHJpbmdbXSk6IHN0cmluZyB7XG5cdFx0Y29uc3QgbnBtQ29tbWFuZCA9IHRoaXMuZ2V0TnBtQ29tbWFuZCgpO1xuXHRcdHJldHVybiB0aGlzLnJ1bkNvbW1hbmRTeW5jKG5wbUNvbW1hbmQuY29tbWFuZCwgWy4uLm5wbUNvbW1hbmQuYXJncywgLi4uYXJnc10pO1xuXHR9XG5cblxuW1Nob3dpbmcgbGluZXMgMS0xNjg3IG9mIDI0NDUgKDUwLjBLQiBsaW1pdCkuIFVzZSBvZmZzZXQ9MTY4OCB0byBjb250aW51ZS5dIn1dLCJkZXRhaWxzIjp7InRydW5jYXRpb24iOnsiY29udGVudCI6ImltcG9ydCB7IHR5cGUgQ2hpbGRQcm9jZXNzLCB0eXBlIENoaWxkUHJvY2Vzc0J5U3RkaW8sIHNwYXduLCBzcGF3blN5bmMgfSBmcm9tIFwibm9kZTpjaGlsZF9wcm9jZXNzXCI7XG5pbXBvcnQgeyBjcmVhdGVIYXNoIH0gZnJvbSBcIm5vZGU6Y3J5cHRvXCI7XG5pbXBvcnQgeyBleGlzdHNTeW5jLCBta2RpclN5bmMsIHJlYWRkaXJTeW5jLCByZWFkRmlsZVN5bmMsIHJtU3luYywgc3RhdFN5bmMsIHdyaXRlRmlsZVN5bmMgfSBmcm9tIFwibm9kZTpmc1wiO1xuaW1wb3J0IHsgaG9tZWRpciwgdG1wZGlyIH0gZnJvbSBcIm5vZGU6b3NcIjtcblxuZnVuY3Rpb24gZ2V0RW52KCk6IE5vZGVKUy5Qcm9jZXNzRW52IHtcblx0aWYgKHByb2Nlc3MucGxhdGZvcm0gIT09IFwibGludXhcIiB8fCBPYmplY3Qua2V5cyhwcm9jZXNzLmVudikubGVuZ3RoID4gMCkge1xuXHRcdHJldHVybiBwcm9jZXNzLmVudjtcblx0fVxuXHR0cnkge1xuXHRcdGNvbnN0IGRhdGEgPSByZWFkRmlsZVN5bmMoXCIvcHJvYy9zZWxmL2Vudmlyb25cIiwgXCJ1dGYtOFwiKTtcblx0XHRjb25zdCBlbnY6IE5vZGVKUy5Qcm9jZXNzRW52ID0ge307XG5cdFx0Zm9yIChjb25zdCBlbnRyeSBvZiBkYXRhLnNwbGl0KFwiXFwwXCIpKSB7XG5cdFx0XHRjb25zdCBpZHggPSBlbnRyeS5pbmRleE9mKFwiPVwiKTtcblx0XHRcdGlmIChpZHggPiAwKSB7XG5cdFx0XHRcdGVudltlbnRyeS5zbGljZSgwLCBpZHgpXSA9IGVudHJ5LnNsaWNlKGlkeCArIDEpO1xuXHRcdFx0fVxuXHRcdH1cblx0XHRyZXR1cm4gZW52O1xuXHR9IGNhdGNoIHtcblx0XHRyZXR1cm4gcHJvY2Vzcy5lbnY7XG5cdH1cbn1cblxuaW1wb3J0IHsgYmFzZW5hbWUsIGRpcm5hbWUsIGpvaW4sIHJlbGF0aXZlLCByZXNvbHZlLCBzZXAgfSBmcm9tIFwibm9kZTpwYXRoXCI7XG5pbXBvcnQgdHlwZSB7IFJlYWRhYmxlIH0gZnJvbSBcIm5vZGU6c3RyZWFtXCI7XG5pbXBvcnQgeyBnbG9iU3luYyB9IGZyb20gXCJnbG9iXCI7XG5pbXBvcnQgaWdub3JlIGZyb20gXCJpZ25vcmVcIjtcbmltcG9ydCB7IG1pbmltYXRjaCB9IGZyb20gXCJtaW5pbWF0Y2hcIjtcbmltcG9ydCB7IENPTkZJR19ESVJfTkFNRSB9IGZyb20gXCIuLi9jb25maWcuanNcIjtcbmltcG9ydCB7IHR5cGUgR2l0U291cmNlLCBwYXJzZUdpdFVybCB9IGZyb20gXCIuLi91dGlscy9naXQuanNcIjtcbmltcG9ydCB7IGNhbm9uaWNhbGl6ZVBhdGgsIGlzTG9jYWxQYXRoIH0gZnJvbSBcIi4uL3V0aWxzL3BhdGhzLmpzXCI7XG5pbXBvcnQgeyBpc1N0ZG91dFRha2VuT3ZlciB9IGZyb20gXCIuL291dHB1dC1ndWFyZC5qc1wiO1xuaW1wb3J0IHR5cGUgeyBQYWNrYWdlU291cmNlLCBTZXR0aW5nc01hbmFnZXIgfSBmcm9tIFwiLi9zZXR0aW5ncy1tYW5hZ2VyLmpzXCI7XG5cbmNvbnN0IE5FVFdPUktfVElNRU9VVF9NUyA9IDEwMDAwO1xuY29uc3QgVVBEQVRFX0NIRUNLX0NPTkNVUlJFTkNZID0gNDtcbmNvbnN0IEdJVF9VUERBVEVfQ09OQ1VSUkVOQ1kgPSA0O1xuXG5mdW5jdGlvbiBpc09mZmxpbmVNb2RlRW5hYmxlZCgpOiBib29sZWFuIHtcblx0Y29uc3QgdmFsdWUgPSBwcm9jZXNzLmVudi5QSV9PRkZMSU5FO1xuXHRpZiAoIXZhbHVlKSByZXR1cm4gZmFsc2U7XG5cdHJldHVybiB2YWx1ZSA9PT0gXCIxXCIgfHwgdmFsdWUudG9Mb3dlckNhc2UoKSA9PT0gXCJ0cnVlXCIgfHwgdmFsdWUudG9Mb3dlckNhc2UoKSA9PT0gXCJ5ZXNcIjtcbn1cblxuZXhwb3J0IGludGVyZmFjZSBQYXRoTWV0YWRhdGEge1xuXHRzb3VyY2U6IHN0cmluZztcblx0c2NvcGU6IFNvdXJjZVNjb3BlO1xuXHRvcmlnaW46IFwicGFja2FnZVwiIHwgXCJ0b3AtbGV2ZWxcIjtcblx0YmFzZURpcj86IHN0cmluZztcbn1cblxuZXhwb3J0IGludGVyZmFjZSBSZXNvbHZlZFJlc291cmNlIHtcblx0cGF0aDogc3RyaW5nO1xuXHRlbmFibGVkOiBib29sZWFuO1xuXHRtZXRhZGF0YTogUGF0aE1ldGFkYXRhO1xufVxuXG5leHBvcnQgaW50ZXJmYWNlIFJlc29sdmVkUGF0aHMge1xuXHRleHRlbnNpb25zOiBSZXNvbHZlZFJlc291cmNlW107XG5cdHNraWxsczogUmVzb2x2ZWRSZXNvdXJjZVtdO1xuXHRwcm9tcHRzOiBSZXNvbHZlZFJlc291cmNlW107XG5cdHRoZW1lczogUmVzb2x2ZWRSZXNvdXJjZVtdO1xufVxuXG5leHBvcnQgdHlwZSBNaXNzaW5nU291cmNlQWN0aW9uID0gXCJpbnN0YWxsXCIgfCBcInNraXBcIiB8IFwiZXJyb3JcIjtcblxuZXhwb3J0IGludGVyZmFjZSBQcm9ncmVzc0V2ZW50IHtcblx0dHlwZTogXCJzdGFydFwiIHwgXCJwcm9ncmVzc1wiIHwgXCJjb21wbGV0ZVwiIHwgXCJlcnJvclwiO1xuXHRhY3Rpb246IFwiaW5zdGFsbFwiIHwgXCJyZW1vdmVcIiB8IFwidXBkYXRlXCIgfCBcImNsb25lXCIgfCBcInB1bGxcIjtcblx0c291cmNlOiBzdHJpbmc7XG5cdG1lc3NhZ2U/OiBzdHJpbmc7XG59XG5cbmV4cG9ydCB0eXBlIFByb2dyZXNzQ2FsbGJhY2sgPSAoZXZlbnQ6IFByb2dyZXNzRXZlbnQpID0+IHZvaWQ7XG5cbmV4cG9ydCBpbnRlcmZhY2UgUGFja2FnZVVwZGF0ZSB7XG5cdHNvdXJjZTogc3RyaW5nO1xuXHRkaXNwbGF5TmFtZTogc3RyaW5nO1xuXHR0eXBlOiBcIm5wbVwiIHwgXCJnaXRcIjtcblx0c2NvcGU6IEV4Y2x1ZGU8U291cmNlU2NvcGUsIFwidGVtcG9yYXJ5XCI+O1xufVxuXG5leHBvcnQgaW50ZXJmYWNlIENvbmZpZ3VyZWRQYWNrYWdlIHtcblx0c291cmNlOiBzdHJpbmc7XG5cdHNjb3BlOiBcInVzZXJcIiB8IFwicHJvamVjdFwiO1xuXHRmaWx0ZXJlZDogYm9vbGVhbjtcblx0aW5zdGFsbGVkUGF0aD86IHN0cmluZztcbn1cblxuZXhwb3J0IGludGVyZmFjZSBQYWNrYWdlTWFuYWdlciB7XG5cdHJlc29sdmUob25NaXNzaW5nPzogKHNvdXJjZTogc3RyaW5nKSA9PiBQcm9taXNlPE1pc3NpbmdTb3VyY2VBY3Rpb24+KTogUHJvbWlzZTxSZXNvbHZlZFBhdGhzPjtcblx0aW5zdGFsbChzb3VyY2U6IHN0cmluZywgb3B0aW9ucz86IHsgbG9jYWw/OiBib29sZWFuIH0pOiBQcm9taXNlPHZvaWQ+O1xuXHRpbnN0YWxsQW5kUGVyc2lzdChzb3VyY2U6IHN0cmluZywgb3B0aW9ucz86IHsgbG9jYWw/OiBib29sZWFuIH0pOiBQcm9taXNlPHZvaWQ+O1xuXHRyZW1vdmUoc291cmNlOiBzdHJpbmcsIG9wdGlvbnM/OiB7IGxvY2FsPzogYm9vbGVhbiB9KTogUHJvbWlzZTx2b2lkPjtcblx0cmVtb3ZlQW5kUGVyc2lzdChzb3VyY2U6IHN0cmluZywgb3B0aW9ucz86IHsgbG9jYWw/OiBib29sZWFuIH0pOiBQcm9taXNlPGJvb2xlYW4+O1xuXHR1cGRhdGUoc291cmNlPzogc3RyaW5nKTogUHJvbWlzZTx2b2lkPjtcblx0bGlzdENvbmZpZ3VyZWRQYWNrYWdlcygpOiBDb25maWd1cmVkUGFja2FnZVtdO1xuXHRyZXNvbHZlRXh0ZW5zaW9uU291cmNlcyhcblx0XHRzb3VyY2VzOiBzdHJpbmdbXSxcblx0XHRvcHRpb25zPzogeyBsb2NhbD86IGJvb2xlYW47IHRlbXBvcmFyeT86IGJvb2xlYW4gfSxcblx0KTogUHJvbWlzZTxSZXNvbHZlZFBhdGhzPjtcblx0YWRkU291cmNlVG9TZXR0aW5ncyhzb3VyY2U6IHN0cmluZywgb3B0aW9ucz86IHsgbG9jYWw/OiBib29sZWFuIH0pOiBib29sZWFuO1xuXHRyZW1vdmVTb3VyY2VGcm9tU2V0dGluZ3Moc291cmNlOiBzdHJpbmcsIG9wdGlvbnM/OiB7IGxvY2FsPzogYm9vbGVhbiB9KTogYm9vbGVhbjtcblx0c2V0UHJvZ3Jlc3NDYWxsYmFjayhjYWxsYmFjazogUHJvZ3Jlc3NDYWxsYmFjayB8IHVuZGVmaW5lZCk6IHZvaWQ7XG5cdGdldEluc3RhbGxlZFBhdGgoc291cmNlOiBzdHJpbmcsIHNjb3BlOiBcInVzZXJcIiB8IFwicHJvamVjdFwiKTogc3RyaW5nIHwgdW5kZWZpbmVkO1xufVxuXG5pbnRlcmZhY2UgUGFja2FnZU1hbmFnZXJPcHRpb25zIHtcblx0Y3dkOiBzdHJpbmc7XG5cdGFnZW50RGlyOiBzdHJpbmc7XG5cdHNldHRpbmdzTWFuYWdlcjogU2V0dGluZ3NNYW5hZ2VyO1xufVxuXG50eXBlIFNvdXJjZVNjb3BlID0gXCJ1c2VyXCIgfCBcInByb2plY3RcIiB8IFwidGVtcG9yYXJ5XCI7XG5cbnR5cGUgTnBtU291cmNlID0ge1xuXHR0eXBlOiBcIm5wbVwiO1xuXHRzcGVjOiBzdHJpbmc7XG5cdG5hbWU6IHN0cmluZztcblx0cGlubmVkOiBib29sZWFuO1xufTtcblxudHlwZSBMb2NhbFNvdXJjZSA9IHtcblx0dHlwZTogXCJsb2NhbFwiO1xuXHRwYXRoOiBzdHJpbmc7XG59O1xuXG50eXBlIFBhcnNlZFNvdXJjZSA9IE5wbVNvdXJjZSB8IEdpdFNvdXJjZSB8IExvY2FsU291cmNlO1xuXG50eXBlIEluc3RhbGxlZFNvdXJjZVNjb3BlID0gRXhjbHVkZTxTb3VyY2VTY29wZSwgXCJ0ZW1wb3JhcnlcIj47XG5cbmludGVyZmFjZSBDb25maWd1cmVkVXBkYXRlU291cmNlIHtcblx0c291cmNlOiBzdHJpbmc7XG5cdHNjb3BlOiBJbnN0YWxsZWRTb3VyY2VTY29wZTtcbn1cblxuaW50ZXJmYWNlIE5wbVVwZGF0ZVRhcmdldCBleHRlbmRzIENvbmZpZ3VyZWRVcGRhdGVTb3VyY2Uge1xuXHRwYXJzZWQ6IE5wbVNvdXJjZTtcbn1cblxuaW50ZXJmYWNlIEdpdFVwZGF0ZVRhcmdldCBleHRlbmRzIENvbmZpZ3VyZWRVcGRhdGVTb3VyY2Uge1xuXHRwYXJzZWQ6IEdpdFNvdXJjZTtcbn1cblxuaW50ZXJmYWNlIFBpTWFuaWZlc3Qge1xuXHRleHRlbnNpb25zPzogc3RyaW5nW107XG5cdHNraWxscz86IHN0cmluZ1tdO1xuXHRwcm9tcHRzPzogc3RyaW5nW107XG5cdHRoZW1lcz86IHN0cmluZ1tdO1xufVxuXG5pbnRlcmZhY2UgUmVzb3VyY2VBY2N1bXVsYXRvciB7XG5cdGV4dGVuc2lvbnM6IE1hcDxzdHJpbmcsIHsgbWV0YWRhdGE6IFBhdGhNZXRhZGF0YTsgZW5hYmxlZDogYm9vbGVhbiB9Pjtcblx0c2tpbGxzOiBNYXA8c3RyaW5nLCB7IG1ldGFkYXRhOiBQYXRoTWV0YWRhdGE7IGVuYWJsZWQ6IGJvb2xlYW4gfT47XG5cdHByb21wdHM6IE1hcDxzdHJpbmcsIHsgbWV0YWRhdGE6IFBhdGhNZXRhZGF0YTsgZW5hYmxlZDogYm9vbGVhbiB9Pjtcblx0dGhlbWVzOiBNYXA8c3RyaW5nLCB7IG1ldGFkYXRhOiBQYXRoTWV0YWRhdGE7IGVuYWJsZWQ6IGJvb2xlYW4gfT47XG59XG5cbi8qKlxuICogQ29tcHV0ZSBhIG51bWVyaWMgcHJlY2VkZW5jZSByYW5rIGZvciBhIHJlc291cmNlIGJhc2VkIG9uIGl0cyBtZXRhZGF0YS5cbiAqIExvd2VyIHJhbmsgPSBoaWdoZXIgcHJlY2VkZW5jZS4gVXNlZCB0byBzb3J0IHJlc29sdmVkIHJlc291cmNlcyBzbyB0aGF0XG4gKiBuYW1lLWNvbGxpc2lvbiByZXNvbHV0aW9uIChcImZpcnN0IHdpbnNcIikgcHJvZHVjZXMgdGhlIGNvcnJlY3Qgb3V0Y29tZS5cbiAqXG4gKiBQcmVjZWRlbmNlIChoaWdoZXN0IHRvIGxvd2VzdCk6XG4gKiAgIDAgIHByb2plY3QgKyBzZXR0aW5ncyBlbnRyeSAoc291cmNlOiBcImxvY2FsXCIsIHNjb3BlOiBcInByb2plY3RcIilcbiAqICAgMSAgcHJvamVjdCArIGF1dG8tZGlzY292ZXJlZCAoc291cmNlOiBcImF1dG9cIiwgc2NvcGU6IFwicHJvamVjdFwiKVxuICogICAyICB1c2VyICsgc2V0dGluZ3MgZW50cnkgKHNvdXJjZTogXCJsb2NhbFwiLCBzY29wZTogXCJ1c2VyXCIpXG4gKiAgIDMgIHVzZXIgKyBhdXRvLWRpc2NvdmVyZWQgKHNvdXJjZTogXCJhdXRvXCIsIHNjb3BlOiBcInVzZXJcIilcbiAqICAgNCAgcGFja2FnZSByZXNvdXJjZSAob3JpZ2luOiBcInBhY2thZ2VcIilcbiAqL1xuZnVuY3Rpb24gcmVzb3VyY2VQcmVjZWRlbmNlUmFuayhtOiBQYXRoTWV0YWRhdGEpOiBudW1iZXIge1xuXHRpZiAobS5vcmlnaW4gPT09IFwicGFja2FnZVwiKSByZXR1cm4gNDtcblx0Y29uc3Qgc2NvcGVCYXNlID0gbS5zY29wZSA9PT0gXCJwcm9qZWN0XCIgPyAwIDogMjtcblx0cmV0dXJuIHNjb3BlQmFzZSArIChtLnNvdXJjZSA9PT0gXCJsb2NhbFwiID8gMCA6IDEpO1xufVxuXG5pbnRlcmZhY2UgUGFja2FnZUZpbHRlciB7XG5cdGV4dGVuc2lvbnM/OiBzdHJpbmdbXTtcblx0c2tpbGxzPzogc3RyaW5nW107XG5cdHByb21wdHM/OiBzdHJpbmdbXTtcblx0dGhlbWVzPzogc3RyaW5nW107XG59XG5cbnR5cGUgUmVzb3VyY2VUeXBlID0gXCJleHRlbnNpb25zXCIgfCBcInNraWxsc1wiIHwgXCJwcm9tcHRzXCIgfCBcInRoZW1lc1wiO1xuXG5jb25zdCBSRVNPVVJDRV9UWVBFUzogUmVzb3VyY2VUeXBlW10gPSBbXCJleHRlbnNpb25zXCIsIFwic2tpbGxzXCIsIFwicHJvbXB0c1wiLCBcInRoZW1lc1wiXTtcblxuY29uc3QgRklMRV9QQVRURVJOUzogUmVjb3JkPFJlc291cmNlVHlwZSwgUmVnRXhwPiA9IHtcblx0ZXh0ZW5zaW9uczogL1xcLih0c3xqcykkLyxcblx0c2tpbGxzOiAvXFwubWQkLyxcblx0cHJvbXB0czogL1xcLm1kJC8sXG5cdHRoZW1lczogL1xcLmpzb24kLyxcbn07XG5cbmNvbnN0IElHTk9SRV9GSUxFX05BTUVTID0gW1wiLmdpdGlnbm9yZVwiLCBcIi5pZ25vcmVcIiwgXCIuZmRpZ25vcmVcIl07XG5cbnR5cGUgSWdub3JlTWF0Y2hlciA9IFJldHVyblR5cGU8dHlwZW9mIGlnbm9yZT47XG5cbmZ1bmN0aW9uIHRvUG9zaXhQYXRoKHA6IHN0cmluZyk6IHN0cmluZyB7XG5cdHJldHVybiBwLnNwbGl0KHNlcCkuam9pbihcIi9cIik7XG59XG5cbmZ1bmN0aW9uIGdldEhvbWVEaXIoKTogc3RyaW5nIHtcblx0cmV0dXJuIHByb2Nlc3MuZW52LkhPTUUgfHwgaG9tZWRpcigpO1xufVxuXG5mdW5jdGlvbiBwcmVmaXhJZ25vcmVQYXR0ZXJuKGxpbmU6IHN0cmluZywgcHJlZml4OiBzdHJpbmcpOiBzdHJpbmcgfCBudWxsIHtcblx0Y29uc3QgdHJpbW1lZCA9IGxpbmUudHJpbSgpO1xuXHRpZiAoIXRyaW1tZWQpIHJldHVybiBudWxsO1xuXHRpZiAodHJpbW1lZC5zdGFydHNXaXRoKFwiI1wiKSAmJiAhdHJpbW1lZC5zdGFydHNXaXRoKFwiXFxcXCNcIikpIHJldHVybiBudWxsO1xuXG5cdGxldCBwYXR0ZXJuID0gbGluZTtcblx0bGV0IG5lZ2F0ZWQgPSBmYWxzZTtcblxuXHRpZiAocGF0dGVybi5zdGFydHNXaXRoKFwiIVwiKSkge1xuXHRcdG5lZ2F0ZWQgPSB0cnVlO1xuXHRcdHBhdHRlcm4gPSBwYXR0ZXJuLnNsaWNlKDEpO1xuXHR9IGVsc2UgaWYgKHBhdHRlcm4uc3RhcnRzV2l0aChcIlxcXFwhXCIpKSB7XG5cdFx0cGF0dGVybiA9IHBhdHRlcm4uc2xpY2UoMSk7XG5cdH1cblxuXHRpZiAocGF0dGVybi5zdGFydHNXaXRoKFwiL1wiKSkge1xuXHRcdHBhdHRlcm4gPSBwYXR0ZXJuLnNsaWNlKDEpO1xuXHR9XG5cblx0Y29uc3QgcHJlZml4ZWQgPSBwcmVmaXggPyBgJHtwcmVmaXh9JHtwYXR0ZXJufWAgOiBwYXR0ZXJuO1xuXHRyZXR1cm4gbmVnYXRlZCA/IGAhJHtwcmVmaXhlZH1gIDogcHJlZml4ZWQ7XG59XG5cbmZ1bmN0aW9uIGFkZElnbm9yZVJ1bGVzKGlnOiBJZ25vcmVNYXRjaGVyLCBkaXI6IHN0cmluZywgcm9vdERpcjogc3RyaW5nKTogdm9pZCB7XG5cdGNvbnN0IHJlbGF0aXZlRGlyID0gcmVsYXRpdmUocm9vdERpciwgZGlyKTtcblx0Y29uc3QgcHJlZml4ID0gcmVsYXRpdmVEaXIgPyBgJHt0b1Bvc2l4UGF0aChyZWxhdGl2ZURpcil9L2AgOiBcIlwiO1xuXG5cdGZvciAoY29uc3QgZmlsZW5hbWUgb2YgSUdOT1JFX0ZJTEVfTkFNRVMpIHtcblx0XHRjb25zdCBpZ25vcmVQYXRoID0gam9pbihkaXIsIGZpbGVuYW1lKTtcblx0XHRpZiAoIWV4aXN0c1N5bmMoaWdub3JlUGF0aCkpIGNvbnRpbnVlO1xuXHRcdHRyeSB7XG5cdFx0XHRjb25zdCBjb250ZW50ID0gcmVhZEZpbGVTeW5jKGlnbm9yZVBhdGgsIFwidXRmLThcIik7XG5cdFx0XHRjb25zdCBwYXR0ZXJucyA9IGNvbnRlbnRcblx0XHRcdFx0LnNwbGl0KC9cXHI/XFxuLylcblx0XHRcdFx0Lm1hcCgobGluZSkgPT4gcHJlZml4SWdub3JlUGF0dGVybihsaW5lLCBwcmVmaXgpKVxuXHRcdFx0XHQuZmlsdGVyKChsaW5lKTogbGluZSBpcyBzdHJpbmcgPT4gQm9vbGVhbihsaW5lKSk7XG5cdFx0XHRpZiAocGF0dGVybnMubGVuZ3RoID4gMCkge1xuXHRcdFx0XHRpZy5hZGQocGF0dGVybnMpO1xuXHRcdFx0fVxuXHRcdH0gY2F0Y2gge31cblx0fVxufVxuXG5mdW5jdGlvbiBpc1BhdHRlcm4oczogc3RyaW5nKTogYm9vbGVhbiB7XG5cdHJldHVybiBzLnN0YXJ0c1dpdGgoXCIhXCIpIHx8IHMuc3RhcnRzV2l0aChcIitcIikgfHwgcy5zdGFydHNXaXRoKFwiLVwiKSB8fCBzLmluY2x1ZGVzKFwiKlwiKSB8fCBzLmluY2x1ZGVzKFwiP1wiKTtcbn1cblxuZnVuY3Rpb24gaXNPdmVycmlkZVBhdHRlcm4oczogc3RyaW5nKTogYm9vbGVhbiB7XG5cdHJldHVybiBzLnN0YXJ0c1dpdGgoXCIhXCIpIHx8IHMuc3RhcnRzV2l0aChcIitcIikgfHwgcy5zdGFydHNXaXRoKFwiLVwiKTtcbn1cblxuZnVuY3Rpb24gaGFzR2xvYlBhdHRlcm4oczogc3RyaW5nKTogYm9vbGVhbiB7XG5cdHJldHVybiBzLmluY2x1ZGVzKFwiKlwiKSB8fCBzLmluY2x1ZGVzKFwiP1wiKTtcbn1cblxuZnVuY3Rpb24gc3BsaXRQYXR0ZXJucyhlbnRyaWVzOiBzdHJpbmdbXSk6IHsgcGxhaW46IHN0cmluZ1tdOyBwYXR0ZXJuczogc3RyaW5nW10gfSB7XG5cdGNvbnN0IHBsYWluOiBzdHJpbmdbXSA9IFtdO1xuXHRjb25zdCBwYXR0ZXJuczogc3RyaW5nW10gPSBbXTtcblx0Zm9yIChjb25zdCBlbnRyeSBvZiBlbnRyaWVzKSB7XG5cdFx0aWYgKGlzUGF0dGVybihlbnRyeSkpIHtcblx0XHRcdHBhdHRlcm5zLnB1c2goZW50cnkpO1xuXHRcdH0gZWxzZSB7XG5cdFx0XHRwbGFpbi5wdXNoKGVudHJ5KTtcblx0XHR9XG5cdH1cblx0cmV0dXJuIHsgcGxhaW4sIHBhdHRlcm5zIH07XG59XG5cbmZ1bmN0aW9uIGNvbGxlY3RGaWxlcyhcblx0ZGlyOiBzdHJpbmcsXG5cdGZpbGVQYXR0ZXJuOiBSZWdFeHAsXG5cdHNraXBOb2RlTW9kdWxlcyA9IHRydWUsXG5cdGlnbm9yZU1hdGNoZXI/OiBJZ25vcmVNYXRjaGVyLFxuXHRyb290RGlyPzogc3RyaW5nLFxuKTogc3RyaW5nW10ge1xuXHRjb25zdCBmaWxlczogc3RyaW5nW10gPSBbXTtcblx0aWYgKCFleGlzdHNTeW5jKGRpcikpIHJldHVybiBmaWxlcztcblxuXHRjb25zdCByb290ID0gcm9vdERpciA/PyBkaXI7XG5cdGNvbnN0IGlnID0gaWdub3JlTWF0Y2hlciA/PyBpZ25vcmUoKTtcblx0YWRkSWdub3JlUnVsZXMoaWcsIGRpciwgcm9vdCk7XG5cblx0dHJ5IHtcblx0XHRjb25zdCBlbnRyaWVzID0gcmVhZGRpclN5bmMoZGlyLCB7IHdpdGhGaWxlVHlwZXM6IHRydWUgfSk7XG5cdFx0Zm9yIChjb25zdCBlbnRyeSBvZiBlbnRyaWVzKSB7XG5cdFx0XHRpZiAoZW50cnkubmFtZS5zdGFydHNXaXRoKFwiLlwiKSkgY29udGludWU7XG5cdFx0XHRpZiAoc2tpcE5vZGVNb2R1bGVzICYmIGVudHJ5Lm5hbWUgPT09IFwibm9kZV9tb2R1bGVzXCIpIGNvbnRpbnVlO1xuXG5cdFx0XHRjb25zdCBmdWxsUGF0aCA9IGpvaW4oZGlyLCBlbnRyeS5uYW1lKTtcblx0XHRcdGxldCBpc0RpciA9IGVudHJ5LmlzRGlyZWN0b3J5KCk7XG5cdFx0XHRsZXQgaXNGaWxlID0gZW50cnkuaXNGaWxlKCk7XG5cblx0XHRcdGlmIChlbnRyeS5pc1N5bWJvbGljTGluaygpKSB7XG5cdFx0XHRcdHRyeSB7XG5cdFx0XHRcdFx0Y29uc3Qgc3RhdHMgPSBzdGF0U3luYyhmdWxsUGF0aCk7XG5cdFx0XHRcdFx0aXNEaXIgPSBzdGF0cy5pc0RpcmVjdG9yeSgpO1xuXHRcdFx0XHRcdGlzRmlsZSA9IHN0YXRzLmlzRmlsZSgpO1xuXHRcdFx0XHR9IGNhdGNoIHtcblx0XHRcdFx0XHRjb250aW51ZTtcblx0XHRcdFx0fVxuXHRcdFx0fVxuXG5cdFx0XHRjb25zdCByZWxQYXRoID0gdG9Qb3NpeFBhdGgocmVsYXRpdmUocm9vdCwgZnVsbFBhdGgpKTtcblx0XHRcdGNvbnN0IGlnbm9yZVBhdGggPSBpc0RpciA/IGAke3JlbFBhdGh9L2AgOiByZWxQYXRoO1xuXHRcdFx0aWYgKGlnLmlnbm9yZXMoaWdub3JlUGF0aCkpIGNvbnRpbnVlO1xuXG5cdFx0XHRpZiAoaXNEaXIpIHtcblx0XHRcdFx0ZmlsZXMucHVzaCguLi5jb2xsZWN0RmlsZXMoZnVsbFBhdGgsIGZpbGVQYXR0ZXJuLCBza2lwTm9kZU1vZHVsZXMsIGlnLCByb290KSk7XG5cdFx0XHR9IGVsc2UgaWYgKGlzRmlsZSAmJiBmaWxlUGF0dGVybi50ZXN0KGVudHJ5Lm5hbWUpKSB7XG5cdFx0XHRcdGZpbGVzLnB1c2goZnVsbFBhdGgpO1xuXHRcdFx0fVxuXHRcdH1cblx0fSBjYXRjaCB7XG5cdFx0Ly8gSWdub3JlIGVycm9yc1xuXHR9XG5cblx0cmV0dXJuIGZpbGVzO1xufVxuXG50eXBlIFNraWxsRGlzY292ZXJ5TW9kZSA9IFwicGlcIiB8IFwiYWdlbnRzXCI7XG5cbmZ1bmN0aW9uIGNvbGxlY3RTa2lsbEVudHJpZXMoXG5cdGRpcjogc3RyaW5nLFxuXHRtb2RlOiBTa2lsbERpc2NvdmVyeU1vZGUsXG5cdGlnbm9yZU1hdGNoZXI/OiBJZ25vcmVNYXRjaGVyLFxuXHRyb290RGlyPzogc3RyaW5nLFxuKTogc3RyaW5nW10ge1xuXHRjb25zdCBlbnRyaWVzOiBzdHJpbmdbXSA9IFtdO1xuXHRpZiAoIWV4aXN0c1N5bmMoZGlyKSkgcmV0dXJuIGVudHJpZXM7XG5cblx0Y29uc3Qgcm9vdCA9IHJvb3REaXIgPz8gZGlyO1xuXHRjb25zdCBpZyA9IGlnbm9yZU1hdGNoZXIgPz8gaWdub3JlKCk7XG5cdGFkZElnbm9yZVJ1bGVzKGlnLCBkaXIsIHJvb3QpO1xuXG5cdHRyeSB7XG5cdFx0Y29uc3QgZGlyRW50cmllcyA9IHJlYWRkaXJTeW5jKGRpciwgeyB3aXRoRmlsZVR5cGVzOiB0cnVlIH0pO1xuXG5cdFx0Zm9yIChjb25zdCBlbnRyeSBvZiBkaXJFbnRyaWVzKSB7XG5cdFx0XHRpZiAoZW50cnkubmFtZSAhPT0gXCJTS0lMTC5tZFwiKSB7XG5cdFx0XHRcdGNvbnRpbnVlO1xuXHRcdFx0fVxuXG5cdFx0XHRjb25zdCBmdWxsUGF0aCA9IGpvaW4oZGlyLCBlbnRyeS5uYW1lKTtcblx0XHRcdGxldCBpc0ZpbGUgPSBlbnRyeS5pc0ZpbGUoKTtcblx0XHRcdGlmIChlbnRyeS5pc1N5bWJvbGljTGluaygpKSB7XG5cdFx0XHRcdHRyeSB7XG5cdFx0XHRcdFx0aXNGaWxlID0gc3RhdFN5bmMoZnVsbFBhdGgpLmlzRmlsZSgpO1xuXHRcdFx0XHR9IGNhdGNoIHtcblx0XHRcdFx0XHRjb250aW51ZTtcblx0XHRcdFx0fVxuXHRcdFx0fVxuXG5cdFx0XHRjb25zdCByZWxQYXRoID0gdG9Qb3NpeFBhdGgocmVsYXRpdmUocm9vdCwgZnVsbFBhdGgpKTtcblx0XHRcdGlmIChpc0ZpbGUgJiYgIWlnLmlnbm9yZXMocmVsUGF0aCkpIHtcblx0XHRcdFx0ZW50cmllcy5wdXNoKGZ1bGxQYXRoKTtcblx0XHRcdFx0cmV0dXJuIGVudHJpZXM7XG5cdFx0XHR9XG5cdFx0fVxuXG5cdFx0Zm9yIChjb25zdCBlbnRyeSBvZiBkaXJFbnRyaWVzKSB7XG5cdFx0XHRpZiAoZW50cnkubmFtZS5zdGFydHNXaXRoKFwiLlwiKSkgY29udGludWU7XG5cdFx0XHRpZiAoZW50cnkubmFtZSA9PT0gXCJub2RlX21vZHVsZXNcIikgY29udGludWU7XG5cblx0XHRcdGNvbnN0IGZ1bGxQYXRoID0gam9pbihkaXIsIGVudHJ5Lm5hbWUpO1xuXHRcdFx0bGV0IGlzRGlyID0gZW50cnkuaXNEaXJlY3RvcnkoKTtcblx0XHRcdGxldCBpc0ZpbGUgPSBlbnRyeS5pc0ZpbGUoKTtcblxuXHRcdFx0aWYgKGVudHJ5LmlzU3ltYm9saWNMaW5rKCkpIHtcblx0XHRcdFx0dHJ5IHtcblx0XHRcdFx0XHRjb25zdCBzdGF0cyA9IHN0YXRTeW5jKGZ1bGxQYXRoKTtcblx0XHRcdFx0XHRpc0RpciA9IHN0YXRzLmlzRGlyZWN0b3J5KCk7XG5cdFx0XHRcdFx0aXNGaWxlID0gc3RhdHMuaXNGaWxlKCk7XG5cdFx0XHRcdH0gY2F0Y2gge1xuXHRcdFx0XHRcdGNvbnRpbnVlO1xuXHRcdFx0XHR9XG5cdFx0XHR9XG5cblx0XHRcdGNvbnN0IHJlbFBhdGggPSB0b1Bvc2l4UGF0aChyZWxhdGl2ZShyb290LCBmdWxsUGF0aCkpO1xuXHRcdFx0aWYgKG1vZGUgPT09IFwicGlcIiAmJiBkaXIgPT09IHJvb3QgJiYgaXNGaWxlICYmIGVudHJ5Lm5hbWUuZW5kc1dpdGgoXCIubWRcIikgJiYgIWlnLmlnbm9yZXMocmVsUGF0aCkpIHtcblx0XHRcdFx0ZW50cmllcy5wdXNoKGZ1bGxQYXRoKTtcblx0XHRcdFx0Y29udGludWU7XG5cdFx0XHR9XG5cblx0XHRcdGlmICghaXNEaXIpIGNvbnRpbnVlO1xuXHRcdFx0aWYgKGlnLmlnbm9yZXMoYCR7cmVsUGF0aH0vYCkpIGNvbnRpbnVlO1xuXG5cdFx0XHRlbnRyaWVzLnB1c2goLi4uY29sbGVjdFNraWxsRW50cmllcyhmdWxsUGF0aCwgbW9kZSwgaWcsIHJvb3QpKTtcblx0XHR9XG5cdH0gY2F0Y2gge1xuXHRcdC8vIElnbm9yZSBlcnJvcnNcblx0fVxuXG5cdHJldHVybiBlbnRyaWVzO1xufVxuXG5mdW5jdGlvbiBjb2xsZWN0QXV0b1NraWxsRW50cmllcyhkaXI6IHN0cmluZywgbW9kZTogU2tpbGxEaXNjb3ZlcnlNb2RlKTogc3RyaW5nW10ge1xuXHRyZXR1cm4gY29sbGVjdFNraWxsRW50cmllcyhkaXIsIG1vZGUpO1xufVxuXG5mdW5jdGlvbiBmaW5kR2l0UmVwb1Jvb3Qoc3RhcnREaXI6IHN0cmluZyk6IHN0cmluZyB8IG51bGwge1xuXHRsZXQgZGlyID0gcmVzb2x2ZShzdGFydERpcik7XG5cdHdoaWxlICh0cnVlKSB7XG5cdFx0aWYgKGV4aXN0c1N5bmMoam9pbihkaXIsIFwiLmdpdFwiKSkpIHtcblx0XHRcdHJldHVybiBkaXI7XG5cdFx0fVxuXHRcdGNvbnN0IHBhcmVudCA9IGRpcm5hbWUoZGlyKTtcblx0XHRpZiAocGFyZW50ID09PSBkaXIpIHtcblx0XHRcdHJldHVybiBudWxsO1xuXHRcdH1cblx0XHRkaXIgPSBwYXJlbnQ7XG5cdH1cbn1cblxuZnVuY3Rpb24gY29sbGVjdEFuY2VzdG9yQWdlbnRzU2tpbGxEaXJzKHN0YXJ0RGlyOiBzdHJpbmcpOiBzdHJpbmdbXSB7XG5cdGNvbnN0IHNraWxsRGlyczogc3RyaW5nW10gPSBbXTtcblx0Y29uc3QgcmVzb2x2ZWRTdGFydERpciA9IHJlc29sdmUoc3RhcnREaXIpO1xuXHRjb25zdCBnaXRSZXBvUm9vdCA9IGZpbmRHaXRSZXBvUm9vdChyZXNvbHZlZFN0YXJ0RGlyKTtcblxuXHRsZXQgZGlyID0gcmVzb2x2ZWRTdGFydERpcjtcblx0d2hpbGUgKHRydWUpIHtcblx0XHRza2lsbERpcnMucHVzaChqb2luKGRpciwgXCIuYWdlbnRzXCIsIFwic2tpbGxzXCIpKTtcblx0XHRpZiAoZ2l0UmVwb1Jvb3QgJiYgZGlyID09PSBnaXRSZXBvUm9vdCkge1xuXHRcdFx0YnJlYWs7XG5cdFx0fVxuXHRcdGNvbnN0IHBhcmVudCA9IGRpcm5hbWUoZGlyKTtcblx0XHRpZiAocGFyZW50ID09PSBkaXIpIHtcblx0XHRcdGJyZWFrO1xuXHRcdH1cblx0XHRkaXIgPSBwYXJlbnQ7XG5cdH1cblxuXHRyZXR1cm4gc2tpbGxEaXJzO1xufVxuXG5mdW5jdGlvbiBjb2xsZWN0QXV0b1Byb21wdEVudHJpZXMoZGlyOiBzdHJpbmcpOiBzdHJpbmdbXSB7XG5cdGNvbnN0IGVudHJpZXM6IHN0cmluZ1tdID0gW107XG5cdGlmICghZXhpc3RzU3luYyhkaXIpKSByZXR1cm4gZW50cmllcztcblxuXHRjb25zdCBpZyA9IGlnbm9yZSgpO1xuXHRhZGRJZ25vcmVSdWxlcyhpZywgZGlyLCBkaXIpO1xuXG5cdHRyeSB7XG5cdFx0Y29uc3QgZGlyRW50cmllcyA9IHJlYWRkaXJTeW5jKGRpciwgeyB3aXRoRmlsZVR5cGVzOiB0cnVlIH0pO1xuXHRcdGZvciAoY29uc3QgZW50cnkgb2YgZGlyRW50cmllcykge1xuXHRcdFx0aWYgKGVudHJ5Lm5hbWUuc3RhcnRzV2l0aChcIi5cIikpIGNvbnRpbnVlO1xuXHRcdFx0aWYgKGVudHJ5Lm5hbWUgPT09IFwibm9kZV9tb2R1bGVzXCIpIGNvbnRpbnVlO1xuXG5cdFx0XHRjb25zdCBmdWxsUGF0aCA9IGpvaW4oZGlyLCBlbnRyeS5uYW1lKTtcblx0XHRcdGxldCBpc0ZpbGUgPSBlbnRyeS5pc0ZpbGUoKTtcblx0XHRcdGlmIChlbnRyeS5pc1N5bWJvbGljTGluaygpKSB7XG5cdFx0XHRcdHRyeSB7XG5cdFx0XHRcdFx0aXNGaWxlID0gc3RhdFN5bmMoZnVsbFBhdGgpLmlzRmlsZSgpO1xuXHRcdFx0XHR9IGNhdGNoIHtcblx0XHRcdFx0XHRjb250aW51ZTtcblx0XHRcdFx0fVxuXHRcdFx0fVxuXG5cdFx0XHRjb25zdCByZWxQYXRoID0gdG9Qb3NpeFBhdGgocmVsYXRpdmUoZGlyLCBmdWxsUGF0aCkpO1xuXHRcdFx0aWYgKGlnLmlnbm9yZXMocmVsUGF0aCkpIGNvbnRpbnVlO1xuXG5cdFx0XHRpZiAoaXNGaWxlICYmIGVudHJ5Lm5hbWUuZW5kc1dpdGgoXCIubWRcIikpIHtcblx0XHRcdFx0ZW50cmllcy5wdXNoKGZ1bGxQYXRoKTtcblx0XHRcdH1cblx0XHR9XG5cdH0gY2F0Y2gge1xuXHRcdC8vIElnbm9yZSBlcnJvcnNcblx0fVxuXG5cdHJldHVybiBlbnRyaWVzO1xufVxuXG5mdW5jdGlvbiBjb2xsZWN0QXV0b1RoZW1lRW50cmllcyhkaXI6IHN0cmluZyk6IHN0cmluZ1tdIHtcblx0Y29uc3QgZW50cmllczogc3RyaW5nW10gPSBbXTtcblx0aWYgKCFleGlzdHNTeW5jKGRpcikpIHJldHVybiBlbnRyaWVzO1xuXG5cdGNvbnN0IGlnID0gaWdub3JlKCk7XG5cdGFkZElnbm9yZVJ1bGVzKGlnLCBkaXIsIGRpcik7XG5cblx0dHJ5IHtcblx0XHRjb25zdCBkaXJFbnRyaWVzID0gcmVhZGRpclN5bmMoZGlyLCB7IHdpdGhGaWxlVHlwZXM6IHRydWUgfSk7XG5cdFx0Zm9yIChjb25zdCBlbnRyeSBvZiBkaXJFbnRyaWVzKSB7XG5cdFx0XHRpZiAoZW50cnkubmFtZS5zdGFydHNXaXRoKFwiLlwiKSkgY29udGludWU7XG5cdFx0XHRpZiAoZW50cnkubmFtZSA9PT0gXCJub2RlX21vZHVsZXNcIikgY29udGludWU7XG5cblx0XHRcdGNvbnN0IGZ1bGxQYXRoID0gam9pbihkaXIsIGVudHJ5Lm5hbWUpO1xuXHRcdFx0bGV0IGlzRmlsZSA9IGVudHJ5LmlzRmlsZSgpO1xuXHRcdFx0aWYgKGVudHJ5LmlzU3ltYm9saWNMaW5rKCkpIHtcblx0XHRcdFx0dHJ5IHtcblx0XHRcdFx0XHRpc0ZpbGUgPSBzdGF0U3luYyhmdWxsUGF0aCkuaXNGaWxlKCk7XG5cdFx0XHRcdH0gY2F0Y2gge1xuXHRcdFx0XHRcdGNvbnRpbnVlO1xuXHRcdFx0XHR9XG5cdFx0XHR9XG5cblx0XHRcdGNvbnN0IHJlbFBhdGggPSB0b1Bvc2l4UGF0aChyZWxhdGl2ZShkaXIsIGZ1bGxQYXRoKSk7XG5cdFx0XHRpZiAoaWcuaWdub3JlcyhyZWxQYXRoKSkgY29udGludWU7XG5cblx0XHRcdGlmIChpc0ZpbGUgJiYgZW50cnkubmFtZS5lbmRzV2l0aChcIi5qc29uXCIpKSB7XG5cdFx0XHRcdGVudHJpZXMucHVzaChmdWxsUGF0aCk7XG5cdFx0XHR9XG5cdFx0fVxuXHR9IGNhdGNoIHtcblx0XHQvLyBJZ25vcmUgZXJyb3JzXG5cdH1cblxuXHRyZXR1cm4gZW50cmllcztcbn1cblxuZnVuY3Rpb24gcmVhZFBpTWFuaWZlc3RGaWxlKHBhY2thZ2VKc29uUGF0aDogc3RyaW5nKTogUGlNYW5pZmVzdCB8IG51bGwge1xuXHR0cnkge1xuXHRcdGNvbnN0IGNvbnRlbnQgPSByZWFkRmlsZVN5bmMocGFja2FnZUpzb25QYXRoLCBcInV0Zi04XCIpO1xuXHRcdGNvbnN0IHBrZyA9IEpTT04ucGFyc2UoY29udGVudCkgYXMgeyBwaT86IFBpTWFuaWZlc3QgfTtcblx0XHRyZXR1cm4gcGtnLnBpID8/IG51bGw7XG5cdH0gY2F0Y2gge1xuXHRcdHJldHVybiBudWxsO1xuXHR9XG59XG5cbmZ1bmN0aW9uIHJlc29sdmVFeHRlbnNpb25FbnRyaWVzKGRpcjogc3RyaW5nKTogc3RyaW5nW10gfCBudWxsIHtcblx0Y29uc3QgcGFja2FnZUpzb25QYXRoID0gam9pbihkaXIsIFwicGFja2FnZS5qc29uXCIpO1xuXHRpZiAoZXhpc3RzU3luYyhwYWNrYWdlSnNvblBhdGgpKSB7XG5cdFx0Y29uc3QgbWFuaWZlc3QgPSByZWFkUGlNYW5pZmVzdEZpbGUocGFja2FnZUpzb25QYXRoKTtcblx0XHRpZiAobWFuaWZlc3Q/LmV4dGVuc2lvbnM/Lmxlbmd0aCkge1xuXHRcdFx0Y29uc3QgZW50cmllczogc3RyaW5nW10gPSBbXTtcblx0XHRcdGZvciAoY29uc3QgZXh0UGF0aCBvZiBtYW5pZmVzdC5leHRlbnNpb25zKSB7XG5cdFx0XHRcdGNvbnN0IHJlc29sdmVkRXh0UGF0aCA9IHJlc29sdmUoZGlyLCBleHRQYXRoKTtcblx0XHRcdFx0aWYgKGV4aXN0c1N5bmMocmVzb2x2ZWRFeHRQYXRoKSkge1xuXHRcdFx0XHRcdGVudHJpZXMucHVzaChyZXNvbHZlZEV4dFBhdGgpO1xuXHRcdFx0XHR9XG5cdFx0XHR9XG5cdFx0XHRpZiAoZW50cmllcy5sZW5ndGggPiAwKSB7XG5cdFx0XHRcdHJldHVybiBlbnRyaWVzO1xuXHRcdFx0fVxuXHRcdH1cblx0fVxuXG5cdGNvbnN0IGluZGV4VHMgPSBqb2luKGRpciwgXCJpbmRleC50c1wiKTtcblx0Y29uc3QgaW5kZXhKcyA9IGpvaW4oZGlyLCBcImluZGV4LmpzXCIpO1xuXHRpZiAoZXhpc3RzU3luYyhpbmRleFRzKSkge1xuXHRcdHJldHVybiBbaW5kZXhUc107XG5cdH1cblx0aWYgKGV4aXN0c1N5bmMoaW5kZXhKcykpIHtcblx0XHRyZXR1cm4gW2luZGV4SnNdO1xuXHR9XG5cblx0cmV0dXJuIG51bGw7XG59XG5cbmZ1bmN0aW9uIGNvbGxlY3RBdXRvRXh0ZW5zaW9uRW50cmllcyhkaXI6IHN0cmluZyk6IHN0cmluZ1tdIHtcblx0Y29uc3QgZW50cmllczogc3RyaW5nW10gPSBbXTtcblx0aWYgKCFleGlzdHNTeW5jKGRpcikpIHJldHVybiBlbnRyaWVzO1xuXG5cdC8vIEZpcnN0IGNoZWNrIGlmIHRoaXMgZGlyZWN0b3J5IGl0c2VsZiBoYXMgZXhwbGljaXQgZXh0ZW5zaW9uIGVudHJpZXMgKHBhY2thZ2UuanNvbiBvciBpbmRleClcblx0Y29uc3Qgcm9vdEVudHJpZXMgPSByZXNvbHZlRXh0ZW5zaW9uRW50cmllcyhkaXIpO1xuXHRpZiAocm9vdEVudHJpZXMpIHtcblx0XHRyZXR1cm4gcm9vdEVudHJpZXM7XG5cdH1cblxuXHQvLyBPdGhlcndpc2UsIGRpc2NvdmVyIGV4dGVuc2lvbnMgZnJvbSBkaXJlY3RvcnkgY29udGVudHNcblx0Y29uc3QgaWcgPSBpZ25vcmUoKTtcblx0YWRkSWdub3JlUnVsZXMoaWcsIGRpciwgZGlyKTtcblxuXHR0cnkge1xuXHRcdGNvbnN0IGRpckVudHJpZXMgPSByZWFkZGlyU3luYyhkaXIsIHsgd2l0aEZpbGVUeXBlczogdHJ1ZSB9KTtcblx0XHRmb3IgKGNvbnN0IGVudHJ5IG9mIGRpckVudHJpZXMpIHtcblx0XHRcdGlmIChlbnRyeS5uYW1lLnN0YXJ0c1dpdGgoXCIuXCIpKSBjb250aW51ZTtcblx0XHRcdGlmIChlbnRyeS5uYW1lID09PSBcIm5vZGVfbW9kdWxlc1wiKSBjb250aW51ZTtcblxuXHRcdFx0Y29uc3QgZnVsbFBhdGggPSBqb2luKGRpciwgZW50cnkubmFtZSk7XG5cdFx0XHRsZXQgaXNEaXIgPSBlbnRyeS5pc0RpcmVjdG9yeSgpO1xuXHRcdFx0bGV0IGlzRmlsZSA9IGVudHJ5LmlzRmlsZSgpO1xuXG5cdFx0XHRpZiAoZW50cnkuaXNTeW1ib2xpY0xpbmsoKSkge1xuXHRcdFx0XHR0cnkge1xuXHRcdFx0XHRcdGNvbnN0IHN0YXRzID0gc3RhdFN5bmMoZnVsbFBhdGgpO1xuXHRcdFx0XHRcdGlzRGlyID0gc3RhdHMuaXNEaXJlY3RvcnkoKTtcblx0XHRcdFx0XHRpc0ZpbGUgPSBzdGF0cy5pc0ZpbGUoKTtcblx0XHRcdFx0fSBjYXRjaCB7XG5cdFx0XHRcdFx0Y29udGludWU7XG5cdFx0XHRcdH1cblx0XHRcdH1cblxuXHRcdFx0Y29uc3QgcmVsUGF0aCA9IHRvUG9zaXhQYXRoKHJlbGF0aXZlKGRpciwgZnVsbFBhdGgpKTtcblx0XHRcdGNvbnN0IGlnbm9yZVBhdGggPSBpc0RpciA/IGAke3JlbFBhdGh9L2AgOiByZWxQYXRoO1xuXHRcdFx0aWYgKGlnLmlnbm9yZXMoaWdub3JlUGF0aCkpIGNvbnRpbnVlO1xuXG5cdFx0XHRpZiAoaXNGaWxlICYmIChlbnRyeS5uYW1lLmVuZHNXaXRoKFwiLnRzXCIpIHx8IGVudHJ5Lm5hbWUuZW5kc1dpdGgoXCIuanNcIikpKSB7XG5cdFx0XHRcdGVudHJpZXMucHVzaChmdWxsUGF0aCk7XG5cdFx0XHR9IGVsc2UgaWYgKGlzRGlyKSB7XG5cdFx0XHRcdGNvbnN0IHJlc29sdmVkRW50cmllcyA9IHJlc29sdmVFeHRlbnNpb25FbnRyaWVzKGZ1bGxQYXRoKTtcblx0XHRcdFx0aWYgKHJlc29sdmVkRW50cmllcykge1xuXHRcdFx0XHRcdGVudHJpZXMucHVzaCguLi5yZXNvbHZlZEVudHJpZXMpO1xuXHRcdFx0XHR9XG5cdFx0XHR9XG5cdFx0fVxuXHR9IGNhdGNoIHtcblx0XHQvLyBJZ25vcmUgZXJyb3JzXG5cdH1cblxuXHRyZXR1cm4gZW50cmllcztcbn1cblxuLyoqXG4gKiBDb2xsZWN0IHJlc291cmNlIGZpbGVzIGZyb20gYSBkaXJlY3RvcnkgYmFzZWQgb24gcmVzb3VyY2UgdHlwZS5cbiAqIEV4dGVuc2lvbnMgdXNlIHNtYXJ0IGRpc2NvdmVyeSAoaW5kZXgudHMgaW4gc3ViZGlycyksIG90aGVycyB1c2UgcmVjdXJzaXZlIGNvbGxlY3Rpb24uXG4gKi9cbmZ1bmN0aW9uIGNvbGxlY3RSZXNvdXJjZUZpbGVzKGRpcjogc3RyaW5nLCByZXNvdXJjZVR5cGU6IFJlc291cmNlVHlwZSk6IHN0cmluZ1tdIHtcblx0aWYgKHJlc291cmNlVHlwZSA9PT0gXCJza2lsbHNcIikge1xuXHRcdHJldHVybiBjb2xsZWN0U2tpbGxFbnRyaWVzKGRpciwgXCJwaVwiKTtcblx0fVxuXHRpZiAocmVzb3VyY2VUeXBlID09PSBcImV4dGVuc2lvbnNcIikge1xuXHRcdHJldHVybiBjb2xsZWN0QXV0b0V4dGVuc2lvbkVudHJpZXMoZGlyKTtcblx0fVxuXHRyZXR1cm4gY29sbGVjdEZpbGVzKGRpciwgRklMRV9QQVRURVJOU1tyZXNvdXJjZVR5cGVdKTtcbn1cblxuZnVuY3Rpb24gbWF0Y2hlc0FueVBhdHRlcm4oZmlsZVBhdGg6IHN0cmluZywgcGF0dGVybnM6IHN0cmluZ1tdLCBiYXNlRGlyOiBzdHJpbmcpOiBib29sZWFuIHtcblx0Y29uc3QgcmVsID0gdG9Qb3NpeFBhdGgocmVsYXRpdmUoYmFzZURpciwgZmlsZVBhdGgpKTtcblx0Y29uc3QgbmFtZSA9IGJhc2VuYW1lKGZpbGVQYXRoKTtcblx0Y29uc3QgZmlsZVBhdGhQb3NpeCA9IHRvUG9zaXhQYXRoKGZpbGVQYXRoKTtcblx0Y29uc3QgaXNTa2lsbEZpbGUgPSBuYW1lID09PSBcIlNLSUxMLm1kXCI7XG5cdGNvbnN0IHBhcmVudERpciA9IGlzU2tpbGxGaWxlID8gZGlybmFtZShmaWxlUGF0aCkgOiB1bmRlZmluZWQ7XG5cdGNvbnN0IHBhcmVudFJlbCA9IGlzU2tpbGxGaWxlID8gdG9Qb3NpeFBhdGgocmVsYXRpdmUoYmFzZURpciwgcGFyZW50RGlyISkpIDogdW5kZWZpbmVkO1xuXHRjb25zdCBwYXJlbnROYW1lID0gaXNTa2lsbEZpbGUgPyBiYXNlbmFtZShwYXJlbnREaXIhKSA6IHVuZGVmaW5lZDtcblx0Y29uc3QgcGFyZW50RGlyUG9zaXggPSBpc1NraWxsRmlsZSA/IHRvUG9zaXhQYXRoKHBhcmVudERpciEpIDogdW5kZWZpbmVkO1xuXG5cdHJldHVybiBwYXR0ZXJucy5zb21lKChwYXR0ZXJuKSA9PiB7XG5cdFx0Y29uc3Qgbm9ybWFsaXplZFBhdHRlcm4gPSB0b1Bvc2l4UGF0aChwYXR0ZXJuKTtcblx0XHRpZiAoXG5cdFx0XHRtaW5pbWF0Y2gocmVsLCBub3JtYWxpemVkUGF0dGVybikgfHxcblx0XHRcdG1pbmltYXRjaChuYW1lLCBub3JtYWxpemVkUGF0dGVybikgfHxcblx0XHRcdG1pbmltYXRjaChmaWxlUGF0aFBvc2l4LCBub3JtYWxpemVkUGF0dGVybilcblx0XHQpIHtcblx0XHRcdHJldHVybiB0cnVlO1xuXHRcdH1cblx0XHRpZiAoIWlzU2tpbGxGaWxlKSByZXR1cm4gZmFsc2U7XG5cdFx0cmV0dXJuIChcblx0XHRcdG1pbmltYXRjaChwYXJlbnRSZWwhLCBub3JtYWxpemVkUGF0dGVybikgfHxcblx0XHRcdG1pbmltYXRjaChwYXJlbnROYW1lISwgbm9ybWFsaXplZFBhdHRlcm4pIHx8XG5cdFx0XHRtaW5pbWF0Y2gocGFyZW50RGlyUG9zaXghLCBub3JtYWxpemVkUGF0dGVybilcblx0XHQpO1xuXHR9KTtcbn1cblxuZnVuY3Rpb24gbm9ybWFsaXplRXhhY3RQYXR0ZXJuKHBhdHRlcm46IHN0cmluZyk6IHN0cmluZyB7XG5cdGNvbnN0IG5vcm1hbGl6ZWQgPSBwYXR0ZXJuLnN0YXJ0c1dpdGgoXCIuL1wiKSB8fCBwYXR0ZXJuLnN0YXJ0c1dpdGgoXCIuXFxcXFwiKSA/IHBhdHRlcm4uc2xpY2UoMikgOiBwYXR0ZXJuO1xuXHRyZXR1cm4gdG9Qb3NpeFBhdGgobm9ybWFsaXplZCk7XG59XG5cbmZ1bmN0aW9uIG1hdGNoZXNBbnlFeGFjdFBhdHRlcm4oZmlsZVBhdGg6IHN0cmluZywgcGF0dGVybnM6IHN0cmluZ1tdLCBiYXNlRGlyOiBzdHJpbmcpOiBib29sZWFuIHtcblx0aWYgKHBhdHRlcm5zLmxlbmd0aCA9PT0gMCkgcmV0dXJuIGZhbHNlO1xuXHRjb25zdCByZWwgPSB0b1Bvc2l4UGF0aChyZWxhdGl2ZShiYXNlRGlyLCBmaWxlUGF0aCkpO1xuXHRjb25zdCBuYW1lID0gYmFzZW5hbWUoZmlsZVBhdGgpO1xuXHRjb25zdCBmaWxlUGF0aFBvc2l4ID0gdG9Qb3NpeFBhdGgoZmlsZVBhdGgpO1xuXHRjb25zdCBpc1NraWxsRmlsZSA9IG5hbWUgPT09IFwiU0tJTEwubWRcIjtcblx0Y29uc3QgcGFyZW50RGlyID0gaXNTa2lsbEZpbGUgPyBkaXJuYW1lKGZpbGVQYXRoKSA6IHVuZGVmaW5lZDtcblx0Y29uc3QgcGFyZW50UmVsID0gaXNTa2lsbEZpbGUgPyB0b1Bvc2l4UGF0aChyZWxhdGl2ZShiYXNlRGlyLCBwYXJlbnREaXIhKSkgOiB1bmRlZmluZWQ7XG5cdGNvbnN0IHBhcmVudERpclBvc2l4ID0gaXNTa2lsbEZpbGUgPyB0b1Bvc2l4UGF0aChwYXJlbnREaXIhKSA6IHVuZGVmaW5lZDtcblxuXHRyZXR1cm4gcGF0dGVybnMuc29tZSgocGF0dGVybikgPT4ge1xuXHRcdGNvbnN0IG5vcm1hbGl6ZWQgPSBub3JtYWxpemVFeGFjdFBhdHRlcm4ocGF0dGVybik7XG5cdFx0aWYgKG5vcm1hbGl6ZWQgPT09IHJlbCB8fCBub3JtYWxpemVkID09PSBmaWxlUGF0aFBvc2l4KSB7XG5cdFx0XHRyZXR1cm4gdHJ1ZTtcblx0XHR9XG5cdFx0aWYgKCFpc1NraWxsRmlsZSkgcmV0dXJuIGZhbHNlO1xuXHRcdHJldHVybiBub3JtYWxpemVkID09PSBwYXJlbnRSZWwgfHwgbm9ybWFsaXplZCA9PT0gcGFyZW50RGlyUG9zaXg7XG5cdH0pO1xufVxuXG5mdW5jdGlvbiBnZXRPdmVycmlkZVBhdHRlcm5zKGVudHJpZXM6IHN0cmluZ1tdKTogc3RyaW5nW10ge1xuXHRyZXR1cm4gZW50cmllcy5maWx0ZXIoKHBhdHRlcm4pID0+IHBhdHRlcm4uc3RhcnRzV2l0aChcIiFcIikgfHwgcGF0dGVybi5zdGFydHNXaXRoKFwiK1wiKSB8fCBwYXR0ZXJuLnN0YXJ0c1dpdGgoXCItXCIpKTtcbn1cblxuZnVuY3Rpb24gaXNFbmFibGVkQnlPdmVycmlkZXMoZmlsZVBhdGg6IHN0cmluZywgcGF0dGVybnM6IHN0cmluZ1tdLCBiYXNlRGlyOiBzdHJpbmcpOiBib29sZWFuIHtcblx0Y29uc3Qgb3ZlcnJpZGVzID0gZ2V0T3ZlcnJpZGVQYXR0ZXJucyhwYXR0ZXJucyk7XG5cdGNvbnN0IGV4Y2x1ZGVzID0gb3ZlcnJpZGVzLmZpbHRlcigocGF0dGVybikgPT4gcGF0dGVybi5zdGFydHNXaXRoKFwiIVwiKSkubWFwKChwYXR0ZXJuKSA9PiBwYXR0ZXJuLnNsaWNlKDEpKTtcblx0Y29uc3QgZm9yY2VJbmNsdWRlcyA9IG92ZXJyaWRlcy5maWx0ZXIoKHBhdHRlcm4pID0+IHBhdHRlcm4uc3RhcnRzV2l0aChcIitcIikpLm1hcCgocGF0dGVybikgPT4gcGF0dGVybi5zbGljZSgxKSk7XG5cdGNvbnN0IGZvcmNlRXhjbHVkZXMgPSBvdmVycmlkZXMuZmlsdGVyKChwYXR0ZXJuKSA9PiBwYXR0ZXJuLnN0YXJ0c1dpdGgoXCItXCIpKS5tYXAoKHBhdHRlcm4pID0+IHBhdHRlcm4uc2xpY2UoMSkpO1xuXG5cdGxldCBlbmFibGVkID0gdHJ1ZTtcblx0aWYgKGV4Y2x1ZGVzLmxlbmd0aCA+IDAgJiYgbWF0Y2hlc0FueVBhdHRlcm4oZmlsZVBhdGgsIGV4Y2x1ZGVzLCBiYXNlRGlyKSkge1xuXHRcdGVuYWJsZWQgPSBmYWxzZTtcblx0fVxuXHRpZiAoZm9yY2VJbmNsdWRlcy5sZW5ndGggPiAwICYmIG1hdGNoZXNBbnlFeGFjdFBhdHRlcm4oZmlsZVBhdGgsIGZvcmNlSW5jbHVkZXMsIGJhc2VEaXIpKSB7XG5cdFx0ZW5hYmxlZCA9IHRydWU7XG5cdH1cblx0aWYgKGZvcmNlRXhjbHVkZXMubGVuZ3RoID4gMCAmJiBtYXRjaGVzQW55RXhhY3RQYXR0ZXJuKGZpbGVQYXRoLCBmb3JjZUV4Y2x1ZGVzLCBiYXNlRGlyKSkge1xuXHRcdGVuYWJsZWQgPSBmYWxzZTtcblx0fVxuXHRyZXR1cm4gZW5hYmxlZDtcbn1cblxuLyoqXG4gKiBBcHBseSBwYXR0ZXJucyB0byBwYXRocyBhbmQgcmV0dXJuIGEgU2V0IG9mIGVuYWJsZWQgcGF0aHMuXG4gKiBQYXR0ZXJuIHR5cGVzOlxuICogLSBQbGFpbiBwYXR0ZXJuczogaW5jbHVkZSBtYXRjaGluZyBwYXRoc1xuICogLSBgIXBhdHRlcm5gOiBleGNsdWRlIG1hdGNoaW5nIHBhdGhzXG4gKiAtIGArcGF0aGA6IGZvcmNlLWluY2x1ZGUgZXhhY3QgcGF0aCAob3ZlcnJpZGVzIGV4Y2x1c2lvbnMpXG4gKiAtIGAtcGF0aGA6IGZvcmNlLWV4Y2x1ZGUgZXhhY3QgcGF0aCAob3ZlcnJpZGVzIGZvcmNlLWluY2x1ZGVzKVxuICovXG5mdW5jdGlvbiBhcHBseVBhdHRlcm5zKGFsbFBhdGhzOiBzdHJpbmdbXSwgcGF0dGVybnM6IHN0cmluZ1tdLCBiYXNlRGlyOiBzdHJpbmcpOiBTZXQ8c3RyaW5nPiB7XG5cdGNvbnN0IGluY2x1ZGVzOiBzdHJpbmdbXSA9IFtdO1xuXHRjb25zdCBleGNsdWRlczogc3RyaW5nW10gPSBbXTtcblx0Y29uc3QgZm9yY2VJbmNsdWRlczogc3RyaW5nW10gPSBbXTtcblx0Y29uc3QgZm9yY2VFeGNsdWRlczogc3RyaW5nW10gPSBbXTtcblxuXHRmb3IgKGNvbnN0IHAgb2YgcGF0dGVybnMpIHtcblx0XHRpZiAocC5zdGFydHNXaXRoKFwiK1wiKSkge1xuXHRcdFx0Zm9yY2VJbmNsdWRlcy5wdXNoKHAuc2xpY2UoMSkpO1xuXHRcdH0gZWxzZSBpZiAocC5zdGFydHNXaXRoKFwiLVwiKSkge1xuXHRcdFx0Zm9yY2VFeGNsdWRlcy5wdXNoKHAuc2xpY2UoMSkpO1xuXHRcdH0gZWxzZSBpZiAocC5zdGFydHNXaXRoKFwiIVwiKSkge1xuXHRcdFx0ZXhjbHVkZXMucHVzaChwLnNsaWNlKDEpKTtcblx0XHR9IGVsc2Uge1xuXHRcdFx0aW5jbHVkZXMucHVzaChwKTtcblx0XHR9XG5cdH1cblxuXHQvLyBTdGVwIDE6IEFwcGx5IGluY2x1ZGVzIChvciBhbGwgaWYgbm8gaW5jbHVkZXMpXG5cdGxldCByZXN1bHQ6IHN0cmluZ1tdO1xuXHRpZiAoaW5jbHVkZXMubGVuZ3RoID09PSAwKSB7XG5cdFx0cmVzdWx0ID0gWy4uLmFsbFBhdGhzXTtcblx0fSBlbHNlIHtcblx0XHRyZXN1bHQgPSBhbGxQYXRocy5maWx0ZXIoKGZpbGVQYXRoKSA9PiBtYXRjaGVzQW55UGF0dGVybihmaWxlUGF0aCwgaW5jbHVkZXMsIGJhc2VEaXIpKTtcblx0fVxuXG5cdC8vIFN0ZXAgMjogQXBwbHkgZXhjbHVkZXNcblx0aWYgKGV4Y2x1ZGVzLmxlbmd0aCA+IDApIHtcblx0XHRyZXN1bHQgPSByZXN1bHQuZmlsdGVyKChmaWxlUGF0aCkgPT4gIW1hdGNoZXNBbnlQYXR0ZXJuKGZpbGVQYXRoLCBleGNsdWRlcywgYmFzZURpcikpO1xuXHR9XG5cblx0Ly8gU3RlcCAzOiBGb3JjZS1pbmNsdWRlIChhZGQgYmFjayBmcm9tIGFsbFBhdGhzLCBvdmVycmlkaW5nIGV4Y2x1c2lvbnMpXG5cdGlmIChmb3JjZUluY2x1ZGVzLmxlbmd0aCA+IDApIHtcblx0XHRmb3IgKGNvbnN0IGZpbGVQYXRoIG9mIGFsbFBhdGhzKSB7XG5cdFx0XHRpZiAoIXJlc3VsdC5pbmNsdWRlcyhmaWxlUGF0aCkgJiYgbWF0Y2hlc0FueUV4YWN0UGF0dGVybihmaWxlUGF0aCwgZm9yY2VJbmNsdWRlcywgYmFzZURpcikpIHtcblx0XHRcdFx0cmVzdWx0LnB1c2goZmlsZVBhdGgpO1xuXHRcdFx0fVxuXHRcdH1cblx0fVxuXG5cdC8vIFN0ZXAgNDogRm9yY2UtZXhjbHVkZSAocmVtb3ZlIGV2ZW4gaWYgaW5jbHVkZWQgb3IgZm9yY2UtaW5jbHVkZWQpXG5cdGlmIChmb3JjZUV4Y2x1ZGVzLmxlbmd0aCA+IDApIHtcblx0XHRyZXN1bHQgPSByZXN1bHQuZmlsdGVyKChmaWxlUGF0aCkgPT4gIW1hdGNoZXNBbnlFeGFjdFBhdHRlcm4oZmlsZVBhdGgsIGZvcmNlRXhjbHVkZXMsIGJhc2VEaXIpKTtcblx0fVxuXG5cdHJldHVybiBuZXcgU2V0KHJlc3VsdCk7XG59XG5cbmV4cG9ydCBjbGFzcyBEZWZhdWx0UGFja2FnZU1hbmFnZXIgaW1wbGVtZW50cyBQYWNrYWdlTWFuYWdlciB7XG5cdHByaXZhdGUgY3dkOiBzdHJpbmc7XG5cdHByaXZhdGUgYWdlbnREaXI6IHN0cmluZztcblx0cHJpdmF0ZSBzZXR0aW5nc01hbmFnZXI6IFNldHRpbmdzTWFuYWdlcjtcblx0cHJpdmF0ZSBnbG9iYWxOcG1Sb290OiBzdHJpbmcgfCB1bmRlZmluZWQ7XG5cdHByaXZhdGUgZ2xvYmFsTnBtUm9vdENvbW1hbmRLZXk6IHN0cmluZyB8IHVuZGVmaW5lZDtcblx0cHJpdmF0ZSBwcm9ncmVzc0NhbGxiYWNrOiBQcm9ncmVzc0NhbGxiYWNrIHwgdW5kZWZpbmVkO1xuXG5cdGNvbnN0cnVjdG9yKG9wdGlvbnM6IFBhY2thZ2VNYW5hZ2VyT3B0aW9ucykge1xuXHRcdHRoaXMuY3dkID0gb3B0aW9ucy5jd2Q7XG5cdFx0dGhpcy5hZ2VudERpciA9IG9wdGlvbnMuYWdlbnREaXI7XG5cdFx0dGhpcy5zZXR0aW5nc01hbmFnZXIgPSBvcHRpb25zLnNldHRpbmdzTWFuYWdlcjtcblx0fVxuXG5cdHNldFByb2dyZXNzQ2FsbGJhY2soY2FsbGJhY2s6IFByb2dyZXNzQ2FsbGJhY2sgfCB1bmRlZmluZWQpOiB2b2lkIHtcblx0XHR0aGlzLnByb2dyZXNzQ2FsbGJhY2sgPSBjYWxsYmFjaztcblx0fVxuXG5cdGFkZFNvdXJjZVRvU2V0dGluZ3Moc291cmNlOiBzdHJpbmcsIG9wdGlvbnM/OiB7IGxvY2FsPzogYm9vbGVhbiB9KTogYm9vbGVhbiB7XG5cdFx0Y29uc3Qgc2NvcGU6IFNvdXJjZVNjb3BlID0gb3B0aW9ucz8ubG9jYWwgPyBcInByb2plY3RcIiA6IFwidXNlclwiO1xuXHRcdGNvbnN0IGN1cnJlbnRTZXR0aW5ncyA9XG5cdFx0XHRzY29wZSA9PT0gXCJwcm9qZWN0XCIgPyB0aGlzLnNldHRpbmdzTWFuYWdlci5nZXRQcm9qZWN0U2V0dGluZ3MoKSA6IHRoaXMuc2V0dGluZ3NNYW5hZ2VyLmdldEdsb2JhbFNldHRpbmdzKCk7XG5cdFx0Y29uc3QgY3VycmVudFBhY2thZ2VzID0gY3VycmVudFNldHRpbmdzLnBhY2thZ2VzID8/IFtdO1xuXHRcdGNvbnN0IG5vcm1hbGl6ZWRTb3VyY2UgPSB0aGlzLm5vcm1hbGl6ZVBhY2thZ2VTb3VyY2VGb3JTZXR0aW5ncyhzb3VyY2UsIHNjb3BlKTtcblx0XHRjb25zdCBleGlzdHMgPSBjdXJyZW50UGFja2FnZXMuc29tZSgoZXhpc3RpbmcpID0+IHRoaXMucGFja2FnZVNvdXJjZXNNYXRjaChleGlzdGluZywgc291cmNlLCBzY29wZSkpO1xuXHRcdGlmIChleGlzdHMpIHtcblx0XHRcdHJldHVybiBmYWxzZTtcblx0XHR9XG5cdFx0Y29uc3QgbmV4dFBhY2thZ2VzID0gWy4uLmN1cnJlbnRQYWNrYWdlcywgbm9ybWFsaXplZFNvdXJjZV07XG5cdFx0aWYgKHNjb3BlID09PSBcInByb2plY3RcIikge1xuXHRcdFx0dGhpcy5zZXR0aW5nc01hbmFnZXIuc2V0UHJvamVjdFBhY2thZ2VzKG5leHRQYWNrYWdlcyk7XG5cdFx0fSBlbHNlIHtcblx0XHRcdHRoaXMuc2V0dGluZ3NNYW5hZ2VyLnNldFBhY2thZ2VzKG5leHRQYWNrYWdlcyk7XG5cdFx0fVxuXHRcdHJldHVybiB0cnVlO1xuXHR9XG5cblx0cmVtb3ZlU291cmNlRnJvbVNldHRpbmdzKHNvdXJjZTogc3RyaW5nLCBvcHRpb25zPzogeyBsb2NhbD86IGJvb2xlYW4gfSk6IGJvb2xlYW4ge1xuXHRcdGNvbnN0IHNjb3BlOiBTb3VyY2VTY29wZSA9IG9wdGlvbnM/LmxvY2FsID8gXCJwcm9qZWN0XCIgOiBcInVzZXJcIjtcblx0XHRjb25zdCBjdXJyZW50U2V0dGluZ3MgPVxuXHRcdFx0c2NvcGUgPT09IFwicHJvamVjdFwiID8gdGhpcy5zZXR0aW5nc01hbmFnZXIuZ2V0UHJvamVjdFNldHRpbmdzKCkgOiB0aGlzLnNldHRpbmdzTWFuYWdlci5nZXRHbG9iYWxTZXR0aW5ncygpO1xuXHRcdGNvbnN0IGN1cnJlbnRQYWNrYWdlcyA9IGN1cnJlbnRTZXR0aW5ncy5wYWNrYWdlcyA/PyBbXTtcblx0XHRjb25zdCBuZXh0UGFja2FnZXMgPSBjdXJyZW50UGFja2FnZXMuZmlsdGVyKChleGlzdGluZykgPT4gIXRoaXMucGFja2FnZVNvdXJjZXNNYXRjaChleGlzdGluZywgc291cmNlLCBzY29wZSkpO1xuXHRcdGNvbnN0IGNoYW5nZWQgPSBuZXh0UGFja2FnZXMubGVuZ3RoICE9PSBjdXJyZW50UGFja2FnZXMubGVuZ3RoO1xuXHRcdGlmICghY2hhbmdlZCkge1xuXHRcdFx0cmV0dXJuIGZhbHNlO1xuXHRcdH1cblx0XHRpZiAoc2NvcGUgPT09IFwicHJvamVjdFwiKSB7XG5cdFx0XHR0aGlzLnNldHRpbmdzTWFuYWdlci5zZXRQcm9qZWN0UGFja2FnZXMobmV4dFBhY2thZ2VzKTtcblx0XHR9IGVsc2Uge1xuXHRcdFx0dGhpcy5zZXR0aW5nc01hbmFnZXIuc2V0UGFja2FnZXMobmV4dFBhY2thZ2VzKTtcblx0XHR9XG5cdFx0cmV0dXJuIHRydWU7XG5cdH1cblxuXHRnZXRJbnN0YWxsZWRQYXRoKHNvdXJjZTogc3RyaW5nLCBzY29wZTogXCJ1c2VyXCIgfCBcInByb2plY3RcIik6IHN0cmluZyB8IHVuZGVmaW5lZCB7XG5cdFx0Y29uc3QgcGFyc2VkID0gdGhpcy5wYXJzZVNvdXJjZShzb3VyY2UpO1xuXHRcdGlmIChwYXJzZWQudHlwZSA9PT0gXCJucG1cIikge1xuXHRcdFx0Y29uc3QgcGF0aCA9IHRoaXMuZ2V0TnBtSW5zdGFsbFBhdGgocGFyc2VkLCBzY29wZSk7XG5cdFx0XHRyZXR1cm4gZXhpc3RzU3luYyhwYXRoKSA/IHBhdGggOiB1bmRlZmluZWQ7XG5cdFx0fVxuXHRcdGlmIChwYXJzZWQudHlwZSA9PT0gXCJnaXRcIikge1xuXHRcdFx0Y29uc3QgcGF0aCA9IHRoaXMuZ2V0R2l0SW5zdGFsbFBhdGgocGFyc2VkLCBzY29wZSk7XG5cdFx0XHRyZXR1cm4gZXhpc3RzU3luYyhwYXRoKSA/IHBhdGggOiB1bmRlZmluZWQ7XG5cdFx0fVxuXHRcdGlmIChwYXJzZWQudHlwZSA9PT0gXCJsb2NhbFwiKSB7XG5cdFx0XHRjb25zdCBiYXNlRGlyID0gdGhpcy5nZXRCYXNlRGlyRm9yU2NvcGUoc2NvcGUpO1xuXHRcdFx0Y29uc3QgcGF0aCA9IHRoaXMucmVzb2x2ZVBhdGhGcm9tQmFzZShwYXJzZWQucGF0aCwgYmFzZURpcik7XG5cdFx0XHRyZXR1cm4gZXhpc3RzU3luYyhwYXRoKSA/IHBhdGggOiB1bmRlZmluZWQ7XG5cdFx0fVxuXHRcdHJldHVybiB1bmRlZmluZWQ7XG5cdH1cblxuXHRwcml2YXRlIGVtaXRQcm9ncmVzcyhldmVudDogUHJvZ3Jlc3NFdmVudCk6IHZvaWQge1xuXHRcdHRoaXMucHJvZ3Jlc3NDYWxsYmFjaz8uKGV2ZW50KTtcblx0fVxuXG5cdHByaXZhdGUgYXN5bmMgd2l0aFByb2dyZXNzKFxuXHRcdGFjdGlvbjogUHJvZ3Jlc3NFdmVudFtcImFjdGlvblwiXSxcblx0XHRzb3VyY2U6IHN0cmluZyxcblx0XHRtZXNzYWdlOiBzdHJpbmcsXG5cdFx0b3BlcmF0aW9uOiAoKSA9PiBQcm9taXNlPHZvaWQ+LFxuXHQpOiBQcm9taXNlPHZvaWQ+IHtcblx0XHR0aGlzLmVtaXRQcm9ncmVzcyh7IHR5cGU6IFwic3RhcnRcIiwgYWN0aW9uLCBzb3VyY2UsIG1lc3NhZ2UgfSk7XG5cdFx0dHJ5IHtcblx0XHRcdGF3YWl0IG9wZXJhdGlvbigpO1xuXHRcdFx0dGhpcy5lbWl0UHJvZ3Jlc3MoeyB0eXBlOiBcImNvbXBsZXRlXCIsIGFjdGlvbiwgc291cmNlIH0pO1xuXHRcdH0gY2F0Y2ggKGVycm9yKSB7XG5cdFx0XHRjb25zdCBlcnJvck1lc3NhZ2UgPSBlcnJvciBpbnN0YW5jZW9mIEVycm9yID8gZXJyb3IubWVzc2FnZSA6IFN0cmluZyhlcnJvcik7XG5cdFx0XHR0aGlzLmVtaXRQcm9ncmVzcyh7IHR5cGU6IFwiZXJyb3JcIiwgYWN0aW9uLCBzb3VyY2UsIG1lc3NhZ2U6IGVycm9yTWVzc2FnZSB9KTtcblx0XHRcdHRocm93IGVycm9yO1xuXHRcdH1cblx0fVxuXG5cdGFzeW5jIHJlc29sdmUob25NaXNzaW5nPzogKHNvdXJjZTogc3RyaW5nKSA9PiBQcm9taXNlPE1pc3NpbmdTb3VyY2VBY3Rpb24+KTogUHJvbWlzZTxSZXNvbHZlZFBhdGhzPiB7XG5cdFx0Y29uc3QgYWNjdW11bGF0b3IgPSB0aGlzLmNyZWF0ZUFjY3VtdWxhdG9yKCk7XG5cdFx0Y29uc3QgZ2xvYmFsU2V0dGluZ3MgPSB0aGlzLnNldHRpbmdzTWFuYWdlci5nZXRHbG9iYWxTZXR0aW5ncygpO1xuXHRcdGNvbnN0IHByb2plY3RTZXR0aW5ncyA9IHRoaXMuc2V0dGluZ3NNYW5hZ2VyLmdldFByb2plY3RTZXR0aW5ncygpO1xuXG5cdFx0Ly8gQ29sbGVjdCBhbGwgcGFja2FnZXMgd2l0aCBzY29wZSAocHJvamVjdCBmaXJzdCBzbyBjd2QgcmVzb3VyY2VzIHdpbiBjb2xsaXNpb25zKVxuXHRcdGNvbnN0IGFsbFBhY2thZ2VzOiBBcnJheTx7IHBrZzogUGFja2FnZVNvdXJjZTsgc2NvcGU6IFNvdXJjZVNjb3BlIH0+ID0gW107XG5cdFx0Zm9yIChjb25zdCBwa2cgb2YgcHJvamVjdFNldHRpbmdzLnBhY2thZ2VzID8/IFtdKSB7XG5cdFx0XHRhbGxQYWNrYWdlcy5wdXNoKHsgcGtnLCBzY29wZTogXCJwcm9qZWN0XCIgfSk7XG5cdFx0fVxuXHRcdGZvciAoY29uc3QgcGtnIG9mIGdsb2JhbFNldHRpbmdzLnBhY2thZ2VzID8/IFtdKSB7XG5cdFx0XHRhbGxQYWNrYWdlcy5wdXNoKHsgcGtnLCBzY29wZTogXCJ1c2VyXCIgfSk7XG5cdFx0fVxuXG5cdFx0Ly8gRGVkdXBlOiBwcm9qZWN0IHNjb3BlIHdpbnMgb3ZlciBnbG9iYWwgZm9yIHNhbWUgcGFja2FnZSBpZGVudGl0eVxuXHRcdGNvbnN0IHBhY2thZ2VTb3VyY2VzID0gdGhpcy5kZWR1cGVQYWNrYWdlcyhhbGxQYWNrYWdlcyk7XG5cdFx0YXdhaXQgdGhpcy5yZXNvbHZlUGFja2FnZVNvdXJjZXMocGFja2FnZVNvdXJjZXMsIGFjY3VtdWxhdG9yLCBvbk1pc3NpbmcpO1xuXG5cdFx0Y29uc3QgZ2xvYmFsQmFzZURpciA9IHRoaXMuYWdlbnREaXI7XG5cdFx0Y29uc3QgcHJvamVjdEJhc2VEaXIgPSBqb2luKHRoaXMuY3dkLCBDT05GSUdfRElSX05BTUUpO1xuXG5cdFx0Zm9yIChjb25zdCByZXNvdXJjZVR5cGUgb2YgUkVTT1VSQ0VfVFlQRVMpIHtcblx0XHRcdGNvbnN0IHRhcmdldCA9IHRoaXMuZ2V0VGFyZ2V0TWFwKGFjY3VtdWxhdG9yLCByZXNvdXJjZVR5cGUpO1xuXHRcdFx0Y29uc3QgZ2xvYmFsRW50cmllcyA9IChnbG9iYWxTZXR0aW5nc1tyZXNvdXJjZVR5cGVdID8/IFtdKSBhcyBzdHJpbmdbXTtcblx0XHRcdGNvbnN0IHByb2plY3RFbnRyaWVzID0gKHByb2plY3RTZXR0aW5nc1tyZXNvdXJjZVR5cGVdID8/IFtdKSBhcyBzdHJpbmdbXTtcblx0XHRcdHRoaXMucmVzb2x2ZUxvY2FsRW50cmllcyhcblx0XHRcdFx0cHJvamVjdEVudHJpZXMsXG5cdFx0XHRcdHJlc291cmNlVHlwZSxcblx0XHRcdFx0dGFyZ2V0LFxuXHRcdFx0XHR7XG5cdFx0XHRcdFx0c291cmNlOiBcImxvY2FsXCIsXG5cdFx0XHRcdFx0c2NvcGU6IFwicHJvamVjdFwiLFxuXHRcdFx0XHRcdG9yaWdpbjogXCJ0b3AtbGV2ZWxcIixcblx0XHRcdFx0fSxcblx0XHRcdFx0cHJvamVjdEJhc2VEaXIsXG5cdFx0XHQpO1xuXHRcdFx0dGhpcy5yZXNvbHZlTG9jYWxFbnRyaWVzKFxuXHRcdFx0XHRnbG9iYWxFbnRyaWVzLFxuXHRcdFx0XHRyZXNvdXJjZVR5cGUsXG5cdFx0XHRcdHRhcmdldCxcblx0XHRcdFx0e1xuXHRcdFx0XHRcdHNvdXJjZTogXCJsb2NhbFwiLFxuXHRcdFx0XHRcdHNjb3BlOiBcInVzZXJcIixcblx0XHRcdFx0XHRvcmlnaW46IFwidG9wLWxldmVsXCIsXG5cdFx0XHRcdH0sXG5cdFx0XHRcdGdsb2JhbEJhc2VEaXIsXG5cdFx0XHQpO1xuXHRcdH1cblxuXHRcdHRoaXMuYWRkQXV0b0Rpc2NvdmVyZWRSZXNvdXJjZXMoYWNjdW11bGF0b3IsIGdsb2JhbFNldHRpbmdzLCBwcm9qZWN0U2V0dGluZ3MsIGdsb2JhbEJhc2VEaXIsIHByb2plY3RCYXNlRGlyKTtcblxuXHRcdHJldHVybiB0aGlzLnRvUmVzb2x2ZWRQYXRocyhhY2N1bXVsYXRvcik7XG5cdH1cblxuXHRhc3luYyByZXNvbHZlRXh0ZW5zaW9uU291cmNlcyhcblx0XHRzb3VyY2VzOiBzdHJpbmdbXSxcblx0XHRvcHRpb25zPzogeyBsb2NhbD86IGJvb2xlYW47IHRlbXBvcmFyeT86IGJvb2xlYW4gfSxcblx0KTogUHJvbWlzZTxSZXNvbHZlZFBhdGhzPiB7XG5cdFx0Y29uc3QgYWNjdW11bGF0b3IgPSB0aGlzLmNyZWF0ZUFjY3VtdWxhdG9yKCk7XG5cdFx0Y29uc3Qgc2NvcGU6IFNvdXJjZVNjb3BlID0gb3B0aW9ucz8udGVtcG9yYXJ5ID8gXCJ0ZW1wb3JhcnlcIiA6IG9wdGlvbnM/LmxvY2FsID8gXCJwcm9qZWN0XCIgOiBcInVzZXJcIjtcblx0XHRjb25zdCBwYWNrYWdlU291cmNlcyA9IHNvdXJjZXMubWFwKChzb3VyY2UpID0+ICh7IHBrZzogc291cmNlIGFzIFBhY2thZ2VTb3VyY2UsIHNjb3BlIH0pKTtcblx0XHRhd2FpdCB0aGlzLnJlc29sdmVQYWNrYWdlU291cmNlcyhwYWNrYWdlU291cmNlcywgYWNjdW11bGF0b3IpO1xuXHRcdHJldHVybiB0aGlzLnRvUmVzb2x2ZWRQYXRocyhhY2N1bXVsYXRvcik7XG5cdH1cblxuXHRsaXN0Q29uZmlndXJlZFBhY2thZ2VzKCk6IENvbmZpZ3VyZWRQYWNrYWdlW10ge1xuXHRcdGNvbnN0IGdsb2JhbFNldHRpbmdzID0gdGhpcy5zZXR0aW5nc01hbmFnZXIuZ2V0R2xvYmFsU2V0dGluZ3MoKTtcblx0XHRjb25zdCBwcm9qZWN0U2V0dGluZ3MgPSB0aGlzLnNldHRpbmdzTWFuYWdlci5nZXRQcm9qZWN0U2V0dGluZ3MoKTtcblx0XHRjb25zdCBjb25maWd1cmVkUGFja2FnZXM6IENvbmZpZ3VyZWRQYWNrYWdlW10gPSBbXTtcblxuXHRcdGZvciAoY29uc3QgcGtnIG9mIGdsb2JhbFNldHRpbmdzLnBhY2thZ2VzID8/IFtdKSB7XG5cdFx0XHRjb25zdCBzb3VyY2UgPSB0eXBlb2YgcGtnID09PSBcInN0cmluZ1wiID8gcGtnIDogcGtnLnNvdXJjZTtcblx0XHRcdGNvbmZpZ3VyZWRQYWNrYWdlcy5wdXNoKHtcblx0XHRcdFx0c291cmNlLFxuXHRcdFx0XHRzY29wZTogXCJ1c2VyXCIsXG5cdFx0XHRcdGZpbHRlcmVkOiB0eXBlb2YgcGtnID09PSBcIm9iamVjdFwiLFxuXHRcdFx0XHRpbnN0YWxsZWRQYXRoOiB0aGlzLmdldEluc3RhbGxlZFBhdGgoc291cmNlLCBcInVzZXJcIiksXG5cdFx0XHR9KTtcblx0XHR9XG5cblx0XHRmb3IgKGNvbnN0IHBrZyBvZiBwcm9qZWN0U2V0dGluZ3MucGFja2FnZXMgPz8gW10pIHtcblx0XHRcdGNvbnN0IHNvdXJjZSA9IHR5cGVvZiBwa2cgPT09IFwic3RyaW5nXCIgPyBwa2cgOiBwa2cuc291cmNlO1xuXHRcdFx0Y29uZmlndXJlZFBhY2thZ2VzLnB1c2goe1xuXHRcdFx0XHRzb3VyY2UsXG5cdFx0XHRcdHNjb3BlOiBcInByb2plY3RcIixcblx0XHRcdFx0ZmlsdGVyZWQ6IHR5cGVvZiBwa2cgPT09IFwib2JqZWN0XCIsXG5cdFx0XHRcdGluc3RhbGxlZFBhdGg6IHRoaXMuZ2V0SW5zdGFsbGVkUGF0aChzb3VyY2UsIFwicHJvamVjdFwiKSxcblx0XHRcdH0pO1xuXHRcdH1cblxuXHRcdHJldHVybiBjb25maWd1cmVkUGFja2FnZXM7XG5cdH1cblxuXHRhc3luYyBpbnN0YWxsKHNvdXJjZTogc3RyaW5nLCBvcHRpb25zPzogeyBsb2NhbD86IGJvb2xlYW4gfSk6IFByb21pc2U8dm9pZD4ge1xuXHRcdGNvbnN0IHBhcnNlZCA9IHRoaXMucGFyc2VTb3VyY2Uoc291cmNlKTtcblx0XHRjb25zdCBzY29wZTogU291cmNlU2NvcGUgPSBvcHRpb25zPy5sb2NhbCA/IFwicHJvamVjdFwiIDogXCJ1c2VyXCI7XG5cdFx0YXdhaXQgdGhpcy53aXRoUHJvZ3Jlc3MoXCJpbnN0YWxsXCIsIHNvdXJjZSwgYEluc3RhbGxpbmcgJHtzb3VyY2V9Li4uYCwgYXN5bmMgKCkgPT4ge1xuXHRcdFx0aWYgKHBhcnNlZC50eXBlID09PSBcIm5wbVwiKSB7XG5cdFx0XHRcdGF3YWl0IHRoaXMuaW5zdGFsbE5wbShwYXJzZWQsIHNjb3BlLCBmYWxzZSk7XG5cdFx0XHRcdHJldHVybjtcblx0XHRcdH1cblx0XHRcdGlmIChwYXJzZWQudHlwZSA9PT0gXCJnaXRcIikge1xuXHRcdFx0XHRhd2FpdCB0aGlzLmluc3RhbGxHaXQocGFyc2VkLCBzY29wZSk7XG5cdFx0XHRcdHJldHVybjtcblx0XHRcdH1cblx0XHRcdGlmIChwYXJzZWQudHlwZSA9PT0gXCJsb2NhbFwiKSB7XG5cdFx0XHRcdGNvbnN0IHJlc29sdmVkID0gdGhpcy5yZXNvbHZlUGF0aChwYXJzZWQucGF0aCk7XG5cdFx0XHRcdGlmICghZXhpc3RzU3luYyhyZXNvbHZlZCkpIHtcblx0XHRcdFx0XHR0aHJvdyBuZXcgRXJyb3IoYFBhdGggZG9lcyBub3QgZXhpc3Q6ICR7cmVzb2x2ZWR9YCk7XG5cdFx0XHRcdH1cblx0XHRcdFx0cmV0dXJuO1xuXHRcdFx0fVxuXHRcdFx0dGhyb3cgbmV3IEVycm9yKGBVbnN1cHBvcnRlZCBpbnN0YWxsIHNvdXJjZTogJHtzb3VyY2V9YCk7XG5cdFx0fSk7XG5cdH1cblxuXHRhc3luYyBpbnN0YWxsQW5kUGVyc2lzdChzb3VyY2U6IHN0cmluZywgb3B0aW9ucz86IHsgbG9jYWw/OiBib29sZWFuIH0pOiBQcm9taXNlPHZvaWQ+IHtcblx0XHRhd2FpdCB0aGlzLmluc3RhbGwoc291cmNlLCBvcHRpb25zKTtcblx0XHR0aGlzLmFkZFNvdXJjZVRvU2V0dGluZ3Moc291cmNlLCBvcHRpb25zKTtcblx0fVxuXG5cdGFzeW5jIHJlbW92ZShzb3VyY2U6IHN0cmluZywgb3B0aW9ucz86IHsgbG9jYWw/OiBib29sZWFuIH0pOiBQcm9taXNlPHZvaWQ+IHtcblx0XHRjb25zdCBwYXJzZWQgPSB0aGlzLnBhcnNlU291cmNlKHNvdXJjZSk7XG5cdFx0Y29uc3Qgc2NvcGU6IFNvdXJjZVNjb3BlID0gb3B0aW9ucz8ubG9jYWwgPyBcInByb2plY3RcIiA6IFwidXNlclwiO1xuXHRcdGF3YWl0IHRoaXMud2l0aFByb2dyZXNzKFwicmVtb3ZlXCIsIHNvdXJjZSwgYFJlbW92aW5nICR7c291cmNlfS4uLmAsIGFzeW5jICgpID0+IHtcblx0XHRcdGlmIChwYXJzZWQudHlwZSA9PT0gXCJucG1cIikge1xuXHRcdFx0XHRhd2FpdCB0aGlzLnVuaW5zdGFsbE5wbShwYXJzZWQsIHNjb3BlKTtcblx0XHRcdFx0cmV0dXJuO1xuXHRcdFx0fVxuXHRcdFx0aWYgKHBhcnNlZC50eXBlID09PSBcImdpdFwiKSB7XG5cdFx0XHRcdGF3YWl0IHRoaXMucmVtb3ZlR2l0KHBhcnNlZCwgc2NvcGUpO1xuXHRcdFx0XHRyZXR1cm47XG5cdFx0XHR9XG5cdFx0XHRpZiAocGFyc2VkLnR5cGUgPT09IFwibG9jYWxcIikge1xuXHRcdFx0XHRyZXR1cm47XG5cdFx0XHR9XG5cdFx0XHR0aHJvdyBuZXcgRXJyb3IoYFVuc3VwcG9ydGVkIHJlbW92ZSBzb3VyY2U6ICR7c291cmNlfWApO1xuXHRcdH0pO1xuXHR9XG5cblx0YXN5bmMgcmVtb3ZlQW5kUGVyc2lzdChzb3VyY2U6IHN0cmluZywgb3B0aW9ucz86IHsgbG9jYWw/OiBib29sZWFuIH0pOiBQcm9taXNlPGJvb2xlYW4+IHtcblx0XHRhd2FpdCB0aGlzLnJlbW92ZShzb3VyY2UsIG9wdGlvbnMpO1xuXHRcdHJldHVybiB0aGlzLnJlbW92ZVNvdXJjZUZyb21TZXR0aW5ncyhzb3VyY2UsIG9wdGlvbnMpO1xuXHR9XG5cblx0YXN5bmMgdXBkYXRlKHNvdXJjZT86IHN0cmluZyk6IFByb21pc2U8dm9pZD4ge1xuXHRcdGNvbnN0IGdsb2JhbFNldHRpbmdzID0gdGhpcy5zZXR0aW5nc01hbmFnZXIuZ2V0R2xvYmFsU2V0dGluZ3MoKTtcblx0XHRjb25zdCBwcm9qZWN0U2V0dGluZ3MgPSB0aGlzLnNldHRpbmdzTWFuYWdlci5nZXRQcm9qZWN0U2V0dGluZ3MoKTtcblx0XHRjb25zdCBpZGVudGl0eSA9IHNvdXJjZSA/IHRoaXMuZ2V0UGFja2FnZUlkZW50aXR5KHNvdXJjZSkgOiB1bmRlZmluZWQ7XG5cdFx0bGV0IG1hdGNoZWQgPSBmYWxzZTtcblx0XHRjb25zdCB1cGRhdGVTb3VyY2VzOiBDb25maWd1cmVkVXBkYXRlU291cmNlW10gPSBbXTtcblxuXHRcdGZvciAoY29uc3QgcGtnIG9mIGdsb2JhbFNldHRpbmdzLnBhY2thZ2VzID8/IFtdKSB7XG5cdFx0XHRjb25zdCBzb3VyY2VTdHIgPSB0eXBlb2YgcGtnID09PSBcInN0cmluZ1wiID8gcGtnIDogcGtnLnNvdXJjZTtcblx0XHRcdGlmIChpZGVudGl0eSAmJiB0aGlzLmdldFBhY2thZ2VJZGVudGl0eShzb3VyY2VTdHIsIFwidXNlclwiKSAhPT0gaWRlbnRpdHkpIGNvbnRpbnVlO1xuXHRcdFx0bWF0Y2hlZCA9IHRydWU7XG5cdFx0XHR1cGRhdGVTb3VyY2VzLnB1c2goeyBzb3VyY2U6IHNvdXJjZVN0ciwgc2NvcGU6IFwidXNlclwiIH0pO1xuXHRcdH1cblx0XHRmb3IgKGNvbnN0IHBrZyBvZiBwcm9qZWN0U2V0dGluZ3MucGFja2FnZXMgPz8gW10pIHtcblx0XHRcdGNvbnN0IHNvdXJjZVN0ciA9IHR5cGVvZiBwa2cgPT09IFwic3RyaW5nXCIgPyBwa2cgOiBwa2cuc291cmNlO1xuXHRcdFx0aWYgKGlkZW50aXR5ICYmIHRoaXMuZ2V0UGFja2FnZUlkZW50aXR5KHNvdXJjZVN0ciwgXCJwcm9qZWN0XCIpICE9PSBpZGVudGl0eSkgY29udGludWU7XG5cdFx0XHRtYXRjaGVkID0gdHJ1ZTtcblx0XHRcdHVwZGF0ZVNvdXJjZXMucHVzaCh7IHNvdXJjZTogc291cmNlU3RyLCBzY29wZTogXCJwcm9qZWN0XCIgfSk7XG5cdFx0fVxuXG5cdFx0aWYgKHNvdXJjZSAmJiAhbWF0Y2hlZCkge1xuXHRcdFx0dGhyb3cgbmV3IEVycm9yKFxuXHRcdFx0XHR0aGlzLmJ1aWxkTm9NYXRjaGluZ1BhY2thZ2VNZXNzYWdlKHNvdXJjZSwgW1xuXHRcdFx0XHRcdC4uLihnbG9iYWxTZXR0aW5ncy5wYWNrYWdlcyA/PyBbXSksXG5cdFx0XHRcdFx0Li4uKHByb2plY3RTZXR0aW5ncy5wYWNrYWdlcyA/PyBbXSksXG5cdFx0XHRcdF0pLFxuXHRcdFx0KTtcblx0XHR9XG5cblx0XHRhd2FpdCB0aGlzLnVwZGF0ZUNvbmZpZ3VyZWRTb3VyY2VzKHVwZGF0ZVNvdXJjZXMpO1xuXHR9XG5cblx0cHJpdmF0ZSBhc3luYyB1cGRhdGVDb25maWd1cmVkU291cmNlcyhzb3VyY2VzOiBDb25maWd1cmVkVXBkYXRlU291cmNlW10pOiBQcm9taXNlPHZvaWQ+IHtcblx0XHRpZiAoaXNPZmZsaW5lTW9kZUVuYWJsZWQoKSB8fCBzb3VyY2VzLmxlbmd0aCA9PT0gMCkge1xuXHRcdFx0cmV0dXJuO1xuXHRcdH1cblxuXHRcdGNvbnN0IG5wbUNhbmRpZGF0ZXM6IE5wbVVwZGF0ZVRhcmdldFtdID0gW107XG5cdFx0Y29uc3QgZ2l0Q2FuZGlkYXRlczogR2l0VXBkYXRlVGFyZ2V0W10gPSBbXTtcblxuXHRcdGZvciAoY29uc3QgZW50cnkgb2Ygc291cmNlcykge1xuXHRcdFx0Y29uc3QgcGFyc2VkID0gdGhpcy5wYXJzZVNvdXJjZShlbnRyeS5zb3VyY2UpO1xuXHRcdFx0aWYgKHBhcnNlZC50eXBlID09PSBcImxvY2FsXCIgfHwgcGFyc2VkLnBpbm5lZCkge1xuXHRcdFx0XHRjb250aW51ZTtcblx0XHRcdH1cblx0XHRcdGlmIChwYXJzZWQudHlwZSA9PT0gXCJucG1cIikge1xuXHRcdFx0XHRucG1DYW5kaWRhdGVzLnB1c2goeyAuLi5lbnRyeSwgcGFyc2VkIH0pO1xuXHRcdFx0XHRjb250aW51ZTtcblx0XHRcdH1cblx0XHRcdGdpdENhbmRpZGF0ZXMucHVzaCh7IC4uLmVudHJ5LCBwYXJzZWQgfSk7XG5cdFx0fVxuXG5cdFx0Y29uc3QgbnBtQ2hlY2tUYXNrcyA9IG5wbUNhbmRpZGF0ZXMubWFwKChlbnRyeSkgPT4gYXN5bmMgKCkgPT4gKHtcblx0XHRcdGVudHJ5LFxuXHRcdFx0c2hvdWxkVXBkYXRlOiBhd2FpdCB0aGlzLnNob3VsZFVwZGF0ZU5wbVNvdXJjZShlbnRyeS5wYXJzZWQsIGVudHJ5LnNjb3BlKSxcblx0XHR9KSk7XG5cdFx0Y29uc3QgbnBtQ2hlY2tSZXN1bHRzID0gYXdhaXQgdGhpcy5ydW5XaXRoQ29uY3VycmVuY3kobnBtQ2hlY2tUYXNrcywgVVBEQVRFX0NIRUNLX0NPTkNVUlJFTkNZKTtcblx0XHRjb25zdCB1c2VyTnBtVXBkYXRlczogTnBtVXBkYXRlVGFyZ2V0W10gPSBbXTtcblx0XHRjb25zdCBwcm9qZWN0TnBtVXBkYXRlczogTnBtVXBkYXRlVGFyZ2V0W10gPSBbXTtcblx0XHRmb3IgKGNvbnN0IHJlc3VsdCBvZiBucG1DaGVja1Jlc3VsdHMpIHtcblx0XHRcdGlmICghcmVzdWx0LnNob3VsZFVwZGF0ZSkge1xuXHRcdFx0XHRjb250aW51ZTtcblx0XHRcdH1cblx0XHRcdGlmIChyZXN1bHQuZW50cnkuc2NvcGUgPT09IFwidXNlclwiKSB7XG5cdFx0XHRcdHVzZXJOcG1VcGRhdGVzLnB1c2gocmVzdWx0LmVudHJ5KTtcblx0XHRcdH0gZWxzZSB7XG5cdFx0XHRcdHByb2plY3ROcG1VcGRhdGVzLnB1c2gocmVzdWx0LmVudHJ5KTtcblx0XHRcdH1cblx0XHR9XG5cblx0XHRjb25zdCB0YXNrczogUHJvbWlzZTx2b2lkPltdID0gW107XG5cdFx0aWYgKHVzZXJOcG1VcGRhdGVzLmxlbmd0aCA+IDApIHtcblx0XHRcdHRhc2tzLnB1c2godGhpcy51cGRhdGVOcG1CYXRjaCh1c2VyTnBtVXBkYXRlcywgXCJ1c2VyXCIpKTtcblx0XHR9XG5cdFx0aWYgKHByb2plY3ROcG1VcGRhdGVzLmxlbmd0aCA+IDApIHtcblx0XHRcdHRhc2tzLnB1c2godGhpcy51cGRhdGVOcG1CYXRjaChwcm9qZWN0TnBtVXBkYXRlcywgXCJwcm9qZWN0XCIpKTtcblx0XHR9XG5cdFx0aWYgKGdpdENhbmRpZGF0ZXMubGVuZ3RoID4gMCkge1xuXHRcdFx0Y29uc3QgZ2l0VGFza3MgPSBnaXRDYW5kaWRhdGVzLm1hcChcblx0XHRcdFx0KGVudHJ5KSA9PiBhc3luYyAoKSA9PlxuXHRcdFx0XHRcdHRoaXMud2l0aFByb2dyZXNzKFwidXBkYXRlXCIsIGVudHJ5LnNvdXJjZSwgYFVwZGF0aW5nICR7ZW50cnkuc291cmNlfS4uLmAsIGFzeW5jICgpID0+IHtcblx0XHRcdFx0XHRcdGF3YWl0IHRoaXMudXBkYXRlR2l0KGVudHJ5LnBhcnNlZCwgZW50cnkuc2NvcGUpO1xuXHRcdFx0XHRcdH0pLFxuXHRcdFx0KTtcblx0XHRcdHRhc2tzLnB1c2godGhpcy5ydW5XaXRoQ29uY3VycmVuY3koZ2l0VGFza3MsIEdJVF9VUERBVEVfQ09OQ1VSUkVOQ1kpLnRoZW4oKCkgPT4ge30pKTtcblx0XHR9XG5cblx0XHRhd2FpdCBQcm9taXNlLmFsbCh0YXNrcyk7XG5cdH1cblxuXHRwcml2YXRlIGFzeW5jIHNob3VsZFVwZGF0ZU5wbVNvdXJjZShzb3VyY2U6IE5wbVNvdXJjZSwgc2NvcGU6IEluc3RhbGxlZFNvdXJjZVNjb3BlKTogUHJvbWlzZTxib29sZWFuPiB7XG5cdFx0Y29uc3QgaW5zdGFsbGVkUGF0aCA9IHRoaXMuZ2V0TnBtSW5zdGFsbFBhdGgoc291cmNlLCBzY29wZSk7XG5cdFx0Y29uc3QgaW5zdGFsbGVkVmVyc2lvbiA9IGV4aXN0c1N5bmMoaW5zdGFsbGVkUGF0aCkgPyB0aGlzLmdldEluc3RhbGxlZE5wbVZlcnNpb24oaW5zdGFsbGVkUGF0aCkgOiB1bmRlZmluZWQ7XG5cdFx0aWYgKCFpbnN0YWxsZWRWZXJzaW9uKSB7XG5cdFx0XHRyZXR1cm4gdHJ1ZTtcblx0XHR9XG5cblx0XHR0cnkge1xuXHRcdFx0Y29uc3QgbGF0ZXN0VmVyc2lvbiA9IGF3YWl0IHRoaXMuZ2V0TGF0ZXN0TnBtVmVyc2lvbihzb3VyY2UubmFtZSk7XG5cdFx0XHRyZXR1cm4gbGF0ZXN0VmVyc2lvbiAhPT0gaW5zdGFsbGVkVmVyc2lvbjtcblx0XHR9IGNhdGNoIHtcblx0XHRcdC8vIFByZXNlcnZlIGV4aXN0aW5nIHVwZGF0ZSBiZWhhdmlvciB3aGVuIHZlcnNpb24gbG9va3VwIGZhaWxzLlxuXHRcdFx0cmV0dXJuIHRydWU7XG5cdFx0fVxuXHR9XG5cblx0cHJpdmF0ZSBhc3luYyB1cGRhdGVOcG1CYXRjaChzb3VyY2VzOiBOcG1VcGRhdGVUYXJnZXRbXSwgc2NvcGU6IEluc3RhbGxlZFNvdXJjZVNjb3BlKTogUHJvbWlzZTx2b2lkPiB7XG5cdFx0aWYgKHNvdXJjZXMubGVuZ3RoID09PSAwKSB7XG5cdFx0XHRyZXR1cm47XG5cdFx0fVxuXG5cdFx0Y29uc3Qgc291cmNlTGFiZWwgPSBzb3VyY2VzLmxlbmd0aCA9PT0gMSA/IHNvdXJjZXNbMF0uc291cmNlIDogYCR7c2NvcGV9IG5wbSBwYWNrYWdlc2A7XG5cdFx0Y29uc3QgbWVzc2FnZSA9IHNvdXJjZXMubGVuZ3RoID09PSAxID8gYFVwZGF0aW5nICR7c291cmNlc1swXS5zb3VyY2V9Li4uYCA6IGBVcGRhdGluZyAke3Njb3BlfSBucG0gcGFja2FnZXMuLi5gO1xuXHRcdGNvbnN0IHNwZWNzID0gc291cmNlcy5tYXAoKGVudHJ5KSA9PiBgJHtlbnRyeS5wYXJzZWQubmFtZX1AbGF0ZXN0YCk7XG5cblx0XHRhd2FpdCB0aGlzLndpdGhQcm9ncmVzcyhcInVwZGF0ZVwiLCBzb3VyY2VMYWJlbCwgbWVzc2FnZSwgYXN5bmMgKCkgPT4ge1xuXHRcdFx0YXdhaXQgdGhpcy5pbnN0YWxsTnBtQmF0Y2goc3BlY3MsIHNjb3BlKTtcblx0XHR9KTtcblx0fVxuXG5cdHByaXZhdGUgYXN5bmMgaW5zdGFsbE5wbUJhdGNoKHNwZWNzOiBzdHJpbmdbXSwgc2NvcGU6IEluc3RhbGxlZFNvdXJjZVNjb3BlKTogUHJvbWlzZTx2b2lkPiB7XG5cdFx0aWYgKHNjb3BlID09PSBcInVzZXJcIikge1xuXHRcdFx0YXdhaXQgdGhpcy5ydW5OcG1Db21tYW5kKFtcImluc3RhbGxcIiwgXCItZ1wiLCAuLi5zcGVjc10pO1xuXHRcdFx0cmV0dXJuO1xuXHRcdH1cblx0XHRjb25zdCBpbnN0YWxsUm9vdCA9IHRoaXMuZ2V0TnBtSW5zdGFsbFJvb3Qoc2NvcGUsIGZhbHNlKTtcblx0XHR0aGlzLmVuc3VyZU5wbVByb2plY3QoaW5zdGFsbFJvb3QpO1xuXHRcdGF3YWl0IHRoaXMucnVuTnBtQ29tbWFuZChbXCJpbnN0YWxsXCIsIC4uLnNwZWNzLCBcIi0tcHJlZml4XCIsIGluc3RhbGxSb290XSk7XG5cdH1cblxuXHRhc3luYyBjaGVja0ZvckF2YWlsYWJsZVVwZGF0ZXMoKTogUHJvbWlzZTxQYWNrYWdlVXBkYXRlW10+IHtcblx0XHRpZiAoaXNPZmZsaW5lTW9kZUVuYWJsZWQoKSkge1xuXHRcdFx0cmV0dXJuIFtdO1xuXHRcdH1cblxuXHRcdGNvbnN0IGdsb2JhbFNldHRpbmdzID0gdGhpcy5zZXR0aW5nc01hbmFnZXIuZ2V0R2xvYmFsU2V0dGluZ3MoKTtcblx0XHRjb25zdCBwcm9qZWN0U2V0dGluZ3MgPSB0aGlzLnNldHRpbmdzTWFuYWdlci5nZXRQcm9qZWN0U2V0dGluZ3MoKTtcblx0XHRjb25zdCBhbGxQYWNrYWdlczogQXJyYXk8eyBwa2c6IFBhY2thZ2VTb3VyY2U7IHNjb3BlOiBTb3VyY2VTY29wZSB9PiA9IFtdO1xuXHRcdGZvciAoY29uc3QgcGtnIG9mIHByb2plY3RTZXR0aW5ncy5wYWNrYWdlcyA/PyBbXSkge1xuXHRcdFx0YWxsUGFja2FnZXMucHVzaCh7IHBrZywgc2NvcGU6IFwicHJvamVjdFwiIH0pO1xuXHRcdH1cblx0XHRmb3IgKGNvbnN0IHBrZyBvZiBnbG9iYWxTZXR0aW5ncy5wYWNrYWdlcyA/PyBbXSkge1xuXHRcdFx0YWxsUGFja2FnZXMucHVzaCh7IHBrZywgc2NvcGU6IFwidXNlclwiIH0pO1xuXHRcdH1cblxuXHRcdGNvbnN0IHBhY2thZ2VTb3VyY2VzID0gdGhpcy5kZWR1cGVQYWNrYWdlcyhhbGxQYWNrYWdlcyk7XG5cdFx0Y29uc3QgY2hlY2tzID0gcGFja2FnZVNvdXJjZXNcblx0XHRcdC5maWx0ZXIoXG5cdFx0XHRcdChlbnRyeSk6IGVudHJ5IGlzIHsgcGtnOiBQYWNrYWdlU291cmNlOyBzY29wZTogRXhjbHVkZTxTb3VyY2VTY29wZSwgXCJ0ZW1wb3JhcnlcIj4gfSA9PlxuXHRcdFx0XHRcdGVudHJ5LnNjb3BlICE9PSBcInRlbXBvcmFyeVwiLFxuXHRcdFx0KVxuXHRcdFx0Lm1hcCgoZW50cnkpID0+IGFzeW5jICgpOiBQcm9taXNlPFBhY2thZ2VVcGRhdGUgfCB1bmRlZmluZWQ+ID0+IHtcblx0XHRcdFx0Y29uc3Qgc291cmNlID0gdHlwZW9mIGVudHJ5LnBrZyA9PT0gXCJzdHJpbmdcIiA/IGVudHJ5LnBrZyA6IGVudHJ5LnBrZy5zb3VyY2U7XG5cdFx0XHRcdGNvbnN0IHBhcnNlZCA9IHRoaXMucGFyc2VTb3VyY2Uoc291cmNlKTtcblx0XHRcdFx0aWYgKHBhcnNlZC50eXBlID09PSBcImxvY2FsXCIgfHwgcGFyc2VkLnBpbm5lZCkge1xuXHRcdFx0XHRcdHJldHVybiB1bmRlZmluZWQ7XG5cdFx0XHRcdH1cblxuXHRcdFx0XHRpZiAocGFyc2VkLnR5cGUgPT09IFwibnBtXCIpIHtcblx0XHRcdFx0XHRjb25zdCBpbnN0YWxsZWRQYXRoID0gdGhpcy5nZXROcG1JbnN0YWxsUGF0aChwYXJzZWQsIGVudHJ5LnNjb3BlKTtcblx0XHRcdFx0XHRpZiAoIWV4aXN0c1N5bmMoaW5zdGFsbGVkUGF0aCkpIHtcblx0XHRcdFx0XHRcdHJldHVybiB1bmRlZmluZWQ7XG5cdFx0XHRcdFx0fVxuXHRcdFx0XHRcdGNvbnN0IGhhc1VwZGF0ZSA9IGF3YWl0IHRoaXMubnBtSGFzQXZhaWxhYmxlVXBkYXRlKHBhcnNlZCwgaW5zdGFsbGVkUGF0aCk7XG5cdFx0XHRcdFx0aWYgKCFoYXNVcGRhdGUpIHtcblx0XHRcdFx0XHRcdHJldHVybiB1bmRlZmluZWQ7XG5cdFx0XHRcdFx0fVxuXHRcdFx0XHRcdHJldHVybiB7XG5cdFx0XHRcdFx0XHRzb3VyY2UsXG5cdFx0XHRcdFx0XHRkaXNwbGF5TmFtZTogcGFyc2VkLm5hbWUsXG5cdFx0XHRcdFx0XHR0eXBlOiBcIm5wbVwiLFxuXHRcdFx0XHRcdFx0c2NvcGU6IGVudHJ5LnNjb3BlLFxuXHRcdFx0XHRcdH07XG5cdFx0XHRcdH1cblxuXHRcdFx0XHRjb25zdCBpbnN0YWxsZWRQYXRoID0gdGhpcy5nZXRHaXRJbnN0YWxsUGF0aChwYXJzZWQsIGVudHJ5LnNjb3BlKTtcblx0XHRcdFx0aWYgKCFleGlzdHNTeW5jKGluc3RhbGxlZFBhdGgpKSB7XG5cdFx0XHRcdFx0cmV0dXJuIHVuZGVmaW5lZDtcblx0XHRcdFx0fVxuXHRcdFx0XHRjb25zdCBoYXNVcGRhdGUgPSBhd2FpdCB0aGlzLmdpdEhhc0F2YWlsYWJsZVVwZGF0ZShpbnN0YWxsZWRQYXRoKTtcblx0XHRcdFx0aWYgKCFoYXNVcGRhdGUpIHtcblx0XHRcdFx0XHRyZXR1cm4gdW5kZWZpbmVkO1xuXHRcdFx0XHR9XG5cdFx0XHRcdHJldHVybiB7XG5cdFx0XHRcdFx0c291cmNlLFxuXHRcdFx0XHRcdGRpc3BsYXlOYW1lOiBgJHtwYXJzZWQuaG9zdH0vJHtwYXJzZWQucGF0aH1gLFxuXHRcdFx0XHRcdHR5cGU6IFwiZ2l0XCIsXG5cdFx0XHRcdFx0c2NvcGU6IGVudHJ5LnNjb3BlLFxuXHRcdFx0XHR9O1xuXHRcdFx0fSk7XG5cblx0XHRjb25zdCByZXN1bHRzID0gYXdhaXQgdGhpcy5ydW5XaXRoQ29uY3VycmVuY3koY2hlY2tzLCBVUERBVEVfQ0hFQ0tfQ09OQ1VSUkVOQ1kpO1xuXHRcdHJldHVybiByZXN1bHRzLmZpbHRlcigocmVzdWx0KTogcmVzdWx0IGlzIFBhY2thZ2VVcGRhdGUgPT4gcmVzdWx0ICE9PSB1bmRlZmluZWQpO1xuXHR9XG5cblx0cHJpdmF0ZSBhc3luYyByZXNvbHZlUGFja2FnZVNvdXJjZXMoXG5cdFx0c291cmNlczogQXJyYXk8eyBwa2c6IFBhY2thZ2VTb3VyY2U7IHNjb3BlOiBTb3VyY2VTY29wZSB9Pixcblx0XHRhY2N1bXVsYXRvcjogUmVzb3VyY2VBY2N1bXVsYXRvcixcblx0XHRvbk1pc3Npbmc/OiAoc291cmNlOiBzdHJpbmcpID0+IFByb21pc2U8TWlzc2luZ1NvdXJjZUFjdGlvbj4sXG5cdCk6IFByb21pc2U8dm9pZD4ge1xuXHRcdGZvciAoY29uc3QgeyBwa2csIHNjb3BlIH0gb2Ygc291cmNlcykge1xuXHRcdFx0Y29uc3Qgc291cmNlU3RyID0gdHlwZW9mIHBrZyA9PT0gXCJzdHJpbmdcIiA/IHBrZyA6IHBrZy5zb3VyY2U7XG5cdFx0XHRjb25zdCBmaWx0ZXIgPSB0eXBlb2YgcGtnID09PSBcIm9iamVjdFwiID8gcGtnIDogdW5kZWZpbmVkO1xuXHRcdFx0Y29uc3QgcGFyc2VkID0gdGhpcy5wYXJzZVNvdXJjZShzb3VyY2VTdHIpO1xuXHRcdFx0Y29uc3QgbWV0YWRhdGE6IFBhdGhNZXRhZGF0YSA9IHsgc291cmNlOiBzb3VyY2VTdHIsIHNjb3BlLCBvcmlnaW46IFwicGFja2FnZVwiIH07XG5cblx0XHRcdGlmIChwYXJzZWQudHlwZSA9PT0gXCJsb2NhbFwiKSB7XG5cdFx0XHRcdGNvbnN0IGJhc2VEaXIgPSB0aGlzLmdldEJhc2VEaXJGb3JTY29wZShzY29wZSk7XG5cdFx0XHRcdHRoaXMucmVzb2x2ZUxvY2FsRXh0ZW5zaW9uU291cmNlKHBhcnNlZCwgYWNjdW11bGF0b3IsIGZpbHRlciwgbWV0YWRhdGEsIGJhc2VEaXIpO1xuXHRcdFx0XHRjb250aW51ZTtcblx0XHRcdH1cblxuXHRcdFx0Y29uc3QgaW5zdGFsbE1pc3NpbmcgPSBhc3luYyAoKTogUHJvbWlzZTxib29sZWFuPiA9PiB7XG5cdFx0XHRcdGlmIChpc09mZmxpbmVNb2RlRW5hYmxlZCgpKSB7XG5cdFx0XHRcdFx0cmV0dXJuIGZhbHNlO1xuXHRcdFx0XHR9XG5cdFx0XHRcdGlmICghb25NaXNzaW5nKSB7XG5cdFx0XHRcdFx0YXdhaXQgdGhpcy5pbnN0YWxsUGFyc2VkU291cmNlKHBhcnNlZCwgc2NvcGUpO1xuXHRcdFx0XHRcdHJldHVybiB0cnVlO1xuXHRcdFx0XHR9XG5cdFx0XHRcdGNvbnN0IGFjdGlvbiA9IGF3YWl0IG9uTWlzc2luZyhzb3VyY2VTdHIpO1xuXHRcdFx0XHRpZiAoYWN0aW9uID09PSBcInNraXBcIikgcmV0dXJuIGZhbHNlO1xuXHRcdFx0XHRpZiAoYWN0aW9uID09PSBcImVycm9yXCIpIHRocm93IG5ldyBFcnJvcihgTWlzc2luZyBzb3VyY2U6ICR7c291cmNlU3RyfWApO1xuXHRcdFx0XHRhd2FpdCB0aGlzLmluc3RhbGxQYXJzZWRTb3VyY2UocGFyc2VkLCBzY29wZSk7XG5cdFx0XHRcdHJldHVybiB0cnVlO1xuXHRcdFx0fTtcblxuXHRcdFx0aWYgKHBhcnNlZC50eXBlID09PSBcIm5wbVwiKSB7XG5cdFx0XHRcdGNvbnN0IGluc3RhbGxlZFBhdGggPSB0aGlzLmdldE5wbUluc3RhbGxQYXRoKHBhcnNlZCwgc2NvcGUpO1xuXHRcdFx0XHRjb25zdCBuZWVkc0luc3RhbGwgPVxuXHRcdFx0XHRcdCFleGlzdHNTeW5jKGluc3RhbGxlZFBhdGgpIHx8XG5cdFx0XHRcdFx0KHBhcnNlZC5waW5uZWQgJiYgIShhd2FpdCB0aGlzLmluc3RhbGxlZE5wbU1hdGNoZXNQaW5uZWRWZXJzaW9uKHBhcnNlZCwgaW5zdGFsbGVkUGF0aCkpKTtcblx0XHRcdFx0aWYgKG5lZWRzSW5zdGFsbCkge1xuXHRcdFx0XHRcdGNvbnN0IGluc3RhbGxlZCA9IGF3YWl0IGluc3RhbGxNaXNzaW5nKCk7XG5cdFx0XHRcdFx0aWYgKCFpbnN0YWxsZWQpIGNvbnRpbnVlO1xuXHRcdFx0XHR9XG5cdFx0XHRcdG1ldGFkYXRhLmJhc2VEaXIgPSBpbnN0YWxsZWRQYXRoO1xuXHRcdFx0XHR0aGlzLmNvbGxlY3RQYWNrYWdlUmVzb3VyY2VzKGluc3RhbGxlZFBhdGgsIGFjY3VtdWxhdG9yLCBmaWx0ZXIsIG1ldGFkYXRhKTtcblx0XHRcdFx0Y29udGludWU7XG5cdFx0XHR9XG5cblx0XHRcdGlmIChwYXJzZWQudHlwZSA9PT0gXCJnaXRcIikge1xuXHRcdFx0XHRjb25zdCBpbnN0YWxsZWRQYXRoID0gdGhpcy5nZXRHaXRJbnN0YWxsUGF0aChwYXJzZWQsIHNjb3BlKTtcblx0XHRcdFx0aWYgKCFleGlzdHNTeW5jKGluc3RhbGxlZFBhdGgpKSB7XG5cdFx0XHRcdFx0Y29uc3QgaW5zdGFsbGVkID0gYXdhaXQgaW5zdGFsbE1pc3NpbmcoKTtcblx0XHRcdFx0XHRpZiAoIWluc3RhbGxlZCkgY29udGludWU7XG5cdFx0XHRcdH0gZWxzZSBpZiAoc2NvcGUgPT09IFwidGVtcG9yYXJ5XCIgJiYgIXBhcnNlZC5waW5uZWQgJiYgIWlzT2ZmbGluZU1vZGVFbmFibGVkKCkpIHtcblx0XHRcdFx0XHRhd2FpdCB0aGlzLnJlZnJlc2hUZW1wb3JhcnlHaXRTb3VyY2UocGFyc2VkLCBzb3VyY2VTdHIpO1xuXHRcdFx0XHR9XG5cdFx0XHRcdG1ldGFkYXRhLmJhc2VEaXIgPSBpbnN0YWxsZWRQYXRoO1xuXHRcdFx0XHR0aGlzLmNvbGxlY3RQYWNrYWdlUmVzb3VyY2VzKGluc3RhbGxlZFBhdGgsIGFjY3VtdWxhdG9yLCBmaWx0ZXIsIG1ldGFkYXRhKTtcblx0XHRcdH1cblx0XHR9XG5cdH1cblxuXHRwcml2YXRlIHJlc29sdmVMb2NhbEV4dGVuc2lvblNvdXJjZShcblx0XHRzb3VyY2U6IExvY2FsU291cmNlLFxuXHRcdGFjY3VtdWxhdG9yOiBSZXNvdXJjZUFjY3VtdWxhdG9yLFxuXHRcdGZpbHRlcjogUGFja2FnZUZpbHRlciB8IHVuZGVmaW5lZCxcblx0XHRtZXRhZGF0YTogUGF0aE1ldGFkYXRhLFxuXHRcdGJhc2VEaXI6IHN0cmluZyxcblx0KTogdm9pZCB7XG5cdFx0Y29uc3QgcmVzb2x2ZWQgPSB0aGlzLnJlc29sdmVQYXRoRnJvbUJhc2Uoc291cmNlLnBhdGgsIGJhc2VEaXIpO1xuXHRcdGlmICghZXhpc3RzU3luYyhyZXNvbHZlZCkpIHtcblx0XHRcdHJldHVybjtcblx0XHR9XG5cblx0XHR0cnkge1xuXHRcdFx0Y29uc3Qgc3RhdHMgPSBzdGF0U3luYyhyZXNvbHZlZCk7XG5cdFx0XHRpZiAoc3RhdHMuaXNGaWxlKCkpIHtcblx0XHRcdFx0bWV0YWRhdGEuYmFzZURpciA9IGRpcm5hbWUocmVzb2x2ZWQpO1xuXHRcdFx0XHR0aGlzLmFkZFJlc291cmNlKGFjY3VtdWxhdG9yLmV4dGVuc2lvbnMsIHJlc29sdmVkLCBtZXRhZGF0YSwgdHJ1ZSk7XG5cdFx0XHRcdHJldHVybjtcblx0XHRcdH1cblx0XHRcdGlmIChzdGF0cy5pc0RpcmVjdG9yeSgpKSB7XG5cdFx0XHRcdG1ldGFkYXRhLmJhc2VEaXIgPSByZXNvbHZlZDtcblx0XHRcdFx0Y29uc3QgcmVzb3VyY2VzID0gdGhpcy5jb2xsZWN0UGFja2FnZVJlc291cmNlcyhyZXNvbHZlZCwgYWNjdW11bGF0b3IsIGZpbHRlciwgbWV0YWRhdGEpO1xuXHRcdFx0XHRpZiAoIXJlc291cmNlcykge1xuXHRcdFx0XHRcdHRoaXMuYWRkUmVzb3VyY2UoYWNjdW11bGF0b3IuZXh0ZW5zaW9ucywgcmVzb2x2ZWQsIG1ldGFkYXRhLCB0cnVlKTtcblx0XHRcdFx0fVxuXHRcdFx0fVxuXHRcdH0gY2F0Y2gge1xuXHRcdFx0cmV0dXJuO1xuXHRcdH1cblx0fVxuXG5cdHByaXZhdGUgYXN5bmMgaW5zdGFsbFBhcnNlZFNvdXJjZShwYXJzZWQ6IFBhcnNlZFNvdXJjZSwgc2NvcGU6IFNvdXJjZVNjb3BlKTogUHJvbWlzZTx2b2lkPiB7XG5cdFx0aWYgKHBhcnNlZC50eXBlID09PSBcIm5wbVwiKSB7XG5cdFx0XHRhd2FpdCB0aGlzLmluc3RhbGxOcG0ocGFyc2VkLCBzY29wZSwgc2NvcGUgPT09IFwidGVtcG9yYXJ5XCIpO1xuXHRcdFx0cmV0dXJuO1xuXHRcdH1cblx0XHRpZiAocGFyc2VkLnR5cGUgPT09IFwiZ2l0XCIpIHtcblx0XHRcdGF3YWl0IHRoaXMuaW5zdGFsbEdpdChwYXJzZWQsIHNjb3BlKTtcblx0XHRcdHJldHVybjtcblx0XHR9XG5cdH1cblxuXHRwcml2YXRlIGdldFBhY2thZ2VTb3VyY2VTdHJpbmcocGtnOiBQYWNrYWdlU291cmNlKTogc3RyaW5nIHtcblx0XHRyZXR1cm4gdHlwZW9mIHBrZyA9PT0gXCJzdHJpbmdcIiA/IHBrZyA6IHBrZy5zb3VyY2U7XG5cdH1cblxuXHRwcml2YXRlIGdldFNvdXJjZU1hdGNoS2V5Rm9ySW5wdXQoc291cmNlOiBzdHJpbmcpOiBzdHJpbmcge1xuXHRcdGNvbnN0IHBhcnNlZCA9IHRoaXMucGFyc2VTb3VyY2Uoc291cmNlKTtcblx0XHRpZiAocGFyc2VkLnR5cGUgPT09IFwibnBtXCIpIHtcblx0XHRcdHJldHVybiBgbnBtOiR7cGFyc2VkLm5hbWV9YDtcblx0XHR9XG5cdFx0aWYgKHBhcnNlZC50eXBlID09PSBcImdpdFwiKSB7XG5cdFx0XHRyZXR1cm4gYGdpdDoke3BhcnNlZC5ob3N0fS8ke3BhcnNlZC5wYXRofWA7XG5cdFx0fVxuXHRcdHJldHVybiBgbG9jYWw6JHt0aGlzLnJlc29sdmVQYXRoKHBhcnNlZC5wYXRoKX1gO1xuXHR9XG5cblx0cHJpdmF0ZSBnZXRTb3VyY2VNYXRjaEtleUZvclNldHRpbmdzKHNvdXJjZTogc3RyaW5nLCBzY29wZTogU291cmNlU2NvcGUpOiBzdHJpbmcge1xuXHRcdGNvbnN0IHBhcnNlZCA9IHRoaXMucGFyc2VTb3VyY2Uoc291cmNlKTtcblx0XHRpZiAocGFyc2VkLnR5cGUgPT09IFwibnBtXCIpIHtcblx0XHRcdHJldHVybiBgbnBtOiR7cGFyc2VkLm5hbWV9YDtcblx0XHR9XG5cdFx0aWYgKHBhcnNlZC50eXBlID09PSBcImdpdFwiKSB7XG5cdFx0XHRyZXR1cm4gYGdpdDoke3BhcnNlZC5ob3N0fS8ke3BhcnNlZC5wYXRofWA7XG5cdFx0fVxuXHRcdGNvbnN0IGJhc2VEaXIgPSB0aGlzLmdldEJhc2VEaXJGb3JTY29wZShzY29wZSk7XG5cdFx0cmV0dXJuIGBsb2NhbDoke3RoaXMucmVzb2x2ZVBhdGhGcm9tQmFzZShwYXJzZWQucGF0aCwgYmFzZURpcil9YDtcblx0fVxuXG5cdHByaXZhdGUgYnVpbGROb01hdGNoaW5nUGFja2FnZU1lc3NhZ2Uoc291cmNlOiBzdHJpbmcsIGNvbmZpZ3VyZWRQYWNrYWdlczogUGFja2FnZVNvdXJjZVtdKTogc3RyaW5nIHtcblx0XHRjb25zdCBzdWdnZXN0aW9uID0gdGhpcy5maW5kU3VnZ2VzdGVkQ29uZmlndXJlZFNvdXJjZShzb3VyY2UsIGNvbmZpZ3VyZWRQYWNrYWdlcyk7XG5cdFx0aWYgKCFzdWdnZXN0aW9uKSB7XG5cdFx0XHRyZXR1cm4gYE5vIG1hdGNoaW5nIHBhY2thZ2UgZm91bmQgZm9yICR7c291cmNlfWA7XG5cdFx0fVxuXHRcdHJldHVybiBgTm8gbWF0Y2hpbmcgcGFja2FnZSBmb3VuZCBmb3IgJHtzb3VyY2V9LiBEaWQgeW91IG1lYW4gJHtzdWdnZXN0aW9ufT9gO1xuXHR9XG5cblx0cHJpdmF0ZSBmaW5kU3VnZ2VzdGVkQ29uZmlndXJlZFNvdXJjZShzb3VyY2U6IHN0cmluZywgY29uZmlndXJlZFBhY2thZ2VzOiBQYWNrYWdlU291cmNlW10pOiBzdHJpbmcgfCB1bmRlZmluZWQge1xuXHRcdGNvbnN0IHRyaW1tZWRTb3VyY2UgPSBzb3VyY2UudHJpbSgpO1xuXHRcdGNvbnN0IHN1Z2dlc3Rpb25zID0gbmV3IFNldDxzdHJpbmc+KCk7XG5cblx0XHRmb3IgKGNvbnN0IHBrZyBvZiBjb25maWd1cmVkUGFja2FnZXMpIHtcblx0XHRcdGNvbnN0IHNvdXJjZVN0ciA9IHRoaXMuZ2V0UGFja2FnZVNvdXJjZVN0cmluZyhwa2cpO1xuXHRcdFx0Y29uc3QgcGFyc2VkID0gdGhpcy5wYXJzZVNvdXJjZShzb3VyY2VTdHIpO1xuXHRcdFx0aWYgKHBhcnNlZC50eXBlID09PSBcIm5wbVwiKSB7XG5cdFx0XHRcdGlmICh0cmltbWVkU291cmNlID09PSBwYXJzZWQubmFtZSB8fCB0cmltbWVkU291cmNlID09PSBwYXJzZWQuc3BlYykge1xuXHRcdFx0XHRcdHN1Z2dlc3Rpb25zLmFkZChzb3VyY2VTdHIpO1xuXHRcdFx0XHR9XG5cdFx0XHRcdGNvbnRpbnVlO1xuXHRcdFx0fVxuXHRcdFx0aWYgKHBhcnNlZC50eXBlID09PSBcImdpdFwiKSB7XG5cdFx0XHRcdGNvbnN0IHNob3J0aGFuZCA9IGAke3BhcnNlZC5ob3N0fS8ke3BhcnNlZC5wYXRofWA7XG5cdFx0XHRcdGNvbnN0IHNob3J0aGFuZFdpdGhSZWYgPSBwYXJzZWQucmVmID8gYCR7c2hvcnRoYW5kfUAke3BhcnNlZC5yZWZ9YCA6IHVuZGVmaW5lZDtcblx0XHRcdFx0aWYgKHRyaW1tZWRTb3VyY2UgPT09IHNob3J0aGFuZCB8fCAoc2hvcnRoYW5kV2l0aFJlZiAmJiB0cmltbWVkU291cmNlID09PSBzaG9ydGhhbmRXaXRoUmVmKSkge1xuXHRcdFx0XHRcdHN1Z2dlc3Rpb25zLmFkZChzb3VyY2VTdHIpO1xuXHRcdFx0XHR9XG5cdFx0XHR9XG5cdFx0fVxuXG5cdFx0cmV0dXJuIHN1Z2dlc3Rpb25zLnZhbHVlcygpLm5leHQoKS52YWx1ZTtcblx0fVxuXG5cdHByaXZhdGUgcGFja2FnZVNvdXJjZXNNYXRjaChleGlzdGluZzogUGFja2FnZVNvdXJjZSwgaW5wdXRTb3VyY2U6IHN0cmluZywgc2NvcGU6IFNvdXJjZVNjb3BlKTogYm9vbGVhbiB7XG5cdFx0Y29uc3QgbGVmdCA9IHRoaXMuZ2V0U291cmNlTWF0Y2hLZXlGb3JTZXR0aW5ncyh0aGlzLmdldFBhY2thZ2VTb3VyY2VTdHJpbmcoZXhpc3RpbmcpLCBzY29wZSk7XG5cdFx0Y29uc3QgcmlnaHQgPSB0aGlzLmdldFNvdXJjZU1hdGNoS2V5Rm9ySW5wdXQoaW5wdXRTb3VyY2UpO1xuXHRcdHJldHVybiBsZWZ0ID09PSByaWdodDtcblx0fVxuXG5cdHByaXZhdGUgbm9ybWFsaXplUGFja2FnZVNvdXJjZUZvclNldHRpbmdzKHNvdXJjZTogc3RyaW5nLCBzY29wZTogU291cmNlU2NvcGUpOiBzdHJpbmcge1xuXHRcdGNvbnN0IHBhcnNlZCA9IHRoaXMucGFyc2VTb3VyY2Uoc291cmNlKTtcblx0XHRpZiAocGFyc2VkLnR5cGUgIT09IFwibG9jYWxcIikge1xuXHRcdFx0cmV0dXJuIHNvdXJjZTtcblx0XHR9XG5cdFx0Y29uc3QgYmFzZURpciA9IHRoaXMuZ2V0QmFzZURpckZvclNjb3BlKHNjb3BlKTtcblx0XHRjb25zdCByZXNvbHZlZCA9IHRoaXMucmVzb2x2ZVBhdGgocGFyc2VkLnBhdGgpO1xuXHRcdGNvbnN0IHJlbCA9IHJlbGF0aXZlKGJhc2VEaXIsIHJlc29sdmVkKTtcblx0XHRyZXR1cm4gcmVsIHx8IFwiLlwiO1xuXHR9XG5cblx0cHJpdmF0ZSBwYXJzZVNvdXJjZShzb3VyY2U6IHN0cmluZyk6IFBhcnNlZFNvdXJjZSB7XG5cdFx0aWYgKHNvdXJjZS5zdGFydHNXaXRoKFwibnBtOlwiKSkge1xuXHRcdFx0Y29uc3Qgc3BlYyA9IHNvdXJjZS5zbGljZShcIm5wbTpcIi5sZW5ndGgpLnRyaW0oKTtcblx0XHRcdGNvbnN0IHsgbmFtZSwgdmVyc2lvbiB9ID0gdGhpcy5wYXJzZU5wbVNwZWMoc3BlYyk7XG5cdFx0XHRyZXR1cm4ge1xuXHRcdFx0XHR0eXBlOiBcIm5wbVwiLFxuXHRcdFx0XHRzcGVjLFxuXHRcdFx0XHRuYW1lLFxuXHRcdFx0XHRwaW5uZWQ6IEJvb2xlYW4odmVyc2lvbiksXG5cdFx0XHR9O1xuXHRcdH1cblxuXHRcdGlmIChpc0xvY2FsUGF0aChzb3VyY2UpKSB7XG5cdFx0XHRyZXR1cm4geyB0eXBlOiBcImxvY2FsXCIsIHBhdGg6IHNvdXJjZSB9O1xuXHRcdH1cblxuXHRcdC8vIFRyeSBwYXJzaW5nIGFzIGdpdCBVUkxcblx0XHRjb25zdCBnaXRQYXJzZWQgPSBwYXJzZUdpdFVybChzb3VyY2UpO1xuXHRcdGlmIChnaXRQYXJzZWQpIHtcblx0XHRcdHJldHVybiBnaXRQYXJzZWQ7XG5cdFx0fVxuXG5cdFx0cmV0dXJuIHsgdHlwZTogXCJsb2NhbFwiLCBwYXRoOiBzb3VyY2UgfTtcblx0fVxuXG5cdHByaXZhdGUgYXN5bmMgaW5zdGFsbGVkTnBtTWF0Y2hlc1Bpbm5lZFZlcnNpb24oc291cmNlOiBOcG1Tb3VyY2UsIGluc3RhbGxlZFBhdGg6IHN0cmluZyk6IFByb21pc2U8Ym9vbGVhbj4ge1xuXHRcdGNvbnN0IGluc3RhbGxlZFZlcnNpb24gPSB0aGlzLmdldEluc3RhbGxlZE5wbVZlcnNpb24oaW5zdGFsbGVkUGF0aCk7XG5cdFx0aWYgKCFpbnN0YWxsZWRWZXJzaW9uKSB7XG5cdFx0XHRyZXR1cm4gZmFsc2U7XG5cdFx0fVxuXG5cdFx0Y29uc3QgeyB2ZXJzaW9uOiBwaW5uZWRWZXJzaW9uIH0gPSB0aGlzLnBhcnNlTnBtU3BlYyhzb3VyY2Uuc3BlYyk7XG5cdFx0aWYgKCFwaW5uZWRWZXJzaW9uKSB7XG5cdFx0XHRyZXR1cm4gdHJ1ZTtcblx0XHR9XG5cblx0XHRyZXR1cm4gaW5zdGFsbGVkVmVyc2lvbiA9PT0gcGlubmVkVmVyc2lvbjtcblx0fVxuXG5cdHByaXZhdGUgYXN5bmMgbnBtSGFzQXZhaWxhYmxlVXBkYXRlKHNvdXJjZTogTnBtU291cmNlLCBpbnN0YWxsZWRQYXRoOiBzdHJpbmcpOiBQcm9taXNlPGJvb2xlYW4+IHtcblx0XHRpZiAoaXNPZmZsaW5lTW9kZUVuYWJsZWQoKSkge1xuXHRcdFx0cmV0dXJuIGZhbHNlO1xuXHRcdH1cblxuXHRcdGNvbnN0IGluc3RhbGxlZFZlcnNpb24gPSB0aGlzLmdldEluc3RhbGxlZE5wbVZlcnNpb24oaW5zdGFsbGVkUGF0aCk7XG5cdFx0aWYgKCFpbnN0YWxsZWRWZXJzaW9uKSB7XG5cdFx0XHRyZXR1cm4gZmFsc2U7XG5cdFx0fVxuXG5cdFx0dHJ5IHtcblx0XHRcdGNvbnN0IGxhdGVzdFZlcnNpb24gPSBhd2FpdCB0aGlzLmdldExhdGVzdE5wbVZlcnNpb24oc291cmNlLm5hbWUpO1xuXHRcdFx0cmV0dXJuIGxhdGVzdFZlcnNpb24gIT09IGluc3RhbGxlZFZlcnNpb247XG5cdFx0fSBjYXRjaCB7XG5cdFx0XHRyZXR1cm4gZmFsc2U7XG5cdFx0fVxuXHR9XG5cblx0cHJpdmF0ZSBnZXRJbnN0YWxsZWROcG1WZXJzaW9uKGluc3RhbGxlZFBhdGg6IHN0cmluZyk6IHN0cmluZyB8IHVuZGVmaW5lZCB7XG5cdFx0Y29uc3QgcGFja2FnZUpzb25QYXRoID0gam9pbihpbnN0YWxsZWRQYXRoLCBcInBhY2thZ2UuanNvblwiKTtcblx0XHRpZiAoIWV4aXN0c1N5bmMocGFja2FnZUpzb25QYXRoKSkgcmV0dXJuIHVuZGVmaW5lZDtcblx0XHR0cnkge1xuXHRcdFx0Y29uc3QgY29udGVudCA9IHJlYWRGaWxlU3luYyhwYWNrYWdlSnNvblBhdGgsIFwidXRmLThcIik7XG5cdFx0XHRjb25zdCBwa2cgPSBKU09OLnBhcnNlKGNvbnRlbnQpIGFzIHsgdmVyc2lvbj86IHN0cmluZyB9O1xuXHRcdFx0cmV0dXJuIHBrZy52ZXJzaW9uO1xuXHRcdH0gY2F0Y2gge1xuXHRcdFx0cmV0dXJuIHVuZGVmaW5lZDtcblx0XHR9XG5cdH1cblxuXHRwcml2YXRlIGFzeW5jIGdldExhdGVzdE5wbVZlcnNpb24ocGFja2FnZU5hbWU6IHN0cmluZyk6IFByb21pc2U8c3RyaW5nPiB7XG5cdFx0Y29uc3QgbnBtQ29tbWFuZCA9IHRoaXMuZ2V0TnBtQ29tbWFuZCgpO1xuXHRcdGNvbnN0IHN0ZG91dCA9IGF3YWl0IHRoaXMucnVuQ29tbWFuZENhcHR1cmUoXG5cdFx0XHRucG1Db21tYW5kLmNvbW1hbmQsXG5cdFx0XHRbLi4ubnBtQ29tbWFuZC5hcmdzLCBcInZpZXdcIiwgcGFja2FnZU5hbWUsIFwidmVyc2lvblwiLCBcIi0tanNvblwiXSxcblx0XHRcdHsgY3dkOiB0aGlzLmN3ZCwgdGltZW91dE1zOiBORVRXT1JLX1RJTUVPVVRfTVMgfSxcblx0XHQpO1xuXHRcdGNvbnN0IHJhdyA9IHN0ZG91dC50cmltKCk7XG5cdFx0aWYgKCFyYXcpIHRocm93IG5ldyBFcnJvcihcIkVtcHR5IHJlc3BvbnNlIGZyb20gbnBtIHZpZXdcIik7XG5cdFx0cmV0dXJuIEpTT04ucGFyc2UocmF3KTtcblx0fVxuXG5cdHByaXZhdGUgYXN5bmMgZ2l0SGFzQXZhaWxhYmxlVXBkYXRlKGluc3RhbGxlZFBhdGg6IHN0cmluZyk6IFByb21pc2U8Ym9vbGVhbj4ge1xuXHRcdGlmIChpc09mZmxpbmVNb2RlRW5hYmxlZCgpKSB7XG5cdFx0XHRyZXR1cm4gZmFsc2U7XG5cdFx0fVxuXG5cdFx0dHJ5IHtcblx0XHRcdGNvbnN0IGxvY2FsSGVhZCA9IGF3YWl0IHRoaXMucnVuQ29tbWFuZENhcHR1cmUoXCJnaXRcIiwgW1wicmV2LXBhcnNlXCIsIFwiSEVBRFwiXSwge1xuXHRcdFx0XHRjd2Q6IGluc3RhbGxlZFBhdGgsXG5cdFx0XHRcdHRpbWVvdXRNczogTkVUV09SS19USU1FT1VUX01TLFxuXHRcdFx0fSk7XG5cdFx0XHRjb25zdCByZW1vdGVIZWFkID0gYXdhaXQgdGhpcy5nZXRSZW1vdGVHaXRIZWFkKGluc3RhbGxlZFBhdGgpO1xuXHRcdFx0cmV0dXJuIGxvY2FsSGVhZC50cmltKCkgIT09IHJlbW90ZUhlYWQudHJpbSgpO1xuXHRcdH0gY2F0Y2gge1xuXHRcdFx0cmV0dXJuIGZhbHNlO1xuXHRcdH1cblx0fVxuXG5cdHByaXZhdGUgYXN5bmMgZ2V0UmVtb3RlR2l0SGVhZChpbnN0YWxsZWRQYXRoOiBzdHJpbmcpOiBQcm9taXNlPHN0cmluZz4ge1xuXHRcdGNvbnN0IHVwc3RyZWFtUmVmID0gYXdhaXQgdGhpcy5nZXRHaXRVcHN0cmVhbVJlZihpbnN0YWxsZWRQYXRoKTtcblx0XHRpZiAodXBzdHJlYW1SZWYpIHtcblx0XHRcdGNvbnN0IHJlbW90ZUhlYWQgPSBhd2FpdCB0aGlzLnJ1bkdpdFJlbW90ZUNvbW1hbmQoaW5zdGFsbGVkUGF0aCwgW1wibHMtcmVtb3RlXCIsIFwib3JpZ2luXCIsIHVwc3RyZWFtUmVmXSk7XG5cdFx0XHRjb25zdCBtYXRjaCA9IHJlbW90ZUhlYWQubWF0Y2goL14oWzAtOWEtZl17NDB9KVxccysvbSk7XG5cdFx0XHRpZiAobWF0Y2g/LlsxXSkge1xuXHRcdFx0XHRyZXR1cm4gbWF0Y2hbMV07XG5cdFx0XHR9XG5cdFx0fVxuXG5cdFx0Y29uc3QgcmVtb3RlSGVhZCA9IGF3YWl0IHRoaXMucnVuR2l0UmVtb3RlQ29tbWFuZChpbnN0YWxsZWRQYXRoLCBbXCJscy1yZW1vdGVcIiwgXCJvcmlnaW5cIiwgXCJIRUFEXCJdKTtcblx0XHRjb25zdCBtYXRjaCA9IHJlbW90ZUhlYWQubWF0Y2goL14oWzAtOWEtZl17NDB9KVxccytIRUFEJC9tKTtcblx0XHRpZiAoIW1hdGNoPy5bMV0pIHtcblx0XHRcdHRocm93IG5ldyBFcnJvcihcIkZhaWxlZCB0byBkZXRlcm1pbmUgcmVtb3RlIEhFQURcIik7XG5cdFx0fVxuXHRcdHJldHVybiBtYXRjaFsxXTtcblx0fVxuXG5cdHByaXZhdGUgYXN5bmMgZ2V0TG9jYWxHaXRVcGRhdGVUYXJnZXQoXG5cdFx0aW5zdGFsbGVkUGF0aDogc3RyaW5nLFxuXHQpOiBQcm9taXNlPHsgcmVmOiBzdHJpbmc7IGhlYWQ6IHN0cmluZzsgZmV0Y2hBcmdzOiBzdHJpbmdbXSB9PiB7XG5cdFx0dHJ5IHtcblx0XHRcdGNvbnN0IHVwc3RyZWFtID0gYXdhaXQgdGhpcy5ydW5Db21tYW5kQ2FwdHVyZShcImdpdFwiLCBbXCJyZXYtcGFyc2VcIiwgXCItLWFiYnJldi1yZWZcIiwgXCJAe3Vwc3RyZWFtfVwiXSwge1xuXHRcdFx0XHRjd2Q6IGluc3RhbGxlZFBhdGgsXG5cdFx0XHRcdHRpbWVvdXRNczogTkVUV09SS19USU1FT1VUX01TLFxuXHRcdFx0fSk7XG5cdFx0XHRjb25zdCB0cmltbWVkVXBzdHJlYW0gPSB1cHN0cmVhbS50cmltKCk7XG5cdFx0XHRpZiAoIXRyaW1tZWRVcHN0cmVhbS5zdGFydHNXaXRoKFwib3JpZ2luL1wiKSkge1xuXHRcdFx0XHR0aHJvdyBuZXcgRXJyb3IoYFVuc3VwcG9ydGVkIHVwc3RyZWFtIHJlbW90ZTogJHt0cmltbWVkVXBzdHJlYW19YCk7XG5cdFx0XHR9XG5cdFx0XHRjb25zdCBicmFuY2ggPSB0cmltbWVkVXBzdHJlYW0uc2xpY2UoXCJvcmlnaW4vXCIubGVuZ3RoKTtcblx0XHRcdGlmICghYnJhbmNoKSB7XG5cdFx0XHRcdHRocm93IG5ldyBFcnJvcihcIk1pc3NpbmcgdXBzdHJlYW0gYnJhbmNoIG5hbWVcIik7XG5cdFx0XHR9XG5cdFx0XHRjb25zdCBoZWFkID0gYXdhaXQgdGhpcy5ydW5Db21tYW5kQ2FwdHVyZShcImdpdFwiLCBbXCJyZXYtcGFyc2VcIiwgXCJAe3Vwc3RyZWFtfVwiXSwge1xuXHRcdFx0XHRjd2Q6IGluc3RhbGxlZFBhdGgsXG5cdFx0XHRcdHRpbWVvdXRNczogTkVUV09SS19USU1FT1VUX01TLFxuXHRcdFx0fSk7XG5cdFx0XHRyZXR1cm4ge1xuXHRcdFx0XHRyZWY6IFwiQHt1cHN0cmVhbX1cIixcblx0XHRcdFx0aGVhZCxcblx0XHRcdFx0ZmV0Y2hBcmdzOiBbXG5cdFx0XHRcdFx0XCJmZXRjaFwiLFxuXHRcdFx0XHRcdFwiLS1wcnVuZVwiLFxuXHRcdFx0XHRcdFwiLS1uby10YWdzXCIsXG5cdFx0XHRcdFx0XCJvcmlnaW5cIixcblx0XHRcdFx0XHRgK3JlZnMvaGVhZHMvJHticmFuY2h9OnJlZnMvcmVtb3Rlcy9vcmlnaW4vJHticmFuY2h9YCxcblx0XHRcdFx0XSxcblx0XHRcdH07XG5cdFx0fSBjYXRjaCB7XG5cdFx0XHRhd2FpdCB0aGlzLnJ1bkNvbW1hbmQoXCJnaXRcIiwgW1wicmVtb3RlXCIsIFwic2V0LWhlYWRcIiwgXCJvcmlnaW5cIiwgXCItYVwiXSwgeyBjd2Q6IGluc3RhbGxlZFBhdGggfSkuY2F0Y2goKCkgPT4ge30pO1xuXHRcdFx0Y29uc3QgaGVhZCA9IGF3YWl0IHRoaXMucnVuQ29tbWFuZENhcHR1cmUoXCJnaXRcIiwgW1wicmV2LXBhcnNlXCIsIFwib3JpZ2luL0hFQURcIl0sIHtcblx0XHRcdFx0Y3dkOiBpbnN0YWxsZWRQYXRoLFxuXHRcdFx0XHR0aW1lb3V0TXM6IE5FVFdPUktfVElNRU9VVF9NUyxcblx0XHRcdH0pO1xuXHRcdFx0Y29uc3Qgb3JpZ2luSGVhZFJlZiA9IGF3YWl0IHRoaXMucnVuQ29tbWFuZENhcHR1cmUoXCJnaXRcIiwgW1wic3ltYm9saWMtcmVmXCIsIFwicmVmcy9yZW1vdGVzL29yaWdpbi9IRUFEXCJdLCB7XG5cdFx0XHRcdGN3ZDogaW5zdGFsbGVkUGF0aCxcblx0XHRcdFx0dGltZW91dE1zOiBORVRXT1JLX1RJTUVPVVRfTVMsXG5cdFx0XHR9KS5jYXRjaCgoKSA9PiBcIlwiKTtcblx0XHRcdGNvbnN0IGJyYW5jaCA9IG9yaWdpbkhlYWRSZWYudHJpbSgpLnJlcGxhY2UoL15yZWZzXFwvcmVtb3Rlc1xcL29yaWdpblxcLy8sIFwiXCIpO1xuXHRcdFx0aWYgKGJyYW5jaCkge1xuXHRcdFx0XHRyZXR1cm4ge1xuXHRcdFx0XHRcdHJlZjogXCJvcmlnaW4vSEVBRFwiLFxuXHRcdFx0XHRcdGhlYWQsXG5cdFx0XHRcdFx0ZmV0Y2hBcmdzOiBbXG5cdFx0XHRcdFx0XHRcImZldGNoXCIsXG5cdFx0XHRcdFx0XHRcIi0tcHJ1bmVcIixcblx0XHRcdFx0XHRcdFwiLS1uby10YWdzXCIsXG5cdFx0XHRcdFx0XHRcIm9yaWdpblwiLFxuXHRcdFx0XHRcdFx0YCtyZWZzL2hlYWRzLyR7YnJhbmNofTpyZWZzL3JlbW90ZXMvb3JpZ2luLyR7YnJhbmNofWAsXG5cdFx0XHRcdFx0XSxcblx0XHRcdFx0fTtcblx0XHRcdH1cblx0XHRcdHJldHVybiB7XG5cdFx0XHRcdHJlZjogXCJvcmlnaW4vSEVBRFwiLFxuXHRcdFx0XHRoZWFkLFxuXHRcdFx0XHRmZXRjaEFyZ3M6IFtcImZldGNoXCIsIFwiLS1wcnVuZVwiLCBcIi0tbm8tdGFnc1wiLCBcIm9yaWdpblwiLCBcIitIRUFEOnJlZnMvcmVtb3Rlcy9vcmlnaW4vSEVBRFwiXSxcblx0XHRcdH07XG5cdFx0fVxuXHR9XG5cblx0cHJpdmF0ZSBhc3luYyBnZXRHaXRVcHN0cmVhbVJlZihpbnN0YWxsZWRQYXRoOiBzdHJpbmcpOiBQcm9taXNlPHN0cmluZyB8IHVuZGVmaW5lZD4ge1xuXHRcdHRyeSB7XG5cdFx0XHRjb25zdCB1cHN0cmVhbSA9IGF3YWl0IHRoaXMucnVuQ29tbWFuZENhcHR1cmUoXCJnaXRcIiwgW1wicmV2LXBhcnNlXCIsIFwiLS1hYmJyZXYtcmVmXCIsIFwiQHt1cHN0cmVhbX1cIl0sIHtcblx0XHRcdFx0Y3dkOiBpbnN0YWxsZWRQYXRoLFxuXHRcdFx0XHR0aW1lb3V0TXM6IE5FVFdPUktfVElNRU9VVF9NUyxcblx0XHRcdH0pO1xuXHRcdFx0Y29uc3QgdHJpbW1lZCA9IHVwc3RyZWFtLnRyaW0oKTtcblx0XHRcdGlmICghdHJpbW1lZC5zdGFydHNXaXRoKFwib3JpZ2luL1wiKSkge1xuXHRcdFx0XHRyZXR1cm4gdW5kZWZpbmVkO1xuXHRcdFx0fVxuXHRcdFx0Y29uc3QgYnJhbmNoID0gdHJpbW1lZC5zbGljZShcIm9yaWdpbi9cIi5sZW5ndGgpO1xuXHRcdFx0cmV0dXJuIGJyYW5jaCA/IGByZWZzL2hlYWRzLyR7YnJhbmNofWAgOiB1bmRlZmluZWQ7XG5cdFx0fSBjYXRjaCB7XG5cdFx0XHRyZXR1cm4gdW5kZWZpbmVkO1xuXHRcdH1cblx0fVxuXG5cdHByaXZhdGUgcnVuR2l0UmVtb3RlQ29tbWFuZChpbnN0YWxsZWRQYXRoOiBzdHJpbmcsIGFyZ3M6IHN0cmluZ1tdKTogUHJvbWlzZTxzdHJpbmc+IHtcblx0XHRyZXR1cm4gdGhpcy5ydW5Db21tYW5kQ2FwdHVyZShcImdpdFwiLCBhcmdzLCB7XG5cdFx0XHRjd2Q6IGluc3RhbGxlZFBhdGgsXG5cdFx0XHR0aW1lb3V0TXM6IE5FVFdPUktfVElNRU9VVF9NUyxcblx0XHRcdGVudjoge1xuXHRcdFx0XHRHSVRfVEVSTUlOQUxfUFJPTVBUOiBcIjBcIixcblx0XHRcdH0sXG5cdFx0fSk7XG5cdH1cblxuXHRwcml2YXRlIGFzeW5jIHJ1bldpdGhDb25jdXJyZW5jeTxUPih0YXNrczogQXJyYXk8KCkgPT4gUHJvbWlzZTxUPj4sIGxpbWl0OiBudW1iZXIpOiBQcm9taXNlPFRbXT4ge1xuXHRcdGlmICh0YXNrcy5sZW5ndGggPT09IDApIHtcblx0XHRcdHJldHVybiBbXTtcblx0XHR9XG5cblx0XHRjb25zdCByZXN1bHRzOiBUW10gPSBuZXcgQXJyYXkodGFza3MubGVuZ3RoKTtcblx0XHRsZXQgbmV4dEluZGV4ID0gMDtcblx0XHRjb25zdCB3b3JrZXJDb3VudCA9IE1hdGgubWF4KDEsIE1hdGgubWluKGxpbWl0LCB0YXNrcy5sZW5ndGgpKTtcblxuXHRcdGNvbnN0IHdvcmtlciA9IGFzeW5jICgpID0+IHtcblx0XHRcdHdoaWxlICh0cnVlKSB7XG5cdFx0XHRcdGNvbnN0IGluZGV4ID0gbmV4dEluZGV4O1xuXHRcdFx0XHRuZXh0SW5kZXggKz0gMTtcblx0XHRcdFx0aWYgKGluZGV4ID49IHRhc2tzLmxlbmd0aCkge1xuXHRcdFx0XHRcdHJldHVybjtcblx0XHRcdFx0fVxuXHRcdFx0XHRyZXN1bHRzW2luZGV4XSA9IGF3YWl0IHRhc2tzW2luZGV4XSgpO1xuXHRcdFx0fVxuXHRcdH07XG5cblx0XHRhd2FpdCBQcm9taXNlLmFsbChBcnJheS5mcm9tKHsgbGVuZ3RoOiB3b3JrZXJDb3VudCB9LCAoKSA9PiB3b3JrZXIoKSkpO1xuXHRcdHJldHVybiByZXN1bHRzO1xuXHR9XG5cblx0LyoqXG5cdCAqIEdldCBhIHVuaXF1ZSBpZGVudGl0eSBmb3IgYSBwYWNrYWdlLCBpZ25vcmluZyB2ZXJzaW9uL3JlZi5cblx0ICogVXNlZCB0byBkZXRlY3Qgd2hlbiB0aGUgc2FtZSBwYWNrYWdlIGlzIGluIGJvdGggZ2xvYmFsIGFuZCBwcm9qZWN0IHNldHRpbmdzLlxuXHQgKiBGb3IgZ2l0IHBhY2thZ2VzLCB1c2VzIG5vcm1hbGl6ZWQgaG9zdC9wYXRoIHRvIGVuc3VyZSBTU0ggYW5kIEhUVFBTIFVSTHNcblx0ICogZm9yIHRoZSBzYW1lIHJlcG9zaXRvcnkgYXJlIHRyZWF0ZWQgYXMgaWRlbnRpY2FsLlxuXHQgKi9cblx0cHJpdmF0ZSBnZXRQYWNrYWdlSWRlbnRpdHkoc291cmNlOiBzdHJpbmcsIHNjb3BlPzogU291cmNlU2NvcGUpOiBzdHJpbmcge1xuXHRcdGNvbnN0IHBhcnNlZCA9IHRoaXMucGFyc2VTb3VyY2Uoc291cmNlKTtcblx0XHRpZiAocGFyc2VkLnR5cGUgPT09IFwibnBtXCIpIHtcblx0XHRcdHJldHVybiBgbnBtOiR7cGFyc2VkLm5hbWV9YDtcblx0XHR9XG5cdFx0aWYgKHBhcnNlZC50eXBlID09PSBcImdpdFwiKSB7XG5cdFx0XHQvLyBVc2UgaG9zdC9wYXRoIGZvciBpZGVudGl0eSB0byBub3JtYWxpemUgU1NIIGFuZCBIVFRQU1xuXHRcdFx0cmV0dXJuIGBnaXQ6JHtwYXJzZWQuaG9zdH0vJHtwYXJzZWQucGF0aH1gO1xuXHRcdH1cblx0XHRpZiAoc2NvcGUpIHtcblx0XHRcdGNvbnN0IGJhc2VEaXIgPSB0aGlzLmdldEJhc2VEaXJGb3JTY29wZShzY29wZSk7XG5cdFx0XHRyZXR1cm4gYGxvY2FsOiR7dGhpcy5yZXNvbHZlUGF0aEZyb21CYXNlKHBhcnNlZC5wYXRoLCBiYXNlRGlyKX1gO1xuXHRcdH1cblx0XHRyZXR1cm4gYGxvY2FsOiR7dGhpcy5yZXNvbHZlUGF0aChwYXJzZWQucGF0aCl9YDtcblx0fVxuXG5cdC8qKlxuXHQgKiBEZWR1cGUgcGFja2FnZXM6IGlmIHNhbWUgcGFja2FnZSBpZGVudGl0eSBhcHBlYXJzIGluIGJvdGggZ2xvYmFsIGFuZCBwcm9qZWN0LFxuXHQgKiBrZWVwIG9ubHkgdGhlIHByb2plY3Qgb25lIChwcm9qZWN0IHdpbnMpLlxuXHQgKi9cblx0cHJpdmF0ZSBkZWR1cGVQYWNrYWdlcyhcblx0XHRwYWNrYWdlczogQXJyYXk8eyBwa2c6IFBhY2thZ2VTb3VyY2U7IHNjb3BlOiBTb3VyY2VTY29wZSB9Pixcblx0KTogQXJyYXk8eyBwa2c6IFBhY2thZ2VTb3VyY2U7IHNjb3BlOiBTb3VyY2VTY29wZSB9PiB7XG5cdFx0Y29uc3Qgc2VlbiA9IG5ldyBNYXA8c3RyaW5nLCB7IHBrZzogUGFja2FnZVNvdXJjZTsgc2NvcGU6IFNvdXJjZVNjb3BlIH0+KCk7XG5cblx0XHRmb3IgKGNvbnN0IGVudHJ5IG9mIHBhY2thZ2VzKSB7XG5cdFx0XHRjb25zdCBzb3VyY2VTdHIgPSB0eXBlb2YgZW50cnkucGtnID09PSBcInN0cmluZ1wiID8gZW50cnkucGtnIDogZW50cnkucGtnLnNvdXJjZTtcblx0XHRcdGNvbnN0IGlkZW50aXR5ID0gdGhpcy5nZXRQYWNrYWdlSWRlbnRpdHkoc291cmNlU3RyLCBlbnRyeS5zY29wZSk7XG5cblx0XHRcdGNvbnN0IGV4aXN0aW5nID0gc2Vlbi5nZXQoaWRlbnRpdHkpO1xuXHRcdFx0aWYgKCFleGlzdGluZykge1xuXHRcdFx0XHRzZWVuLnNldChpZGVudGl0eSwgZW50cnkpO1xuXHRcdFx0fSBlbHNlIGlmIChlbnRyeS5zY29wZSA9PT0gXCJwcm9qZWN0XCIgJiYgZXhpc3Rpbmcuc2NvcGUgPT09IFwidXNlclwiKSB7XG5cdFx0XHRcdC8vIFByb2plY3Qgd2lucyBvdmVyIHVzZXJcblx0XHRcdFx0c2Vlbi5zZXQoaWRlbnRpdHksIGVudHJ5KTtcblx0XHRcdH1cblx0XHRcdC8vIElmIGV4aXN0aW5nIGlzIHByb2plY3QgYW5kIG5ldyBpcyBnbG9iYWwsIGtlZXAgZXhpc3RpbmcgKHByb2plY3QpXG5cdFx0XHQvLyBJZiBib3RoIGFyZSBzYW1lIHNjb3BlLCBrZWVwIGZpcnN0IG9uZVxuXHRcdH1cblxuXHRcdHJldHVybiBBcnJheS5mcm9tKHNlZW4udmFsdWVzKCkpO1xuXHR9XG5cblx0cHJpdmF0ZSBwYXJzZU5wbVNwZWMoc3BlYzogc3RyaW5nKTogeyBuYW1lOiBzdHJpbmc7IHZlcnNpb24/OiBzdHJpbmcgfSB7XG5cdFx0Y29uc3QgbWF0Y2ggPSBzcGVjLm1hdGNoKC9eKEA/W15AXSsoPzpcXC9bXkBdKyk/KSg/OkAoLispKT8kLyk7XG5cdFx0aWYgKCFtYXRjaCkge1xuXHRcdFx0cmV0dXJuIHsgbmFtZTogc3BlYyB9O1xuXHRcdH1cblx0XHRjb25zdCBuYW1lID0gbWF0Y2hbMV0gPz8gc3BlYztcblx0XHRjb25zdCB2ZXJzaW9uID0gbWF0Y2hbMl07XG5cdFx0cmV0dXJuIHsgbmFtZSwgdmVyc2lvbiB9O1xuXHR9XG5cblx0cHJpdmF0ZSBnZXROcG1Db21tYW5kKCk6IHsgY29tbWFuZDogc3RyaW5nOyBhcmdzOiBzdHJpbmdbXSB9IHtcblx0XHRjb25zdCBjb25maWd1cmVkQ29tbWFuZCA9IHRoaXMuc2V0dGluZ3NNYW5hZ2VyLmdldE5wbUNvbW1hbmQoKTtcblx0XHRpZiAoIWNvbmZpZ3VyZWRDb21tYW5kIHx8IGNvbmZpZ3VyZWRDb21tYW5kLmxlbmd0aCA9PT0gMCkge1xuXHRcdFx0cmV0dXJuIHsgY29tbWFuZDogXCJucG1cIiwgYXJnczogW10gfTtcblx0XHR9XG5cdFx0Y29uc3QgW2NvbW1hbmQsIC4uLmFyZ3NdID0gY29uZmlndXJlZENvbW1hbmQ7XG5cdFx0aWYgKCFjb21tYW5kKSB7XG5cdFx0XHR0aHJvdyBuZXcgRXJyb3IoXCJJbnZhbGlkIG5wbUNvbW1hbmQ6IGZpcnN0IGFycmF5IGVudHJ5IG11c3QgYmUgYSBub24tZW1wdHkgY29tbWFuZFwiKTtcblx0XHR9XG5cdFx0cmV0dXJuIHsgY29tbWFuZCwgYXJncyB9O1xuXHR9XG5cblx0cHJpdmF0ZSBhc3luYyBydW5OcG1Db21tYW5kKGFyZ3M6IHN0cmluZ1tdLCBvcHRpb25zPzogeyBjd2Q/OiBzdHJpbmcgfSk6IFByb21pc2U8dm9pZD4ge1xuXHRcdGNvbnN0IG5wbUNvbW1hbmQgPSB0aGlzLmdldE5wbUNvbW1hbmQoKTtcblx0XHRhd2FpdCB0aGlzLnJ1bkNvbW1hbmQobnBtQ29tbWFuZC5jb21tYW5kLCBbLi4ubnBtQ29tbWFuZC5hcmdzLCAuLi5hcmdzXSwgb3B0aW9ucyk7XG5cdH1cblxuXHRwcml2YXRlIGdldEdpdERlcGVuZGVuY3lJbnN0YWxsQXJncygpOiBzdHJpbmdbXSB7XG5cdFx0Y29uc3QgY29uZmlndXJlZENvbW1hbmQgPSB0aGlzLnNldHRpbmdzTWFuYWdlci5nZXROcG1Db21tYW5kKCk7XG5cdFx0aWYgKGNvbmZpZ3VyZWRDb21tYW5kICYmIGNvbmZpZ3VyZWRDb21tYW5kLmxlbmd0aCA+IDApIHtcblx0XHRcdHJldHVybiBbXCJpbnN0YWxsXCJdO1xuXHRcdH1cblx0XHRyZXR1cm4gW1wiaW5zdGFsbFwiLCBcIi0tb21pdD1kZXZcIl07XG5cdH1cblxuXHRwcml2YXRlIHJ1bk5wbUNvbW1hbmRTeW5jKGFyZ3M6IHN0cmluZ1tdKTogc3RyaW5nIHtcblx0XHRjb25zdCBucG1Db21tYW5kID0gdGhpcy5nZXROcG1Db21tYW5kKCk7XG5cdFx0cmV0dXJuIHRoaXMucnVuQ29tbWFuZFN5bmMobnBtQ29tbWFuZC5jb21tYW5kLCBbLi4ubnBtQ29tbWFuZC5hcmdzLCAuLi5hcmdzXSk7XG5cdH1cbiIsInRydW5jYXRlZCI6dHJ1ZSwidHJ1bmNhdGVkQnkiOiJieXRlcyIsInRvdGFsTGluZXMiOjI0NDUsInRvdGFsQnl0ZXMiOjc0MTY0LCJvdXRwdXRMaW5lcyI6MTY4Nywib3V0cHV0Qnl0ZXMiOjUxMTU4LCJsYXN0TGluZVBhcnRpYWwiOmZhbHNlLCJmaXJzdExpbmVFeGNlZWRzTGltaXQiOmZhbHNlLCJtYXhMaW5lcyI6MjAwMCwibWF4Qnl0ZXMiOjUxMjAwfX0sImlzRXJyb3IiOmZhbHNlLCJ0aW1lc3RhbXAiOjE3Nzc1NjQxNzYyNzN9fSx7InR5cGUiOiJtZXNzYWdlIiwiaWQiOiIyZjc4NTJkNSIsInBhcmVudElkIjoiZTYzY2Q1MTYiLCJ0aW1lc3RhbXAiOiIyMDI2LTA0LTMwVDE1OjQ5OjM2LjI3M1oiLCJtZXNzYWdlIjp7InJvbGUiOiJ0b29sUmVzdWx0IiwidG9vbENhbGxJZCI6InJlYWQ6MSIsInRvb2xOYW1lIjoicmVhZCIsImNvbnRlbnQiOlt7InR5cGUiOiJ0ZXh0IiwidGV4dCI6Ii8qKlxuICogVFVJIGNvbXBvbmVudCBmb3IgbWFuYWdpbmcgcGFja2FnZSByZXNvdXJjZXMgKGVuYWJsZS9kaXNhYmxlKVxuICovXG5cbmltcG9ydCB7IGJhc2VuYW1lLCBkaXJuYW1lLCBqb2luLCByZWxhdGl2ZSB9IGZyb20gXCJub2RlOnBhdGhcIjtcbmltcG9ydCB7XG5cdHR5cGUgQ29tcG9uZW50LFxuXHRDb250YWluZXIsXG5cdHR5cGUgRm9jdXNhYmxlLFxuXHRnZXRLZXliaW5kaW5ncyxcblx0SW5wdXQsXG5cdG1hdGNoZXNLZXksXG5cdFNwYWNlcixcblx0dHJ1bmNhdGVUb1dpZHRoLFxuXHR2aXNpYmxlV2lkdGgsXG59IGZyb20gXCJAbWFyaW96ZWNobmVyL3BpLXR1aVwiO1xuaW1wb3J0IHsgQ09ORklHX0RJUl9OQU1FIH0gZnJvbSBcIi4uLy4uLy4uL2NvbmZpZy5qc1wiO1xuaW1wb3J0IHR5cGUgeyBQYXRoTWV0YWRhdGEsIFJlc29sdmVkUGF0aHMsIFJlc29sdmVkUmVzb3VyY2UgfSBmcm9tIFwiLi4vLi4vLi4vY29yZS9wYWNrYWdlLW1hbmFnZXIuanNcIjtcbmltcG9ydCB0eXBlIHsgUGFja2FnZVNvdXJjZSwgU2V0dGluZ3NNYW5hZ2VyIH0gZnJvbSBcIi4uLy4uLy4uL2NvcmUvc2V0dGluZ3MtbWFuYWdlci5qc1wiO1xuaW1wb3J0IHsgdGhlbWUgfSBmcm9tIFwiLi4vdGhlbWUvdGhlbWUuanNcIjtcbmltcG9ydCB7IER5bmFtaWNCb3JkZXIgfSBmcm9tIFwiLi9keW5hbWljLWJvcmRlci5qc1wiO1xuaW1wb3J0IHsgcmF3S2V5SGludCB9IGZyb20gXCIuL2tleWJpbmRpbmctaGludHMuanNcIjtcblxudHlwZSBSZXNvdXJjZVR5cGUgPSBcImV4dGVuc2lvbnNcIiB8IFwic2tpbGxzXCIgfCBcInByb21wdHNcIiB8IFwidGhlbWVzXCI7XG5cbmNvbnN0IFJFU09VUkNFX1RZUEVfTEFCRUxTOiBSZWNvcmQ8UmVzb3VyY2VUeXBlLCBzdHJpbmc+ID0ge1xuXHRleHRlbnNpb25zOiBcIkV4dGVuc2lvbnNcIixcblx0c2tpbGxzOiBcIlNraWxsc1wiLFxuXHRwcm9tcHRzOiBcIlByb21wdHNcIixcblx0dGhlbWVzOiBcIlRoZW1lc1wiLFxufTtcblxuaW50ZXJmYWNlIFJlc291cmNlSXRlbSB7XG5cdHBhdGg6IHN0cmluZztcblx0ZW5hYmxlZDogYm9vbGVhbjtcblx0bWV0YWRhdGE6IFBhdGhNZXRhZGF0YTtcblx0cmVzb3VyY2VUeXBlOiBSZXNvdXJjZVR5cGU7XG5cdGRpc3BsYXlOYW1lOiBzdHJpbmc7XG5cdGdyb3VwS2V5OiBzdHJpbmc7XG5cdHN1Ymdyb3VwS2V5OiBzdHJpbmc7XG59XG5cbmludGVyZmFjZSBSZXNvdXJjZVN1Ymdyb3VwIHtcblx0dHlwZTogUmVzb3VyY2VUeXBlO1xuXHRsYWJlbDogc3RyaW5nO1xuXHRpdGVtczogUmVzb3VyY2VJdGVtW107XG59XG5cbmludGVyZmFjZSBSZXNvdXJjZUdyb3VwIHtcblx0a2V5OiBzdHJpbmc7XG5cdGxhYmVsOiBzdHJpbmc7XG5cdHNjb3BlOiBcInVzZXJcIiB8IFwicHJvamVjdFwiIHwgXCJ0ZW1wb3JhcnlcIjtcblx0b3JpZ2luOiBcInBhY2thZ2VcIiB8IFwidG9wLWxldmVsXCI7XG5cdHNvdXJjZTogc3RyaW5nO1xuXHRzdWJncm91cHM6IFJlc291cmNlU3ViZ3JvdXBbXTtcbn1cblxuZnVuY3Rpb24gZ2V0R3JvdXBMYWJlbChtZXRhZGF0YTogUGF0aE1ldGFkYXRhKTogc3RyaW5nIHtcblx0aWYgKG1ldGFkYXRhLm9yaWdpbiA9PT0gXCJwYWNrYWdlXCIpIHtcblx0XHRyZXR1cm4gYCR7bWV0YWRhdGEuc291cmNlfSAoJHttZXRhZGF0YS5zY29wZX0pYDtcblx0fVxuXHQvLyBUb3AtbGV2ZWwgcmVzb3VyY2VzXG5cdGlmIChtZXRhZGF0YS5zb3VyY2UgPT09IFwiYXV0b1wiKSB7XG5cdFx0cmV0dXJuIG1ldGFkYXRhLnNjb3BlID09PSBcInVzZXJcIiA/IFwiVXNlciAofi8ucGkvYWdlbnQvKVwiIDogXCJQcm9qZWN0ICgucGkvKVwiO1xuXHR9XG5cdHJldHVybiBtZXRhZGF0YS5zY29wZSA9PT0gXCJ1c2VyXCIgPyBcIlVzZXIgc2V0dGluZ3NcIiA6IFwiUHJvamVjdCBzZXR0aW5nc1wiO1xufVxuXG5mdW5jdGlvbiBidWlsZEdyb3VwcyhyZXNvbHZlZDogUmVzb2x2ZWRQYXRocyk6IFJlc291cmNlR3JvdXBbXSB7XG5cdGNvbnN0IGdyb3VwTWFwID0gbmV3IE1hcDxzdHJpbmcsIFJlc291cmNlR3JvdXA+KCk7XG5cblx0Y29uc3QgYWRkVG9Hcm91cCA9IChyZXNvdXJjZXM6IFJlc29sdmVkUmVzb3VyY2VbXSwgcmVzb3VyY2VUeXBlOiBSZXNvdXJjZVR5cGUpID0+IHtcblx0XHRmb3IgKGNvbnN0IHJlcyBvZiByZXNvdXJjZXMpIHtcblx0XHRcdGNvbnN0IHsgcGF0aCwgZW5hYmxlZCwgbWV0YWRhdGEgfSA9IHJlcztcblx0XHRcdGNvbnN0IGdyb3VwS2V5ID0gYCR7bWV0YWRhdGEub3JpZ2lufToke21ldGFkYXRhLnNjb3BlfToke21ldGFkYXRhLnNvdXJjZX1gO1xuXG5cdFx0XHRpZiAoIWdyb3VwTWFwLmhhcyhncm91cEtleSkpIHtcblx0XHRcdFx0Z3JvdXBNYXAuc2V0KGdyb3VwS2V5LCB7XG5cdFx0XHRcdFx0a2V5OiBncm91cEtleSxcblx0XHRcdFx0XHRsYWJlbDogZ2V0R3JvdXBMYWJlbChtZXRhZGF0YSksXG5cdFx0XHRcdFx0c2NvcGU6IG1ldGFkYXRhLnNjb3BlLFxuXHRcdFx0XHRcdG9yaWdpbjogbWV0YWRhdGEub3JpZ2luLFxuXHRcdFx0XHRcdHNvdXJjZTogbWV0YWRhdGEuc291cmNlLFxuXHRcdFx0XHRcdHN1Ymdyb3VwczogW10sXG5cdFx0XHRcdH0pO1xuXHRcdFx0fVxuXG5cdFx0XHRjb25zdCBncm91cCA9IGdyb3VwTWFwLmdldChncm91cEtleSkhO1xuXHRcdFx0Y29uc3Qgc3ViZ3JvdXBLZXkgPSBgJHtncm91cEtleX06JHtyZXNvdXJjZVR5cGV9YDtcblxuXHRcdFx0bGV0IHN1Ymdyb3VwID0gZ3JvdXAuc3ViZ3JvdXBzLmZpbmQoKHNnKSA9PiBzZy50eXBlID09PSByZXNvdXJjZVR5cGUpO1xuXHRcdFx0aWYgKCFzdWJncm91cCkge1xuXHRcdFx0XHRzdWJncm91cCA9IHtcblx0XHRcdFx0XHR0eXBlOiByZXNvdXJjZVR5cGUsXG5cdFx0XHRcdFx0bGFiZWw6IFJFU09VUkNFX1RZUEVfTEFCRUxTW3Jlc291cmNlVHlwZV0sXG5cdFx0XHRcdFx0aXRlbXM6IFtdLFxuXHRcdFx0XHR9O1xuXHRcdFx0XHRncm91cC5zdWJncm91cHMucHVzaChzdWJncm91cCk7XG5cdFx0XHR9XG5cblx0XHRcdGNvbnN0IGZpbGVOYW1lID0gYmFzZW5hbWUocGF0aCk7XG5cdFx0XHRjb25zdCBwYXJlbnRGb2xkZXIgPSBiYXNlbmFtZShkaXJuYW1lKHBhdGgpKTtcblx0XHRcdGxldCBkaXNwbGF5TmFtZTogc3RyaW5nO1xuXHRcdFx0aWYgKHJlc291cmNlVHlwZSA9PT0gXCJleHRlbnNpb25zXCIgJiYgcGFyZW50Rm9sZGVyICE9PSBcImV4dGVuc2lvbnNcIikge1xuXHRcdFx0XHRkaXNwbGF5TmFtZSA9IGAke3BhcmVudEZvbGRlcn0vJHtmaWxlTmFtZX1gO1xuXHRcdFx0fSBlbHNlIGlmIChyZXNvdXJjZVR5cGUgPT09IFwic2tpbGxzXCIgJiYgZmlsZU5hbWUgPT09IFwiU0tJTEwubWRcIikge1xuXHRcdFx0XHRkaXNwbGF5TmFtZSA9IHBhcmVudEZvbGRlcjtcblx0XHRcdH0gZWxzZSB7XG5cdFx0XHRcdGRpc3BsYXlOYW1lID0gZmlsZU5hbWU7XG5cdFx0XHR9XG5cdFx0XHRzdWJncm91cC5pdGVtcy5wdXNoKHtcblx0XHRcdFx0cGF0aCxcblx0XHRcdFx0ZW5hYmxlZCxcblx0XHRcdFx0bWV0YWRhdGEsXG5cdFx0XHRcdHJlc291cmNlVHlwZSxcblx0XHRcdFx0ZGlzcGxheU5hbWUsXG5cdFx0XHRcdGdyb3VwS2V5LFxuXHRcdFx0XHRzdWJncm91cEtleSxcblx0XHRcdH0pO1xuXHRcdH1cblx0fTtcblxuXHRhZGRUb0dyb3VwKHJlc29sdmVkLmV4dGVuc2lvbnMsIFwiZXh0ZW5zaW9uc1wiKTtcblx0YWRkVG9Hcm91cChyZXNvbHZlZC5za2lsbHMsIFwic2tpbGxzXCIpO1xuXHRhZGRUb0dyb3VwKHJlc29sdmVkLnByb21wdHMsIFwicHJvbXB0c1wiKTtcblx0YWRkVG9Hcm91cChyZXNvbHZlZC50aGVtZXMsIFwidGhlbWVzXCIpO1xuXG5cdC8vIFNvcnQgZ3JvdXBzOiBwYWNrYWdlcyBmaXJzdCwgdGhlbiB0b3AtbGV2ZWw7IHVzZXIgYmVmb3JlIHByb2plY3Rcblx0Y29uc3QgZ3JvdXBzID0gQXJyYXkuZnJvbShncm91cE1hcC52YWx1ZXMoKSk7XG5cdGdyb3Vwcy5zb3J0KChhLCBiKSA9PiB7XG5cdFx0aWYgKGEub3JpZ2luICE9PSBiLm9yaWdpbikge1xuXHRcdFx0cmV0dXJuIGEub3JpZ2luID09PSBcInBhY2thZ2VcIiA/IC0xIDogMTtcblx0XHR9XG5cdFx0aWYgKGEuc2NvcGUgIT09IGIuc2NvcGUpIHtcblx0XHRcdHJldHVybiBhLnNjb3BlID09PSBcInVzZXJcIiA/IC0xIDogMTtcblx0XHR9XG5cdFx0cmV0dXJuIGEuc291cmNlLmxvY2FsZUNvbXBhcmUoYi5zb3VyY2UpO1xuXHR9KTtcblxuXHQvLyBTb3J0IHN1Ymdyb3VwcyB3aXRoaW4gZWFjaCBncm91cCBieSB0eXBlIG9yZGVyLCBhbmQgaXRlbXMgYnkgbmFtZVxuXHRjb25zdCB0eXBlT3JkZXI6IFJlY29yZDxSZXNvdXJjZVR5cGUsIG51bWJlcj4gPSB7IGV4dGVuc2lvbnM6IDAsIHNraWxsczogMSwgcHJvbXB0czogMiwgdGhlbWVzOiAzIH07XG5cdGZvciAoY29uc3QgZ3JvdXAgb2YgZ3JvdXBzKSB7XG5cdFx0Z3JvdXAuc3ViZ3JvdXBzLnNvcnQoKGEsIGIpID0+IHR5cGVPcmRlclthLnR5cGVdIC0gdHlwZU9yZGVyW2IudHlwZV0pO1xuXHRcdGZvciAoY29uc3Qgc3ViZ3JvdXAgb2YgZ3JvdXAuc3ViZ3JvdXBzKSB7XG5cdFx0XHRzdWJncm91cC5pdGVtcy5zb3J0KChhLCBiKSA9PiBhLmRpc3BsYXlOYW1lLmxvY2FsZUNvbXBhcmUoYi5kaXNwbGF5TmFtZSkpO1xuXHRcdH1cblx0fVxuXG5cdHJldHVybiBncm91cHM7XG59XG5cbnR5cGUgRmxhdEVudHJ5ID1cblx0fCB7IHR5cGU6IFwiZ3JvdXBcIjsgZ3JvdXA6IFJlc291cmNlR3JvdXAgfVxuXHR8IHsgdHlwZTogXCJzdWJncm91cFwiOyBzdWJncm91cDogUmVzb3VyY2VTdWJncm91cDsgZ3JvdXA6IFJlc291cmNlR3JvdXAgfVxuXHR8IHsgdHlwZTogXCJpdGVtXCI7IGl0ZW06IFJlc291cmNlSXRlbSB9O1xuXG5jbGFzcyBDb25maWdTZWxlY3RvckhlYWRlciBpbXBsZW1lbnRzIENvbXBvbmVudCB7XG5cdGludmFsaWRhdGUoKTogdm9pZCB7fVxuXG5cdHJlbmRlcih3aWR0aDogbnVtYmVyKTogc3RyaW5nW10ge1xuXHRcdGNvbnN0IHRpdGxlID0gdGhlbWUuYm9sZChcIlJlc291cmNlIENvbmZpZ3VyYXRpb25cIik7XG5cdFx0Y29uc3Qgc2VwID0gdGhlbWUuZmcoXCJtdXRlZFwiLCBcIiDCtyBcIik7XG5cdFx0Y29uc3QgaGludCA9IHJhd0tleUhpbnQoXCJzcGFjZVwiLCBcInRvZ2dsZVwiKSArIHNlcCArIHJhd0tleUhpbnQoXCJlc2NcIiwgXCJjbG9zZVwiKTtcblx0XHRjb25zdCBoaW50V2lkdGggPSB2aXNpYmxlV2lkdGgoaGludCk7XG5cdFx0Y29uc3QgdGl0bGVXaWR0aCA9IHZpc2libGVXaWR0aCh0aXRsZSk7XG5cdFx0Y29uc3Qgc3BhY2luZyA9IE1hdGgubWF4KDEsIHdpZHRoIC0gdGl0bGVXaWR0aCAtIGhpbnRXaWR0aCk7XG5cblx0XHRyZXR1cm4gW1xuXHRcdFx0dHJ1bmNhdGVUb1dpZHRoKGAke3RpdGxlfSR7XCIgXCIucmVwZWF0KHNwYWNpbmcpfSR7aGludH1gLCB3aWR0aCwgXCJcIiksXG5cdFx0XHR0aGVtZS5mZyhcIm11dGVkXCIsIFwiVHlwZSB0byBmaWx0ZXIgcmVzb3VyY2VzXCIpLFxuXHRcdF07XG5cdH1cbn1cblxuY2xhc3MgUmVzb3VyY2VMaXN0IGltcGxlbWVudHMgQ29tcG9uZW50LCBGb2N1c2FibGUge1xuXHRwcml2YXRlIGdyb3VwczogUmVzb3VyY2VHcm91cFtdO1xuXHRwcml2YXRlIGZsYXRJdGVtczogRmxhdEVudHJ5W10gPSBbXTtcblx0cHJpdmF0ZSBmaWx0ZXJlZEl0ZW1zOiBGbGF0RW50cnlbXSA9IFtdO1xuXHRwcml2YXRlIHNlbGVjdGVkSW5kZXggPSAwO1xuXHRwcml2YXRlIHNlYXJjaElucHV0OiBJbnB1dDtcblx0cHJpdmF0ZSBtYXhWaXNpYmxlID0gMTU7XG5cdHByaXZhdGUgc2V0dGluZ3NNYW5hZ2VyOiBTZXR0aW5nc01hbmFnZXI7XG5cdHByaXZhdGUgY3dkOiBzdHJpbmc7XG5cdHByaXZhdGUgYWdlbnREaXI6IHN0cmluZztcblxuXHRwdWJsaWMgb25DYW5jZWw/OiAoKSA9PiB2b2lkO1xuXHRwdWJsaWMgb25FeGl0PzogKCkgPT4gdm9pZDtcblx0cHVibGljIG9uVG9nZ2xlPzogKGl0ZW06IFJlc291cmNlSXRlbSwgbmV3RW5hYmxlZDogYm9vbGVhbikgPT4gdm9pZDtcblxuXHRwcml2YXRlIF9mb2N1c2VkID0gZmFsc2U7XG5cdGdldCBmb2N1c2VkKCk6IGJvb2xlYW4ge1xuXHRcdHJldHVybiB0aGlzLl9mb2N1c2VkO1xuXHR9XG5cdHNldCBmb2N1c2VkKHZhbHVlOiBib29sZWFuKSB7XG5cdFx0dGhpcy5fZm9jdXNlZCA9IHZhbHVlO1xuXHRcdHRoaXMuc2VhcmNoSW5wdXQuZm9jdXNlZCA9IHZhbHVlO1xuXHR9XG5cblx0Y29uc3RydWN0b3IoZ3JvdXBzOiBSZXNvdXJjZUdyb3VwW10sIHNldHRpbmdzTWFuYWdlcjogU2V0dGluZ3NNYW5hZ2VyLCBjd2Q6IHN0cmluZywgYWdlbnREaXI6IHN0cmluZykge1xuXHRcdHRoaXMuZ3JvdXBzID0gZ3JvdXBzO1xuXHRcdHRoaXMuc2V0dGluZ3NNYW5hZ2VyID0gc2V0dGluZ3NNYW5hZ2VyO1xuXHRcdHRoaXMuY3dkID0gY3dkO1xuXHRcdHRoaXMuYWdlbnREaXIgPSBhZ2VudERpcjtcblx0XHR0aGlzLnNlYXJjaElucHV0ID0gbmV3IElucHV0KCk7XG5cdFx0dGhpcy5idWlsZEZsYXRMaXN0KCk7XG5cdFx0dGhpcy5maWx0ZXJlZEl0ZW1zID0gWy4uLnRoaXMuZmxhdEl0ZW1zXTtcblx0fVxuXG5cdHByaXZhdGUgYnVpbGRGbGF0TGlzdCgpOiB2b2lkIHtcblx0XHR0aGlzLmZsYXRJdGVtcyA9IFtdO1xuXHRcdGZvciAoY29uc3QgZ3JvdXAgb2YgdGhpcy5ncm91cHMpIHtcblx0XHRcdHRoaXMuZmxhdEl0ZW1zLnB1c2goeyB0eXBlOiBcImdyb3VwXCIsIGdyb3VwIH0pO1xuXHRcdFx0Zm9yIChjb25zdCBzdWJncm91cCBvZiBncm91cC5zdWJncm91cHMpIHtcblx0XHRcdFx0dGhpcy5mbGF0SXRlbXMucHVzaCh7IHR5cGU6IFwic3ViZ3JvdXBcIiwgc3ViZ3JvdXAsIGdyb3VwIH0pO1xuXHRcdFx0XHRmb3IgKGNvbnN0IGl0ZW0gb2Ygc3ViZ3JvdXAuaXRlbXMpIHtcblx0XHRcdFx0XHR0aGlzLmZsYXRJdGVtcy5wdXNoKHsgdHlwZTogXCJpdGVtXCIsIGl0ZW0gfSk7XG5cdFx0XHRcdH1cblx0XHRcdH1cblx0XHR9XG5cdFx0Ly8gU3RhcnQgc2VsZWN0aW9uIG9uIGZpcnN0IGl0ZW0gKG5vdCBoZWFkZXIpXG5cdFx0dGhpcy5zZWxlY3RlZEluZGV4ID0gdGhpcy5mbGF0SXRlbXMuZmluZEluZGV4KChlKSA9PiBlLnR5cGUgPT09IFwiaXRlbVwiKTtcblx0XHRpZiAodGhpcy5zZWxlY3RlZEluZGV4IDwgMCkgdGhpcy5zZWxlY3RlZEluZGV4ID0gMDtcblx0fVxuXG5cdHByaXZhdGUgZmluZE5leHRJdGVtKGZyb21JbmRleDogbnVtYmVyLCBkaXJlY3Rpb246IDEgfCAtMSk6IG51bWJlciB7XG5cdFx0bGV0IGlkeCA9IGZyb21JbmRleCArIGRpcmVjdGlvbjtcblx0XHR3aGlsZSAoaWR4ID49IDAgJiYgaWR4IDwgdGhpcy5maWx0ZXJlZEl0ZW1zLmxlbmd0aCkge1xuXHRcdFx0aWYgKHRoaXMuZmlsdGVyZWRJdGVtc1tpZHhdLnR5cGUgPT09IFwiaXRlbVwiKSB7XG5cdFx0XHRcdHJldHVybiBpZHg7XG5cdFx0XHR9XG5cdFx0XHRpZHggKz0gZGlyZWN0aW9uO1xuXHRcdH1cblx0XHRyZXR1cm4gZnJvbUluZGV4OyAvLyBTdGF5IGF0IGN1cnJlbnQgaWYgbm8gaXRlbSBmb3VuZFxuXHR9XG5cblx0cHJpdmF0ZSBmaWx0ZXJJdGVtcyhxdWVyeTogc3RyaW5nKTogdm9pZCB7XG5cdFx0aWYgKCFxdWVyeS50cmltKCkpIHtcblx0XHRcdHRoaXMuZmlsdGVyZWRJdGVtcyA9IFsuLi50aGlzLmZsYXRJdGVtc107XG5cdFx0XHR0aGlzLnNlbGVjdEZpcnN0SXRlbSgpO1xuXHRcdFx0cmV0dXJuO1xuXHRcdH1cblxuXHRcdGNvbnN0IGxvd2VyUXVlcnkgPSBxdWVyeS50b0xvd2VyQ2FzZSgpO1xuXHRcdGNvbnN0IG1hdGNoaW5nSXRlbXMgPSBuZXcgU2V0PFJlc291cmNlSXRlbT4oKTtcblx0XHRjb25zdCBtYXRjaGluZ1N1Ymdyb3VwcyA9IG5ldyBTZXQ8UmVzb3VyY2VTdWJncm91cD4oKTtcblx0XHRjb25zdCBtYXRjaGluZ0dyb3VwcyA9IG5ldyBTZXQ8UmVzb3VyY2VHcm91cD4oKTtcblxuXHRcdGZvciAoY29uc3QgZW50cnkgb2YgdGhpcy5mbGF0SXRlbXMpIHtcblx0XHRcdGlmIChlbnRyeS50eXBlID09PSBcIml0ZW1cIikge1xuXHRcdFx0XHRjb25zdCBpdGVtID0gZW50cnkuaXRlbTtcblx0XHRcdFx0aWYgKFxuXHRcdFx0XHRcdGl0ZW0uZGlzcGxheU5hbWUudG9Mb3dlckNhc2UoKS5pbmNsdWRlcyhsb3dlclF1ZXJ5KSB8fFxuXHRcdFx0XHRcdGl0ZW0ucmVzb3VyY2VUeXBlLnRvTG93ZXJDYXNlKCkuaW5jbHVkZXMobG93ZXJRdWVyeSkgfHxcblx0XHRcdFx0XHRpdGVtLnBhdGgudG9Mb3dlckNhc2UoKS5pbmNsdWRlcyhsb3dlclF1ZXJ5KVxuXHRcdFx0XHQpIHtcblx0XHRcdFx0XHRtYXRjaGluZ0l0ZW1zLmFkZChpdGVtKTtcblx0XHRcdFx0fVxuXHRcdFx0fVxuXHRcdH1cblxuXHRcdC8vIEZpbmQgd2hpY2ggc3ViZ3JvdXBzIGFuZCBncm91cHMgY29udGFpbiBtYXRjaGluZyBpdGVtc1xuXHRcdGZvciAoY29uc3QgZ3JvdXAgb2YgdGhpcy5ncm91cHMpIHtcblx0XHRcdGZvciAoY29uc3Qgc3ViZ3JvdXAgb2YgZ3JvdXAuc3ViZ3JvdXBzKSB7XG5cdFx0XHRcdGZvciAoY29uc3QgaXRlbSBvZiBzdWJncm91cC5pdGVtcykge1xuXHRcdFx0XHRcdGlmIChtYXRjaGluZ0l0ZW1zLmhhcyhpdGVtKSkge1xuXHRcdFx0XHRcdFx0bWF0Y2hpbmdTdWJncm91cHMuYWRkKHN1Ymdyb3VwKTtcblx0XHRcdFx0XHRcdG1hdGNoaW5nR3JvdXBzLmFkZChncm91cCk7XG5cdFx0XHRcdFx0fVxuXHRcdFx0XHR9XG5cdFx0XHR9XG5cdFx0fVxuXG5cdFx0dGhpcy5maWx0ZXJlZEl0ZW1zID0gW107XG5cdFx0Zm9yIChjb25zdCBlbnRyeSBvZiB0aGlzLmZsYXRJdGVtcykge1xuXHRcdFx0aWYgKGVudHJ5LnR5cGUgPT09IFwiZ3JvdXBcIiAmJiBtYXRjaGluZ0dyb3Vwcy5oYXMoZW50cnkuZ3JvdXApKSB7XG5cdFx0XHRcdHRoaXMuZmlsdGVyZWRJdGVtcy5wdXNoKGVudHJ5KTtcblx0XHRcdH0gZWxzZSBpZiAoZW50cnkudHlwZSA9PT0gXCJzdWJncm91cFwiICYmIG1hdGNoaW5nU3ViZ3JvdXBzLmhhcyhlbnRyeS5zdWJncm91cCkpIHtcblx0XHRcdFx0dGhpcy5maWx0ZXJlZEl0ZW1zLnB1c2goZW50cnkpO1xuXHRcdFx0fSBlbHNlIGlmIChlbnRyeS50eXBlID09PSBcIml0ZW1cIiAmJiBtYXRjaGluZ0l0ZW1zLmhhcyhlbnRyeS5pdGVtKSkge1xuXHRcdFx0XHR0aGlzLmZpbHRlcmVkSXRlbXMucHVzaChlbnRyeSk7XG5cdFx0XHR9XG5cdFx0fVxuXG5cdFx0dGhpcy5zZWxlY3RGaXJzdEl0ZW0oKTtcblx0fVxuXG5cdHByaXZhdGUgc2VsZWN0Rmlyc3RJdGVtKCk6IHZvaWQge1xuXHRcdGNvbnN0IGZpcnN0SXRlbUluZGV4ID0gdGhpcy5maWx0ZXJlZEl0ZW1zLmZpbmRJbmRleCgoZSkgPT4gZS50eXBlID09PSBcIml0ZW1cIik7XG5cdFx0dGhpcy5zZWxlY3RlZEluZGV4ID0gZmlyc3RJdGVtSW5kZXggPj0gMCA/IGZpcnN0SXRlbUluZGV4IDogMDtcblx0fVxuXG5cdHVwZGF0ZUl0ZW0oaXRlbTogUmVzb3VyY2VJdGVtLCBlbmFibGVkOiBib29sZWFuKTogdm9pZCB7XG5cdFx0aXRlbS5lbmFibGVkID0gZW5hYmxlZDtcblx0XHQvLyBVcGRhdGUgaW4gZ3JvdXBzIHRvb1xuXHRcdGZvciAoY29uc3QgZ3JvdXAgb2YgdGhpcy5ncm91cHMpIHtcblx0XHRcdGZvciAoY29uc3Qgc3ViZ3JvdXAgb2YgZ3JvdXAuc3ViZ3JvdXBzKSB7XG5cdFx0XHRcdGNvbnN0IGZvdW5kID0gc3ViZ3JvdXAuaXRlbXMuZmluZCgoaSkgPT4gaS5wYXRoID09PSBpdGVtLnBhdGggJiYgaS5yZXNvdXJjZVR5cGUgPT09IGl0ZW0ucmVzb3VyY2VUeXBlKTtcblx0XHRcdFx0aWYgKGZvdW5kKSB7XG5cdFx0XHRcdFx0Zm91bmQuZW5hYmxlZCA9IGVuYWJsZWQ7XG5cdFx0XHRcdFx0cmV0dXJuO1xuXHRcdFx0XHR9XG5cdFx0XHR9XG5cdFx0fVxuXHR9XG5cblx0aW52YWxpZGF0ZSgpOiB2b2lkIHt9XG5cblx0cmVuZGVyKHdpZHRoOiBudW1iZXIpOiBzdHJpbmdbXSB7XG5cdFx0Y29uc3QgbGluZXM6IHN0cmluZ1tdID0gW107XG5cblx0XHQvLyBTZWFyY2ggaW5wdXRcblx0XHRsaW5lcy5wdXNoKC4uLnRoaXMuc2VhcmNoSW5wdXQucmVuZGVyKHdpZHRoKSk7XG5cdFx0bGluZXMucHVzaChcIlwiKTtcblxuXHRcdGlmICh0aGlzLmZpbHRlcmVkSXRlbXMubGVuZ3RoID09PSAwKSB7XG5cdFx0XHRsaW5lcy5wdXNoKHRoZW1lLmZnKFwibXV0ZWRcIiwgXCIgIE5vIHJlc291cmNlcyBmb3VuZFwiKSk7XG5cdFx0XHRyZXR1cm4gbGluZXM7XG5cdFx0fVxuXG5cdFx0Ly8gQ2FsY3VsYXRlIHZpc2libGUgcmFuZ2Vcblx0XHRjb25zdCBzdGFydEluZGV4ID0gTWF0aC5tYXgoXG5cdFx0XHQwLFxuXHRcdFx0TWF0aC5taW4odGhpcy5zZWxlY3RlZEluZGV4IC0gTWF0aC5mbG9vcih0aGlzLm1heFZpc2libGUgLyAyKSwgdGhpcy5maWx0ZXJlZEl0ZW1zLmxlbmd0aCAtIHRoaXMubWF4VmlzaWJsZSksXG5cdFx0KTtcblx0XHRjb25zdCBlbmRJbmRleCA9IE1hdGgubWluKHN0YXJ0SW5kZXggKyB0aGlzLm1heFZpc2libGUsIHRoaXMuZmlsdGVyZWRJdGVtcy5sZW5ndGgpO1xuXG5cdFx0Zm9yIChsZXQgaSA9IHN0YXJ0SW5kZXg7IGkgPCBlbmRJbmRleDsgaSsrKSB7XG5cdFx0XHRjb25zdCBlbnRyeSA9IHRoaXMuZmlsdGVyZWRJdGVtc1tpXTtcblx0XHRcdGNvbnN0IGlzU2VsZWN0ZWQgPSBpID09PSB0aGlzLnNlbGVjdGVkSW5kZXg7XG5cblx0XHRcdGlmIChlbnRyeS50eXBlID09PSBcImdyb3VwXCIpIHtcblx0XHRcdFx0Ly8gTWFpbiBncm91cCBoZWFkZXIgKG5vIGN1cnNvcilcblx0XHRcdFx0Y29uc3QgZ3JvdXBMaW5lID0gdGhlbWUuZmcoXCJhY2NlbnRcIiwgdGhlbWUuYm9sZChlbnRyeS5ncm91cC5sYWJlbCkpO1xuXHRcdFx0XHRsaW5lcy5wdXNoKHRydW5jYXRlVG9XaWR0aChgICAke2dyb3VwTGluZX1gLCB3aWR0aCwgXCJcIikpO1xuXHRcdFx0fSBlbHNlIGlmIChlbnRyeS50eXBlID09PSBcInN1Ymdyb3VwXCIpIHtcblx0XHRcdFx0Ly8gU3ViZ3JvdXAgaGVhZGVyIChpbmRlbnRlZCwgbm8gY3Vyc29yKVxuXHRcdFx0XHRjb25zdCBzdWJncm91cExpbmUgPSB0aGVtZS5mZyhcIm11dGVkXCIsIGVudHJ5LnN1Ymdyb3VwLmxhYmVsKTtcblx0XHRcdFx0bGluZXMucHVzaCh0cnVuY2F0ZVRvV2lkdGgoYCAgICAke3N1Ymdyb3VwTGluZX1gLCB3aWR0aCwgXCJcIikpO1xuXHRcdFx0fSBlbHNlIHtcblx0XHRcdFx0Ly8gUmVzb3VyY2UgaXRlbSAoY3Vyc29yIG9ubHkgb24gaXRlbXMpXG5cdFx0XHRcdGNvbnN0IGl0ZW0gPSBlbnRyeS5pdGVtO1xuXHRcdFx0XHRjb25zdCBjdXJzb3IgPSBpc1NlbGVjdGVkID8gXCI+IFwiIDogXCIgIFwiO1xuXHRcdFx0XHRjb25zdCBjaGVja2JveCA9IGl0ZW0uZW5hYmxlZCA/IHRoZW1lLmZnKFwic3VjY2Vzc1wiLCBcIlt4XVwiKSA6IHRoZW1lLmZnKFwiZGltXCIsIFwiWyBdXCIpO1xuXHRcdFx0XHRjb25zdCBuYW1lID0gaXNTZWxlY3RlZCA/IHRoZW1lLmJvbGQoaXRlbS5kaXNwbGF5TmFtZSkgOiBpdGVtLmRpc3BsYXlOYW1lO1xuXHRcdFx0XHRsaW5lcy5wdXNoKHRydW5jYXRlVG9XaWR0aChgJHtjdXJzb3J9ICAgICR7Y2hlY2tib3h9ICR7bmFtZX1gLCB3aWR0aCwgXCIuLi5cIikpO1xuXHRcdFx0fVxuXHRcdH1cblxuXHRcdC8vIFNjcm9sbCBpbmRpY2F0b3Jcblx0XHRpZiAoc3RhcnRJbmRleCA+IDAgfHwgZW5kSW5kZXggPCB0aGlzLmZpbHRlcmVkSXRlbXMubGVuZ3RoKSB7XG5cdFx0XHRjb25zdCBpdGVtQ291bnQgPSB0aGlzLmZpbHRlcmVkSXRlbXMuZmlsdGVyKChlKSA9PiBlLnR5cGUgPT09IFwiaXRlbVwiKS5sZW5ndGg7XG5cdFx0XHRjb25zdCBjdXJyZW50SXRlbUluZGV4ID1cblx0XHRcdFx0dGhpcy5maWx0ZXJlZEl0ZW1zLnNsaWNlKDAsIHRoaXMuc2VsZWN0ZWRJbmRleCkuZmlsdGVyKChlKSA9PiBlLnR5cGUgPT09IFwiaXRlbVwiKS5sZW5ndGggKyAxO1xuXHRcdFx0bGluZXMucHVzaCh0aGVtZS5mZyhcImRpbVwiLCBgICAoJHtjdXJyZW50SXRlbUluZGV4fS8ke2l0ZW1Db3VudH0pYCkpO1xuXHRcdH1cblxuXHRcdHJldHVybiBsaW5lcztcblx0fVxuXG5cdGhhbmRsZUlucHV0KGRhdGE6IHN0cmluZyk6IHZvaWQge1xuXHRcdGNvbnN0IGtiID0gZ2V0S2V5YmluZGluZ3MoKTtcblxuXHRcdGlmIChrYi5tYXRjaGVzKGRhdGEsIFwidHVpLnNlbGVjdC51cFwiKSkge1xuXHRcdFx0dGhpcy5zZWxlY3RlZEluZGV4ID0gdGhpcy5maW5kTmV4dEl0ZW0odGhpcy5zZWxlY3RlZEluZGV4LCAtMSk7XG5cdFx0XHRyZXR1cm47XG5cdFx0fVxuXHRcdGlmIChrYi5tYXRjaGVzKGRhdGEsIFwidHVpLnNlbGVjdC5kb3duXCIpKSB7XG5cdFx0XHR0aGlzLnNlbGVjdGVkSW5kZXggPSB0aGlzLmZpbmROZXh0SXRlbSh0aGlzLnNlbGVjdGVkSW5kZXgsIDEpO1xuXHRcdFx0cmV0dXJuO1xuXHRcdH1cblx0XHRpZiAoa2IubWF0Y2hlcyhkYXRhLCBcInR1aS5zZWxlY3QucGFnZVVwXCIpKSB7XG5cdFx0XHQvLyBKdW1wIHVwIGJ5IG1heFZpc2libGUsIHRoZW4gZmluZCBuZWFyZXN0IGl0ZW1cblx0XHRcdGxldCB0YXJnZXQgPSBNYXRoLm1heCgwLCB0aGlzLnNlbGVjdGVkSW5kZXggLSB0aGlzLm1heFZpc2libGUpO1xuXHRcdFx0d2hpbGUgKHRhcmdldCA8IHRoaXMuZmlsdGVyZWRJdGVtcy5sZW5ndGggJiYgdGhpcy5maWx0ZXJlZEl0ZW1zW3RhcmdldF0udHlwZSAhPT0gXCJpdGVtXCIpIHtcblx0XHRcdFx0dGFyZ2V0Kys7XG5cdFx0XHR9XG5cdFx0XHRpZiAodGFyZ2V0IDwgdGhpcy5maWx0ZXJlZEl0ZW1zLmxlbmd0aCkge1xuXHRcdFx0XHR0aGlzLnNlbGVjdGVkSW5kZXggPSB0YXJnZXQ7XG5cdFx0XHR9XG5cdFx0XHRyZXR1cm47XG5cdFx0fVxuXHRcdGlmIChrYi5tYXRjaGVzKGRhdGEsIFwidHVpLnNlbGVjdC5wYWdlRG93blwiKSkge1xuXHRcdFx0Ly8gSnVtcCBkb3duIGJ5IG1heFZpc2libGUsIHRoZW4gZmluZCBuZWFyZXN0IGl0ZW1cblx0XHRcdGxldCB0YXJnZXQgPSBNYXRoLm1pbih0aGlzLmZpbHRlcmVkSXRlbXMubGVuZ3RoIC0gMSwgdGhpcy5zZWxlY3RlZEluZGV4ICsgdGhpcy5tYXhWaXNpYmxlKTtcblx0XHRcdHdoaWxlICh0YXJnZXQgPj0gMCAmJiB0aGlzLmZpbHRlcmVkSXRlbXNbdGFyZ2V0XS50eXBlICE9PSBcIml0ZW1cIikge1xuXHRcdFx0XHR0YXJnZXQtLTtcblx0XHRcdH1cblx0XHRcdGlmICh0YXJnZXQgPj0gMCkge1xuXHRcdFx0XHR0aGlzLnNlbGVjdGVkSW5kZXggPSB0YXJnZXQ7XG5cdFx0XHR9XG5cdFx0XHRyZXR1cm47XG5cdFx0fVxuXHRcdGlmIChrYi5tYXRjaGVzKGRhdGEsIFwidHVpLnNlbGVjdC5jYW5jZWxcIikpIHtcblx0XHRcdHRoaXMub25DYW5jZWw/LigpO1xuXHRcdFx0cmV0dXJuO1xuXHRcdH1cblx0XHRpZiAobWF0Y2hlc0tleShkYXRhLCBcImN0cmwrY1wiKSkge1xuXHRcdFx0dGhpcy5vbkV4aXQ/LigpO1xuXHRcdFx0cmV0dXJuO1xuXHRcdH1cblx0XHRpZiAoZGF0YSA9PT0gXCIgXCIgfHwga2IubWF0Y2hlcyhkYXRhLCBcInR1aS5zZWxlY3QuY29uZmlybVwiKSkge1xuXHRcdFx0Y29uc3QgZW50cnkgPSB0aGlzLmZpbHRlcmVkSXRlbXNbdGhpcy5zZWxlY3RlZEluZGV4XTtcblx0XHRcdGlmIChlbnRyeT8udHlwZSA9PT0gXCJpdGVtXCIpIHtcblx0XHRcdFx0Y29uc3QgbmV3RW5hYmxlZCA9ICFlbnRyeS5pdGVtLmVuYWJsZWQ7XG5cdFx0XHRcdHRoaXMudG9nZ2xlUmVzb3VyY2UoZW50cnkuaXRlbSwgbmV3RW5hYmxlZCk7XG5cdFx0XHRcdHRoaXMudXBkYXRlSXRlbShlbnRyeS5pdGVtLCBuZXdFbmFibGVkKTtcblx0XHRcdFx0dGhpcy5vblRvZ2dsZT8uKGVudHJ5Lml0ZW0sIG5ld0VuYWJsZWQpO1xuXHRcdFx0fVxuXHRcdFx0cmV0dXJuO1xuXHRcdH1cblxuXHRcdC8vIFBhc3MgdG8gc2VhcmNoIGlucHV0XG5cdFx0dGhpcy5zZWFyY2hJbnB1dC5oYW5kbGVJbnB1dChkYXRhKTtcblx0XHR0aGlzLmZpbHRlckl0ZW1zKHRoaXMuc2VhcmNoSW5wdXQuZ2V0VmFsdWUoKSk7XG5cdH1cblxuXHRwcml2YXRlIHRvZ2dsZVJlc291cmNlKGl0ZW06IFJlc291cmNlSXRlbSwgZW5hYmxlZDogYm9vbGVhbik6IHZvaWQge1xuXHRcdGlmIChpdGVtLm1ldGFkYXRhLm9yaWdpbiA9PT0gXCJ0b3AtbGV2ZWxcIikge1xuXHRcdFx0dGhpcy50b2dnbGVUb3BMZXZlbFJlc291cmNlKGl0ZW0sIGVuYWJsZWQpO1xuXHRcdH0gZWxzZSB7XG5cdFx0XHR0aGlzLnRvZ2dsZVBhY2thZ2VSZXNvdXJjZShpdGVtLCBlbmFibGVkKTtcblx0XHR9XG5cdH1cblxuXHRwcml2YXRlIHRvZ2dsZVRvcExldmVsUmVzb3VyY2UoaXRlbTogUmVzb3VyY2VJdGVtLCBlbmFibGVkOiBib29sZWFuKTogdm9pZCB7XG5cdFx0Y29uc3Qgc2NvcGUgPSBpdGVtLm1ldGFkYXRhLnNjb3BlIGFzIFwidXNlclwiIHwgXCJwcm9qZWN0XCI7XG5cdFx0Y29uc3Qgc2V0dGluZ3MgPVxuXHRcdFx0c2NvcGUgPT09IFwicHJvamVjdFwiID8gdGhpcy5zZXR0aW5nc01hbmFnZXIuZ2V0UHJvamVjdFNldHRpbmdzKCkgOiB0aGlzLnNldHRpbmdzTWFuYWdlci5nZXRHbG9iYWxTZXR0aW5ncygpO1xuXG5cdFx0Y29uc3QgYXJyYXlLZXkgPSBpdGVtLnJlc291cmNlVHlwZSBhcyBcImV4dGVuc2lvbnNcIiB8IFwic2tpbGxzXCIgfCBcInByb21wdHNcIiB8IFwidGhlbWVzXCI7XG5cdFx0Y29uc3QgY3VycmVudCA9IChzZXR0aW5nc1thcnJheUtleV0gPz8gW10pIGFzIHN0cmluZ1tdO1xuXG5cdFx0Ly8gR2VuZXJhdGUgcGF0dGVybiBmb3IgdGhpcyByZXNvdXJjZVxuXHRcdGNvbnN0IHBhdHRlcm4gPSB0aGlzLmdldFJlc291cmNlUGF0dGVybihpdGVtKTtcblx0XHRjb25zdCBkaXNhYmxlUGF0dGVybiA9IGAtJHtwYXR0ZXJufWA7XG5cdFx0Y29uc3QgZW5hYmxlUGF0dGVybiA9IGArJHtwYXR0ZXJufWA7XG5cblx0XHQvLyBGaWx0ZXIgb3V0IGV4aXN0aW5nIHBhdHRlcm5zIGZvciB0aGlzIHJlc291cmNlXG5cdFx0Y29uc3QgdXBkYXRlZCA9IGN1cnJlbnQuZmlsdGVyKChwKSA9PiB7XG5cdFx0XHRjb25zdCBzdHJpcHBlZCA9IHAuc3RhcnRzV2l0aChcIiFcIikgfHwgcC5zdGFydHNXaXRoKFwiK1wiKSB8fCBwLnN0YXJ0c1dpdGgoXCItXCIpID8gcC5zbGljZSgxKSA6IHA7XG5cdFx0XHRyZXR1cm4gc3RyaXBwZWQgIT09IHBhdHRlcm47XG5cdFx0fSk7XG5cblx0XHRpZiAoZW5hYmxlZCkge1xuXHRcdFx0dXBkYXRlZC5wdXNoKGVuYWJsZVBhdHRlcm4pO1xuXHRcdH0gZWxzZSB7XG5cdFx0XHR1cGRhdGVkLnB1c2goZGlzYWJsZVBhdHRlcm4pO1xuXHRcdH1cblxuXHRcdGlmIChzY29wZSA9PT0gXCJwcm9qZWN0XCIpIHtcblx0XHRcdGlmIChhcnJheUtleSA9PT0gXCJleHRlbnNpb25zXCIpIHtcblx0XHRcdFx0dGhpcy5zZXR0aW5nc01hbmFnZXIuc2V0UHJvamVjdEV4dGVuc2lvblBhdGhzKHVwZGF0ZWQpO1xuXHRcdFx0fSBlbHNlIGlmIChhcnJheUtleSA9PT0gXCJza2lsbHNcIikge1xuXHRcdFx0XHR0aGlzLnNldHRpbmdzTWFuYWdlci5zZXRQcm9qZWN0U2tpbGxQYXRocyh1cGRhdGVkKTtcblx0XHRcdH0gZWxzZSBpZiAoYXJyYXlLZXkgPT09IFwicHJvbXB0c1wiKSB7XG5cdFx0XHRcdHRoaXMuc2V0dGluZ3NNYW5hZ2VyLnNldFByb2plY3RQcm9tcHRUZW1wbGF0ZVBhdGhzKHVwZGF0ZWQpO1xuXHRcdFx0fSBlbHNlIGlmIChhcnJheUtleSA9PT0gXCJ0aGVtZXNcIikge1xuXHRcdFx0XHR0aGlzLnNldHRpbmdzTWFuYWdlci5zZXRQcm9qZWN0VGhlbWVQYXRocyh1cGRhdGVkKTtcblx0XHRcdH1cblx0XHR9IGVsc2Uge1xuXHRcdFx0aWYgKGFycmF5S2V5ID09PSBcImV4dGVuc2lvbnNcIikge1xuXHRcdFx0XHR0aGlzLnNldHRpbmdzTWFuYWdlci5zZXRFeHRlbnNpb25QYXRocyh1cGRhdGVkKTtcblx0XHRcdH0gZWxzZSBpZiAoYXJyYXlLZXkgPT09IFwic2tpbGxzXCIpIHtcblx0XHRcdFx0dGhpcy5zZXR0aW5nc01hbmFnZXIuc2V0U2tpbGxQYXRocyh1cGRhdGVkKTtcblx0XHRcdH0gZWxzZSBpZiAoYXJyYXlLZXkgPT09IFwicHJvbXB0c1wiKSB7XG5cdFx0XHRcdHRoaXMuc2V0dGluZ3NNYW5hZ2VyLnNldFByb21wdFRlbXBsYXRlUGF0aHModXBkYXRlZCk7XG5cdFx0XHR9IGVsc2UgaWYgKGFycmF5S2V5ID09PSBcInRoZW1lc1wiKSB7XG5cdFx0XHRcdHRoaXMuc2V0dGluZ3NNYW5hZ2VyLnNldFRoZW1lUGF0aHModXBkYXRlZCk7XG5cdFx0XHR9XG5cdFx0fVxuXHR9XG5cblx0cHJpdmF0ZSB0b2dnbGVQYWNrYWdlUmVzb3VyY2UoaXRlbTogUmVzb3VyY2VJdGVtLCBlbmFibGVkOiBib29sZWFuKTogdm9pZCB7XG5cdFx0Y29uc3Qgc2NvcGUgPSBpdGVtLm1ldGFkYXRhLnNjb3BlIGFzIFwidXNlclwiIHwgXCJwcm9qZWN0XCI7XG5cdFx0Y29uc3Qgc2V0dGluZ3MgPVxuXHRcdFx0c2NvcGUgPT09IFwicHJvamVjdFwiID8gdGhpcy5zZXR0aW5nc01hbmFnZXIuZ2V0UHJvamVjdFNldHRpbmdzKCkgOiB0aGlzLnNldHRpbmdzTWFuYWdlci5nZXRHbG9iYWxTZXR0aW5ncygpO1xuXG5cdFx0Y29uc3QgcGFja2FnZXMgPSBbLi4uKHNldHRpbmdzLnBhY2thZ2VzID8/IFtdKV0gYXMgUGFja2FnZVNvdXJjZVtdO1xuXHRcdGNvbnN0IHBrZ0luZGV4ID0gcGFja2FnZXMuZmluZEluZGV4KChwa2cpID0+IHtcblx0XHRcdGNvbnN0IHNvdXJjZSA9IHR5cGVvZiBwa2cgPT09IFwic3RyaW5nXCIgPyBwa2cgOiBwa2cuc291cmNlO1xuXHRcdFx0cmV0dXJuIHNvdXJjZSA9PT0gaXRlbS5tZXRhZGF0YS5zb3VyY2U7XG5cdFx0fSk7XG5cblx0XHRpZiAocGtnSW5kZXggPT09IC0xKSByZXR1cm47XG5cblx0XHRsZXQgcGtnID0gcGFja2FnZXNbcGtnSW5kZXhdO1xuXG5cdFx0Ly8gQ29udmVydCBzdHJpbmcgdG8gb2JqZWN0IGZvcm0gaWYgbmVlZGVkXG5cdFx0aWYgKHR5cGVvZiBwa2cgPT09IFwic3RyaW5nXCIpIHtcblx0XHRcdHBrZyA9IHsgc291cmNlOiBwa2cgfTtcblx0XHRcdHBhY2thZ2VzW3BrZ0luZGV4XSA9IHBrZztcblx0XHR9XG5cblx0XHQvLyBHZXQgdGhlIHJlc291cmNlIGFycmF5IGZvciB0aGlzIHR5cGVcblx0XHRjb25zdCBhcnJheUtleSA9IGl0ZW0ucmVzb3VyY2VUeXBlIGFzIFwiZXh0ZW5zaW9uc1wiIHwgXCJza2lsbHNcIiB8IFwicHJvbXB0c1wiIHwgXCJ0aGVtZXNcIjtcblx0XHRjb25zdCBjdXJyZW50ID0gKHBrZ1thcnJheUtleV0gPz8gW10pIGFzIHN0cmluZ1tdO1xuXG5cdFx0Ly8gR2VuZXJhdGUgcGF0dGVybiByZWxhdGl2ZSB0byBwYWNrYWdlIHJvb3Rcblx0XHRjb25zdCBwYXR0ZXJuID0gdGhpcy5nZXRQYWNrYWdlUmVzb3VyY2VQYXR0ZXJuKGl0ZW0pO1xuXHRcdGNvbnN0IGRpc2FibGVQYXR0ZXJuID0gYC0ke3BhdHRlcm59YDtcblx0XHRjb25zdCBlbmFibGVQYXR0ZXJuID0gYCske3BhdHRlcm59YDtcblxuXHRcdC8vIEZpbHRlciBvdXQgZXhpc3RpbmcgcGF0dGVybnMgZm9yIHRoaXMgcmVzb3VyY2Vcblx0XHRjb25zdCB1cGRhdGVkID0gY3VycmVudC5maWx0ZXIoKHApID0+IHtcblx0XHRcdGNvbnN0IHN0cmlwcGVkID0gcC5zdGFydHNXaXRoKFwiIVwiKSB8fCBwLnN0YXJ0c1dpdGgoXCIrXCIpIHx8IHAuc3RhcnRzV2l0aChcIi1cIikgPyBwLnNsaWNlKDEpIDogcDtcblx0XHRcdHJldHVybiBzdHJpcHBlZCAhPT0gcGF0dGVybjtcblx0XHR9KTtcblxuXHRcdGlmIChlbmFibGVkKSB7XG5cdFx0XHR1cGRhdGVkLnB1c2goZW5hYmxlUGF0dGVybik7XG5cdFx0fSBlbHNlIHtcblx0XHRcdHVwZGF0ZWQucHVzaChkaXNhYmxlUGF0dGVybik7XG5cdFx0fVxuXG5cdFx0KHBrZyBhcyBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPilbYXJyYXlLZXldID0gdXBkYXRlZC5sZW5ndGggPiAwID8gdXBkYXRlZCA6IHVuZGVmaW5lZDtcblxuXHRcdC8vIENsZWFuIHVwIGVtcHR5IGZpbHRlciBvYmplY3Rcblx0XHRjb25zdCBoYXNGaWx0ZXJzID0gW1wiZXh0ZW5zaW9uc1wiLCBcInNraWxsc1wiLCBcInByb21wdHNcIiwgXCJ0aGVtZXNcIl0uc29tZShcblx0XHRcdChrKSA9PiAocGtnIGFzIFJlY29yZDxzdHJpbmcsIHVua25vd24+KVtrXSAhPT0gdW5kZWZpbmVkLFxuXHRcdCk7XG5cdFx0aWYgKCFoYXNGaWx0ZXJzKSB7XG5cdFx0XHRwYWNrYWdlc1twa2dJbmRleF0gPSAocGtnIGFzIHsgc291cmNlOiBzdHJpbmcgfSkuc291cmNlO1xuXHRcdH1cblxuXHRcdGlmIChzY29wZSA9PT0gXCJwcm9qZWN0XCIpIHtcblx0XHRcdHRoaXMuc2V0dGluZ3NNYW5hZ2VyLnNldFByb2plY3RQYWNrYWdlcyhwYWNrYWdlcyk7XG5cdFx0fSBlbHNlIHtcblx0XHRcdHRoaXMuc2V0dGluZ3NNYW5hZ2VyLnNldFBhY2thZ2VzKHBhY2thZ2VzKTtcblx0XHR9XG5cdH1cblxuXHRwcml2YXRlIGdldFRvcExldmVsQmFzZURpcihzY29wZTogXCJ1c2VyXCIgfCBcInByb2plY3RcIik6IHN0cmluZyB7XG5cdFx0cmV0dXJuIHNjb3BlID09PSBcInByb2plY3RcIiA/IGpvaW4odGhpcy5jd2QsIENPTkZJR19ESVJfTkFNRSkgOiB0aGlzLmFnZW50RGlyO1xuXHR9XG5cblx0cHJpdmF0ZSBnZXRSZXNvdXJjZVBhdHRlcm4oaXRlbTogUmVzb3VyY2VJdGVtKTogc3RyaW5nIHtcblx0XHRjb25zdCBzY29wZSA9IGl0ZW0ubWV0YWRhdGEuc2NvcGUgYXMgXCJ1c2VyXCIgfCBcInByb2plY3RcIjtcblx0XHRjb25zdCBiYXNlRGlyID0gdGhpcy5nZXRUb3BMZXZlbEJhc2VEaXIoc2NvcGUpO1xuXHRcdHJldHVybiByZWxhdGl2ZShiYXNlRGlyLCBpdGVtLnBhdGgpO1xuXHR9XG5cblx0cHJpdmF0ZSBnZXRQYWNrYWdlUmVzb3VyY2VQYXR0ZXJuKGl0ZW06IFJlc291cmNlSXRlbSk6IHN0cmluZyB7XG5cdFx0Y29uc3QgYmFzZURpciA9IGl0ZW0ubWV0YWRhdGEuYmFzZURpciA/PyBkaXJuYW1lKGl0ZW0ucGF0aCk7XG5cdFx0cmV0dXJuIHJlbGF0aXZlKGJhc2VEaXIsIGl0ZW0ucGF0aCk7XG5cdH1cbn1cblxuZXhwb3J0IGNsYXNzIENvbmZpZ1NlbGVjdG9yQ29tcG9uZW50IGV4dGVuZHMgQ29udGFpbmVyIGltcGxlbWVudHMgRm9jdXNhYmxlIHtcblx0cHJpdmF0ZSByZXNvdXJjZUxpc3Q6IFJlc291cmNlTGlzdDtcblxuXHRwcml2YXRlIF9mb2N1c2VkID0gZmFsc2U7XG5cdGdldCBmb2N1c2VkKCk6IGJvb2xlYW4ge1xuXHRcdHJldHVybiB0aGlzLl9mb2N1c2VkO1xuXHR9XG5cdHNldCBmb2N1c2VkKHZhbHVlOiBib29sZWFuKSB7XG5cdFx0dGhpcy5fZm9jdXNlZCA9IHZhbHVlO1xuXHRcdHRoaXMucmVzb3VyY2VMaXN0LmZvY3VzZWQgPSB2YWx1ZTtcblx0fVxuXG5cdGNvbnN0cnVjdG9yKFxuXHRcdHJlc29sdmVkUGF0aHM6IFJlc29sdmVkUGF0aHMsXG5cdFx0c2V0dGluZ3NNYW5hZ2VyOiBTZXR0aW5nc01hbmFnZXIsXG5cdFx0Y3dkOiBzdHJpbmcsXG5cdFx0YWdlbnREaXI6IHN0cmluZyxcblx0XHRvbkNsb3NlOiAoKSA9PiB2b2lkLFxuXHRcdG9uRXhpdDogKCkgPT4gdm9pZCxcblx0XHRyZXF1ZXN0UmVuZGVyOiAoKSA9PiB2b2lkLFxuXHQpIHtcblx0XHRzdXBlcigpO1xuXG5cdFx0Y29uc3QgZ3JvdXBzID0gYnVpbGRHcm91cHMocmVzb2x2ZWRQYXRocyk7XG5cblx0XHQvLyBBZGQgaGVhZGVyXG5cdFx0dGhpcy5hZGRDaGlsZChuZXcgU3BhY2VyKDEpKTtcblx0XHR0aGlzLmFkZENoaWxkKG5ldyBEeW5hbWljQm9yZGVyKCkpO1xuXHRcdHRoaXMuYWRkQ2hpbGQobmV3IFNwYWNlcigxKSk7XG5cdFx0dGhpcy5hZGRDaGlsZChuZXcgQ29uZmlnU2VsZWN0b3JIZWFkZXIoKSk7XG5cdFx0dGhpcy5hZGRDaGlsZChuZXcgU3BhY2VyKDEpKTtcblxuXHRcdC8vIFJlc291cmNlIGxpc3Rcblx0XHR0aGlzLnJlc291cmNlTGlzdCA9IG5ldyBSZXNvdXJjZUxpc3QoZ3JvdXBzLCBzZXR0aW5nc01hbmFnZXIsIGN3ZCwgYWdlbnREaXIpO1xuXHRcdHRoaXMucmVzb3VyY2VMaXN0Lm9uQ2FuY2VsID0gb25DbG9zZTtcblx0XHR0aGlzLnJlc291cmNlTGlzdC5vbkV4aXQgPSBvbkV4aXQ7XG5cdFx0dGhpcy5yZXNvdXJjZUxpc3Qub25Ub2dnbGUgPSAoKSA9PiByZXF1ZXN0UmVuZGVyKCk7XG5cdFx0dGhpcy5hZGRDaGlsZCh0aGlzLnJlc291cmNlTGlzdCk7XG5cblx0XHQvLyBCb3R0b20gYm9yZGVyXG5cdFx0dGhpcy5hZGRDaGlsZChuZXcgU3BhY2VyKDEpKTtcblx0XHR0aGlzLmFkZENoaWxkKG5ldyBEeW5hbWljQm9yZGVyKCkpO1xuXHR9XG5cblx0Z2V0UmVzb3VyY2VMaXN0KCk6IFJlc291cmNlTGlzdCB7XG5cdFx0cmV0dXJuIHRoaXMucmVzb3VyY2VMaXN0O1xuXHR9XG59XG4ifV0sImlzRXJyb3IiOmZhbHNlLCJ0aW1lc3RhbXAiOjE3Nzc1NjQxNzYyNzN9fSx7InR5cGUiOiJtZXNzYWdlIiwiaWQiOiJlMTU1ZTM0ZSIsInBhcmVudElkIjoiMmY3ODUyZDUiLCJ0aW1lc3RhbXAiOiIyMDI2LTA0LTMwVDE1OjQ5OjM2LjI3M1oiLCJtZXNzYWdlIjp7InJvbGUiOiJ0b29sUmVzdWx0IiwidG9vbENhbGxJZCI6ImdyZXA6MiIsInRvb2xOYW1lIjoiZ3JlcCIsImNvbnRlbnQiOlt7InR5cGUiOiJ0ZXh0IiwidGV4dCI6InBhY2thZ2UtbWFuYWdlci50ZXN0LnRzOjI2MDogICAvLyBTaG91bGQgTk9UIGZpbmQgaGVscGVyLnRzIChub3QgZGVjbGFyZWQgaW4gbWFuaWZlc3QpXG5wYWNrYWdlLW1hbmFnZXIudGVzdC50czoyNjE6ICAgZXhwZWN0KHJlc3VsdC5leHRlbnNpb25zLnNvbWUoKHIpID0+IHBhdGhFbmRzV2l0aChyLnBhdGgsIFwiaGVscGVyLnRzXCIpKSkudG9CZShmYWxzZSk7XG5wYWNrYWdlLW1hbmFnZXIudGVzdC50czoyNjI6ICAgfSk7XG5wYWNrYWdlLW1hbmFnZXIudGVzdC50czoyNjM6ICAgfSk7XG5wYWNrYWdlLW1hbmFnZXIudGVzdC50czoyNjQ6ICAgXG5wYWNrYWdlLW1hbmFnZXIudGVzdC50czoyNjU6IGRlc2NyaWJlKFwiYXV0by1kaXNjb3ZlcmVkIHNraWxsIG1ldGFkYXRhXCIsICgpID0+IHtcbnBhY2thZ2UtbWFuYWdlci50ZXN0LnRzOjI2NjogICBpdChcInNob3VsZCB1c2UgdGhlIGFnZW50IGRpciBhcyBiYXNlRGlyIGZvciB1c2VyIC5waS9hZ2VudCBza2lsbHNcIiwgYXN5bmMgKCkgPT4ge1xucGFja2FnZS1tYW5hZ2VyLnRlc3QudHM6MjY3OiAgIGNvbnN0IHNraWxsUGF0aCA9IGpvaW4oYWdlbnREaXIsIFwic2tpbGxzXCIsIFwidXNlci1waVwiLCBcIlNLSUxMLm1kXCIpO1xucGFja2FnZS1tYW5hZ2VyLnRlc3QudHM6MjY4OiAgIG1rZGlyU3luYyhqb2luKGFnZW50RGlyLCBcInNraWxsc1wiLCBcInVzZXItcGlcIiksIHsgcmVjdXJzaXZlOiB0cnVlIH0pO1xucGFja2FnZS1tYW5hZ2VyLnRlc3QudHM6MjY5OiAgIHdyaXRlRmlsZVN5bmMoc2tpbGxQYXRoLCBcIi0tLVxcbm5hbWU6IHVzZXItcGlcXG5kZXNjcmlwdGlvbjogdXNlciBwaVxcbi0tLVxcblwiKTtcbnBhY2thZ2UtbWFuYWdlci50ZXN0LnRzOjI3MDogICAifV0sImRldGFpbHMiOnsibWF0Y2hDb3VudCI6MSwibWF0Y2hlcyI6W3sicGF0aCI6InBhY2thZ2UtbWFuYWdlci50ZXN0LnRzIiwibGluZSI6MjYwLCJ0ZXh0IjoiICAvLyBTaG91bGQgTk9UIGZpbmQgaGVscGVyLnRzIChub3QgZGVjbGFyZWQgaW4gbWFuaWZlc3QpIn0seyJwYXRoIjoicGFja2FnZS1tYW5hZ2VyLnRlc3QudHMiLCJsaW5lIjoyNjEsInRleHQiOiIgIGV4cGVjdChyZXN1bHQuZXh0ZW5zaW9ucy5zb21lKChyKSA9PiBwYXRoRW5kc1dpdGgoci5wYXRoLCBcImhlbHBlci50c1wiKSkpLnRvQmUoZmFsc2UpOyJ9LHsicGF0aCI6InBhY2thZ2UtbWFuYWdlci50ZXN0LnRzIiwibGluZSI6MjYyLCJ0ZXh0IjoiICB9KTsifSx7InBhdGgiOiJwYWNrYWdlLW1hbmFnZXIudGVzdC50cyIsImxpbmUiOjI2MywidGV4dCI6IiAgfSk7In0seyJwYXRoIjoicGFja2FnZS1tYW5hZ2VyLnRlc3QudHMiLCJsaW5lIjoyNjQsInRleHQiOiIgICJ9LHsicGF0aCI6InBhY2thZ2UtbWFuYWdlci50ZXN0LnRzIiwibGluZSI6MjY1LCJ0ZXh0IjoiZGVzY3JpYmUoXCJhdXRvLWRpc2NvdmVyZWQgc2tpbGwgbWV0YWRhdGFcIiwgKCkgPT4geyJ9LHsicGF0aCI6InBhY2thZ2UtbWFuYWdlci50ZXN0LnRzIiwibGluZSI6MjY2LCJ0ZXh0IjoiICBpdChcInNob3VsZCB1c2UgdGhlIGFnZW50IGRpciBhcyBiYXNlRGlyIGZvciB1c2VyIC5waS9hZ2VudCBza2lsbHNcIiwgYXN5bmMgKCkgPT4geyJ9LHsicGF0aCI6InBhY2thZ2UtbWFuYWdlci50ZXN0LnRzIiwibGluZSI6MjY3LCJ0ZXh0IjoiICBjb25zdCBza2lsbFBhdGggPSBqb2luKGFnZW50RGlyLCBcInNraWxsc1wiLCBcInVzZXItcGlcIiwgXCJTS0lMTC5tZFwiKTsifSx7InBhdGgiOiJwYWNrYWdlLW1hbmFnZXIudGVzdC50cyIsImxpbmUiOjI2OCwidGV4dCI6IiAgbWtkaXJTeW5jKGpvaW4oYWdlbnREaXIsIFwic2tpbGxzXCIsIFwidXNlci1waVwiKSwgeyByZWN1cnNpdmU6IHRydWUgfSk7In0seyJwYXRoIjoicGFja2FnZS1tYW5hZ2VyLnRlc3QudHMiLCJsaW5lIjoyNjksInRleHQiOiIgIHdyaXRlRmlsZVN5bmMoc2tpbGxQYXRoLCBcIi0tLVxcbm5hbWU6IHVzZXItcGlcXG5kZXNjcmlwdGlvbjogdXNlciBwaVxcbi0tLVxcblwiKTsifSx7InBhdGgiOiJwYWNrYWdlLW1hbmFnZXIudGVzdC50cyIsImxpbmUiOjI3MCwidGV4dCI6IiAgIn1dfSwiaXNFcnJvciI6ZmFsc2UsInRpbWVzdGFtcCI6MTc3NzU2NDE3NjI3M319LHsidHlwZSI6Im1lc3NhZ2UiLCJpZCI6ImVhNWViODdkIiwicGFyZW50SWQiOiJlMTU1ZTM0ZSIsInRpbWVzdGFtcCI6IjIwMjYtMDQtMzBUMTU6NDk6NDUuNjQyWiIsIm1lc3NhZ2UiOnsicm9sZSI6ImFzc2lzdGFudCIsImNvbnRlbnQiOlt7InR5cGUiOiJ0aGlua2luZyIsInRoaW5raW5nIjoiSSBuZWVkIHRvIHJlYWQgbW9yZSBvZiB0aGUgdGVzdCBmaWxlIHRvIHVuZGVyc3RhbmQgdGhlIGZ1bGwgdGVzdCBleHBlY3RhdGlvbnMuIExldCBtZSBhbHNvIHJlYWQgdGhlIHJlc3Qgb2YgcGFja2FnZS1tYW5hZ2VyLnRzIHdoZXJlIGBhZGRBdXRvRGlzY292ZXJlZFJlc291cmNlc2AgaXMgZGVmaW5lZC4iLCJ0aGlua2luZ1NpZ25hdHVyZSI6InJlYXNvbmluZyJ9LHsidHlwZSI6InRvb2xDYWxsIiwiaWQiOiJyZWFkOjMiLCJuYW1lIjoicmVhZCIsImFyZ3VtZW50cyI6eyJwYXRoIjoicGFja2FnZXMvY29kaW5nLWFnZW50L3Rlc3QvcGFja2FnZS1tYW5hZ2VyLnRlc3QudHMiLCJvZmZzZXQiOjI2NX19LHsidHlwZSI6InRvb2xDYWxsIiwiaWQiOiJyZWFkOjQiLCJuYW1lIjoicmVhZCIsImFyZ3VtZW50cyI6eyJwYXRoIjoicGFja2FnZXMvY29kaW5nLWFnZW50L3NyYy9jb3JlL3BhY2thZ2UtbWFuYWdlci50cyIsIm9mZnNldCI6MTY4OH19XSwiYXBpIjoib3BlbmFpLWNvbXBsZXRpb25zIiwicHJvdmlkZXIiOiJvcGVuY29kZS1nbyIsIm1vZGVsIjoia2ltaS1rMi42IiwidXNhZ2UiOnsiaW5wdXQiOjE4MDUwLCJvdXRwdXQiOjk2LCJjYWNoZVJlYWQiOjExNzc2LCJjYWNoZVdyaXRlIjowLCJ0b3RhbFRva2VucyI6Mjk5MjIsImNvc3QiOnsiaW5wdXQiOjAuMDA1Nzc2LCJvdXRwdXQiOjAuMDAwMTI4NjQwMDAwMDAwMDAwMDIsImNhY2hlUmVhZCI6MC4wMDA2MzU5MDQsImNhY2hlV3JpdGUiOjAsInRvdGFsIjowLjAwNjU0MDU0NH19LCJzdG9wUmVhc29uIjoidG9vbFVzZSIsInRpbWVzdGFtcCI6MTc3NzU2NDE3NjI3MywicmVzcG9uc2VJZCI6Imdlbi0xNzc3NTY0MTc2LUd1SEVEN3o2U1RFTmg0TzFjUE01In19LHsidHlwZSI6Im1lc3NhZ2UiLCJpZCI6ImM5NDc1ZWQ5IiwicGFyZW50SWQiOiJlYTVlYjg3ZCIsInRpbWVzdGFtcCI6IjIwMjYtMDQtMzBUMTU6NDk6NDUuNjc5WiIsIm1lc3NhZ2UiOnsicm9sZSI6InRvb2xSZXN1bHQiLCJ0b29sQ2FsbElkIjoicmVhZDozIiwidG9vbE5hbWUiOiJyZWFkIiwiY29udGVudCI6W3sidHlwZSI6InRleHQiLCJ0ZXh0IjoiXHRkZXNjcmliZShcImF1dG8tZGlzY292ZXJlZCBza2lsbCBtZXRhZGF0YVwiLCAoKSA9PiB7XG5cdFx0aXQoXCJzaG91bGQgdXNlIHRoZSBhZ2VudCBkaXIgYXMgYmFzZURpciBmb3IgdXNlciAucGkvYWdlbnQgc2tpbGxzXCIsIGFzeW5jICgpID0+IHtcblx0XHRcdGNvbnN0IHNraWxsUGF0aCA9IGpvaW4oYWdlbnREaXIsIFwic2tpbGxzXCIsIFwidXNlci1waVwiLCBcIlNLSUxMLm1kXCIpO1xuXHRcdFx0bWtkaXJTeW5jKGpvaW4oYWdlbnREaXIsIFwic2tpbGxzXCIsIFwidXNlci1waVwiKSwgeyByZWN1cnNpdmU6IHRydWUgfSk7XG5cdFx0XHR3cml0ZUZpbGVTeW5jKHNraWxsUGF0aCwgXCItLS1cXG5uYW1lOiB1c2VyLXBpXFxuZGVzY3JpcHRpb246IHVzZXIgcGlcXG4tLS1cXG5cIik7XG5cblx0XHRcdGNvbnN0IHJlc3VsdCA9IGF3YWl0IHBhY2thZ2VNYW5hZ2VyLnJlc29sdmUoKTtcblx0XHRcdGNvbnN0IHNraWxsID0gcmVzdWx0LnNraWxscy5maW5kKChyKSA9PiByLnBhdGggPT09IHNraWxsUGF0aCk7XG5cblx0XHRcdGV4cGVjdChza2lsbD8ubWV0YWRhdGEuc291cmNlKS50b0JlKFwiYXV0b1wiKTtcblx0XHRcdGV4cGVjdChza2lsbD8ubWV0YWRhdGEuc2NvcGUpLnRvQmUoXCJ1c2VyXCIpO1xuXHRcdFx0ZXhwZWN0KHNraWxsPy5tZXRhZGF0YS5iYXNlRGlyKS50b0JlKGFnZW50RGlyKTtcblx0XHR9KTtcblxuXHRcdGl0KFwic2hvdWxkIHVzZSB0aGUgcHJvamVjdCAucGkgZGlyIGFzIGJhc2VEaXIgZm9yIHByb2plY3QgLnBpIHNraWxsc1wiLCBhc3luYyAoKSA9PiB7XG5cdFx0XHRjb25zdCBwcm9qZWN0QmFzZURpciA9IGpvaW4odGVtcERpciwgXCIucGlcIik7XG5cdFx0XHRjb25zdCBza2lsbFBhdGggPSBqb2luKHByb2plY3RCYXNlRGlyLCBcInNraWxsc1wiLCBcInByb2plY3QtcGlcIiwgXCJTS0lMTC5tZFwiKTtcblx0XHRcdG1rZGlyU3luYyhqb2luKHByb2plY3RCYXNlRGlyLCBcInNraWxsc1wiLCBcInByb2plY3QtcGlcIiksIHsgcmVjdXJzaXZlOiB0cnVlIH0pO1xuXHRcdFx0d3JpdGVGaWxlU3luYyhza2lsbFBhdGgsIFwiLS0tXFxubmFtZTogcHJvamVjdC1waVxcbmRlc2NyaXB0aW9uOiBwcm9qZWN0IHBpXFxuLS0tXFxuXCIpO1xuXG5cdFx0XHRjb25zdCByZXN1bHQgPSBhd2FpdCBwYWNrYWdlTWFuYWdlci5yZXNvbHZlKCk7XG5cdFx0XHRjb25zdCBza2lsbCA9IHJlc3VsdC5za2lsbHMuZmluZCgocikgPT4gci5wYXRoID09PSBza2lsbFBhdGgpO1xuXG5cdFx0XHRleHBlY3Qoc2tpbGw/Lm1ldGFkYXRhLnNvdXJjZSkudG9CZShcImF1dG9cIik7XG5cdFx0XHRleHBlY3Qoc2tpbGw/Lm1ldGFkYXRhLnNjb3BlKS50b0JlKFwicHJvamVjdFwiKTtcblx0XHRcdGV4cGVjdChza2lsbD8ubWV0YWRhdGEuYmFzZURpcikudG9CZShwcm9qZWN0QmFzZURpcik7XG5cdFx0fSk7XG5cblx0XHRpdChcInNob3VsZCB1c2Ugfi8uYWdlbnRzIGFzIGJhc2VEaXIgZm9yIHVzZXIgLmFnZW50cyBza2lsbHNcIiwgYXN5bmMgKCkgPT4ge1xuXHRcdFx0Y29uc3QgcHJldmlvdXNIb21lID0gcHJvY2Vzcy5lbnYuSE9NRTtcblx0XHRcdHByb2Nlc3MuZW52LkhPTUUgPSB0ZW1wRGlyO1xuXG5cdFx0XHR0cnkge1xuXHRcdFx0XHRjb25zdCBhZ2VudHNCYXNlRGlyID0gam9pbih0ZW1wRGlyLCBcIi5hZ2VudHNcIik7XG5cdFx0XHRcdGNvbnN0IHNraWxsUGF0aCA9IGpvaW4oYWdlbnRzQmFzZURpciwgXCJza2lsbHNcIiwgXCJ1c2VyLWFnZW50c1wiLCBcIlNLSUxMLm1kXCIpO1xuXHRcdFx0XHRta2RpclN5bmMoam9pbihhZ2VudHNCYXNlRGlyLCBcInNraWxsc1wiLCBcInVzZXItYWdlbnRzXCIpLCB7IHJlY3Vyc2l2ZTogdHJ1ZSB9KTtcblx0XHRcdFx0d3JpdGVGaWxlU3luYyhza2lsbFBhdGgsIFwiLS0tXFxubmFtZTogdXNlci1hZ2VudHNcXG5kZXNjcmlwdGlvbjogdXNlciBhZ2VudHNcXG4tLS1cXG5cIik7XG5cblx0XHRcdFx0Y29uc3QgcmVzdWx0ID0gYXdhaXQgcGFja2FnZU1hbmFnZXIucmVzb2x2ZSgpO1xuXHRcdFx0XHRjb25zdCBza2lsbCA9IHJlc3VsdC5za2lsbHMuZmluZCgocikgPT4gci5wYXRoID09PSBza2lsbFBhdGgpO1xuXG5cdFx0XHRcdGV4cGVjdChza2lsbD8ubWV0YWRhdGEuc291cmNlKS50b0JlKFwiYXV0b1wiKTtcblx0XHRcdFx0ZXhwZWN0KHNraWxsPy5tZXRhZGF0YS5zY29wZSkudG9CZShcInVzZXJcIik7XG5cdFx0XHRcdGV4cGVjdChza2lsbD8ubWV0YWRhdGEuYmFzZURpcikudG9CZShhZ2VudHNCYXNlRGlyKTtcblx0XHRcdH0gZmluYWxseSB7XG5cdFx0XHRcdGlmIChwcmV2aW91c0hvbWUgPT09IHVuZGVmaW5lZCkge1xuXHRcdFx0XHRcdGRlbGV0ZSBwcm9jZXNzLmVudi5IT01FO1xuXHRcdFx0XHR9IGVsc2Uge1xuXHRcdFx0XHRcdHByb2Nlc3MuZW52LkhPTUUgPSBwcmV2aW91c0hvbWU7XG5cdFx0XHRcdH1cblx0XHRcdH1cblx0XHR9KTtcblxuXHRcdGl0KFwic2hvdWxkIHVzZSBlYWNoIHByb2plY3QgLmFnZW50cyBkaXIgYXMgYmFzZURpciBmb3IgcHJvamVjdCAuYWdlbnRzIHNraWxsc1wiLCBhc3luYyAoKSA9PiB7XG5cdFx0XHRjb25zdCByZXBvUm9vdCA9IGpvaW4odGVtcERpciwgXCJyZXBvXCIpO1xuXHRcdFx0Y29uc3QgbmVzdGVkQ3dkID0gam9pbihyZXBvUm9vdCwgXCJwYWNrYWdlc1wiLCBcImZlYXR1cmVcIik7XG5cdFx0XHRta2RpclN5bmMobmVzdGVkQ3dkLCB7IHJlY3Vyc2l2ZTogdHJ1ZSB9KTtcblx0XHRcdG1rZGlyU3luYyhqb2luKHJlcG9Sb290LCBcIi5naXRcIiksIHsgcmVjdXJzaXZlOiB0cnVlIH0pO1xuXG5cdFx0XHRjb25zdCByZXBvQWdlbnRzQmFzZURpciA9IGpvaW4ocmVwb1Jvb3QsIFwiLmFnZW50c1wiKTtcblx0XHRcdGNvbnN0IHJlcG9Ta2lsbCA9IGpvaW4ocmVwb0FnZW50c0Jhc2VEaXIsIFwic2tpbGxzXCIsIFwicmVwb1wiLCBcIlNLSUxMLm1kXCIpO1xuXHRcdFx0bWtkaXJTeW5jKGpvaW4ocmVwb0FnZW50c0Jhc2VEaXIsIFwic2tpbGxzXCIsIFwicmVwb1wiKSwgeyByZWN1cnNpdmU6IHRydWUgfSk7XG5cdFx0XHR3cml0ZUZpbGVTeW5jKHJlcG9Ta2lsbCwgXCItLS1cXG5uYW1lOiByZXBvXFxuZGVzY3JpcHRpb246IHJlcG9cXG4tLS1cXG5cIik7XG5cblx0XHRcdGNvbnN0IHBhY2thZ2VBZ2VudHNCYXNlRGlyID0gam9pbihyZXBvUm9vdCwgXCJwYWNrYWdlc1wiLCBcIi5hZ2VudHNcIik7XG5cdFx0XHRjb25zdCBwYWNrYWdlU2tpbGwgPSBqb2luKHBhY2thZ2VBZ2VudHNCYXNlRGlyLCBcInNraWxsc1wiLCBcInBhY2thZ2VcIiwgXCJTS0lMTC5tZFwiKTtcblx0XHRcdG1rZGlyU3luYyhqb2luKHBhY2thZ2VBZ2VudHNCYXNlRGlyLCBcInNraWxsc1wiLCBcInBhY2thZ2VcIiksIHsgcmVjdXJzaXZlOiB0cnVlIH0pO1xuXHRcdFx0d3JpdGVGaWxlU3luYyhwYWNrYWdlU2tpbGwsIFwiLS0tXFxubmFtZTogcGFja2FnZVxcbmRlc2NyaXB0aW9uOiBwYWNrYWdlXFxuLS0tXFxuXCIpO1xuXG5cdFx0XHRjb25zdCBwbSA9IG5ldyBEZWZhdWx0UGFja2FnZU1hbmFnZXIoe1xuXHRcdFx0XHRjd2Q6IG5lc3RlZEN3ZCxcblx0XHRcdFx0YWdlbnREaXIsXG5cdFx0XHRcdHNldHRpbmdzTWFuYWdlcixcblx0XHRcdH0pO1xuXG5cdFx0XHRjb25zdCByZXN1bHQgPSBhd2FpdCBwbS5yZXNvbHZlKCk7XG5cdFx0XHRjb25zdCByZXNvbHZlZFJlcG9Ta2lsbCA9IHJlc3VsdC5za2lsbHMuZmluZCgocikgPT4gci5wYXRoID09PSByZXBvU2tpbGwpO1xuXHRcdFx0Y29uc3QgcmVzb2x2ZWRQYWNrYWdlU2tpbGwgPSByZXN1bHQuc2tpbGxzLmZpbmQoKHIpID0+IHIucGF0aCA9PT0gcGFja2FnZVNraWxsKTtcblxuXHRcdFx0ZXhwZWN0KHJlc29sdmVkUmVwb1NraWxsPy5tZXRhZGF0YS5zb3VyY2UpLnRvQmUoXCJhdXRvXCIpO1xuXHRcdFx0ZXhwZWN0KHJlc29sdmVkUmVwb1NraWxsPy5tZXRhZGF0YS5zY29wZSkudG9CZShcInByb2plY3RcIik7XG5cdFx0XHRleHBlY3QocmVzb2x2ZWRSZXBvU2tpbGw/Lm1ldGFkYXRhLmJhc2VEaXIpLnRvQmUocmVwb0FnZW50c0Jhc2VEaXIpO1xuXHRcdFx0ZXhwZWN0KHJlc29sdmVkUGFja2FnZVNraWxsPy5tZXRhZGF0YS5zb3VyY2UpLnRvQmUoXCJhdXRvXCIpO1xuXHRcdFx0ZXhwZWN0KHJlc29sdmVkUGFja2FnZVNraWxsPy5tZXRhZGF0YS5zY29wZSkudG9CZShcInByb2plY3RcIik7XG5cdFx0XHRleHBlY3QocmVzb2x2ZWRQYWNrYWdlU2tpbGw/Lm1ldGFkYXRhLmJhc2VEaXIpLnRvQmUocGFja2FnZUFnZW50c0Jhc2VEaXIpO1xuXHRcdH0pO1xuXHR9KTtcblxuXHRkZXNjcmliZShcIi5hZ2VudHMvc2tpbGxzIGF1dG8tZGlzY292ZXJ5XCIsICgpID0+IHtcblx0XHRpdChcInNob3VsZCBzY2FuIC5hZ2VudHMvc2tpbGxzIGZyb20gY3dkIHVwIHRvIGdpdCByZXBvIHJvb3RcIiwgYXN5bmMgKCkgPT4ge1xuXHRcdFx0Y29uc3QgcmVwb1Jvb3QgPSBqb2luKHRlbXBEaXIsIFwicmVwb1wiKTtcblx0XHRcdGNvbnN0IG5lc3RlZEN3ZCA9IGpvaW4ocmVwb1Jvb3QsIFwicGFja2FnZXNcIiwgXCJmZWF0dXJlXCIpO1xuXHRcdFx0bWtkaXJTeW5jKG5lc3RlZEN3ZCwgeyByZWN1cnNpdmU6IHRydWUgfSk7XG5cdFx0XHRta2RpclN5bmMoam9pbihyZXBvUm9vdCwgXCIuZ2l0XCIpLCB7IHJlY3Vyc2l2ZTogdHJ1ZSB9KTtcblxuXHRcdFx0Y29uc3QgYWJvdmVSZXBvU2tpbGwgPSBqb2luKHRlbXBEaXIsIFwiLmFnZW50c1wiLCBcInNraWxsc1wiLCBcImFib3ZlLXJlcG9cIiwgXCJTS0lMTC5tZFwiKTtcblx0XHRcdG1rZGlyU3luYyhqb2luKHRlbXBEaXIsIFwiLmFnZW50c1wiLCBcInNraWxsc1wiLCBcImFib3ZlLXJlcG9cIiksIHsgcmVjdXJzaXZlOiB0cnVlIH0pO1xuXHRcdFx0d3JpdGVGaWxlU3luYyhhYm92ZVJlcG9Ta2lsbCwgXCItLS1cXG5uYW1lOiBhYm92ZS1yZXBvXFxuZGVzY3JpcHRpb246IGFib3ZlXFxuLS0tXFxuXCIpO1xuXG5cdFx0XHRjb25zdCByZXBvUm9vdFNraWxsID0gam9pbihyZXBvUm9vdCwgXCIuYWdlbnRzXCIsIFwic2tpbGxzXCIsIFwicmVwby1yb290XCIsIFwiU0tJTEwubWRcIik7XG5cdFx0XHRta2RpclN5bmMoam9pbihyZXBvUm9vdCwgXCIuYWdlbnRzXCIsIFwic2tpbGxzXCIsIFwicmVwby1yb290XCIpLCB7IHJlY3Vyc2l2ZTogdHJ1ZSB9KTtcblx0XHRcdHdyaXRlRmlsZVN5bmMocmVwb1Jvb3RTa2lsbCwgXCItLS1cXG5uYW1lOiByZXBvLXJvb3RcXG5kZXNjcmlwdGlvbjogcmVwb1xcbi0tLVxcblwiKTtcblxuXHRcdFx0Y29uc3QgbmVzdGVkU2tpbGwgPSBqb2luKHJlcG9Sb290LCBcInBhY2thZ2VzXCIsIFwiLmFnZW50c1wiLCBcInNraWxsc1wiLCBcIm5lc3RlZFwiLCBcIlNLSUxMLm1kXCIpO1xuXHRcdFx0bWtkaXJTeW5jKGpvaW4ocmVwb1Jvb3QsIFwicGFja2FnZXNcIiwgXCIuYWdlbnRzXCIsIFwic2tpbGxzXCIsIFwibmVzdGVkXCIpLCB7IHJlY3Vyc2l2ZTogdHJ1ZSB9KTtcblx0XHRcdHdyaXRlRmlsZVN5bmMobmVzdGVkU2tpbGwsIFwiLS0tXFxubmFtZTogbmVzdGVkXFxuZGVzY3JpcHRpb246IG5lc3RlZFxcbi0tLVxcblwiKTtcblxuXHRcdFx0Y29uc3QgcG0gPSBuZXcgRGVmYXVsdFBhY2thZ2VNYW5hZ2VyKHtcblx0XHRcdFx0Y3dkOiBuZXN0ZWRDd2QsXG5cdFx0XHRcdGFnZW50RGlyLFxuXHRcdFx0XHRzZXR0aW5nc01hbmFnZXIsXG5cdFx0XHR9KTtcblxuXHRcdFx0Y29uc3QgcmVzdWx0ID0gYXdhaXQgcG0ucmVzb2x2ZSgpO1xuXHRcdFx0ZXhwZWN0KHJlc3VsdC5za2lsbHMuc29tZSgocikgPT4gci5wYXRoID09PSByZXBvUm9vdFNraWxsICYmIHIuZW5hYmxlZCkpLnRvQmUodHJ1ZSk7XG5cdFx0XHRleHBlY3QocmVzdWx0LnNraWxscy5zb21lKChyKSA9PiByLnBhdGggPT09IG5lc3RlZFNraWxsICYmIHIuZW5hYmxlZCkpLnRvQmUodHJ1ZSk7XG5cdFx0XHRleHBlY3QocmVzdWx0LnNraWxscy5zb21lKChyKSA9PiByLnBhdGggPT09IGFib3ZlUmVwb1NraWxsKSkudG9CZShmYWxzZSk7XG5cdFx0fSk7XG5cblx0XHRpdChcInNob3VsZCBzY2FuIC5hZ2VudHMvc2tpbGxzIHVwIHRvIGZpbGVzeXN0ZW0gcm9vdCB3aGVuIG5vdCBpbiBhIGdpdCByZXBvXCIsIGFzeW5jICgpID0+IHtcblx0XHRcdGNvbnN0IG5vblJlcG9Sb290ID0gam9pbih0ZW1wRGlyLCBcIm5vbi1yZXBvXCIpO1xuXHRcdFx0Y29uc3QgbmVzdGVkQ3dkID0gam9pbihub25SZXBvUm9vdCwgXCJhXCIsIFwiYlwiKTtcblx0XHRcdG1rZGlyU3luYyhuZXN0ZWRDd2QsIHsgcmVjdXJzaXZlOiB0cnVlIH0pO1xuXG5cdFx0XHRjb25zdCByb290U2tpbGwgPSBqb2luKG5vblJlcG9Sb290LCBcIi5hZ2VudHNcIiwgXCJza2lsbHNcIiwgXCJyb290XCIsIFwiU0tJTEwubWRcIik7XG5cdFx0XHRta2RpclN5bmMoam9pbihub25SZXBvUm9vdCwgXCIuYWdlbnRzXCIsIFwic2tpbGxzXCIsIFwicm9vdFwiKSwgeyByZWN1cnNpdmU6IHRydWUgfSk7XG5cdFx0XHR3cml0ZUZpbGVTeW5jKHJvb3RTa2lsbCwgXCItLS1cXG5uYW1lOiByb290XFxuZGVzY3JpcHRpb246IHJvb3RcXG4tLS1cXG5cIik7XG5cblx0XHRcdGNvbnN0IG1pZGRsZVNraWxsID0gam9pbihub25SZXBvUm9vdCwgXCJhXCIsIFwiLmFnZW50c1wiLCBcInNraWxsc1wiLCBcIm1pZGRsZVwiLCBcIlNLSUxMLm1kXCIpO1xuXHRcdFx0bWtkaXJTeW5jKGpvaW4obm9uUmVwb1Jvb3QsIFwiYVwiLCBcIi5hZ2VudHNcIiwgXCJza2lsbHNcIiwgXCJtaWRkbGVcIiksIHsgcmVjdXJzaXZlOiB0cnVlIH0pO1xuXHRcdFx0d3JpdGVGaWxlU3luYyhtaWRkbGVTa2lsbCwgXCItLS1cXG5uYW1lOiBtaWRkbGVcXG5kZXNjcmlwdGlvbjogbWlkZGxlXFxuLS0tXFxuXCIpO1xuXG5cdFx0XHRjb25zdCBwbSA9IG5ldyBEZWZhdWx0UGFja2FnZU1hbmFnZXIoe1xuXHRcdFx0XHRjd2Q6IG5lc3RlZEN3ZCxcblx0XHRcdFx0YWdlbnREaXIsXG5cdFx0XHRcdHNldHRpbmdzTWFuYWdlcixcblx0XHRcdH0pO1xuXG5cdFx0XHRjb25zdCByZXN1bHQgPSBhd2FpdCBwbS5yZXNvbHZlKCk7XG5cdFx0XHRleHBlY3QocmVzdWx0LnNraWxscy5zb21lKChyKSA9PiByLnBhdGggPT09IHJvb3RTa2lsbCAmJiByLmVuYWJsZWQpKS50b0JlKHRydWUpO1xuXHRcdFx0ZXhwZWN0KHJlc3VsdC5za2lsbHMuc29tZSgocikgPT4gci5wYXRoID09PSBtaWRkbGVTa2lsbCAmJiByLmVuYWJsZWQpKS50b0JlKHRydWUpO1xuXHRcdH0pO1xuXG5cdFx0aXQoXCJzaG91bGQgaWdub3JlIHJvb3QgbWFya2Rvd24gZmlsZXMgaW4gLmFnZW50cy9za2lsbHNcIiwgYXN5bmMgKCkgPT4ge1xuXHRcdFx0Y29uc3QgYWdlbnRzU2tpbGxzRGlyID0gam9pbih0ZW1wRGlyLCBcIi5hZ2VudHNcIiwgXCJza2lsbHNcIik7XG5cdFx0XHRta2RpclN5bmMoam9pbihhZ2VudHNTa2lsbHNEaXIsIFwibmVzdGVkLXNraWxsXCIpLCB7IHJlY3Vyc2l2ZTogdHJ1ZSB9KTtcblx0XHRcdGNvbnN0IHJvb3RTa2lsbCA9IGpvaW4oYWdlbnRzU2tpbGxzRGlyLCBcInJvb3QtZmlsZS5tZFwiKTtcblx0XHRcdGNvbnN0IG5lc3RlZFNraWxsID0gam9pbihhZ2VudHNTa2lsbHNEaXIsIFwibmVzdGVkLXNraWxsXCIsIFwiU0tJTEwubWRcIik7XG5cdFx0XHR3cml0ZUZpbGVTeW5jKHJvb3RTa2lsbCwgXCItLS1cXG5uYW1lOiByb290LWZpbGVcXG5kZXNjcmlwdGlvbjogUm9vdCBtYXJrZG93biBmaWxlXFxuLS0tXFxuXCIpO1xuXHRcdFx0d3JpdGVGaWxlU3luYyhuZXN0ZWRTa2lsbCwgXCItLS1cXG5uYW1lOiBuZXN0ZWQtc2tpbGxcXG5kZXNjcmlwdGlvbjogTmVzdGVkIHNraWxsXFxuLS0tXFxuXCIpO1xuXG5cdFx0XHRjb25zdCBwbSA9IG5ldyBEZWZhdWx0UGFja2FnZU1hbmFnZXIoe1xuXHRcdFx0XHRjd2Q6IGpvaW4odGVtcERpciwgXCJ3b3JrXCIpLFxuXHRcdFx0XHRhZ2VudERpcixcblx0XHRcdFx0c2V0dGluZ3NNYW5hZ2VyLFxuXHRcdFx0fSk7XG5cdFx0XHRta2RpclN5bmMoam9pbih0ZW1wRGlyLCBcIndvcmtcIiksIHsgcmVjdXJzaXZlOiB0cnVlIH0pO1xuXG5cdFx0XHRjb25zdCByZXN1bHQgPSBhd2FpdCBwbS5yZXNvbHZlKCk7XG5cdFx0XHRleHBlY3QocmVzdWx0LnNraWxscy5zb21lKChyKSA9PiByLnBhdGggPT09IHJvb3RTa2lsbCkpLnRvQmUoZmFsc2UpO1xuXHRcdFx0ZXhwZWN0KHJlc3VsdC5za2lsbHMuc29tZSgocikgPT4gci5wYXRoID09PSBuZXN0ZWRTa2lsbCAmJiByLmVuYWJsZWQpKS50b0JlKHRydWUpO1xuXHRcdH0pO1xuXG5cdFx0aXQoXCJzaG91bGQga2VlcCB+Ly5hZ2VudHMvc2tpbGxzIHVzZXItc2NvcGVkIHdoZW4gY3dkIGlzIHVuZGVyIGhvbWUgaW4gYSBub24tZ2l0IGRpcmVjdG9yeVwiLCBhc3luYyAoKSA9PiB7XG5cdFx0XHRjb25zdCBwcmV2aW91c0hvbWUgPSBwcm9jZXNzLmVudi5IT01FO1xuXHRcdFx0cHJvY2Vzcy5lbnYuSE9NRSA9IHRlbXBEaXI7XG5cblx0XHRcdHRyeSB7XG5cdFx0XHRcdGNvbnN0IGN3ZCA9IGpvaW4odGVtcERpciwgXCJzY3JhdGNoXCIsIFwibmVzdGVkXCIpO1xuXHRcdFx0XHRjb25zdCBsb2NhbEFnZW50RGlyID0gam9pbih0ZW1wRGlyLCBcIi5waVwiLCBcImFnZW50XCIpO1xuXHRcdFx0XHRjb25zdCBsb2NhbFNldHRpbmdzTWFuYWdlciA9IFNldHRpbmdzTWFuYWdlci5pbk1lbW9yeSgpO1xuXHRcdFx0XHRta2RpclN5bmMoY3dkLCB7IHJlY3Vyc2l2ZTogdHJ1ZSB9KTtcblx0XHRcdFx0bWtkaXJTeW5jKGxvY2FsQWdlbnREaXIsIHsgcmVjdXJzaXZlOiB0cnVlIH0pO1xuXG5cdFx0XHRcdGNvbnN0IGhvbWVTa2lsbCA9IGpvaW4odGVtcERpciwgXCIuYWdlbnRzXCIsIFwic2tpbGxzXCIsIFwiaG9tZS1za2lsbFwiLCBcIlNLSUxMLm1kXCIpO1xuXHRcdFx0XHRta2RpclN5bmMoam9pbih0ZW1wRGlyLCBcIi5hZ2VudHNcIiwgXCJza2lsbHNcIiwgXCJob21lLXNraWxsXCIpLCB7IHJlY3Vyc2l2ZTogdHJ1ZSB9KTtcblx0XHRcdFx0d3JpdGVGaWxlU3luYyhob21lU2tpbGwsIFwiLS0tXFxubmFtZTogaG9tZS1za2lsbFxcbmRlc2NyaXB0aW9uOiBob21lXFxuLS0tXFxuXCIpO1xuXG5cdFx0XHRcdGNvbnN0IHBtID0gbmV3IERlZmF1bHRQYWNrYWdlTWFuYWdlcih7XG5cdFx0XHRcdFx0Y3dkLFxuXHRcdFx0XHRcdGFnZW50RGlyOiBsb2NhbEFnZW50RGlyLFxuXHRcdFx0XHRcdHNldHRpbmdzTWFuYWdlcjogbG9jYWxTZXR0aW5nc01hbmFnZXIsXG5cdFx0XHRcdH0pO1xuXG5cdFx0XHRcdGNvbnN0IHJlc3VsdCA9IGF3YWl0IHBtLnJlc29sdmUoKTtcblx0XHRcdFx0Y29uc3QgbWF0Y2hpbmdTa2lsbHMgPSByZXN1bHQuc2tpbGxzLmZpbHRlcigocikgPT4gci5wYXRoID09PSBob21lU2tpbGwpO1xuXHRcdFx0XHRleHBlY3QobWF0Y2hpbmdTa2lsbHMpLnRvSGF2ZUxlbmd0aCgxKTtcblx0XHRcdFx0ZXhwZWN0KG1hdGNoaW5nU2tpbGxzWzBdPy5lbmFibGVkKS50b0JlKHRydWUpO1xuXHRcdFx0XHRleHBlY3QobWF0Y2hpbmdTa2lsbHNbMF0/Lm1ldGFkYXRhLnNjb3BlKS50b0JlKFwidXNlclwiKTtcblx0XHRcdFx0ZXhwZWN0KG1hdGNoaW5nU2tpbGxzWzBdPy5tZXRhZGF0YS5zb3VyY2UpLnRvQmUoXCJhdXRvXCIpO1xuXHRcdFx0fSBmaW5hbGx5IHtcblx0XHRcdFx0aWYgKHByZXZpb3VzSG9tZSA9PT0gdW5kZWZpbmVkKSB7XG5cdFx0XHRcdFx0ZGVsZXRlIHByb2Nlc3MuZW52LkhPTUU7XG5cdFx0XHRcdH0gZWxzZSB7XG5cdFx0XHRcdFx0cHJvY2Vzcy5lbnYuSE9NRSA9IHByZXZpb3VzSG9tZTtcblx0XHRcdFx0fVxuXHRcdFx0fVxuXHRcdH0pO1xuXG5cdFx0aXQoXCJzaG91bGQgZGVkdXBlIHVzZXIgc2tpbGwgZW50cmllcyB3aGVuIH4vLnBpL2FnZW50L3NraWxscyBpcyBhIHN5bWxpbmsgdG8gfi8uYWdlbnRzL3NraWxsc1wiLCBhc3luYyAoKSA9PiB7XG5cdFx0XHRjb25zdCBwcmV2aW91c0hvbWUgPSBwcm9jZXNzLmVudi5IT01FO1xuXHRcdFx0cHJvY2Vzcy5lbnYuSE9NRSA9IHRlbXBEaXI7XG5cblx0XHRcdHRyeSB7XG5cdFx0XHRcdGNvbnN0IGFnZW50U2tpbGxzRGlyID0gam9pbihhZ2VudERpciwgXCJza2lsbHNcIik7XG5cdFx0XHRcdGNvbnN0IGFnZW50c1NraWxsc0RpciA9IGpvaW4odGVtcERpciwgXCIuYWdlbnRzXCIsIFwic2tpbGxzXCIpO1xuXHRcdFx0XHRta2RpclN5bmMoYWdlbnRzU2tpbGxzRGlyLCB7IHJlY3Vyc2l2ZTogdHJ1ZSB9KTtcblx0XHRcdFx0Ly8gVXNlIGp1bmN0aW9uIG9uIFdpbmRvd3MgdG8gYXZvaWQgRVBFUk0gd2hlbiBzeW1saW5rIHByaXZpbGVnZXMgYXJlIHVuYXZhaWxhYmxlLlxuXHRcdFx0XHRjb25zdCBkaXJlY3RvcnlMaW5rVHlwZSA9IHByb2Nlc3MucGxhdGZvcm0gPT09IFwid2luMzJcIiA/IFwianVuY3Rpb25cIiA6IFwiZGlyXCI7XG5cdFx0XHRcdHN5bWxpbmtTeW5jKGFnZW50c1NraWxsc0RpciwgYWdlbnRTa2lsbHNEaXIsIGRpcmVjdG9yeUxpbmtUeXBlKTtcblxuXHRcdFx0XHRjb25zdCBza2lsbFBhdGggPSBqb2luKGFnZW50c1NraWxsc0RpciwgXCJmb29cIiwgXCJTS0lMTC5tZFwiKTtcblx0XHRcdFx0bWtkaXJTeW5jKGpvaW4oYWdlbnRzU2tpbGxzRGlyLCBcImZvb1wiKSwgeyByZWN1cnNpdmU6IHRydWUgfSk7XG5cdFx0XHRcdHdyaXRlRmlsZVN5bmMoc2tpbGxQYXRoLCBcIi0tLVxcbm5hbWU6IGZvb1xcbmRlc2NyaXB0aW9uOiBmb29cXG4tLS1cXG5cIik7XG5cblx0XHRcdFx0Y29uc3QgcmVzdWx0ID0gYXdhaXQgcGFja2FnZU1hbmFnZXIucmVzb2x2ZSgpO1xuXHRcdFx0XHRjb25zdCBmb29Ta2lsbHMgPSByZXN1bHQuc2tpbGxzLmZpbHRlcigocikgPT4gcGF0aEVuZHNXaXRoKHIucGF0aCwgXCJmb28vU0tJTEwubWRcIikpO1xuXG5cdFx0XHRcdGV4cGVjdChmb29Ta2lsbHMpLnRvSGF2ZUxlbmd0aCgxKTtcblx0XHRcdH0gZmluYWxseSB7XG5cdFx0XHRcdGlmIChwcmV2aW91c0hvbWUgPT09IHVuZGVmaW5lZCkge1xuXHRcdFx0XHRcdGRlbGV0ZSBwcm9jZXNzLmVudi5IT01FO1xuXHRcdFx0XHR9IGVsc2Uge1xuXHRcdFx0XHRcdHByb2Nlc3MuZW52LkhPTUUgPSBwcmV2aW91c0hvbWU7XG5cdFx0XHRcdH1cblx0XHRcdH1cblx0XHR9KTtcblx0fSk7XG5cblx0ZGVzY3JpYmUoXCJpZ25vcmUgZmlsZXNcIiwgKCkgPT4ge1xuXHRcdGl0KFwic2hvdWxkIHJlc3BlY3QgLmdpdGlnbm9yZSBpbiBza2lsbCBkaXJlY3Rvcmllc1wiLCBhc3luYyAoKSA9PiB7XG5cdFx0XHRjb25zdCBza2lsbHNEaXIgPSBqb2luKGFnZW50RGlyLCBcInNraWxsc1wiKTtcblx0XHRcdG1rZGlyU3luYyhza2lsbHNEaXIsIHsgcmVjdXJzaXZlOiB0cnVlIH0pO1xuXHRcdFx0d3JpdGVGaWxlU3luYyhqb2luKHNraWxsc0RpciwgXCIuZ2l0aWdub3JlXCIpLCBcInZlbnZcXG5fX3B5Y2FjaGVfX1xcblwiKTtcblxuXHRcdFx0Y29uc3QgZ29vZFNraWxsRGlyID0gam9pbihza2lsbHNEaXIsIFwiZ29vZC1za2lsbFwiKTtcblx0XHRcdG1rZGlyU3luYyhnb29kU2tpbGxEaXIsIHsgcmVjdXJzaXZlOiB0cnVlIH0pO1xuXHRcdFx0d3JpdGVGaWxlU3luYyhqb2luKGdvb2RTa2lsbERpciwgXCJTS0lMTC5tZFwiKSwgXCItLS1cXG5uYW1lOiBnb29kLXNraWxsXFxuZGVzY3JpcHRpb246IEdvb2RcXG4tLS1cXG5Db250ZW50XCIpO1xuXG5cdFx0XHRjb25zdCBpZ25vcmVkU2tpbGxEaXIgPSBqb2luKHNraWxsc0RpciwgXCJ2ZW52XCIsIFwiYmFkLXNraWxsXCIpO1xuXHRcdFx0bWtkaXJTeW5jKGlnbm9yZWRTa2lsbERpciwgeyByZWN1cnNpdmU6IHRydWUgfSk7XG5cdFx0XHR3cml0ZUZpbGVTeW5jKGpvaW4oaWdub3JlZFNraWxsRGlyLCBcIlNLSUxMLm1kXCIpLCBcIi0tLVxcbm5hbWU6IGJhZC1za2lsbFxcbmRlc2NyaXB0aW9uOiBCYWRcXG4tLS1cXG5Db250ZW50XCIpO1xuXG5cdFx0XHRzZXR0aW5nc01hbmFnZXIuc2V0U2tpbGxQYXRocyhbXCJza2lsbHNcIl0pO1xuXG5cdFx0XHRjb25zdCByZXN1bHQgPSBhd2FpdCBwYWNrYWdlTWFuYWdlci5yZXNvbHZlKCk7XG5cdFx0XHRleHBlY3QocmVzdWx0LnNraWxscy5zb21lKChyKSA9PiByLnBhdGguaW5jbHVkZXMoXCJnb29kLXNraWxsXCIpICYmIHIuZW5hYmxlZCkpLnRvQmUodHJ1ZSk7XG5cdFx0XHRleHBlY3QocmVzdWx0LnNraWxscy5zb21lKChyKSA9PiByLnBhdGguaW5jbHVkZXMoXCJ2ZW52XCIpICYmIHIuZW5hYmxlZCkpLnRvQmUoZmFsc2UpO1xuXHRcdH0pO1xuXG5cdFx0aXQoXCJzaG91bGQgbm90IGFwcGx5IHBhcmVudCAuZ2l0aWdub3JlIHRvIC5waSBhdXRvLWRpc2NvdmVyeVwiLCBhc3luYyAoKSA9PiB7XG5cdFx0XHR3cml0ZUZpbGVTeW5jKGpvaW4odGVtcERpciwgXCIuZ2l0aWdub3JlXCIpLCBcIi5waVxcblwiKTtcblxuXHRcdFx0Y29uc3Qgc2tpbGxEaXIgPSBqb2luKHRlbXBEaXIsIFwiLnBpXCIsIFwic2tpbGxzXCIsIFwiYXV0by1za2lsbFwiKTtcblx0XHRcdG1rZGlyU3luYyhza2lsbERpciwgeyByZWN1cnNpdmU6IHRydWUgfSk7XG5cdFx0XHRjb25zdCBza2lsbFBhdGggPSBqb2luKHNraWxsRGlyLCBcIlNLSUxMLm1kXCIpO1xuXHRcdFx0d3JpdGVGaWxlU3luYyhza2lsbFBhdGgsIFwiLS0tXFxubmFtZTogYXV0by1za2lsbFxcbmRlc2NyaXB0aW9uOiBBdXRvXFxuLS0tXFxuQ29udGVudFwiKTtcblxuXHRcdFx0Y29uc3QgcmVzdWx0ID0gYXdhaXQgcGFja2FnZU1hbmFnZXIucmVzb2x2ZSgpO1xuXHRcdFx0ZXhwZWN0KHJlc3VsdC5za2lsbHMuc29tZSgocikgPT4gci5wYXRoID09PSBza2lsbFBhdGggJiYgci5lbmFibGVkKSkudG9CZSh0cnVlKTtcblx0XHR9KTtcblx0fSk7XG5cblx0ZGVzY3JpYmUoXCJyZXNvbHZlRXh0ZW5zaW9uU291cmNlc1wiLCAoKSA9PiB7XG5cdFx0aXQoXCJzaG91bGQgcmVzb2x2ZSBsb2NhbCBwYXRoc1wiLCBhc3luYyAoKSA9PiB7XG5cdFx0XHRjb25zdCBleHRQYXRoID0gam9pbih0ZW1wRGlyLCBcImV4dC50c1wiKTtcblx0XHRcdHdyaXRlRmlsZVN5bmMoZXh0UGF0aCwgXCJleHBvcnQgZGVmYXVsdCBmdW5jdGlvbigpIHt9XCIpO1xuXG5cdFx0XHRjb25zdCByZXN1bHQgPSBhd2FpdCBwYWNrYWdlTWFuYWdlci5yZXNvbHZlRXh0ZW5zaW9uU291cmNlcyhbZXh0UGF0aF0pO1xuXHRcdFx0ZXhwZWN0KHJlc3VsdC5leHRlbnNpb25zLnNvbWUoKHIpID0+IHIucGF0aCA9PT0gZXh0UGF0aCAmJiByLmVuYWJsZWQpKS50b0JlKHRydWUpO1xuXHRcdH0pO1xuXG5cdFx0aXQoXCJzaG91bGQgaGFuZGxlIGRpcmVjdG9yaWVzIHdpdGggcGkgbWFuaWZlc3RcIiwgYXN5bmMgKCkgPT4ge1xuXHRcdFx0Y29uc3QgcGtnRGlyID0gam9pbih0ZW1wRGlyLCBcIm15LXBhY2thZ2VcIik7XG5cdFx0XHRta2RpclN5bmMocGtnRGlyLCB7IHJlY3Vyc2l2ZTogdHJ1ZSB9KTtcblx0XHRcdHdyaXRlRmlsZVN5bmMoXG5cdFx0XHRcdGpvaW4ocGtnRGlyLCBcInBhY2thZ2UuanNvblwiKSxcblx0XHRcdFx0SlNPTi5zdHJpbmdpZnkoe1xuXHRcdFx0XHRcdG5hbWU6IFwibXktcGFja2FnZVwiLFxuXHRcdFx0XHRcdHBpOiB7XG5cdFx0XHRcdFx0XHRleHRlbnNpb25zOiBbXCIuL3NyYy9pbmRleC50c1wiXSxcblx0XHRcdFx0XHRcdHNraWxsczogW1wiLi9za2lsbHNcIl0sXG5cdFx0XHRcdFx0fSxcblx0XHRcdFx0fSksXG5cdFx0XHQpO1xuXHRcdFx0bWtkaXJTeW5jKGpvaW4ocGtnRGlyLCBcInNyY1wiKSwgeyByZWN1cnNpdmU6IHRydWUgfSk7XG5cdFx0XHR3cml0ZUZpbGVTeW5jKGpvaW4ocGtnRGlyLCBcInNyY1wiLCBcImluZGV4LnRzXCIpLCBcImV4cG9ydCBkZWZhdWx0IGZ1bmN0aW9uKCkge31cIik7XG5cdFx0XHRta2RpclN5bmMoam9pbihwa2dEaXIsIFwic2tpbGxzXCIsIFwibXktc2tpbGxcIiksIHsgcmVjdXJzaXZlOiB0cnVlIH0pO1xuXHRcdFx0d3JpdGVGaWxlU3luYyhcblx0XHRcdFx0am9pbihwa2dEaXIsIFwic2tpbGxzXCIsIFwibXktc2tpbGxcIiwgXCJTS0lMTC5tZFwiKSxcblx0XHRcdFx0XCItLS1cXG5uYW1lOiBteS1za2lsbFxcbmRlc2NyaXB0aW9uOiBUZXN0XFxuLS0tXFxuQ29udGVudFwiLFxuXHRcdFx0KTtcblxuXHRcdFx0Y29uc3QgcmVzdWx0ID0gYXdhaXQgcGFja2FnZU1hbmFnZXIucmVzb2x2ZUV4dGVuc2lvblNvdXJjZXMoW3BrZ0Rpcl0pO1xuXHRcdFx0ZXhwZWN0KHJlc3VsdC5leHRlbnNpb25zLnNvbWUoKHIpID0+IHIucGF0aCA9PT0gam9pbihwa2dEaXIsIFwic3JjXCIsIFwiaW5kZXgudHNcIikgJiYgci5lbmFibGVkKSkudG9CZSh0cnVlKTtcblx0XHRcdC8vIFNraWxscyB3aXRoIFNLSUxMLm1kIGFyZSByZXR1cm5lZCBhcyBmaWxlIHBhdGhzXG5cdFx0XHRleHBlY3QocmVzdWx0LnNraWxscy5zb21lKChyKSA9PiByLnBhdGggPT09IGpvaW4ocGtnRGlyLCBcInNraWxsc1wiLCBcIm15LXNraWxsXCIsIFwiU0tJTEwubWRcIikgJiYgci5lbmFibGVkKSkudG9CZShcblx0XHRcdFx0dHJ1ZSxcblx0XHRcdCk7XG5cdFx0fSk7XG5cblx0XHRpdChcInNob3VsZCBoYW5kbGUgZGlyZWN0b3JpZXMgd2l0aCBhdXRvLWRpc2NvdmVyeSBsYXlvdXRcIiwgYXN5bmMgKCkgPT4ge1xuXHRcdFx0Y29uc3QgcGtnRGlyID0gam9pbih0ZW1wRGlyLCBcImF1dG8tcGtnXCIpO1xuXHRcdFx0bWtkaXJTeW5jKGpvaW4ocGtnRGlyLCBcImV4dGVuc2lvbnNcIiksIHsgcmVjdXJzaXZlOiB0cnVlIH0pO1xuXHRcdFx0bWtkaXJTeW5jKGpvaW4ocGtnRGlyLCBcInRoZW1lc1wiKSwgeyByZWN1cnNpdmU6IHRydWUgfSk7XG5cdFx0XHR3cml0ZUZpbGVTeW5jKGpvaW4ocGtnRGlyLCBcImV4dGVuc2lvbnNcIiwgXCJtYWluLnRzXCIpLCBcImV4cG9ydCBkZWZhdWx0IGZ1bmN0aW9uKCkge31cIik7XG5cdFx0XHR3cml0ZUZpbGVTeW5jKGpvaW4ocGtnRGlyLCBcInRoZW1lc1wiLCBcImRhcmsuanNvblwiKSwgXCJ7fVwiKTtcblxuXHRcdFx0Y29uc3QgcmVzdWx0ID0gYXdhaXQgcGFja2FnZU1hbmFnZXIucmVzb2x2ZUV4dGVuc2lvblNvdXJjZXMoW3BrZ0Rpcl0pO1xuXHRcdFx0ZXhwZWN0KHJlc3VsdC5leHRlbnNpb25zLnNvbWUoKHIpID0+IHBhdGhFbmRzV2l0aChyLnBhdGgsIFwibWFpbi50c1wiKSAmJiByLmVuYWJsZWQpKS50b0JlKHRydWUpO1xuXHRcdFx0ZXhwZWN0KHJlc3VsdC50aGVtZXMuc29tZSgocikgPT4gcGF0aEVuZHNXaXRoKHIucGF0aCwgXCJkYXJrLmpzb25cIikgJiYgci5lbmFibGVkKSkudG9CZSh0cnVlKTtcblx0XHR9KTtcblxuXHRcdGl0KFwic2hvdWxkIHN0b3AgcmVjdXJzaW5nIHdoZW4gYSBwYWNrYWdlIHNraWxsIGRpcmVjdG9yeSBjb250YWlucyBTS0lMTC5tZFwiLCBhc3luYyAoKSA9PiB7XG5cdFx0XHRjb25zdCBwa2dEaXIgPSBqb2luKHRlbXBEaXIsIFwic2tpbGwtcm9vdC1wa2dcIik7XG5cdFx0XHRta2RpclN5bmMoam9pbihwa2dEaXIsIFwic2tpbGxzXCIsIFwicm9vdC1za2lsbFwiLCBcIm5lc3RlZC1za2lsbFwiKSwgeyByZWN1cnNpdmU6IHRydWUgfSk7XG5cdFx0XHRjb25zdCByb290U2tpbGwgPSBqb2luKHBrZ0RpciwgXCJza2lsbHNcIiwgXCJyb290LXNraWxsXCIsIFwiU0tJTEwubWRcIik7XG5cdFx0XHRjb25zdCBuZXN0ZWRTa2lsbCA9IGpvaW4ocGtnRGlyLCBcInNraWxsc1wiLCBcInJvb3Qtc2tpbGxcIiwgXCJuZXN0ZWQtc2tpbGxcIiwgXCJTS0lMTC5tZFwiKTtcblx0XHRcdHdyaXRlRmlsZVN5bmMocm9vdFNraWxsLCBcIi0tLVxcbm5hbWU6IHJvb3Qtc2tpbGxcXG5kZXNjcmlwdGlvbjogUm9vdCBza2lsbFxcbi0tLVxcblwiKTtcblx0XHRcdHdyaXRlRmlsZVN5bmMobmVzdGVkU2tpbGwsIFwiLS0tXFxubmFtZTogbmVzdGVkLXNraWxsXFxuZGVzY3JpcHRpb246IE5lc3RlZCBza2lsbFxcbi0tLVxcblwiKTtcblxuXHRcdFx0Y29uc3QgcmVzdWx0ID0gYXdhaXQgcGFja2FnZU1hbmFnZXIucmVzb2x2ZUV4dGVuc2lvblNvdXJjZXMoW3BrZ0Rpcl0pO1xuXHRcdFx0ZXhwZWN0KHJlc3VsdC5za2lsbHMuc29tZSgocikgPT4gci5wYXRoID09PSByb290U2tpbGwgJiYgci5lbmFibGVkKSkudG9CZSh0cnVlKTtcblx0XHRcdGV4cGVjdChyZXN1bHQuc2tpbGxzLnNvbWUoKHIpID0+IHIucGF0aCA9PT0gbmVzdGVkU2tpbGwpKS50b0JlKGZhbHNlKTtcblx0XHR9KTtcblx0fSk7XG5cblx0ZGVzY3JpYmUoXCJwcm9ncmVzcyBjYWxsYmFja1wiLCAoKSA9PiB7XG5cdFx0aXQoXCJzaG91bGQgZW1pdCBwcm9ncmVzcyBldmVudHNcIiwgYXN5bmMgKCkgPT4ge1xuXHRcdFx0Y29uc3QgZXZlbnRzOiBQcm9ncmVzc0V2ZW50W10gPSBbXTtcblx0XHRcdHBhY2thZ2VNYW5hZ2VyLnNldFByb2dyZXNzQ2FsbGJhY2soKGV2ZW50KSA9PiBldmVudHMucHVzaChldmVudCkpO1xuXG5cdFx0XHRjb25zdCBleHRQYXRoID0gam9pbih0ZW1wRGlyLCBcImV4dC50c1wiKTtcblx0XHRcdHdyaXRlRmlsZVN5bmMoZXh0UGF0aCwgXCJleHBvcnQgZGVmYXVsdCBmdW5jdGlvbigpIHt9XCIpO1xuXG5cdFx0XHQvLyBMb2NhbCBwYXRocyBkb24ndCB0cmlnZ2VyIGluc3RhbGwgcHJvZ3Jlc3MsIGJ1dCB3ZSBjYW4gdmVyaWZ5IHRoZSBjYWxsYmFjayBpcyBzZXRcblx0XHRcdGF3YWl0IHBhY2thZ2VNYW5hZ2VyLnJlc29sdmVFeHRlbnNpb25Tb3VyY2VzKFtleHRQYXRoXSk7XG5cblx0XHRcdC8vIEZvciBub3cganVzdCB2ZXJpZnkgbm8gZXJyb3JzIC0gbnBtL2dpdCB3b3VsZCB0cmlnZ2VyIGFjdHVhbCBldmVudHNcblx0XHRcdGV4cGVjdChldmVudHMubGVuZ3RoKS50b0JlKDApO1xuXHRcdH0pO1xuXHR9KTtcblxuXHRkZXNjcmliZShcIndpbmRvd3MgY29tbWFuZCBzcGF3bmluZ1wiLCAoKSA9PiB7XG5cdFx0aXQoXCJzaG91bGQgYXZvaWQgdGhlIHNoZWxsIGZvciBnaXQgc28gV2luZG93cyBwYXRocyB3aXRoIHNwYWNlcyBzdGF5IHNpbmdsZSBhcmd1bWVudHNcIiwgKCkgPT4ge1xuXHRcdFx0dmkuc3B5T24ocHJvY2VzcywgXCJwbGF0Zm9ybVwiLCBcImdldFwiKS5tb2NrUmV0dXJuVmFsdWUoXCJ3aW4zMlwiKTtcblx0XHRcdGNvbnN0IG1hbmFnZXJXaXRoSW50ZXJuYWxzID0gcGFja2FnZU1hbmFnZXIgYXMgdW5rbm93biBhcyB7XG5cdFx0XHRcdHNob3VsZFVzZVdpbmRvd3NTaGVsbChjb21tYW5kOiBzdHJpbmcpOiBib29sZWFuO1xuXHRcdFx0fTtcblxuXHRcdFx0ZXhwZWN0KG1hbmFnZXJXaXRoSW50ZXJuYWxzLnNob3VsZFVzZVdpbmRvd3NTaGVsbChcImdpdFwiKSkudG9CZShmYWxzZSk7XG5cdFx0XHRleHBlY3QobWFuYWdlcldpdGhJbnRlcm5hbHMuc2hvdWxkVXNlV2luZG93c1NoZWxsKFwibnBtXCIpKS50b0JlKHRydWUpO1xuXHRcdFx0ZXhwZWN0KG1hbmFnZXJXaXRoSW50ZXJuYWxzLnNob3VsZFVzZVdpbmRvd3NTaGVsbChcInBucG1cIikpLnRvQmUodHJ1ZSk7XG5cdFx0XHRleHBlY3QobWFuYWdlcldpdGhJbnRlcm5hbHMuc2hvdWxkVXNlV2luZG93c1NoZWxsKFwiQzovUHJvZ3JhbSBGaWxlcy9ub2RlanMvbnBtLmNtZFwiKSkudG9CZSh0cnVlKTtcblx0XHR9KTtcblx0fSk7XG5cblx0ZGVzY3JpYmUoXCJucG1Db21tYW5kXCIsICgpID0+IHtcblx0XHRpdChcInNob3VsZCB1c2UgbnBtQ29tbWFuZCBhcmd2IGZvciBucG0gaW5zdGFsbHNcIiwgYXN5bmMgKCkgPT4ge1xuXHRcdFx0c2V0dGluZ3NNYW5hZ2VyID0gU2V0dGluZ3NNYW5hZ2VyLmluTWVtb3J5KHtcblx0XHRcdFx0bnBtQ29tbWFuZDogW1wibWlzZVwiLCBcImV4ZWNcIiwgXCJub2RlQDIwXCIsIFwiLS1cIiwgXCJucG1cIl0sXG5cdFx0XHR9KTtcblx0XHRcdHBhY2thZ2VNYW5hZ2VyID0gbmV3IERlZmF1bHRQYWNrYWdlTWFuYWdlcih7XG5cdFx0XHRcdGN3ZDogdGVtcERpcixcblx0XHRcdFx0YWdlbnREaXIsXG5cdFx0XHRcdHNldHRpbmdzTWFuYWdlcixcblx0XHRcdH0pO1xuXG5cdFx0XHRjb25zdCBydW5Db21tYW5kU3B5ID0gdmkuc3B5T24ocGFja2FnZU1hbmFnZXIgYXMgYW55LCBcInJ1bkNvbW1hbmRcIikubW9ja1Jlc29sdmVkVmFsdWUodW5kZWZpbmVkKTtcblxuXHRcdFx0YXdhaXQgcGFja2FnZU1hbmFnZXIuaW5zdGFsbChcIm5wbTpAc2NvcGUvcGtnXCIpO1xuXG5cdFx0XHRleHBlY3QocnVuQ29tbWFuZFNweSkudG9IYXZlQmVlbkNhbGxlZFdpdGgoXG5cdFx0XHRcdFwibWlzZVwiLFxuXHRcdFx0XHRbXCJleGVjXCIsIFwibm9kZUAyMFwiLCBcIi0tXCIsIFwibnBtXCIsIFwiaW5zdGFsbFwiLCBcIi1nXCIsIFwiQHNjb3BlL3BrZ1wiXSxcblx0XHRcdFx0dW5kZWZpbmVkLFxuXHRcdFx0KTtcblx0XHR9KTtcblxuXHRcdGl0KFwic2hvdWxkIGluc3RhbGwgZ2l0IHBhY2thZ2UgZGVwZW5kZW5jaWVzIHdpdGggLS1vbWl0PWRldlwiLCBhc3luYyAoKSA9PiB7XG5cdFx0XHRjb25zdCBzb3VyY2UgPSBcImdpdDpnaXRodWIuY29tL3VzZXIvcmVwb1wiO1xuXHRcdFx0Y29uc3QgdGFyZ2V0RGlyID0gam9pbihhZ2VudERpciwgXCJnaXRcIiwgXCJnaXRodWIuY29tXCIsIFwidXNlclwiLCBcInJlcG9cIik7XG5cdFx0XHRjb25zdCBydW5Db21tYW5kU3B5ID0gdmlcblx0XHRcdFx0LnNweU9uKHBhY2thZ2VNYW5hZ2VyIGFzIGFueSwgXCJydW5Db21tYW5kXCIpXG5cdFx0XHRcdC5tb2NrSW1wbGVtZW50YXRpb24oYXN5bmMgKC4uLmNhbGxBcmdzOiB1bmtub3duW10pID0+IHtcblx0XHRcdFx0XHRjb25zdCBbY29tbWFuZCwgYXJnc10gPSBjYWxsQXJncyBhcyBbc3RyaW5nLCBzdHJpbmdbXV07XG5cdFx0XHRcdFx0aWYgKGNvbW1hbmQgPT09IFwiZ2l0XCIgJiYgYXJnc1swXSA9PT0gXCJjbG9uZVwiKSB7XG5cdFx0XHRcdFx0XHRta2RpclN5bmModGFyZ2V0RGlyLCB7IHJlY3Vyc2l2ZTogdHJ1ZSB9KTtcblx0XHRcdFx0XHRcdHdyaXRlRmlsZVN5bmMoam9pbih0YXJnZXREaXIsIFwicGFja2FnZS5qc29uXCIpLCBKU09OLnN0cmluZ2lmeSh7IG5hbWU6IFwicmVwb1wiLCB2ZXJzaW9uOiBcIjEuMC4wXCIgfSkpO1xuXHRcdFx0XHRcdH1cblx0XHRcdFx0fSk7XG5cblx0XHRcdGF3YWl0IHBhY2thZ2VNYW5hZ2VyLmluc3RhbGwoc291cmNlKTtcblxuXHRcdFx0ZXhwZWN0KHJ1bkNvbW1hbmRTcHkpLnRvSGF2ZUJlZW5DYWxsZWRXaXRoKFwibnBtXCIsIFtcImluc3RhbGxcIiwgXCItLW9taXQ9ZGV2XCJdLCB7IGN3ZDogdGFyZ2V0RGlyIH0pO1xuXHRcdH0pO1xuXG5cdFx0aXQoXCJzaG91bGQgdXNlIHBsYWluIGluc3RhbGwgZm9yIGdpdCBwYWNrYWdlIGRlcGVuZGVuY2llcyB3aGVuIG5wbUNvbW1hbmQgaXMgY29uZmlndXJlZFwiLCBhc3luYyAoKSA9PiB7XG5cdFx0XHRzZXR0aW5nc01hbmFnZXIgPSBTZXR0aW5nc01hbmFnZXIuaW5NZW1vcnkoe1xuXHRcdFx0XHRucG1Db21tYW5kOiBbXCJwbnBtXCJdLFxuXHRcdFx0fSk7XG5cdFx0XHRwYWNrYWdlTWFuYWdlciA9IG5ldyBEZWZhdWx0UGFja2FnZU1hbmFnZXIoe1xuXHRcdFx0XHRjd2Q6IHRlbXBEaXIsXG5cdFx0XHRcdGFnZW50RGlyLFxuXHRcdFx0XHRzZXR0aW5nc01hbmFnZXIsXG5cdFx0XHR9KTtcblxuXHRcdFx0Y29uc3Qgc291cmNlID0gXCJnaXQ6Z2l0aHViLmNvbS91c2VyL3JlcG9cIjtcblx0XHRcdGNvbnN0IHRhcmdldERpciA9IGpvaW4oYWdlbnREaXIsIFwiZ2l0XCIsIFwiZ2l0aHViLmNvbVwiLCBcInVzZXJcIiwgXCJyZXBvXCIpO1xuXHRcdFx0Y29uc3QgcnVuQ29tbWFuZFNweSA9IHZpXG5cdFx0XHRcdC5zcHlPbihwYWNrYWdlTWFuYWdlciBhcyBhbnksIFwicnVuQ29tbWFuZFwiKVxuXHRcdFx0XHQubW9ja0ltcGxlbWVudGF0aW9uKGFzeW5jICguLi5jYWxsQXJnczogdW5rbm93bltdKSA9PiB7XG5cdFx0XHRcdFx0Y29uc3QgW2NvbW1hbmQsIGFyZ3NdID0gY2FsbEFyZ3MgYXMgW3N0cmluZywgc3RyaW5nW11dO1xuXHRcdFx0XHRcdGlmIChjb21tYW5kID09PSBcImdpdFwiICYmIGFyZ3NbMF0gPT09IFwiY2xvbmVcIikge1xuXHRcdFx0XHRcdFx0bWtkaXJTeW5jKHRhcmdldERpciwgeyByZWN1cnNpdmU6IHRydWUgfSk7XG5cdFx0XHRcdFx0XHR3cml0ZUZpbGVTeW5jKGpvaW4odGFyZ2V0RGlyLCBcInBhY2thZ2UuanNvblwiKSwgSlNPTi5zdHJpbmdpZnkoeyBuYW1lOiBcInJlcG9cIiwgdmVyc2lvbjogXCIxLjAuMFwiIH0pKTtcblx0XHRcdFx0XHR9XG5cdFx0XHRcdH0pO1xuXG5cdFx0XHRhd2FpdCBwYWNrYWdlTWFuYWdlci5pbnN0YWxsKHNvdXJjZSk7XG5cblx0XHRcdGV4cGVjdChydW5Db21tYW5kU3B5KS50b0hhdmVCZWVuQ2FsbGVkV2l0aChcInBucG1cIiwgW1wiaW5zdGFsbFwiXSwgeyBjd2Q6IHRhcmdldERpciB9KTtcblx0XHR9KTtcblxuXHRcdGl0KFwic2hvdWxkIHVwZGF0ZSBnaXQgcGFja2FnZSBkZXBlbmRlbmNpZXMgd2l0aCAtLW9taXQ9ZGV2XCIsIGFzeW5jICgpID0+IHtcblx0XHRcdGNvbnN0IHNvdXJjZSA9IFwiZ2l0OmdpdGh1Yi5jb20vdXNlci9yZXBvXCI7XG5cdFx0XHRjb25zdCB0YXJnZXREaXIgPSBqb2luKHRlbXBEaXIsIFwiLnBpXCIsIFwiZ2l0XCIsIFwiZ2l0aHViLmNvbVwiLCBcInVzZXJcIiwgXCJyZXBvXCIpO1xuXHRcdFx0bWtkaXJTeW5jKHRhcmdldERpciwgeyByZWN1cnNpdmU6IHRydWUgfSk7XG5cdFx0XHR3cml0ZUZpbGVTeW5jKGpvaW4odGFyZ2V0RGlyLCBcInBhY2thZ2UuanNvblwiKSwgSlNPTi5zdHJpbmdpZnkoeyBuYW1lOiBcInJlcG9cIiwgdmVyc2lvbjogXCIxLjAuMFwiIH0pKTtcblx0XHRcdHNldHRpbmdzTWFuYWdlci5zZXRQcm9qZWN0UGFja2FnZXMoW3NvdXJjZV0pO1xuXG5cdFx0XHR2aS5zcHlPbihwYWNrYWdlTWFuYWdlciBhcyBhbnksIFwicnVuQ29tbWFuZENhcHR1cmVcIikubW9ja0ltcGxlbWVudGF0aW9uKGFzeW5jICguLi5jYWxsQXJnczogdW5rbm93bltdKSA9PiB7XG5cdFx0XHRcdGNvbnN0IFtfY29tbWFuZCwgYXJnc10gPSBjYWxsQXJncyBhcyBbc3RyaW5nLCBzdHJpbmdbXV07XG5cdFx0XHRcdGlmIChhcmdzWzBdID09PSBcInJldi1wYXJzZVwiICYmIGFyZ3NbMV0gPT09IFwiLS1hYmJyZXYtcmVmXCIgJiYgYXJnc1syXSA9PT0gXCJAe3Vwc3RyZWFtfVwiKSB7XG5cdFx0XHRcdFx0cmV0dXJuIFwib3JpZ2luL21haW5cIjtcblx0XHRcdFx0fVxuXHRcdFx0XHRpZiAoYXJnc1swXSA9PT0gXCJyZXYtcGFyc2VcIiAmJiBhcmdzWzFdID09PSBcIkB7dXBzdHJlYW19XCIpIHtcblx0XHRcdFx0XHRyZXR1cm4gXCJyZW1vdGUtaGVhZFwiO1xuXHRcdFx0XHR9XG5cdFx0XHRcdGlmIChhcmdzWzBdID09PSBcInJldi1wYXJzZVwiICYmIGFyZ3NbMV0gPT09IFwiSEVBRFwiKSB7XG5cdFx0XHRcdFx0cmV0dXJuIFwibG9jYWwtaGVhZFwiO1xuXHRcdFx0XHR9XG5cdFx0XHRcdHRocm93IG5ldyBFcnJvcihgVW5leHBlY3RlZCBydW5Db21tYW5kQ2FwdHVyZSBhcmdzOiAke2FyZ3Muam9pbihcIiBcIil9YCk7XG5cdFx0XHR9KTtcblx0XHRcdGNvbnN0IHJ1bkNvbW1hbmRTcHkgPSB2aS5zcHlPbihwYWNrYWdlTWFuYWdlciBhcyBhbnksIFwicnVuQ29tbWFuZFwiKS5tb2NrUmVzb2x2ZWRWYWx1ZSh1bmRlZmluZWQpO1xuXG5cdFx0XHRhd2FpdCBwYWNrYWdlTWFuYWdlci51cGRhdGUoc291cmNlKTtcblxuXHRcdFx0ZXhwZWN0KHJ1bkNvbW1hbmRTcHkpLnRvSGF2ZUJlZW5DYWxsZWRXaXRoKFwibnBtXCIsIFtcImluc3RhbGxcIiwgXCItLW9taXQ9ZGV2XCJdLCB7IGN3ZDogdGFyZ2V0RGlyIH0pO1xuXHRcdH0pO1xuXG5cdFx0aXQoXCJzaG91bGQgdXNlIHBsYWluIGluc3RhbGwgdGhyb3VnaCBucG1Db21tYW5kIGFyZ3Ygd2hlbiB1cGRhdGluZyBnaXQgcGFja2FnZSBkZXBlbmRlbmNpZXNcIiwgYXN5bmMgKCkgPT4ge1xuXHRcdFx0c2V0dGluZ3NNYW5hZ2VyID0gU2V0dGluZ3NNYW5hZ2VyLmluTWVtb3J5KHtcblx0XHRcdFx0bnBtQ29tbWFuZDogW1wibWlzZVwiLCBcImV4ZWNcIiwgXCJub2RlQDIwXCIsIFwiLS1cIiwgXCJwbnBtXCJdLFxuXHRcdFx0fSk7XG5cdFx0XHRwYWNrYWdlTWFuYWdlciA9IG5ldyBEZWZhdWx0UGFja2FnZU1hbmFnZXIoe1xuXHRcdFx0XHRjd2Q6IHRlbXBEaXIsXG5cdFx0XHRcdGFnZW50RGlyLFxuXHRcdFx0XHRzZXR0aW5nc01hbmFnZXIsXG5cdFx0XHR9KTtcblxuXHRcdFx0Y29uc3Qgc291cmNlID0gXCJnaXQ6Z2l0aHViLmNvbS91c2VyL3JlcG9cIjtcblx0XHRcdGNvbnN0IHRhcmdldERpciA9IGpvaW4odGVtcERpciwgXCIucGlcIiwgXCJnaXRcIiwgXCJnaXRodWIuY29tXCIsIFwidXNlclwiLCBcInJlcG9cIik7XG5cdFx0XHRta2RpclN5bmModGFyZ2V0RGlyLCB7IHJlY3Vyc2l2ZTogdHJ1ZSB9KTtcblx0XHRcdHdyaXRlRmlsZVN5bmMoam9pbih0YXJnZXREaXIsIFwicGFja2FnZS5qc29uXCIpLCBKU09OLnN0cmluZ2lmeSh7IG5hbWU6IFwicmVwb1wiLCB2ZXJzaW9uOiBcIjEuMC4wXCIgfSkpO1xuXHRcdFx0c2V0dGluZ3NNYW5hZ2VyLnNldFByb2plY3RQYWNrYWdlcyhbc291cmNlXSk7XG5cblx0XHRcdHZpLnNweU9uKHBhY2thZ2VNYW5hZ2VyIGFzIGFueSwgXCJydW5Db21tYW5kQ2FwdHVyZVwiKS5tb2NrSW1wbGVtZW50YXRpb24oYXN5bmMgKC4uLmNhbGxBcmdzOiB1bmtub3duW10pID0+IHtcblx0XHRcdFx0Y29uc3QgW19jb21tYW5kLCBhcmdzXSA9IGNhbGxBcmdzIGFzIFtzdHJpbmcsIHN0cmluZ1tdXTtcblx0XHRcdFx0aWYgKGFyZ3NbMF0gPT09IFwicmV2LXBhcnNlXCIgJiYgYXJnc1sxXSA9PT0gXCItLWFiYnJldi1yZWZcIiAmJiBhcmdzWzJdID09PSBcIkB7dXBzdHJlYW19XCIpIHtcblx0XHRcdFx0XHRyZXR1cm4gXCJvcmlnaW4vbWFpblwiO1xuXHRcdFx0XHR9XG5cdFx0XHRcdGlmIChhcmdzWzBdID09PSBcInJldi1wYXJzZVwiICYmIGFyZ3NbMV0gPT09IFwiQHt1cHN0cmVhbX1cIikge1xuXHRcdFx0XHRcdHJldHVybiBcInJlbW90ZS1oZWFkXCI7XG5cdFx0XHRcdH1cblx0XHRcdFx0aWYgKGFyZ3NbMF0gPT09IFwicmV2LXBhcnNlXCIgJiYgYXJnc1sxXSA9PT0gXCJIRUFEXCIpIHtcblx0XHRcdFx0XHRyZXR1cm4gXCJsb2NhbC1oZWFkXCI7XG5cdFx0XHRcdH1cblx0XHRcdFx0dGhyb3cgbmV3IEVycm9yKGBVbmV4cGVjdGVkIHJ1bkNvbW1hbmRDYXB0dXJlIGFyZ3M6ICR7YXJncy5qb2luKFwiIFwiKX1gKTtcblx0XHRcdH0pO1xuXHRcdFx0Y29uc3QgcnVuQ29tbWFuZFNweSA9IHZpLnNweU9uKHBhY2thZ2VNYW5hZ2VyIGFzIGFueSwgXCJydW5Db21tYW5kXCIpLm1vY2tSZXNvbHZlZFZhbHVlKHVuZGVmaW5lZCk7XG5cblx0XHRcdGF3YWl0IHBhY2thZ2VNYW5hZ2VyLnVwZGF0ZShzb3VyY2UpO1xuXG5cdFx0XHRleHBlY3QocnVuQ29tbWFuZFNweSkudG9IYXZlQmVlbkNhbGxlZFdpdGgoXCJtaXNlXCIsIFtcImV4ZWNcIiwgXCJub2RlQDIwXCIsIFwiLS1cIiwgXCJwbnBtXCIsIFwiaW5zdGFsbFwiXSwge1xuXHRcdFx0XHRjd2Q6IHRhcmdldERpcixcblx0XHRcdH0pO1xuXHRcdH0pO1xuXG5cdFx0aXQoXCJzaG91bGQgdXNlIG5wbUNvbW1hbmQgYXJndiBmb3IgbnBtIHJvb3QgbG9va3VwIGFuZCBpbnZhbGlkYXRlIGNhY2hlZCByb290IHdoZW4gbnBtQ29tbWFuZCBjaGFuZ2VzXCIsICgpID0+IHtcblx0XHRcdHNldHRpbmdzTWFuYWdlciA9IFNldHRpbmdzTWFuYWdlci5pbk1lbW9yeSh7XG5cdFx0XHRcdG5wbUNvbW1hbmQ6IFtcIm1pc2VcIiwgXCJleGVjXCIsIFwibm9kZUAyMFwiLCBcIi0tXCIsIFwibnBtXCJdLFxuXHRcdFx0fSk7XG5cdFx0XHRwYWNrYWdlTWFuYWdlciA9IG5ldyBEZWZhdWx0UGFja2FnZU1hbmFnZXIoe1xuXHRcdFx0XHRjd2Q6IHRlbXBEaXIsXG5cdFx0XHRcdGFnZW50RGlyLFxuXHRcdFx0XHRzZXR0aW5nc01hbmFnZXIsXG5cdFx0XHR9KTtcblxuXHRcdFx0Y29uc3Qgcm9vdDIwID0gam9pbih0ZW1wRGlyLCBcIm5vZGUyMFwiLCBcImxpYlwiLCBcIm5vZGVfbW9kdWxlc1wiKTtcblx0XHRcdGNvbnN0IHJvb3QyMiA9IGpvaW4odGVtcERpciwgXCJub2RlMjJcIiwgXCJsaWJcIiwgXCJub2RlX21vZHVsZXNcIik7XG5cdFx0XHRta2RpclN5bmMoam9pbihyb290MjAsIFwiQHNjb3BlXCIsIFwicGtnXCIpLCB7IHJlY3Vyc2l2ZTogdHJ1ZSB9KTtcblxuXHRcdFx0Y29uc3QgcnVuQ29tbWFuZFN5bmNTcHkgPSB2aVxuXHRcdFx0XHQuc3B5T24ocGFja2FnZU1hbmFnZXIgYXMgYW55LCBcInJ1bkNvbW1hbmRTeW5jXCIpXG5cdFx0XHRcdC5tb2NrSW1wbGVtZW50YXRpb24oKC4uLmNhbGxBcmdzOiB1bmtub3duW10pID0+IHtcblx0XHRcdFx0XHRjb25zdCBbY29tbWFuZCwgYXJnc10gPSBjYWxsQXJncyBhcyBbc3RyaW5nLCBzdHJpbmdbXV07XG5cdFx0XHRcdFx0aWYgKGNvbW1hbmQgIT09IFwibWlzZVwiKSB7XG5cdFx0XHRcdFx0XHR0aHJvdyBuZXcgRXJyb3IoYHVuZXhwZWN0ZWQgY29tbWFuZCAke2NvbW1hbmR9YCk7XG5cdFx0XHRcdFx0fVxuXHRcdFx0XHRcdGlmIChhcmdzWzFdID09PSBcIm5vZGVAMjBcIikge1xuXHRcdFx0XHRcdFx0cmV0dXJuIHJvb3QyMDtcblx0XHRcdFx0XHR9XG5cdFx0XHRcdFx0aWYgKGFyZ3NbMV0gPT09IFwibm9kZUAyMlwiKSB7XG5cdFx0XHRcdFx0XHRyZXR1cm4gcm9vdDIyO1xuXHRcdFx0XHRcdH1cblx0XHRcdFx0XHR0aHJvdyBuZXcgRXJyb3IoYHVuZXhwZWN0ZWQgYXJncyAke2FyZ3Muam9pbihcIiBcIil9YCk7XG5cdFx0XHRcdH0pO1xuXG5cdFx0XHRleHBlY3QocGFja2FnZU1hbmFnZXIuZ2V0SW5zdGFsbGVkUGF0aChcIm5wbTpAc2NvcGUvcGtnXCIsIFwidXNlclwiKSkudG9CZShqb2luKHJvb3QyMCwgXCJAc2NvcGVcIiwgXCJwa2dcIikpO1xuXHRcdFx0ZXhwZWN0KHJ1bkNvbW1hbmRTeW5jU3B5KS50b0hhdmVCZWVuTnRoQ2FsbGVkV2l0aCgxLCBcIm1pc2VcIiwgW1wiZXhlY1wiLCBcIm5vZGVAMjBcIiwgXCItLVwiLCBcIm5wbVwiLCBcInJvb3RcIiwgXCItZ1wiXSk7XG5cblx0XHRcdHNldHRpbmdzTWFuYWdlci5zZXROcG1Db21tYW5kKFtcIm1pc2VcIiwgXCJleGVjXCIsIFwibm9kZUAyMlwiLCBcIi0tXCIsIFwibnBtXCJdKTtcblxuXHRcdFx0ZXhwZWN0KHBhY2thZ2VNYW5hZ2VyLmdldEluc3RhbGxlZFBhdGgoXCJucG06QHNjb3BlL3BrZ1wiLCBcInVzZXJcIikpLnRvQmVVbmRlZmluZWQoKTtcblx0XHRcdGV4cGVjdChydW5Db21tYW5kU3luY1NweSkudG9IYXZlQmVlbk50aENhbGxlZFdpdGgoMiwgXCJtaXNlXCIsIFtcImV4ZWNcIiwgXCJub2RlQDIyXCIsIFwiLS1cIiwgXCJucG1cIiwgXCJyb290XCIsIFwiLWdcIl0pO1xuXHRcdH0pO1xuXHR9KTtcblxuXHRkZXNjcmliZShcInNvdXJjZSBwYXJzaW5nXCIsICgpID0+IHtcblx0XHRpdChcInNob3VsZCBlbWl0IHByb2dyZXNzIGV2ZW50cyBvbiBpbnN0YWxsIGF0dGVtcHRcIiwgYXN5bmMgKCkgPT4ge1xuXHRcdFx0Y29uc3QgZXZlbnRzOiBQcm9ncmVzc0V2ZW50W10gPSBbXTtcblx0XHRcdHBhY2thZ2VNYW5hZ2VyLnNldFByb2dyZXNzQ2FsbGJhY2soKGV2ZW50KSA9PiBldmVudHMucHVzaChldmVudCkpO1xuXG5cdFx0XHQvLyBVc2UgcHVibGljIGluc3RhbGwgbWV0aG9kIHdoaWNoIGVtaXRzIHByb2dyZXNzIGV2ZW50c1xuXHRcdFx0dHJ5IHtcblx0XHRcdFx0YXdhaXQgcGFja2FnZU1hbmFnZXIuaW5zdGFsbChcIm5wbTpub25leGlzdGVudC1wYWNrYWdlQDEuMC4wXCIpO1xuXHRcdFx0fSBjYXRjaCB7XG5cdFx0XHRcdC8vIEV4cGVjdGVkIHRvIGZhaWwgLSBwYWNrYWdlIGRvZXNuJ3QgZXhpc3Rcblx0XHRcdH1cblxuXHRcdFx0Ly8gU2hvdWxkIGhhdmUgZW1pdHRlZCBzdGFydCBldmVudCBiZWZvcmUgZmFpbHVyZVxuXHRcdFx0ZXhwZWN0KGV2ZW50cy5zb21lKChlKSA9PiBlLnR5cGUgPT09IFwic3RhcnRcIiAmJiBlLmFjdGlvbiA9PT0gXCJpbnN0YWxsXCIpKS50b0JlKHRydWUpO1xuXHRcdFx0Ly8gU2hvdWxkIGhhdmUgZW1pdHRlZCBlcnJvciBldmVudFxuXHRcdFx0ZXhwZWN0KGV2ZW50cy5zb21lKChlKSA9PiBlLnR5cGUgPT09IFwiZXJyb3JcIikpLnRvQmUodHJ1ZSk7XG5cdFx0fSk7XG5cblx0XHRpdChcInNob3VsZCByZWNvZ25pemUgZ2l0aHViIFVSTHMgd2l0aG91dCBnaXQ6IHByZWZpeFwiLCBhc3luYyAoKSA9PiB7XG5cdFx0XHRjb25zdCBldmVudHM6IFByb2dyZXNzRXZlbnRbXSA9IFtdO1xuXHRcdFx0cGFja2FnZU1hbmFnZXIuc2V0UHJvZ3Jlc3NDYWxsYmFjaygoZXZlbnQpID0+IGV2ZW50cy5wdXNoKGV2ZW50KSk7XG5cdFx0XHRjb25zdCBwcmV2aW91c0dpdFRlcm1pbmFsUHJvbXB0ID0gcHJvY2Vzcy5lbnYuR0lUX1RFUk1JTkFMX1BST01QVDtcblx0XHRcdHByb2Nlc3MuZW52LkdJVF9URVJNSU5BTF9QUk9NUFQgPSBcIjBcIjtcblxuXHRcdFx0dHJ5IHtcblx0XHRcdFx0Ly8gVGhpcyBzaG91bGQgYmUgcGFyc2VkIGFzIGEgZ2l0IHNvdXJjZSwgbm90IHRocm93IFwidW5zdXBwb3J0ZWRcIlxuXHRcdFx0XHR0cnkge1xuXHRcdFx0XHRcdGF3YWl0IHBhY2thZ2VNYW5hZ2VyLmluc3RhbGwoXCJodHRwczovL2dpdGh1Yi5jb20vbm9uZXhpc3RlbnQvcmVwb1wiKTtcblx0XHRcdFx0fSBjYXRjaCB7XG5cdFx0XHRcdFx0Ly8gRXhwZWN0ZWQgdG8gZmFpbCAtIHJlcG8gZG9lc24ndCBleGlzdFxuXHRcdFx0XHR9XG5cdFx0XHR9IGZpbmFsbHkge1xuXHRcdFx0XHRpZiAocHJldmlvdXNHaXRUZXJtaW5hbFByb21wdCA9PT0gdW5kZWZpbmVkKSB7XG5cdFx0XHRcdFx0ZGVsZXRlIHByb2Nlc3MuZW52LkdJVF9URVJNSU5BTF9QUk9NUFQ7XG5cdFx0XHRcdH0gZWxzZSB7XG5cdFx0XHRcdFx0cHJvY2Vzcy5lbnYuR0lUX1RFUk1JTkFMX1BST01QVCA9IHByZXZpb3VzR2l0VGVybWluYWxQcm9tcHQ7XG5cdFx0XHRcdH1cblx0XHRcdH1cblxuXHRcdFx0Ly8gU2hvdWxkIGhhdmUgYXR0ZW1wdGVkIGNsb25lLCBub3QgdGhyb3duIHVuc3VwcG9ydGVkIGVycm9yXG5cdFx0XHRleHBlY3QoZXZlbnRzLnNvbWUoKGUpID0+IGUudHlwZSA9PT0gXCJzdGFydFwiICYmIGUuYWN0aW9uID09PSBcImluc3RhbGxcIikpLnRvQmUodHJ1ZSk7XG5cdFx0fSk7XG5cblx0XHRpdChcInNob3VsZCBwYXJzZSBwYWNrYWdlIHNvdXJjZSB0eXBlcyBmcm9tIGRvY3MgZXhhbXBsZXNcIiwgKCkgPT4ge1xuXHRcdFx0ZXhwZWN0KChwYWNrYWdlTWFuYWdlciBhcyBhbnkpLnBhcnNlU291cmNlKFwibnBtOkBzY29wZS9wa2dAMS4yLjNcIikudHlwZSkudG9CZShcIm5wbVwiKTtcblx0XHRcdGV4cGVjdCgocGFja2FnZU1hbmFnZXIgYXMgYW55KS5wYXJzZVNvdXJjZShcIm5wbTpwa2dcIikudHlwZSkudG9CZShcIm5wbVwiKTtcblxuXHRcdFx0ZXhwZWN0KChwYWNrYWdlTWFuYWdlciBhcyBhbnkpLnBhcnNlU291cmNlKFwiZ2l0OmdpdGh1Yi5jb20vdXNlci9yZXBvQHYxXCIpLnR5cGUpLnRvQmUoXCJnaXRcIik7XG5cdFx0XHRleHBlY3QoKHBhY2thZ2VNYW5hZ2VyIGFzIGFueSkucGFyc2VTb3VyY2UoXCJodHRwczovL2dpdGh1Yi5jb20vdXNlci9yZXBvQHYxXCIpLnR5cGUpLnRvQmUoXCJnaXRcIik7XG5cdFx0XHRleHBlY3QoKHBhY2thZ2VNYW5hZ2VyIGFzIGFueSkucGFyc2VTb3VyY2UoXCJnaXQ6Z2l0QGdpdGh1Yi5jb206dXNlci9yZXBvQHYxXCIpLnR5cGUpLnRvQmUoXCJnaXRcIik7XG5cdFx0XHRleHBlY3QoKHBhY2thZ2VNYW5hZ2VyIGFzIGFueSkucGFyc2VTb3VyY2UoXCJzc2g6Ly9naXRAZ2l0aHViLmNvbS91c2VyL3JlcG9AdjFcIikudHlwZSkudG9CZShcImdpdFwiKTtcblxuXHRcdFx0ZXhwZWN0KChwYWNrYWdlTWFuYWdlciBhcyBhbnkpLnBhcnNlU291cmNlKFwiL2Fic29sdXRlL3BhdGgvdG8vcGFja2FnZVwiKS50eXBlKS50b0JlKFwibG9jYWxcIik7XG5cdFx0XHRleHBlY3QoKHBhY2thZ2VNYW5hZ2VyIGFzIGFueSkucGFyc2VTb3VyY2UoXCIuL3JlbGF0aXZlL3BhdGgvdG8vcGFja2FnZVwiKS50eXBlKS50b0JlKFwibG9jYWxcIik7XG5cdFx0XHRleHBlY3QoKHBhY2thZ2VNYW5hZ2VyIGFzIGFueSkucGFyc2VTb3VyY2UoXCIuLi9yZWxhdGl2ZS9wYXRoL3RvL3BhY2thZ2VcIikudHlwZSkudG9CZShcImxvY2FsXCIpO1xuXHRcdH0pO1xuXG5cdFx0aXQoXCJzaG91bGQgbmV2ZXIgcGFyc2UgZG90LXJlbGF0aXZlIHBhdGhzIGFzIGdpdFwiLCAoKSA9PiB7XG5cdFx0XHRjb25zdCBkb3RTbGFzaCA9IChwYWNrYWdlTWFuYWdlciBhcyBhbnkpLnBhcnNlU291cmNlKFwiLi9wYWNrYWdlcy9hZ2VudC10aW1lcnNcIik7XG5cdFx0XHRleHBlY3QoZG90U2xhc2gudHlwZSkudG9CZShcImxvY2FsXCIpO1xuXHRcdFx0ZXhwZWN0KGRvdFNsYXNoLnBhdGgpLnRvQmUoXCIuL3BhY2thZ2VzL2FnZW50LXRpbWVyc1wiKTtcblxuXHRcdFx0Y29uc3QgZG90RG90U2xhc2ggPSAocGFja2FnZU1hbmFnZXIgYXMgYW55KS5wYXJzZVNvdXJjZShcIi4uL3BhY2thZ2VzL2FnZW50LXRpbWVyc1wiKTtcblx0XHRcdGV4cGVjdChkb3REb3RTbGFzaC50eXBlKS50b0JlKFwibG9jYWxcIik7XG5cdFx0XHRleHBlY3QoZG90RG90U2xhc2gucGF0aCkudG9CZShcIi4uL3BhY2thZ2VzL2FnZW50LXRpbWVyc1wiKTtcblx0XHR9KTtcblx0fSk7XG5cblx0ZGVzY3JpYmUoXCJzZXR0aW5ncyBzb3VyY2Ugbm9ybWFsaXphdGlvblwiLCAoKSA9PiB7XG5cdFx0aXQoXCJzaG91bGQgc3RvcmUgZ2xvYmFsIGxvY2FsIHBhY2thZ2VzIHJlbGF0aXZlIHRvIGFnZW50IHNldHRpbmdzIGJhc2VcIiwgKCkgPT4ge1xuXHRcdFx0Y29uc3QgcGtnRGlyID0gam9pbih0ZW1wRGlyLCBcInBhY2thZ2VzXCIsIFwibG9jYWwtZ2xvYmFsLXBrZ1wiKTtcblx0XHRcdG1rZGlyU3luYyhqb2luKHBrZ0RpciwgXCJleHRlbnNpb25zXCIpLCB7IHJlY3Vyc2l2ZTogdHJ1ZSB9KTtcblx0XHRcdHdyaXRlRmlsZVN5bmMoam9pbihwa2dEaXIsIFwiZXh0ZW5zaW9uc1wiLCBcImluZGV4LnRzXCIpLCBcImV4cG9ydCBkZWZhdWx0IGZ1bmN0aW9uKCkge31cIik7XG5cblx0XHRcdGNvbnN0IGFkZGVkID0gcGFja2FnZU1hbmFnZXIuYWRkU291cmNlVG9TZXR0aW5ncyhcIi4vcGFja2FnZXMvbG9jYWwtZ2xvYmFsLXBrZ1wiKTtcblx0XHRcdGV4cGVjdChhZGRlZCkudG9CZSh0cnVlKTtcblxuXHRcdFx0Y29uc3Qgc2V0dGluZ3MgPSBzZXR0aW5nc01hbmFnZXIuZ2V0R2xvYmFsU2V0dGluZ3MoKTtcblx0XHRcdGNvbnN0IHJlbCA9IHJlbGF0aXZlKGFnZW50RGlyLCBwa2dEaXIpO1xuXHRcdFx0Y29uc3QgZXhwZWN0ZWQgPSByZWwuc3RhcnRzV2l0aChcIi5cIikgPyByZWwgOiBgLi8ke3JlbH1gO1xuXHRcdFx0ZXhwZWN0KHNldHRpbmdzLnBhY2thZ2VzPy5bMF0pLnRvQmUoZXhwZWN0ZWQpO1xuXHRcdH0pO1xuXG5cdFx0aXQoXCJzaG91bGQgc3RvcmUgcHJvamVjdCBsb2NhbCBwYWNrYWdlcyByZWxhdGl2ZSB0byAucGkgc2V0dGluZ3MgYmFzZVwiLCAoKSA9PiB7XG5cdFx0XHRjb25zdCBwcm9qZWN0UGtnRGlyID0gam9pbih0ZW1wRGlyLCBcInByb2plY3QtbG9jYWwtcGtnXCIpO1xuXHRcdFx0bWtkaXJTeW5jKGpvaW4ocHJvamVjdFBrZ0RpciwgXCJleHRlbnNpb25zXCIpLCB7IHJlY3Vyc2l2ZTogdHJ1ZSB9KTtcblx0XHRcdHdyaXRlRmlsZVN5bmMoam9pbihwcm9qZWN0UGtnRGlyLCBcImV4dGVuc2lvbnNcIiwgXCJpbmRleC50c1wiKSwgXCJleHBvcnQgZGVmYXVsdCBmdW5jdGlvbigpIHt9XCIpO1xuXG5cdFx0XHRjb25zdCBhZGRlZCA9IHBhY2thZ2VNYW5hZ2VyLmFkZFNvdXJjZVRvU2V0dGluZ3MoXCIuL3Byb2plY3QtbG9jYWwtcGtnXCIsIHsgbG9jYWw6IHRydWUgfSk7XG5cdFx0XHRleHBlY3QoYWRkZWQpLnRvQmUodHJ1ZSk7XG5cblx0XHRcdGNvbnN0IHNldHRpbmdzID0gc2V0dGluZ3NNYW5hZ2VyLmdldFByb2plY3RTZXR0aW5ncygpO1xuXHRcdFx0Y29uc3QgcmVsID0gcmVsYXRpdmUoam9pbih0ZW1wRGlyLCBcIi5waVwiKSwgcHJvamVjdFBrZ0Rpcik7XG5cdFx0XHRjb25zdCBleHBlY3RlZCA9IHJlbC5zdGFydHNXaXRoKFwiLlwiKSA/IHJlbCA6IGAuLyR7cmVsfWA7XG5cdFx0XHRleHBlY3Qoc2V0dGluZ3MucGFja2FnZXM/LlswXSkudG9CZShleHBlY3RlZCk7XG5cdFx0fSk7XG5cblx0XHRpdChcInNob3VsZCByZW1vdmUgbG9jYWwgcGFja2FnZSBlbnRyaWVzIHVzaW5nIGVxdWl2YWxlbnQgcGF0aCBmb3Jtc1wiLCAoKSA9PiB7XG5cdFx0XHRjb25zdCBwa2dEaXIgPSBqb2luKHRlbXBEaXIsIFwicmVtb3ZlLWxvY2FsLXBrZ1wiKTtcblx0XHRcdG1rZGlyU3luYyhqb2luKHBrZ0RpciwgXCJleHRlbnNpb25zXCIpLCB7IHJlY3Vyc2l2ZTogdHJ1ZSB9KTtcblx0XHRcdHdyaXRlRmlsZVN5bmMoam9pbihwa2dEaXIsIFwiZXh0ZW5zaW9uc1wiLCBcImluZGV4LnRzXCIpLCBcImV4cG9ydCBkZWZhdWx0IGZ1bmN0aW9uKCkge31cIik7XG5cblx0XHRcdHBhY2thZ2VNYW5hZ2VyLmFkZFNvdXJjZVRvU2V0dGluZ3MoXCIuL3JlbW92ZS1sb2NhbC1wa2dcIik7XG5cdFx0XHRjb25zdCByZW1vdmVkID0gcGFja2FnZU1hbmFnZXIucmVtb3ZlU291cmNlRnJvbVNldHRpbmdzKGAke3BrZ0Rpcn0vYCk7XG5cdFx0XHRleHBlY3QocmVtb3ZlZCkudG9CZSh0cnVlKTtcblx0XHRcdGV4cGVjdChzZXR0aW5nc01hbmFnZXIuZ2V0R2xvYmFsU2V0dGluZ3MoKS5wYWNrYWdlcyA/PyBbXSkudG9IYXZlTGVuZ3RoKDApO1xuXHRcdH0pO1xuXHR9KTtcblxuXHRkZXNjcmliZShcIkhUVFBTIGdpdCBVUkwgcGFyc2luZyAob2xkIGJlaGF2aW9yKVwiLCAoKSA9PiB7XG5cdFx0aXQoXCJzaG91bGQgcGFyc2UgSFRUUFMgR2l0SHViIFVSTHMgY29ycmVjdGx5XCIsIGFzeW5jICgpID0+IHtcblx0XHRcdGNvbnN0IHBhcnNlZCA9IChwYWNrYWdlTWFuYWdlciBhcyBhbnkpLnBhcnNlU291cmNlKFwiaHR0cHM6Ly9naXRodWIuY29tL3VzZXIvcmVwb1wiKTtcblx0XHRcdGV4cGVjdChwYXJzZWQudHlwZSkudG9CZShcImdpdFwiKTtcblx0XHRcdGV4cGVjdChwYXJzZWQuaG9zdCkudG9CZShcImdpdGh1Yi5jb21cIik7XG5cdFx0XHRleHBlY3QocGFyc2VkLnBhdGgpLnRvQmUoXCJ1c2VyL3JlcG9cIik7XG5cdFx0XHRleHBlY3QocGFyc2VkLnBpbm5lZCkudG9CZShmYWxzZSk7XG5cdFx0fSk7XG5cblx0XHRpdChcInNob3VsZCBwYXJzZSBIVFRQUyBVUkxzIHdpdGggZ2l0OiBwcmVmaXhcIiwgYXN5bmMgKCkgPT4ge1xuXHRcdFx0Y29uc3QgcGFyc2VkID0gKHBhY2thZ2VNYW5hZ2VyIGFzIGFueSkucGFyc2VTb3VyY2UoXCJnaXQ6aHR0cHM6Ly9naXRodWIuY29tL3VzZXIvcmVwb1wiKTtcblx0XHRcdGV4cGVjdChwYXJzZWQudHlwZSkudG9CZShcImdpdFwiKTtcblx0XHRcdGV4cGVjdChwYXJzZWQuaG9zdCkudG9CZShcImdpdGh1Yi5jb21cIik7XG5cdFx0XHRleHBlY3QocGFyc2VkLnBhdGgpLnRvQmUoXCJ1c2VyL3JlcG9cIik7XG5cdFx0fSk7XG5cblx0XHRpdChcInNob3VsZCBwYXJzZSBIVFRQUyBVUkxzIHdpdGggcmVmXCIsIGFzeW5jICgpID0+IHtcblx0XHRcdGNvbnN0IHBhcnNlZCA9IChwYWNrYWdlTWFuYWdlciBhcyBhbnkpLnBhcnNlU291cmNlKFwiaHR0cHM6Ly9naXRodWIuY29tL3VzZXIvcmVwb0B2MS4yLjNcIik7XG5cdFx0XHRleHBlY3QocGFyc2VkLnR5cGUpLnRvQmUoXCJnaXRcIik7XG5cdFx0XHRleHBlY3QocGFyc2VkLmhvc3QpLnRvQmUoXCJnaXRodWIuY29tXCIpO1xuXHRcdFx0ZXhwZWN0KHBhcnNlZC5wYXRoKS50b0JlKFwidXNlci9yZXBvXCIpO1xuXHRcdFx0ZXhwZWN0KHBhcnNlZC5yZWYpLnRvQmUoXCJ2MS4yLjNcIik7XG5cdFx0XHRleHBlY3QocGFyc2VkLnBpbm5lZCkudG9CZSh0cnVlKTtcblx0XHR9KTtcblxuXHRcdGl0KFwic2hvdWxkIHBhcnNlIGhvc3QvcGF0aCBzaG9ydGhhbmQgb25seSB3aXRoIGdpdDogcHJlZml4XCIsIGFzeW5jICgpID0+IHtcblx0XHRcdGNvbnN0IHBhcnNlZCA9IChwYWNrYWdlTWFuYWdlciBhcyBhbnkpLnBhcnNlU291cmNlKFwiZ2l0OmdpdGh1Yi5jb20vdXNlci9yZXBvXCIpO1xuXHRcdFx0ZXhwZWN0KHBhcnNlZC50eXBlKS50b0JlKFwiZ2l0XCIpO1xuXHRcdFx0ZXhwZWN0KHBhcnNlZC5ob3N0KS50b0JlKFwiZ2l0aHViLmNvbVwiKTtcblx0XHRcdGV4cGVjdChwYXJzZWQucGF0aCkudG9CZShcInVzZXIvcmVwb1wiKTtcblx0XHR9KTtcblxuXHRcdGl0KFwic2hvdWxkIHRyZWF0IGhvc3QvcGF0aCBzaG9ydGhhbmQgYXMgbG9jYWwgd2l0aG91dCBnaXQ6IHByZWZpeFwiLCBhc3luYyAoKSA9PiB7XG5cdFx0XHRjb25zdCBwYXJzZWQgPSAocGFja2FnZU1hbmFnZXIgYXMgYW55KS5wYXJzZVNvdXJjZShcImdpdGh1Yi5jb20vdXNlci9yZXBvXCIpO1xuXHRcdFx0ZXhwZWN0KHBhcnNlZC50eXBlKS50b0JlKFwibG9jYWxcIik7XG5cdFx0fSk7XG5cblx0XHRpdChcInNob3VsZCBwYXJzZSBIVFRQUyBVUkxzIHdpdGggLmdpdCBzdWZmaXhcIiwgYXN5bmMgKCkgPT4ge1xuXHRcdFx0Y29uc3QgcGFyc2VkID0gKHBhY2thZ2VNYW5hZ2VyIGFzIGFueSkucGFyc2VTb3VyY2UoXCJodHRwczovL2dpdGh1Yi5jb20vdXNlci9yZXBvLmdpdFwiKTtcblx0XHRcdGV4cGVjdChwYXJzZWQudHlwZSkudG9CZShcImdpdFwiKTtcblx0XHRcdGV4cGVjdChwYXJzZWQuaG9zdCkudG9CZShcImdpdGh1Yi5jb21cIik7XG5cdFx0XHRleHBlY3QocGFyc2VkLnBhdGgpLnRvQmUoXCJ1c2VyL3JlcG9cIik7XG5cdFx0fSk7XG5cblx0XHRpdChcInNob3VsZCBwYXJzZSBHaXRMYWIgSFRUUFMgVVJMc1wiLCBhc3luYyAoKSA9PiB7XG5cdFx0XHRjb25zdCBwYXJzZWQgPSAocGFja2FnZU1hbmFnZXIgYXMgYW55KS5wYXJzZVNvdXJjZShcImh0dHBzOi8vZ2l0bGFiLmNvbS91c2VyL3JlcG9cIik7XG5cdFx0XHRleHBlY3QocGFyc2VkLnR5cGUpLnRvQmUoXCJnaXRcIik7XG5cdFx0XHRleHBlY3QocGFyc2VkLmhvc3QpLnRvQmUoXCJnaXRsYWIuY29tXCIpO1xuXHRcdFx0ZXhwZWN0KHBhcnNlZC5wYXRoKS50b0JlKFwidXNlci9yZXBvXCIpO1xuXHRcdH0pO1xuXG5cdFx0aXQoXCJzaG91bGQgcGFyc2UgQml0YnVja2V0IEhUVFBTIFVSTHNcIiwgYXN5bmMgKCkgPT4ge1xuXHRcdFx0Y29uc3QgcGFyc2VkID0gKHBhY2thZ2VNYW5hZ2VyIGFzIGFueSkucGFyc2VTb3VyY2UoXCJodHRwczovL2JpdGJ1Y2tldC5vcmcvdXNlci9yZXBvXCIpO1xuXHRcdFx0ZXhwZWN0KHBhcnNlZC50eXBlKS50b0JlKFwiZ2l0XCIpO1xuXHRcdFx0ZXhwZWN0KHBhcnNlZC5ob3N0KS50b0JlKFwiYml0YnVja2V0Lm9yZ1wiKTtcblx0XHRcdGV4cGVjdChwYXJzZWQucGF0aCkudG9CZShcInVzZXIvcmVwb1wiKTtcblx0XHR9KTtcblxuXHRcdGl0KFwic2hvdWxkIHBhcnNlIENvZGViZXJnIEhUVFBTIFVSTHNcIiwgYXN5bmMgKCkgPT4ge1xuXHRcdFx0Y29uc3QgcGFyc2VkID0gKHBhY2thZ2VNYW5hZ2VyIGFzIGFueSkucGFyc2VTb3VyY2UoXCJodHRwczovL2NvZGViZXJnLm9yZy91c2VyL3JlcG9cIik7XG5cdFx0XHRleHBlY3QocGFyc2VkLnR5cGUpLnRvQmUoXCJnaXRcIik7XG5cdFx0XHRleHBlY3QocGFyc2VkLmhvc3QpLnRvQmUoXCJjb2RlYmVyZy5vcmdcIik7XG5cdFx0XHRleHBlY3QocGFyc2VkLnBhdGgpLnRvQmUoXCJ1c2VyL3JlcG9cIik7XG5cdFx0fSk7XG5cblx0XHRpdChcInNob3VsZCBnZW5lcmF0ZSBjb3JyZWN0IHBhY2thZ2UgaWRlbnRpdHkgZm9yIHByb3RvY29sIGFuZCBnaXQ6LXByZWZpeGVkIFVSTHNcIiwgYXN5bmMgKCkgPT4ge1xuXHRcdFx0Y29uc3QgaWRlbnRpdHkxID0gKHBhY2thZ2VNYW5hZ2VyIGFzIGFueSkuZ2V0UGFja2FnZUlkZW50aXR5KFwiaHR0cHM6Ly9naXRodWIuY29tL3VzZXIvcmVwb1wiKTtcblx0XHRcdGNvbnN0IGlkZW50aXR5MiA9IChwYWNrYWdlTWFuYWdlciBhcyBhbnkpLmdldFBhY2thZ2VJZGVudGl0eShcImh0dHBzOi8vZ2l0aHViLmNvbS91c2VyL3JlcG9AdjEuMC4wXCIpO1xuXHRcdFx0Y29uc3QgaWRlbnRpdHkzID0gKHBhY2thZ2VNYW5hZ2VyIGFzIGFueSkuZ2V0UGFja2FnZUlkZW50aXR5KFwiZ2l0OmdpdGh1Yi5jb20vdXNlci9yZXBvXCIpO1xuXHRcdFx0Y29uc3QgaWRlbnRpdHk0ID0gKHBhY2thZ2VNYW5hZ2VyIGFzIGFueSkuZ2V0UGFja2FnZUlkZW50aXR5KFwiaHR0cHM6Ly9naXRodWIuY29tL3VzZXIvcmVwby5naXRcIik7XG5cblx0XHRcdC8vIEFsbCBzaG91bGQgaGF2ZSB0aGUgc2FtZSBpZGVudGl0eSAobm9ybWFsaXplZClcblx0XHRcdGV4cGVjdChpZGVudGl0eTEpLnRvQmUoXCJnaXQ6Z2l0aHViLmNvbS91c2VyL3JlcG9cIik7XG5cdFx0XHRleHBlY3QoaWRlbnRpdHkyKS50b0JlKFwiZ2l0OmdpdGh1Yi5jb20vdXNlci9yZXBvXCIpO1xuXHRcdFx0ZXhwZWN0KGlkZW50aXR5MykudG9CZShcImdpdDpnaXRodWIuY29tL3VzZXIvcmVwb1wiKTtcblx0XHRcdGV4cGVjdChpZGVudGl0eTQpLnRvQmUoXCJnaXQ6Z2l0aHViLmNvbS91c2VyL3JlcG9cIik7XG5cdFx0fSk7XG5cblx0XHRpdChcInNob3VsZCBkZWR1cGxpY2F0ZSBnaXQgVVJMcyB3aXRoIGRpZmZlcmVudCBzdXBwb3J0ZWQgZm9ybWF0c1wiLCBhc3luYyAoKSA9PiB7XG5cdFx0XHRjb25zdCBwa2dEaXIgPSBqb2luKHRlbXBEaXIsIFwiaHR0cHMtZGVkdXAtcGtnXCIpO1xuXHRcdFx0bWtkaXJTeW5jKGpvaW4ocGtnRGlyLCBcImV4dGVuc2lvbnNcIiksIHsgcmVjdXJzaXZlOiB0cnVlIH0pO1xuXHRcdFx0d3JpdGVGaWxlU3luYyhqb2luKHBrZ0RpciwgXCJleHRlbnNpb25zXCIsIFwidGVzdC50c1wiKSwgXCJleHBvcnQgZGVmYXVsdCBmdW5jdGlvbigpIHt9XCIpO1xuXG5cdFx0XHQvLyBNb2NrIHRoZSBwYWNrYWdlIGFzIGlmIGl0IHdlcmUgY2xvbmVkIGZyb20gZGlmZmVyZW50IFVSTCBmb3JtYXRzXG5cdFx0XHQvLyBJbiByZWFsaXR5LCB0aGVzZSB3b3VsZCBhbGwgcG9pbnQgdG8gdGhlIHNhbWUgbG9jYWwgZGlyIGFmdGVyIGluc3RhbGxcblx0XHRcdHNldHRpbmdzTWFuYWdlci5zZXRQYWNrYWdlcyhbXG5cdFx0XHRcdFwiaHR0cHM6Ly9naXRodWIuY29tL3VzZXIvcmVwb1wiLFxuXHRcdFx0XHRcImdpdDpnaXRodWIuY29tL3VzZXIvcmVwb1wiLFxuXHRcdFx0XHRcImh0dHBzOi8vZ2l0aHViLmNvbS91c2VyL3JlcG8uZ2l0XCIsXG5cdFx0XHRdKTtcblxuXHRcdFx0Ly8gU2luY2UgdGhlc2UgVVJMcyBkb24ndCBhY3R1YWxseSBleGlzdCBhbmQgd2UgY2FuJ3QgY2xvbmUgdGhlbSxcblx0XHRcdC8vIHdlIHZlcmlmeSB0aGV5IHByb2R1Y2UgdGhlIHNhbWUgaWRlbnRpdHlcblx0XHRcdGNvbnN0IGlkMSA9IChwYWNrYWdlTWFuYWdlciBhcyBhbnkpLmdldFBhY2thZ2VJZGVudGl0eShcImh0dHBzOi8vZ2l0aHViLmNvbS91c2VyL3JlcG9cIik7XG5cdFx0XHRjb25zdCBpZDIgPSAocGFja2FnZU1hbmFnZXIgYXMgYW55KS5nZXRQYWNrYWdlSWRlbnRpdHkoXCJnaXQ6Z2l0aHViLmNvbS91c2VyL3JlcG9cIik7XG5cdFx0XHRjb25zdCBpZDMgPSAocGFja2FnZU1hbmFnZXIgYXMgYW55KS5nZXRQYWNrYWdlSWRlbnRpdHkoXCJodHRwczovL2dpdGh1Yi5jb20vdXNlci9yZXBvLmdpdFwiKTtcblxuXHRcdFx0ZXhwZWN0KGlkMSkudG9CZShpZDIpO1xuXHRcdFx0ZXhwZWN0KGlkMikudG9CZShpZDMpO1xuXHRcdH0pO1xuXG5cdFx0aXQoXCJzaG91bGQgaGFuZGxlIEhUVFBTIFVSTHMgd2l0aCByZWZzIGluIHJlc29sdmVcIiwgYXN5bmMgKCkgPT4ge1xuXHRcdFx0Ly8gVGhpcyB0ZXN0cyB0aGF0IHRoZSByZWYgaXMgcHJvcGVybHkgZXh0cmFjdGVkIGFuZCBzdG9yZWRcblx0XHRcdGNvbnN0IHBhcnNlZCA9IChwYWNrYWdlTWFuYWdlciBhcyBhbnkpLnBhcnNlU291cmNlKFwiaHR0cHM6Ly9naXRodWIuY29tL3VzZXIvcmVwb0BtYWluXCIpO1xuXHRcdFx0ZXhwZWN0KHBhcnNlZC5yZWYpLnRvQmUoXCJtYWluXCIpO1xuXHRcdFx0ZXhwZWN0KHBhcnNlZC5waW5uZWQpLnRvQmUodHJ1ZSk7XG5cblx0XHRcdGNvbnN0IHBhcnNlZDIgPSAocGFja2FnZU1hbmFnZXIgYXMgYW55KS5wYXJzZVNvdXJjZShcImh0dHBzOi8vZ2l0aHViLmNvbS91c2VyL3JlcG9AZmVhdHVyZS9icmFuY2hcIik7XG5cdFx0XHRleHBlY3QocGFyc2VkMi5yZWYpLnRvQmUoXCJmZWF0dXJlL2JyYW5jaFwiKTtcblx0XHR9KTtcblx0fSk7XG5cblx0ZGVzY3JpYmUoXCJwYXR0ZXJuIGZpbHRlcmluZyBpbiB0b3AtbGV2ZWwgYXJyYXlzXCIsICgpID0+IHtcblx0XHRpdChcInNob3VsZCBleGNsdWRlIGV4dGVuc2lvbnMgd2l0aCAhIHBhdHRlcm5cIiwgYXN5bmMgKCkgPT4ge1xuXHRcdFx0Y29uc3QgZXh0RGlyID0gam9pbihhZ2VudERpciwgXCJleHRlbnNpb25zXCIpO1xuXHRcdFx0bWtkaXJTeW5jKGV4dERpciwgeyByZWN1cnNpdmU6IHRydWUgfSk7XG5cdFx0XHR3cml0ZUZpbGVTeW5jKGpvaW4oZXh0RGlyLCBcImtlZXAudHNcIiksIFwiZXhwb3J0IGRlZmF1bHQgZnVuY3Rpb24oKSB7fVwiKTtcblx0XHRcdHdyaXRlRmlsZVN5bmMoam9pbihleHREaXIsIFwicmVtb3ZlLnRzXCIpLCBcImV4cG9ydCBkZWZhdWx0IGZ1bmN0aW9uKCkge31cIik7XG5cblx0XHRcdHNldHRpbmdzTWFuYWdlci5zZXRFeHRlbnNpb25QYXRocyhbXCJleHRlbnNpb25zXCIsIFwiISoqL3JlbW92ZS50c1wiXSk7XG5cblx0XHRcdGNvbnN0IHJlc3VsdCA9IGF3YWl0IHBhY2thZ2VNYW5hZ2VyLnJlc29sdmUoKTtcblx0XHRcdGV4cGVjdChyZXN1bHQuZXh0ZW5zaW9ucy5zb21lKChyKSA9PiBpc0VuYWJsZWQociwgXCJrZWVwLnRzXCIpKSkudG9CZSh0cnVlKTtcblx0XHRcdGV4cGVjdChyZXN1bHQuZXh0ZW5zaW9ucy5zb21lKChyKSA9PiBpc0Rpc2FibGVkKHIsIFwicmVtb3ZlLnRzXCIpKSkudG9CZSh0cnVlKTtcblx0XHR9KTtcblxuXHRcdGl0KFwic2hvdWxkIGZpbHRlciB0aGVtZXMgd2l0aCBnbG9iIHBhdHRlcm5zXCIsIGFzeW5jICgpID0+IHtcblx0XHRcdGNvbnN0IHRoZW1lc0RpciA9IGpvaW4oYWdlbnREaXIsIFwidGhlbWVzXCIpO1xuXHRcdFx0bWtkaXJTeW5jKHRoZW1lc0RpciwgeyByZWN1cnNpdmU6IHRydWUgfSk7XG5cdFx0XHR3cml0ZUZpbGVTeW5jKGpvaW4odGhlbWVzRGlyLCBcImRhcmsuanNvblwiKSwgXCJ7fVwiKTtcblx0XHRcdHdyaXRlRmlsZVN5bmMoam9pbih0aGVtZXNEaXIsIFwibGlnaHQuanNvblwiKSwgXCJ7fVwiKTtcblx0XHRcdHdyaXRlRmlsZVN5bmMoam9pbih0aGVtZXNEaXIsIFwiZnVua3kuanNvblwiKSwgXCJ7fVwiKTtcblxuXHRcdFx0c2V0dGluZ3NNYW5hZ2VyLnNldFRoZW1lUGF0aHMoW1widGhlbWVzXCIsIFwiIWZ1bmt5Lmpzb25cIl0pO1xuXG5cdFx0XHRjb25zdCByZXN1bHQgPSBhd2FpdCBwYWNrYWdlTWFuYWdlci5yZXNvbHZlKCk7XG5cdFx0XHRleHBlY3QocmVzdWx0LnRoZW1lcy5zb21lKChyKSA9PiBpc0VuYWJsZWQociwgXCJkYXJrLmpzb25cIikpKS50b0JlKHRydWUpO1xuXHRcdFx0ZXhwZWN0KHJlc3VsdC50aGVtZXMuc29tZSgocikgPT4gaXNFbmFibGVkKHIsIFwibGlnaHQuanNvblwiKSkpLnRvQmUodHJ1ZSk7XG5cdFx0XHRleHBlY3QocmVzdWx0LnRoZW1lcy5zb21lKChyKSA9PiBpc0Rpc2FibGVkKHIsIFwiZnVua3kuanNvblwiKSkpLnRvQmUodHJ1ZSk7XG5cdFx0fSk7XG5cblx0XHRpdChcInNob3VsZCBmaWx0ZXIgcHJvbXB0cyB3aXRoIGV4Y2x1c2lvbiBwYXR0ZXJuXCIsIGFzeW5jICgpID0+IHtcblx0XHRcdGNvbnN0IHByb21wdHNEaXIgPSBqb2luKGFnZW50RGlyLCBcInByb21wdHNcIik7XG5cdFx0XHRta2RpclN5bmMocHJvbXB0c0RpciwgeyByZWN1cnNpdmU6IHRydWUgfSk7XG5cdFx0XHR3cml0ZUZpbGVTeW5jKGpvaW4ocHJvbXB0c0RpciwgXCJyZXZpZXcubWRcIiksIFwiUmV2aWV3IGNvZGVcIik7XG5cdFx0XHR3cml0ZUZpbGVTeW5jKGpvaW4ocHJvbXB0c0RpciwgXCJleHBsYWluLm1kXCIpLCBcIkV4cGxhaW4gY29kZVwiKTtcblxuXHRcdFx0c2V0dGluZ3NNYW5hZ2VyLnNldFByb21wdFRlbXBsYXRlUGF0aHMoW1wicHJvbXB0c1wiLCBcIiFleHBsYWluLm1kXCJdKTtcblxuXHRcdFx0Y29uc3QgcmVzdWx0ID0gYXdhaXQgcGFja2FnZU1hbmFnZXIucmVzb2x2ZSgpO1xuXHRcdFx0ZXhwZWN0KHJlc3VsdC5wcm9tcHRzLnNvbWUoKHIpID0+IGlzRW5hYmxlZChyLCBcInJldmlldy5tZFwiKSkpLnRvQmUodHJ1ZSk7XG5cdFx0XHRleHBlY3QocmVzdWx0LnByb21wdHMuc29tZSgocikgPT4gaXNEaXNhYmxlZChyLCBcImV4cGxhaW4ubWRcIikpKS50b0JlKHRydWUpO1xuXHRcdH0pO1xuXG5cdFx0aXQoXCJzaG91bGQgZmlsdGVyIHNraWxscyB3aXRoIGV4Y2x1c2lvbiBwYXR0ZXJuXCIsIGFzeW5jICgpID0+IHtcblx0XHRcdGNvbnN0IHNraWxsc0RpciA9IGpvaW4oYWdlbnREaXIsIFwic2tpbGxzXCIpO1xuXHRcdFx0bWtkaXJTeW5jKGpvaW4oc2tpbGxzRGlyLCBcImdvb2Qtc2tpbGxcIiksIHsgcmVjdXJzaXZlOiB0cnVlIH0pO1xuXHRcdFx0bWtkaXJTeW5jKGpvaW4oc2tpbGxzRGlyLCBcImJhZC1za2lsbFwiKSwgeyByZWN1cnNpdmU6IHRydWUgfSk7XG5cdFx0XHR3cml0ZUZpbGVTeW5jKFxuXHRcdFx0XHRqb2luKHNraWxsc0RpciwgXCJnb29kLXNraWxsXCIsIFwiU0tJTEwubWRcIiksXG5cdFx0XHRcdFwiLS0tXFxubmFtZTogZ29vZC1za2lsbFxcbmRlc2NyaXB0aW9uOiBHb29kXFxuLS0tXFxuQ29udGVudFwiLFxuXHRcdFx0KTtcblx0XHRcdHdyaXRlRmlsZVN5bmMoXG5cdFx0XHRcdGpvaW4oc2tpbGxzRGlyLCBcImJhZC1za2lsbFwiLCBcIlNLSUxMLm1kXCIpLFxuXHRcdFx0XHRcIi0tLVxcbm5hbWU6IGJhZC1za2lsbFxcbmRlc2NyaXB0aW9uOiBCYWRcXG4tLS1cXG5Db250ZW50XCIsXG5cdFx0XHQpO1xuXG5cdFx0XHRzZXR0aW5nc01hbmFnZXIuc2V0U2tpbGxQYXRocyhbXCJza2lsbHNcIiwgXCIhKiovYmFkLXNraWxsXCJdKTtcblxuXHRcdFx0Y29uc3QgcmVzdWx0ID0gYXdhaXQgcGFja2FnZU1hbmFnZXIucmVzb2x2ZSgpO1xuXHRcdFx0ZXhwZWN0KHJlc3VsdC5za2lsbHMuc29tZSgocikgPT4gaXNFbmFibGVkKHIsIFwiZ29vZC1za2lsbFwiLCBcImluY2x1ZGVzXCIpKSkudG9CZSh0cnVlKTtcblx0XHRcdGV4cGVjdChyZXN1bHQuc2tpbGxzLnNvbWUoKHIpID0+IGlzRGlzYWJsZWQociwgXCJiYWQtc2tpbGxcIiwgXCJpbmNsdWRlc1wiKSkpLnRvQmUodHJ1ZSk7XG5cdFx0fSk7XG5cblx0XHRpdChcInNob3VsZCB3b3JrIHdpdGhvdXQgcGF0dGVybnMgKGJhY2t3YXJkIGNvbXBhdGlibGUpXCIsIGFzeW5jICgpID0+IHtcblx0XHRcdGNvbnN0IGV4dERpciA9IGpvaW4oYWdlbnREaXIsIFwiZXh0ZW5zaW9uc1wiKTtcblx0XHRcdG1rZGlyU3luYyhleHREaXIsIHsgcmVjdXJzaXZlOiB0cnVlIH0pO1xuXHRcdFx0Y29uc3QgZXh0UGF0aCA9IGpvaW4oZXh0RGlyLCBcIm15LWV4dC50c1wiKTtcblx0XHRcdHdyaXRlRmlsZVN5bmMoZXh0UGF0aCwgXCJleHBvcnQgZGVmYXVsdCBmdW5jdGlvbigpIHt9XCIpO1xuXG5cdFx0XHRzZXR0aW5nc01hbmFnZXIuc2V0RXh0ZW5zaW9uUGF0aHMoW1wiZXh0ZW5zaW9ucy9teS1leHQudHNcIl0pO1xuXG5cdFx0XHRjb25zdCByZXN1bHQgPSBhd2FpdCBwYWNrYWdlTWFuYWdlci5yZXNvbHZlKCk7XG5cdFx0XHRleHBlY3QocmVzdWx0LmV4dGVuc2lvbnMuc29tZSgocikgPT4gci5wYXRoID09PSBleHRQYXRoICYmIHIuZW5hYmxlZCkpLnRvQmUodHJ1ZSk7XG5cdFx0fSk7XG5cdH0pO1xuXG5cdGRlc2NyaWJlKFwicGF0dGVybiBmaWx0ZXJpbmcgaW4gcGkgbWFuaWZlc3RcIiwgKCkgPT4ge1xuXHRcdGl0KFwic2hvdWxkIHN1cHBvcnQgZ2xvYiBwYXR0ZXJucyBpbiBtYW5pZmVzdCBleHRlbnNpb25zXCIsIGFzeW5jICgpID0+IHtcblx0XHRcdGNvbnN0IHBrZ0RpciA9IGpvaW4odGVtcERpciwgXCJtYW5pZmVzdC1wa2dcIik7XG5cdFx0XHRta2RpclN5bmMoam9pbihwa2dEaXIsIFwiZXh0ZW5zaW9uc1wiKSwgeyByZWN1cnNpdmU6IHRydWUgfSk7XG5cdFx0XHRta2RpclN5bmMoam9pbihwa2dEaXIsIFwibm9kZV9tb2R1bGVzL2RlcC9leHRlbnNpb25zXCIpLCB7IHJlY3Vyc2l2ZTogdHJ1ZSB9KTtcblx0XHRcdHdyaXRlRmlsZVN5bmMoam9pbihwa2dEaXIsIFwiZXh0ZW5zaW9uc1wiLCBcImxvY2FsLnRzXCIpLCBcImV4cG9ydCBkZWZhdWx0IGZ1bmN0aW9uKCkge31cIik7XG5cdFx0XHR3cml0ZUZpbGVTeW5jKGpvaW4ocGtnRGlyLCBcIm5vZGVfbW9kdWxlcy9kZXAvZXh0ZW5zaW9uc1wiLCBcInJlbW90ZS50c1wiKSwgXCJleHBvcnQgZGVmYXVsdCBmdW5jdGlvbigpIHt9XCIpO1xuXHRcdFx0d3JpdGVGaWxlU3luYyhqb2luKHBrZ0RpciwgXCJub2RlX21vZHVsZXMvZGVwL2V4dGVuc2lvbnNcIiwgXCJza2lwLnRzXCIpLCBcImV4cG9ydCBkZWZhdWx0IGZ1bmN0aW9uKCkge31cIik7XG5cdFx0XHR3cml0ZUZpbGVTeW5jKFxuXHRcdFx0XHRqb2luKHBrZ0RpciwgXCJwYWNrYWdlLmpzb25cIiksXG5cdFx0XHRcdEpTT04uc3RyaW5naWZ5KHtcblx0XHRcdFx0XHRuYW1lOiBcIm1hbmlmZXN0LXBrZ1wiLFxuXHRcdFx0XHRcdHBpOiB7XG5cdFx0XHRcdFx0XHRleHRlbnNpb25zOiBbXCJleHRlbnNpb25zXCIsIFwibm9kZV9tb2R1bGVzL2RlcC9leHRlbnNpb25zXCIsIFwiISoqL3NraXAudHNcIl0sXG5cdFx0XHRcdFx0fSxcblx0XHRcdFx0fSksXG5cdFx0XHQpO1xuXG5cdFx0XHRjb25zdCByZXN1bHQgPSBhd2FpdCBwYWNrYWdlTWFuYWdlci5yZXNvbHZlRXh0ZW5zaW9uU291cmNlcyhbcGtnRGlyXSk7XG5cdFx0XHRleHBlY3QocmVzdWx0LmV4dGVuc2lvbnMuc29tZSgocikgPT4gaXNFbmFibGVkKHIsIFwibG9jYWwudHNcIikpKS50b0JlKHRydWUpO1xuXHRcdFx0ZXhwZWN0KHJlc3VsdC5leHRlbnNpb25zLnNvbWUoKHIpID0+IGlzRW5hYmxlZChyLCBcInJlbW90ZS50c1wiKSkpLnRvQmUodHJ1ZSk7XG5cdFx0XHRleHBlY3QocmVzdWx0LmV4dGVuc2lvbnMuc29tZSgocikgPT4gcGF0aEVuZHNXaXRoKHIucGF0aCwgXCJza2lwLnRzXCIpKSkudG9CZShmYWxzZSk7XG5cdFx0fSk7XG5cblx0XHRpdChcInNob3VsZCBzdXBwb3J0IGdsb2IgcGF0dGVybnMgaW4gbWFuaWZlc3Qgc2tpbGxzXCIsIGFzeW5jICgpID0+IHtcblx0XHRcdGNvbnN0IHBrZ0RpciA9IGpvaW4odGVtcERpciwgXCJza2lsbC1tYW5pZmVzdC1wa2dcIik7XG5cdFx0XHRta2RpclN5bmMoam9pbihwa2dEaXIsIFwic2tpbGxzL2dvb2Qtc2tpbGxcIiksIHsgcmVjdXJzaXZlOiB0cnVlIH0pO1xuXHRcdFx0bWtkaXJTeW5jKGpvaW4ocGtnRGlyLCBcInNraWxscy9iYWQtc2tpbGxcIiksIHsgcmVjdXJzaXZlOiB0cnVlIH0pO1xuXHRcdFx0d3JpdGVGaWxlU3luYyhcblx0XHRcdFx0am9pbihwa2dEaXIsIFwic2tpbGxzL2dvb2Qtc2tpbGxcIiwgXCJTS0lMTC5tZFwiKSxcblx0XHRcdFx0XCItLS1cXG5uYW1lOiBnb29kLXNraWxsXFxuZGVzY3JpcHRpb246IEdvb2RcXG4tLS1cXG5Db250ZW50XCIsXG5cdFx0XHQpO1xuXHRcdFx0d3JpdGVGaWxlU3luYyhcblx0XHRcdFx0am9pbihwa2dEaXIsIFwic2tpbGxzL2JhZC1za2lsbFwiLCBcIlNLSUxMLm1kXCIpLFxuXHRcdFx0XHRcIi0tLVxcbm5hbWU6IGJhZC1za2lsbFxcbmRlc2NyaXB0aW9uOiBCYWRcXG4tLS1cXG5Db250ZW50XCIsXG5cdFx0XHQpO1xuXHRcdFx0d3JpdGVGaWxlU3luYyhcblx0XHRcdFx0am9pbihwa2dEaXIsIFwicGFja2FnZS5qc29uXCIpLFxuXHRcdFx0XHRKU09OLnN0cmluZ2lmeSh7XG5cdFx0XHRcdFx0bmFtZTogXCJza2lsbC1tYW5pZmVzdC1wa2dcIixcblx0XHRcdFx0XHRwaToge1xuXHRcdFx0XHRcdFx0c2tpbGxzOiBbXCJza2lsbHNcIiwgXCIhKiovYmFkLXNraWxsXCJdLFxuXHRcdFx0XHRcdH0sXG5cdFx0XHRcdH0pLFxuXHRcdFx0KTtcblxuXHRcdFx0Y29uc3QgcmVzdWx0ID0gYXdhaXQgcGFja2FnZU1hbmFnZXIucmVzb2x2ZUV4dGVuc2lvblNvdXJjZXMoW3BrZ0Rpcl0pO1xuXHRcdFx0ZXhwZWN0KHJlc3VsdC5za2lsbHMuc29tZSgocikgPT4gaXNFbmFibGVkKHIsIFwiZ29vZC1za2lsbFwiLCBcImluY2x1ZGVzXCIpKSkudG9CZSh0cnVlKTtcblx0XHRcdGV4cGVjdChyZXN1bHQuc2tpbGxzLnNvbWUoKHIpID0+IHIucGF0aC5pbmNsdWRlcyhcImJhZC1za2lsbFwiKSkpLnRvQmUoZmFsc2UpO1xuXHRcdH0pO1xuXG5cdFx0aXQoXCJzaG91bGQgZXhwYW5kIHBvc2l0aXZlIGdsb2IgbWFuaWZlc3QgZW50cmllcyBiZWZvcmUgY29sbGVjdGluZyBza2lsbHNcIiwgYXN5bmMgKCkgPT4ge1xuXHRcdFx0Y29uc3QgcGtnRGlyID0gam9pbih0ZW1wRGlyLCBcInNraWxsLW1hbmlmZXN0LWdsb2ItcGtnXCIpO1xuXHRcdFx0bWtkaXJTeW5jKGpvaW4ocGtnRGlyLCBcInBsdWdpbnMvcGRmLXRvLW1hcmtkb3duL3NraWxscy9wZGYtdG8tbWFya2Rvd25cIiksIHsgcmVjdXJzaXZlOiB0cnVlIH0pO1xuXHRcdFx0bWtkaXJTeW5jKGpvaW4ocGtnRGlyLCBcInBsdWdpbnMvbnV0cmllbnQtZHdzL3NraWxscy9kb2N1bWVudC1wcm9jZXNzb3ItYXBpXCIpLCB7IHJlY3Vyc2l2ZTogdHJ1ZSB9KTtcblx0XHRcdHdyaXRlRmlsZVN5bmMoXG5cdFx0XHRcdGpvaW4ocGtnRGlyLCBcInBsdWdpbnMvcGRmLXRvLW1hcmtkb3duL3NraWxscy9wZGYtdG8tbWFya2Rvd25cIiwgXCJTS0lMTC5tZFwiKSxcblx0XHRcdFx0XCItLS1cXG5uYW1lOiBwZGYtdG8tbWFya2Rvd25cXG5kZXNjcmlwdGlvbjogUERGIHRvIE1hcmtkb3duXFxuLS0tXFxuQ29udGVudFwiLFxuXHRcdFx0KTtcblx0XHRcdHdyaXRlRmlsZVN5bmMoXG5cdFx0XHRcdGpvaW4ocGtnRGlyLCBcInBsdWdpbnMvbnV0cmllbnQtZHdzL3NraWxscy9kb2N1bWVudC1wcm9jZXNzb3ItYXBpXCIsIFwiU0tJTEwubWRcIiksXG5cdFx0XHRcdFwiLS0tXFxubmFtZTogZG9jdW1lbnQtcHJvY2Vzc29yLWFwaVxcbmRlc2NyaXB0aW9uOiBEV1NcXG4tLS1cXG5Db250ZW50XCIsXG5cdFx0XHQpO1xuXHRcdFx0d3JpdGVGaWxlU3luYyhcblx0XHRcdFx0am9pbihwa2dEaXIsIFwicGFja2FnZS5qc29uXCIpLFxuXHRcdFx0XHRKU09OLnN0cmluZ2lmeSh7XG5cdFx0XHRcdFx0bmFtZTogXCJza2lsbC1tYW5pZmVzdC1nbG9iLXBrZ1wiLFxuXHRcdFx0XHRcdHBpOiB7XG5cdFx0XHRcdFx0XHRza2lsbHM6IFtcIi4vcGx1Z2lucy8qL3NraWxsc1wiXSxcblx0XHRcdFx0XHR9LFxuXHRcdFx0XHR9KSxcblx0XHRcdCk7XG5cblx0XHRcdGNvbnN0IHJlc3VsdCA9IGF3YWl0IHBhY2thZ2VNYW5hZ2VyLnJlc29sdmVFeHRlbnNpb25Tb3VyY2VzKFtwa2dEaXJdKTtcblx0XHRcdGV4cGVjdChyZXN1bHQuc2tpbGxzLnNvbWUoKHIpID0+IGlzRW5hYmxlZChyLCBcInBkZi10by1tYXJrZG93blwiLCBcImluY2x1ZGVzXCIpKSkudG9CZSh0cnVlKTtcblx0XHRcdGV4cGVjdChyZXN1bHQuc2tpbGxzLnNvbWUoKHIpID0+IGlzRW5hYmxlZChyLCBcImRvY3VtZW50LXByb2Nlc3Nvci1hcGlcIiwgXCJpbmNsdWRlc1wiKSkpLnRvQmUodHJ1ZSk7XG5cdFx0fSk7XG5cdH0pO1xuXG5cdGRlc2NyaWJlKFwicGF0dGVybiBmaWx0ZXJpbmcgaW4gcGFja2FnZSBmaWx0ZXJzXCIsICgpID0+IHtcblx0XHRpdChcInNob3VsZCBhcHBseSB1c2VyIGZpbHRlcnMgb24gdG9wIG9mIG1hbmlmZXN0IGZpbHRlcnMgKG5vdCByZXBsYWNlKVwiLCBhc3luYyAoKSA9PiB7XG5cdFx0XHQvLyBNYW5pZmVzdCBleGNsdWRlcyBiYXoudHMsIHVzZXIgZXhjbHVkZXMgYmFyLnRzXG5cdFx0XHQvLyBSZXN1bHQgc2hvdWxkIGV4Y2x1ZGUgQk9USFxuXHRcdFx0Y29uc3QgcGtnRGlyID0gam9pbih0ZW1wRGlyLCBcImxheWVyZWQtcGtnXCIpO1xuXHRcdFx0bWtkaXJTeW5jKGpvaW4ocGtnRGlyLCBcImV4dGVuc2lvbnNcIiksIHsgcmVjdXJzaXZlOiB0cnVlIH0pO1xuXHRcdFx0d3JpdGVGaWxlU3luYyhqb2luKHBrZ0RpciwgXCJleHRlbnNpb25zXCIsIFwiZm9vLnRzXCIpLCBcImV4cG9ydCBkZWZhdWx0IGZ1bmN0aW9uKCkge31cIik7XG5cdFx0XHR3cml0ZUZpbGVTeW5jKGpvaW4ocGtnRGlyLCBcImV4dGVuc2lvbnNcIiwgXCJiYXIudHNcIiksIFwiZXhwb3J0IGRlZmF1bHQgZnVuY3Rpb24oKSB7fVwiKTtcblx0XHRcdHdyaXRlRmlsZVN5bmMoam9pbihwa2dEaXIsIFwiZXh0ZW5zaW9uc1wiLCBcImJhei50c1wiKSwgXCJleHBvcnQgZGVmYXVsdCBmdW5jdGlvbigpIHt9XCIpO1xuXHRcdFx0d3JpdGVGaWxlU3luYyhcblx0XHRcdFx0am9pbihwa2dEaXIsIFwicGFja2FnZS5qc29uXCIpLFxuXHRcdFx0XHRKU09OLnN0cmluZ2lmeSh7XG5cdFx0XHRcdFx0bmFtZTogXCJsYXllcmVkLXBrZ1wiLFxuXHRcdFx0XHRcdHBpOiB7XG5cdFx0XHRcdFx0XHRleHRlbnNpb25zOiBbXCJleHRlbnNpb25zXCIsIFwiISoqL2Jhei50c1wiXSxcblx0XHRcdFx0XHR9LFxuXHRcdFx0XHR9KSxcblx0XHRcdCk7XG5cblx0XHRcdC8vIFVzZXIgZmlsdGVyIGFkZHMgZXhjbHVzaW9uIGZvciBiYXIudHNcblx0XHRcdHNldHRpbmdzTWFuYWdlci5zZXRQYWNrYWdlcyhbXG5cdFx0XHRcdHtcblx0XHRcdFx0XHRzb3VyY2U6IHBrZ0Rpcixcblx0XHRcdFx0XHRleHRlbnNpb25zOiBbXCIhKiovYmFyLnRzXCJdLFxuXHRcdFx0XHRcdHNraWxsczogW10sXG5cdFx0XHRcdFx0cHJvbXB0czogW10sXG5cdFx0XHRcdFx0dGhlbWVzOiBbXSxcblx0XHRcdFx0fSxcblx0XHRcdF0pO1xuXG5cdFx0XHRjb25zdCByZXN1bHQgPSBhd2FpdCBwYWNrYWdlTWFuYWdlci5yZXNvbHZlKCk7XG5cdFx0XHQvLyBmb28udHMgc2hvdWxkIGJlIGluY2x1ZGVkIChub3QgZXhjbHVkZWQgYnkgYW55b25lKVxuXHRcdFx0ZXhwZWN0KHJlc3VsdC5leHRlbnNpb25zLnNvbWUoKHIpID0+IGlzRW5hYmxlZChyLCBcImZvby50c1wiKSkpLnRvQmUodHJ1ZSk7XG5cdFx0XHQvLyBiYXIudHMgc2hvdWxkIGJlIGV4Y2x1ZGVkIChieSB1c2VyKVxuXHRcdFx0ZXhwZWN0KHJlc3VsdC5leHRlbnNpb25zLnNvbWUoKHIpID0+IGlzRGlzYWJsZWQociwgXCJiYXIudHNcIikpKS50b0JlKHRydWUpO1xuXHRcdFx0Ly8gYmF6LnRzIHNob3VsZCBiZSBleGNsdWRlZCAoYnkgbWFuaWZlc3QpXG5cdFx0XHRleHBlY3QocmVzdWx0LmV4dGVuc2lvbnMuc29tZSgocikgPT4gcGF0aEVuZHNXaXRoKHIucGF0aCwgXCJiYXoudHNcIikpKS50b0JlKGZhbHNlKTtcblx0XHR9KTtcblxuXHRcdGl0KFwic2hvdWxkIGV4Y2x1ZGUgZXh0ZW5zaW9ucyBmcm9tIHBhY2thZ2Ugd2l0aCAhIHBhdHRlcm5cIiwgYXN5bmMgKCkgPT4ge1xuXHRcdFx0Y29uc3QgcGtnRGlyID0gam9pbih0ZW1wRGlyLCBcInBhdHRlcm4tcGtnXCIpO1xuXHRcdFx0bWtkaXJTeW5jKGpvaW4ocGtnRGlyLCBcImV4dGVuc2lvbnNcIiksIHsgcmVjdXJzaXZlOiB0cnVlIH0pO1xuXHRcdFx0d3JpdGVGaWxlU3luYyhqb2luKHBrZ0RpciwgXCJleHRlbnNpb25zXCIsIFwiZm9vLnRzXCIpLCBcImV4cG9ydCBkZWZhdWx0IGZ1bmN0aW9uKCkge31cIik7XG5cdFx0XHR3cml0ZUZpbGVTeW5jKGpvaW4ocGtnRGlyLCBcImV4dGVuc2lvbnNcIiwgXCJiYXIudHNcIiksIFwiZXhwb3J0IGRlZmF1bHQgZnVuY3Rpb24oKSB7fVwiKTtcblx0XHRcdHdyaXRlRmlsZVN5bmMoam9pbihwa2dEaXIsIFwiZXh0ZW5zaW9uc1wiLCBcImJhei50c1wiKSwgXCJleHBvcnQgZGVmYXVsdCBmdW5jdGlvbigpIHt9XCIpO1xuXG5cdFx0XHRzZXR0aW5nc01hbmFnZXIuc2V0UGFja2FnZXMoW1xuXHRcdFx0XHR7XG5cdFx0XHRcdFx0c291cmNlOiBwa2dEaXIsXG5cdFx0XHRcdFx0ZXh0ZW5zaW9uczogW1wiISoqL2Jhei50c1wiXSxcblx0XHRcdFx0XHRza2lsbHM6IFtdLFxuXHRcdFx0XHRcdHByb21wdHM6IFtdLFxuXHRcdFx0XHRcdHRoZW1lczogW10sXG5cdFx0XHRcdH0sXG5cdFx0XHRdKTtcblxuXHRcdFx0Y29uc3QgcmVzdWx0ID0gYXdhaXQgcGFja2FnZU1hbmFnZXIucmVzb2x2ZSgpO1xuXHRcdFx0ZXhwZWN0KHJlc3VsdC5leHRlbnNpb25zLnNvbWUoKHIpID0+IGlzRW5hYmxlZChyLCBcImZvby50c1wiKSkpLnRvQmUodHJ1ZSk7XG5cdFx0XHRleHBlY3QocmVzdWx0LmV4dGVuc2lvbnMuc29tZSgocikgPT4gaXNFbmFibGVkKHIsIFwiYmFyLnRzXCIpKSkudG9CZSh0cnVlKTtcblx0XHRcdGV4cGVjdChyZXN1bHQuZXh0ZW5zaW9ucy5zb21lKChyKSA9PiBpc0Rpc2FibGVkKHIsIFwiYmF6LnRzXCIpKSkudG9CZSh0cnVlKTtcblx0XHR9KTtcblxuXHRcdGl0KFwic2hvdWxkIGZpbHRlciB0aGVtZXMgZnJvbSBwYWNrYWdlXCIsIGFzeW5jICgpID0+IHtcblx0XHRcdGNvbnN0IHBrZ0RpciA9IGpvaW4odGVtcERpciwgXCJ0aGVtZS1wa2dcIik7XG5cdFx0XHRta2RpclN5bmMoam9pbihwa2dEaXIsIFwidGhlbWVzXCIpLCB7IHJlY3Vyc2l2ZTogdHJ1ZSB9KTtcblx0XHRcdHdyaXRlRmlsZVN5bmMoam9pbihwa2dEaXIsIFwidGhlbWVzXCIsIFwibmljZS5qc29uXCIpLCBcInt9XCIpO1xuXHRcdFx0d3JpdGVGaWxlU3luYyhqb2luKHBrZ0RpciwgXCJ0aGVtZXNcIiwgXCJ1Z2x5Lmpzb25cIiksIFwie31cIik7XG5cblx0XHRcdHNldHRpbmdzTWFuYWdlci5zZXRQYWNrYWdlcyhbXG5cdFx0XHRcdHtcblx0XHRcdFx0XHRzb3VyY2U6IHBrZ0Rpcixcblx0XHRcdFx0XHRleHRlbnNpb25zOiBbXSxcblx0XHRcdFx0XHRza2lsbHM6IFtdLFxuXHRcdFx0XHRcdHByb21wdHM6IFtdLFxuXHRcdFx0XHRcdHRoZW1lczogW1wiIXVnbHkuanNvblwiXSxcblx0XHRcdFx0fSxcblx0XHRcdF0pO1xuXG5cdFx0XHRjb25zdCByZXN1bHQgPSBhd2FpdCBwYWNrYWdlTWFuYWdlci5yZXNvbHZlKCk7XG5cdFx0XHRleHBlY3QocmVzdWx0LnRoZW1lcy5zb21lKChyKSA9PiBpc0VuYWJsZWQociwgXCJuaWNlLmpzb25cIikpKS50b0JlKHRydWUpO1xuXHRcdFx0ZXhwZWN0KHJlc3VsdC50aGVtZXMuc29tZSgocikgPT4gaXNEaXNhYmxlZChyLCBcInVnbHkuanNvblwiKSkpLnRvQmUodHJ1ZSk7XG5cdFx0fSk7XG5cblx0XHRpdChcInNob3VsZCBjb21iaW5lIGluY2x1ZGUgYW5kIGV4Y2x1ZGUgcGF0dGVybnNcIiwgYXN5bmMgKCkgPT4ge1xuXHRcdFx0Y29uc3QgcGtnRGlyID0gam9pbih0ZW1wRGlyLCBcImNvbWJvLXBrZ1wiKTtcblx0XHRcdG1rZGlyU3luYyhqb2luKHBrZ0RpciwgXCJleHRlbnNpb25zXCIpLCB7IHJlY3Vyc2l2ZTogdHJ1ZSB9KTtcblx0XHRcdHdyaXRlRmlsZVN5bmMoam9pbihwa2dEaXIsIFwiZXh0ZW5zaW9uc1wiLCBcImFscGhhLnRzXCIpLCBcImV4cG9ydCBkZWZhdWx0IGZ1bmN0aW9uKCkge31cIik7XG5cdFx0XHR3cml0ZUZpbGVTeW5jKGpvaW4ocGtnRGlyLCBcImV4dGVuc2lvbnNcIiwgXCJiZXRhLnRzXCIpLCBcImV4cG9ydCBkZWZhdWx0IGZ1bmN0aW9uKCkge31cIik7XG5cdFx0XHR3cml0ZUZpbGVTeW5jKGpvaW4ocGtnRGlyLCBcImV4dGVuc2lvbnNcIiwgXCJnYW1tYS50c1wiKSwgXCJleHBvcnQgZGVmYXVsdCBmdW5jdGlvbigpIHt9XCIpO1xuXG5cdFx0XHRzZXR0aW5nc01hbmFnZXIuc2V0UGFja2FnZXMoW1xuXHRcdFx0XHR7XG5cdFx0XHRcdFx0c291cmNlOiBwa2dEaXIsXG5cdFx0XHRcdFx0ZXh0ZW5zaW9uczogW1wiKiovYWxwaGEudHNcIiwgXCIqKi9iZXRhLnRzXCIsIFwiISoqL2JldGEudHNcIl0sXG5cdFx0XHRcdFx0c2tpbGxzOiBbXSxcblx0XHRcdFx0XHRwcm9tcHRzOiBbXSxcblx0XHRcdFx0XHR0aGVtZXM6IFtdLFxuXHRcdFx0XHR9LFxuXHRcdFx0XSk7XG5cblx0XHRcdGNvbnN0IHJlc3VsdCA9IGF3YWl0IHBhY2thZ2VNYW5hZ2VyLnJlc29sdmUoKTtcblx0XHRcdGV4cGVjdChyZXN1bHQuZXh0ZW5zaW9ucy5zb21lKChyKSA9PiBpc0VuYWJsZWQociwgXCJhbHBoYS50c1wiKSkpLnRvQmUodHJ1ZSk7XG5cdFx0XHRleHBlY3QocmVzdWx0LmV4dGVuc2lvbnMuc29tZSgocikgPT4gaXNEaXNhYmxlZChyLCBcImJldGEudHNcIikpKS50b0JlKHRydWUpO1xuXHRcdFx0ZXhwZWN0KHJlc3VsdC5leHRlbnNpb25zLnNvbWUoKHIpID0+IGlzRGlzYWJsZWQociwgXCJnYW1tYS50c1wiKSkpLnRvQmUodHJ1ZSk7XG5cdFx0fSk7XG5cblx0XHRpdChcInNob3VsZCB3b3JrIHdpdGggZGlyZWN0IHBhdGhzIChubyBwYXR0ZXJucylcIiwgYXN5bmMgKCkgPT4ge1xuXHRcdFx0Y29uc3QgcGtnRGlyID0gam9pbih0ZW1wRGlyLCBcImRpcmVjdC1wa2dcIik7XG5cdFx0XHRta2RpclN5bmMoam9pbihwa2dEaXIsIFwiZXh0ZW5zaW9uc1wiKSwgeyByZWN1cnNpdmU6IHRydWUgfSk7XG5cdFx0XHR3cml0ZUZpbGVTeW5jKGpvaW4ocGtnRGlyLCBcImV4dGVuc2lvbnNcIiwgXCJvbmUudHNcIiksIFwiZXhwb3J0IGRlZmF1bHQgZnVuY3Rpb24oKSB7fVwiKTtcblx0XHRcdHdyaXRlRmlsZVN5bmMoam9pbihwa2dEaXIsIFwiZXh0ZW5zaW9uc1wiLCBcInR3by50c1wiKSwgXCJleHBvcnQgZGVmYXVsdCBmdW5jdGlvbigpIHt9XCIpO1xuXG5cdFx0XHRzZXR0aW5nc01hbmFnZXIuc2V0UGFja2FnZXMoW1xuXHRcdFx0XHR7XG5cdFx0XHRcdFx0c291cmNlOiBwa2dEaXIsXG5cdFx0XHRcdFx0ZXh0ZW5zaW9uczogW1wiZXh0ZW5zaW9ucy9vbmUudHNcIl0sXG5cdFx0XHRcdFx0c2tpbGxzOiBbXSxcblx0XHRcdFx0XHRwcm9tcHRzOiBbXSxcblx0XHRcdFx0XHR0aGVtZXM6IFtdLFxuXHRcdFx0XHR9LFxuXHRcdFx0XSk7XG5cblx0XHRcdGNvbnN0IHJlc3VsdCA9IGF3YWl0IHBhY2thZ2VNYW5hZ2VyLnJlc29sdmUoKTtcblx0XHRcdGV4cGVjdChyZXN1bHQuZXh0ZW5zaW9ucy5zb21lKChyKSA9PiBpc0VuYWJsZWQociwgXCJvbmUudHNcIikpKS50b0JlKHRydWUpO1xuXHRcdFx0ZXhwZWN0KHJlc3VsdC5leHRlbnNpb25zLnNvbWUoKHIpID0+IGlzRGlzYWJsZWQociwgXCJ0d28udHNcIikpKS50b0JlKHRydWUpO1xuXHRcdH0pO1xuXHR9KTtcblxuXHRkZXNjcmliZShcImZvcmNlLWluY2x1ZGUgcGF0dGVybnNcIiwgKCkgPT4ge1xuXHRcdGl0KFwic2hvdWxkIGZvcmNlLWluY2x1ZGUgZXh0ZW5zaW9ucyB3aXRoICsgcGF0dGVybiBhZnRlciBleGNsdXNpb25cIiwgYXN5bmMgKCkgPT4ge1xuXHRcdFx0Y29uc3QgZXh0RGlyID0gam9pbihhZ2VudERpciwgXCJleHRlbnNpb25zXCIpO1xuXHRcdFx0bWtkaXJTeW5jKGV4dERpciwgeyByZWN1cnNpdmU6IHRydWUgfSk7XG5cdFx0XHR3cml0ZUZpbGVTeW5jKGpvaW4oZXh0RGlyLCBcImtlZXAudHNcIiksIFwiZXhwb3J0IGRlZmF1bHQgZnVuY3Rpb24oKSB7fVwiKTtcblx0XHRcdHdyaXRlRmlsZVN5bmMoam9pbihleHREaXIsIFwiZXhjbHVkZWQudHNcIiksIFwiZXhwb3J0IGRlZmF1bHQgZnVuY3Rpb24oKSB7fVwiKTtcblx0XHRcdHdyaXRlRmlsZVN5bmMoam9pbihleHREaXIsIFwiZm9yY2UtYmFjay50c1wiKSwgXCJleHBvcnQgZGVmYXVsdCBmdW5jdGlvbigpIHt9XCIpO1xuXG5cdFx0XHQvLyBFeGNsdWRlIGFsbCwgdGhlbiBmb3JjZS1pbmNsdWRlIG9uZSBiYWNrXG5cdFx0XHRzZXR0aW5nc01hbmFnZXIuc2V0RXh0ZW5zaW9uUGF0aHMoW1wiZXh0ZW5zaW9uc1wiLCBcIiFleHRlbnNpb25zLyoudHNcIiwgXCIrZXh0ZW5zaW9ucy9mb3JjZS1iYWNrLnRzXCJdKTtcblxuXHRcdFx0Y29uc3QgcmVzdWx0ID0gYXdhaXQgcGFja2FnZU1hbmFnZXIucmVzb2x2ZSgpO1xuXHRcdFx0ZXhwZWN0KHJlc3VsdC5leHRlbnNpb25zLnNvbWUoKHIpID0+IGlzRGlzYWJsZWQociwgXCJrZWVwLnRzXCIpKSkudG9CZSh0cnVlKTtcblx0XHRcdGV4cGVjdChyZXN1bHQuZXh0ZW5zaW9ucy5zb21lKChyKSA9PiBpc0Rpc2FibGVkKHIsIFwiZXhjbHVkZWQudHNcIikpKS50b0JlKHRydWUpO1xuXHRcdFx0ZXhwZWN0KHJlc3VsdC5leHRlbnNpb25zLnNvbWUoKHIpID0+IGlzRW5hYmxlZChyLCBcImZvcmNlLWJhY2sudHNcIikpKS50b0JlKHRydWUpO1xuXHRcdH0pO1xuXG5cdFx0aXQoXCJzaG91bGQgZm9yY2UtaW5jbHVkZSBvdmVycmlkZXMgZXhjbHVkZSBpbiBwYWNrYWdlIGZpbHRlcnNcIiwgYXN5bmMgKCkgPT4ge1xuXHRcdFx0Y29uc3QgcGtnRGlyID0gam9pbih0ZW1wRGlyLCBcImZvcmNlLXBrZ1wiKTtcblx0XHRcdG1rZGlyU3luYyhqb2luKHBrZ0RpciwgXCJleHRlbnNpb25zXCIpLCB7IHJlY3Vyc2l2ZTogdHJ1ZSB9KTtcblx0XHRcdHdyaXRlRmlsZVN5bmMoam9pbihwa2dEaXIsIFwiZXh0ZW5zaW9uc1wiLCBcImFscGhhLnRzXCIpLCBcImV4cG9ydCBkZWZhdWx0IGZ1bmN0aW9uKCkge31cIik7XG5cdFx0XHR3cml0ZUZpbGVTeW5jKGpvaW4ocGtnRGlyLCBcImV4dGVuc2lvbnNcIiwgXCJiZXRhLnRzXCIpLCBcImV4cG9ydCBkZWZhdWx0IGZ1bmN0aW9uKCkge31cIik7XG5cdFx0XHR3cml0ZUZpbGVTeW5jKGpvaW4ocGtnRGlyLCBcImV4dGVuc2lvbnNcIiwgXCJnYW1tYS50c1wiKSwgXCJleHBvcnQgZGVmYXVsdCBmdW5jdGlvbigpIHt9XCIpO1xuXG5cdFx0XHRzZXR0aW5nc01hbmFnZXIuc2V0UGFja2FnZXMoW1xuXHRcdFx0XHR7XG5cdFx0XHRcdFx0c291cmNlOiBwa2dEaXIsXG5cdFx0XHRcdFx0ZXh0ZW5zaW9uczogW1wiISoqLyoudHNcIiwgXCIrZXh0ZW5zaW9ucy9iZXRhLnRzXCJdLFxuXHRcdFx0XHRcdHNraWxsczogW10sXG5cdFx0XHRcdFx0cHJvbXB0czogW10sXG5cdFx0XHRcdFx0dGhlbWVzOiBbXSxcblx0XHRcdFx0fSxcblx0XHRcdF0pO1xuXG5cdFx0XHRjb25zdCByZXN1bHQgPSBhd2FpdCBwYWNrYWdlTWFuYWdlci5yZXNvbHZlKCk7XG5cdFx0XHRleHBlY3QocmVzdWx0LmV4dGVuc2lvbnMuc29tZSgocikgPT4gaXNEaXNhYmxlZChyLCBcImFscGhhLnRzXCIpKSkudG9CZSh0cnVlKTtcblx0XHRcdGV4cGVjdChyZXN1bHQuZXh0ZW5zaW9ucy5zb21lKChyKSA9PiBpc0VuYWJsZWQociwgXCJiZXRhLnRzXCIpKSkudG9CZSh0cnVlKTtcblx0XHRcdGV4cGVjdChyZXN1bHQuZXh0ZW5zaW9ucy5zb21lKChyKSA9PiBpc0Rpc2FibGVkKHIsIFwiZ2FtbWEudHNcIikpKS50b0JlKHRydWUpO1xuXHRcdH0pO1xuXG5cdFx0aXQoXCJzaG91bGQgZm9yY2UtaW5jbHVkZSBtdWx0aXBsZSByZXNvdXJjZXNcIiwgYXN5bmMgKCkgPT4ge1xuXHRcdFx0Y29uc3QgcGtnRGlyID0gam9pbih0ZW1wRGlyLCBcIm11bHRpLWZvcmNlLXBrZ1wiKTtcblx0XHRcdG1rZGlyU3luYyhqb2luKHBrZ0RpciwgXCJza2lsbHMvc2tpbGwtYVwiKSwgeyByZWN1cnNpdmU6IHRydWUgfSk7XG5cdFx0XHRta2RpclN5bmMoam9pbihwa2dEaXIsIFwic2tpbGxzL3NraWxsLWJcIiksIHsgcmVjdXJzaXZlOiB0cnVlIH0pO1xuXHRcdFx0bWtkaXJTeW5jKGpvaW4ocGtnRGlyLCBcInNraWxscy9za2lsbC1jXCIpLCB7IHJlY3Vyc2l2ZTogdHJ1ZSB9KTtcblx0XHRcdHdyaXRlRmlsZVN5bmMoam9pbihwa2dEaXIsIFwic2tpbGxzL3NraWxsLWFcIiwgXCJTS0lMTC5tZFwiKSwgXCItLS1cXG5uYW1lOiBza2lsbC1hXFxuZGVzY3JpcHRpb246IEFcXG4tLS1cXG5Db250ZW50XCIpO1xuXHRcdFx0d3JpdGVGaWxlU3luYyhqb2luKHBrZ0RpciwgXCJza2lsbHMvc2tpbGwtYlwiLCBcIlNLSUxMLm1kXCIpLCBcIi0tLVxcbm5hbWU6IHNraWxsLWJcXG5kZXNjcmlwdGlvbjogQlxcbi0tLVxcbkNvbnRlbnRcIik7XG5cdFx0XHR3cml0ZUZpbGVTeW5jKGpvaW4ocGtnRGlyLCBcInNraWxscy9za2lsbC1jXCIsIFwiU0tJTEwubWRcIiksIFwiLS0tXFxubmFtZTogc2tpbGwtY1xcbmRlc2NyaXB0aW9uOiBDXFxuLS0tXFxuQ29udGVudFwiKTtcblxuXHRcdFx0c2V0dGluZ3NNYW5hZ2VyLnNldFBhY2thZ2VzKFtcblx0XHRcdFx0e1xuXHRcdFx0XHRcdHNvdXJjZTogcGtnRGlyLFxuXHRcdFx0XHRcdGV4dGVuc2lvbnM6IFtdLFxuXHRcdFx0XHRcdHNraWxsczogW1wiISoqLypcIiwgXCIrc2tpbGxzL3NraWxsLWFcIiwgXCIrc2tpbGxzL3NraWxsLWNcIl0sXG5cdFx0XHRcdFx0cHJvbXB0czogW10sXG5cdFx0XHRcdFx0dGhlbWVzOiBbXSxcblx0XHRcdFx0fSxcblx0XHRcdF0pO1xuXG5cdFx0XHRjb25zdCByZXN1bHQgPSBhd2FpdCBwYWNrYWdlTWFuYWdlci5yZXNvbHZlKCk7XG5cdFx0XHRleHBlY3QocmVzdWx0LnNraWxscy5zb21lKChyKSA9PiBpc0VuYWJsZWQociwgXCJza2lsbC1hXCIsIFwiaW5jbHVkZXNcIikpKS50b0JlKHRydWUpO1xuXHRcdFx0ZXhwZWN0KHJlc3VsdC5za2lsbHMuc29tZSgocikgPT4gaXNEaXNhYmxlZChyLCBcInNraWxsLWJcIiwgXCJpbmNsdWRlc1wiKSkpLnRvQmUodHJ1ZSk7XG5cdFx0XHRleHBlY3QocmVzdWx0LnNraWxscy5zb21lKChyKSA9PiBpc0VuYWJsZWQociwgXCJza2lsbC1jXCIsIFwiaW5jbHVkZXNcIikpKS50b0JlKHRydWUpO1xuXHRcdH0pO1xuXG5cdFx0aXQoXCJzaG91bGQgZm9yY2UtaW5jbHVkZSBhZnRlciBzcGVjaWZpYyBleGNsdXNpb25cIiwgYXN5bmMgKCkgPT4ge1xuXHRcdFx0Y29uc3QgZXh0RGlyID0gam9pbihhZ2VudERpciwgXCJleHRlbnNpb25zXCIpO1xuXHRcdFx0bWtkaXJTeW5jKGV4dERpciwgeyByZWN1cnNpdmU6IHRydWUgfSk7XG5cdFx0XHR3cml0ZUZpbGVTeW5jKGpvaW4oZXh0RGlyLCBcImEudHNcIiksIFwiZXhwb3J0IGRlZmF1bHQgZnVuY3Rpb24oKSB7fVwiKTtcblx0XHRcdHdyaXRlRmlsZVN5bmMoam9pbihleHREaXIsIFwiYi50c1wiKSwgXCJleHBvcnQgZGVmYXVsdCBmdW5jdGlvbigpIHt9XCIpO1xuXG5cdFx0XHQvLyBTcGVjaWZpY2FsbHkgZXhjbHVkZSBiLnRzLCB0aGVuIGZvcmNlIGl0IGJhY2tcblx0XHRcdHNldHRpbmdzTWFuYWdlci5zZXRFeHRlbnNpb25QYXRocyhbXCJleHRlbnNpb25zXCIsIFwiIWV4dGVuc2lvbnMvYi50c1wiLCBcIitleHRlbnNpb25zL2IudHNcIl0pO1xuXG5cdFx0XHRjb25zdCByZXN1bHQgPSBhd2FpdCBwYWNrYWdlTWFuYWdlci5yZXNvbHZlKCk7XG5cdFx0XHRleHBlY3QocmVzdWx0LmV4dGVuc2lvbnMuc29tZSgocikgPT4gaXNFbmFibGVkKHIsIFwiYS50c1wiKSkpLnRvQmUodHJ1ZSk7XG5cdFx0XHRleHBlY3QocmVzdWx0LmV4dGVuc2lvbnMuc29tZSgocikgPT4gaXNFbmFibGVkKHIsIFwiYi50c1wiKSkpLnRvQmUodHJ1ZSk7XG5cdFx0fSk7XG5cblx0XHRpdChcInNob3VsZCBoYW5kbGUgZm9yY2UtaW5jbHVkZSBpbiBtYW5pZmVzdCBwYXR0ZXJuc1wiLCBhc3luYyAoKSA9PiB7XG5cdFx0XHRjb25zdCBwa2dEaXIgPSBqb2luKHRlbXBEaXIsIFwibWFuaWZlc3QtZm9yY2UtcGtnXCIpO1xuXHRcdFx0bWtkaXJTeW5jKGpvaW4ocGtnRGlyLCBcImV4dGVuc2lvbnNcIiksIHsgcmVjdXJzaXZlOiB0cnVlIH0pO1xuXHRcdFx0d3JpdGVGaWxlU3luYyhqb2luKHBrZ0RpciwgXCJleHRlbnNpb25zXCIsIFwib25lLnRzXCIpLCBcImV4cG9ydCBkZWZhdWx0IGZ1bmN0aW9uKCkge31cIik7XG5cdFx0XHR3cml0ZUZpbGVTeW5jKGpvaW4ocGtnRGlyLCBcImV4dGVuc2lvbnNcIiwgXCJ0d28udHNcIiksIFwiZXhwb3J0IGRlZmF1bHQgZnVuY3Rpb24oKSB7fVwiKTtcblx0XHRcdHdyaXRlRmlsZVN5bmMoam9pbihwa2dEaXIsIFwiZXh0ZW5zaW9uc1wiLCBcInRocmVlLnRzXCIpLCBcImV4cG9ydCBkZWZhdWx0IGZ1bmN0aW9uKCkge31cIik7XG5cdFx0XHR3cml0ZUZpbGVTeW5jKFxuXHRcdFx0XHRqb2luKHBrZ0RpciwgXCJwYWNrYWdlLmpzb25cIiksXG5cdFx0XHRcdEpTT04uc3RyaW5naWZ5KHtcblx0XHRcdFx0XHRuYW1lOiBcIm1hbmlmZXN0LWZvcmNlLXBrZ1wiLFxuXHRcdFx0XHRcdHBpOiB7XG5cdFx0XHRcdFx0XHRleHRlbnNpb25zOiBbXCJleHRlbnNpb25zXCIsIFwiISoqL3R3by50c1wiLCBcIitleHRlbnNpb25zL3R3by50c1wiXSxcblx0XHRcdFx0XHR9LFxuXHRcdFx0XHR9KSxcblx0XHRcdCk7XG5cblx0XHRcdGNvbnN0IHJlc3VsdCA9IGF3YWl0IHBhY2thZ2VNYW5hZ2VyLnJlc29sdmVFeHRlbnNpb25Tb3VyY2VzKFtwa2dEaXJdKTtcblx0XHRcdGV4cGVjdChyZXN1bHQuZXh0ZW5zaW9ucy5zb21lKChyKSA9PiBpc0VuYWJsZWQociwgXCJvbmUudHNcIikpKS50b0JlKHRydWUpO1xuXHRcdFx0ZXhwZWN0KHJlc3VsdC5leHRlbnNpb25zLnNvbWUoKHIpID0+IGlzRW5hYmxlZChyLCBcInR3by50c1wiKSkpLnRvQmUodHJ1ZSk7XG5cdFx0XHRleHBlY3QocmVzdWx0LmV4dGVuc2lvbnMuc29tZSgocikgPT4gaXNFbmFibGVkKHIsIFwidGhyZWUudHNcIikpKS50b0JlKHRydWUpO1xuXHRcdH0pO1xuXG5cdFx0aXQoXCJzaG91bGQgZm9yY2UtaW5jbHVkZSB0aGVtZXNcIiwgYXN5bmMgKCkgPT4ge1xuXHRcdFx0Y29uc3QgdGhlbWVzRGlyID0gam9pbihhZ2VudERpciwgXCJ0aGVtZXNcIik7XG5cdFx0XHRta2RpclN5bmModGhlbWVzRGlyLCB7IHJlY3Vyc2l2ZTogdHJ1ZSB9KTtcblx0XHRcdHdyaXRlRmlsZVN5bmMoam9pbih0aGVtZXNEaXIsIFwiZGFyay5qc29uXCIpLCBcInt9XCIpO1xuXHRcdFx0d3JpdGVGaWxlU3luYyhqb2luKHRoZW1lc0RpciwgXCJsaWdodC5qc29uXCIpLCBcInt9XCIpO1xuXHRcdFx0d3JpdGVGaWxlU3luYyhqb2luKHRoZW1lc0RpciwgXCJzcGVjaWFsLmpzb25cIiksIFwie31cIik7XG5cblx0XHRcdHNldHRpbmdzTWFuYWdlci5zZXRUaGVtZVBhdGhzKFtcInRoZW1lc1wiLCBcIiF0aGVtZXMvKi5qc29uXCIsIFwiK3RoZW1lcy9zcGVjaWFsLmpzb25cIl0pO1xuXG5cdFx0XHRjb25zdCByZXN1bHQgPSBhd2FpdCBwYWNrYWdlTWFuYWdlci5yZXNvbHZlKCk7XG5cdFx0XHRleHBlY3QocmVzdWx0LnRoZW1lcy5zb21lKChyKSA9PiBpc0Rpc2FibGVkKHIsIFwiZGFyay5qc29uXCIpKSkudG9CZSh0cnVlKTtcblx0XHRcdGV4cGVjdChyZXN1bHQudGhlbWVzLnNvbWUoKHIpID0+IGlzRGlzYWJsZWQociwgXCJsaWdodC5qc29uXCIpKSkudG9CZSh0cnVlKTtcblx0XHRcdGV4cGVjdChyZXN1bHQudGhlbWVzLnNvbWUoKHIpID0+IGlzRW5hYmxlZChyLCBcInNwZWNpYWwuanNvblwiKSkpLnRvQmUodHJ1ZSk7XG5cdFx0fSk7XG5cblx0XHRpdChcInNob3VsZCBmb3JjZS1pbmNsdWRlIHByb21wdHNcIiwgYXN5bmMgKCkgPT4ge1xuXHRcdFx0Y29uc3QgcHJvbXB0c0RpciA9IGpvaW4oYWdlbnREaXIsIFwicHJvbXB0c1wiKTtcblx0XHRcdG1rZGlyU3luYyhwcm9tcHRzRGlyLCB7IHJlY3Vyc2l2ZTogdHJ1ZSB9KTtcblx0XHRcdHdyaXRlRmlsZVN5bmMoam9pbihwcm9tcHRzRGlyLCBcInJldmlldy5tZFwiKSwgXCJSZXZpZXdcIik7XG5cdFx0XHR3cml0ZUZpbGVTeW5jKGpvaW4ocHJvbXB0c0RpciwgXCJleHBsYWluLm1kXCIpLCBcIkV4cGxhaW5cIik7XG5cdFx0XHR3cml0ZUZpbGVTeW5jKGpvaW4ocHJvbXB0c0RpciwgXCJkZWJ1Zy5tZFwiKSwgXCJEZWJ1Z1wiKTtcblxuXHRcdFx0c2V0dGluZ3NNYW5hZ2VyLnNldFByb21wdFRlbXBsYXRlUGF0aHMoW1wicHJvbXB0c1wiLCBcIiFwcm9tcHRzLyoubWRcIiwgXCIrcHJvbXB0cy9kZWJ1Zy5tZFwiXSk7XG5cblx0XHRcdGNvbnN0IHJlc3VsdCA9IGF3YWl0IHBhY2thZ2VNYW5hZ2VyLnJlc29sdmUoKTtcblx0XHRcdGV4cGVjdChyZXN1bHQucHJvbXB0cy5zb21lKChyKSA9PiBpc0Rpc2FibGVkKHIsIFwicmV2aWV3Lm1kXCIpKSkudG9CZSh0cnVlKTtcblx0XHRcdGV4cGVjdChyZXN1bHQucHJvbXB0cy5zb21lKChyKSA9PiBpc0Rpc2FibGVkKHIsIFwiZXhwbGFpbi5tZFwiKSkpLnRvQmUodHJ1ZSk7XG5cdFx0XHRleHBlY3QocmVzdWx0LnByb21wdHMuc29tZSgocikgPT4gaXNFbmFibGVkKHIsIFwiZGVidWcubWRcIikpKS50b0JlKHRydWUpO1xuXHRcdH0pO1xuXHR9KTtcblxuXHRkZXNjcmliZShcImZvcmNlLWV4Y2x1ZGUgcGF0dGVybnNcIiwgKCkgPT4ge1xuXHRcdGl0KFwic2hvdWxkIGZvcmNlLWV4Y2x1ZGUgdG9wLWxldmVsIHJlc291cmNlc1wiLCBhc3luYyAoKSA9PiB7XG5cdFx0XHRjb25zdCBleHREaXIgPSBqb2luKGFnZW50RGlyLCBcImV4dGVuc2lvbnNcIik7XG5cdFx0XHRta2RpclN5bmMoZXh0RGlyLCB7IHJlY3Vyc2l2ZTogdHJ1ZSB9KTtcblx0XHRcdHdyaXRlRmlsZVN5bmMoam9pbihleHREaXIsIFwiYWxwaGEudHNcIiksIFwiZXhwb3J0IGRlZmF1bHQgZnVuY3Rpb24oKSB7fVwiKTtcblx0XHRcdHdyaXRlRmlsZVN5bmMoam9pbihleHREaXIsIFwiYmV0YS50c1wiKSwgXCJleHBvcnQgZGVmYXVsdCBmdW5jdGlvbigpIHt9XCIpO1xuXG5cdFx0XHRzZXR0aW5nc01hbmFnZXIuc2V0RXh0ZW5zaW9uUGF0aHMoW1wiZXh0ZW5zaW9uc1wiLCBcIitleHRlbnNpb25zL2FscGhhLnRzXCIsIFwiLWV4dGVuc2lvbnMvYWxwaGEudHNcIl0pO1xuXG5cdFx0XHRjb25zdCByZXN1bHQgPSBhd2FpdCBwYWNrYWdlTWFuYWdlci5yZXNvbHZlKCk7XG5cdFx0XHRleHBlY3QocmVzdWx0LmV4dGVuc2lvbnMuc29tZSgocikgPT4gaXNEaXNhYmxlZChyLCBcImFscGhhLnRzXCIpKSkudG9CZSh0cnVlKTtcblx0XHRcdGV4cGVjdChyZXN1bHQuZXh0ZW5zaW9ucy5zb21lKChyKSA9PiBpc0VuYWJsZWQociwgXCJiZXRhLnRzXCIpKSkudG9CZSh0cnVlKTtcblx0XHR9KTtcblxuXHRcdGl0KFwic2hvdWxkIGZvcmNlLWV4Y2x1ZGUgaW4gcGFja2FnZSBmaWx0ZXJzXCIsIGFzeW5jICgpID0+IHtcblx0XHRcdGNvbnN0IHBrZ0RpciA9IGpvaW4odGVtcERpciwgXCJmb3JjZS1leGNsdWRlLXBrZ1wiKTtcblx0XHRcdG1rZGlyU3luYyhqb2luKHBrZ0RpciwgXCJleHRlbnNpb25zXCIpLCB7IHJlY3Vyc2l2ZTogdHJ1ZSB9KTtcblx0XHRcdHdyaXRlRmlsZVN5bmMoam9pbihwa2dEaXIsIFwiZXh0ZW5zaW9uc1wiLCBcImFscGhhLnRzXCIpLCBcImV4cG9ydCBkZWZhdWx0IGZ1bmN0aW9uKCkge31cIik7XG5cdFx0XHR3cml0ZUZpbGVTeW5jKGpvaW4ocGtnRGlyLCBcImV4dGVuc2lvbnNcIiwgXCJiZXRhLnRzXCIpLCBcImV4cG9ydCBkZWZhdWx0IGZ1bmN0aW9uKCkge31cIik7XG5cblx0XHRcdHNldHRpbmdzTWFuYWdlci5zZXRQYWNrYWdlcyhbXG5cdFx0XHRcdHtcblx0XHRcdFx0XHRzb3VyY2U6IHBrZ0Rpcixcblx0XHRcdFx0XHRleHRlbnNpb25zOiBbXCJleHRlbnNpb25zLyoudHNcIiwgXCIrZXh0ZW5zaW9ucy9hbHBoYS50c1wiLCBcIi1leHRlbnNpb25zL2FscGhhLnRzXCJdLFxuXHRcdFx0XHRcdHNraWxsczogW10sXG5cdFx0XHRcdFx0cHJvbXB0czogW10sXG5cdFx0XHRcdFx0dGhlbWVzOiBbXSxcblx0XHRcdFx0fSxcblx0XHRcdF0pO1xuXG5cdFx0XHRjb25zdCByZXN1bHQgPSBhd2FpdCBwYWNrYWdlTWFuYWdlci5yZXNvbHZlKCk7XG5cdFx0XHRleHBlY3QocmVzdWx0LmV4dGVuc2lvbnMuc29tZSgocikgPT4gaXNEaXNhYmxlZChyLCBcImFscGhhLnRzXCIpKSkudG9CZSh0cnVlKTtcblx0XHRcdGV4cGVjdChyZXN1bHQuZXh0ZW5zaW9ucy5zb21lKChyKSA9PiBpc0VuYWJsZWQociwgXCJiZXRhLnRzXCIpKSkudG9CZSh0cnVlKTtcblx0XHR9KTtcblx0fSk7XG5cblx0ZGVzY3JpYmUoXCJwYWNrYWdlIGRlZHVwbGljYXRpb25cIiwgKCkgPT4ge1xuXHRcdGl0KFwic2hvdWxkIGRlZHVwZSBzYW1lIGxvY2FsIHBhY2thZ2UgaW4gZ2xvYmFsIGFuZCBwcm9qZWN0IChwcm9qZWN0IHdpbnMpXCIsIGFzeW5jICgpID0+IHtcblx0XHRcdGNvbnN0IHBrZ0RpciA9IGpvaW4odGVtcERpciwgXCJzaGFyZWQtcGtnXCIpO1xuXHRcdFx0bWtkaXJTeW5jKGpvaW4ocGtnRGlyLCBcImV4dGVuc2lvbnNcIiksIHsgcmVjdXJzaXZlOiB0cnVlIH0pO1xuXHRcdFx0d3JpdGVGaWxlU3luYyhqb2luKHBrZ0RpciwgXCJleHRlbnNpb25zXCIsIFwic2hhcmVkLnRzXCIpLCBcImV4cG9ydCBkZWZhdWx0IGZ1bmN0aW9uKCkge31cIik7XG5cblx0XHRcdC8vIFNhbWUgcGFja2FnZSBpbiBib3RoIGdsb2JhbCBhbmQgcHJvamVjdFxuXHRcdFx0c2V0dGluZ3NNYW5hZ2VyLnNldFBhY2thZ2VzKFtwa2dEaXJdKTsgLy8gZ2xvYmFsXG5cdFx0XHRzZXR0aW5nc01hbmFnZXIuc2V0UHJvamVjdFBhY2thZ2VzKFtwa2dEaXJdKTsgLy8gcHJvamVjdFxuXG5cdFx0XHQvLyBEZWJ1ZzogdmVyaWZ5IHNldHRpbmdzIGFyZSBzdG9yZWQgY29ycmVjdGx5XG5cdFx0XHRjb25zdCBnbG9iYWxTZXR0aW5ncyA9IHNldHRpbmdzTWFuYWdlci5nZXRHbG9iYWxTZXR0aW5ncygpO1xuXHRcdFx0Y29uc3QgcHJvamVjdFNldHRpbmdzID0gc2V0dGluZ3NNYW5hZ2VyLmdldFByb2plY3RTZXR0aW5ncygpO1xuXG5bU2hvd2luZyBsaW5lcyAyNjUtMTQ3NyBvZiAyMDIwICg1MC4wS0IgbGltaXQpLiBVc2Ugb2Zmc2V0PTE0NzggdG8gY29udGludWUuXSJ9XSwiZGV0YWlscyI6eyJ0cnVuY2F0aW9uIjp7ImNvbnRlbnQiOiJcdGRlc2NyaWJlKFwiYXV0by1kaXNjb3ZlcmVkIHNraWxsIG1ldGFkYXRhXCIsICgpID0+IHtcblx0XHRpdChcInNob3VsZCB1c2UgdGhlIGFnZW50IGRpciBhcyBiYXNlRGlyIGZvciB1c2VyIC5waS9hZ2VudCBza2lsbHNcIiwgYXN5bmMgKCkgPT4ge1xuXHRcdFx0Y29uc3Qgc2tpbGxQYXRoID0gam9pbihhZ2VudERpciwgXCJza2lsbHNcIiwgXCJ1c2VyLXBpXCIsIFwiU0tJTEwubWRcIik7XG5cdFx0XHRta2RpclN5bmMoam9pbihhZ2VudERpciwgXCJza2lsbHNcIiwgXCJ1c2VyLXBpXCIpLCB7IHJlY3Vyc2l2ZTogdHJ1ZSB9KTtcblx0XHRcdHdyaXRlRmlsZVN5bmMoc2tpbGxQYXRoLCBcIi0tLVxcbm5hbWU6IHVzZXItcGlcXG5kZXNjcmlwdGlvbjogdXNlciBwaVxcbi0tLVxcblwiKTtcblxuXHRcdFx0Y29uc3QgcmVzdWx0ID0gYXdhaXQgcGFja2FnZU1hbmFnZXIucmVzb2x2ZSgpO1xuXHRcdFx0Y29uc3Qgc2tpbGwgPSByZXN1bHQuc2tpbGxzLmZpbmQoKHIpID0+IHIucGF0aCA9PT0gc2tpbGxQYXRoKTtcblxuXHRcdFx0ZXhwZWN0KHNraWxsPy5tZXRhZGF0YS5zb3VyY2UpLnRvQmUoXCJhdXRvXCIpO1xuXHRcdFx0ZXhwZWN0KHNraWxsPy5tZXRhZGF0YS5zY29wZSkudG9CZShcInVzZXJcIik7XG5cdFx0XHRleHBlY3Qoc2tpbGw/Lm1ldGFkYXRhLmJhc2VEaXIpLnRvQmUoYWdlbnREaXIpO1xuXHRcdH0pO1xuXG5cdFx0aXQoXCJzaG91bGQgdXNlIHRoZSBwcm9qZWN0IC5waSBkaXIgYXMgYmFzZURpciBmb3IgcHJvamVjdCAucGkgc2tpbGxzXCIsIGFzeW5jICgpID0+IHtcblx0XHRcdGNvbnN0IHByb2plY3RCYXNlRGlyID0gam9pbih0ZW1wRGlyLCBcIi5waVwiKTtcblx0XHRcdGNvbnN0IHNraWxsUGF0aCA9IGpvaW4ocHJvamVjdEJhc2VEaXIsIFwic2tpbGxzXCIsIFwicHJvamVjdC1waVwiLCBcIlNLSUxMLm1kXCIpO1xuXHRcdFx0bWtkaXJTeW5jKGpvaW4ocHJvamVjdEJhc2VEaXIsIFwic2tpbGxzXCIsIFwicHJvamVjdC1waVwiKSwgeyByZWN1cnNpdmU6IHRydWUgfSk7XG5cdFx0XHR3cml0ZUZpbGVTeW5jKHNraWxsUGF0aCwgXCItLS1cXG5uYW1lOiBwcm9qZWN0LXBpXFxuZGVzY3JpcHRpb246IHByb2plY3QgcGlcXG4tLS1cXG5cIik7XG5cblx0XHRcdGNvbnN0IHJlc3VsdCA9IGF3YWl0IHBhY2thZ2VNYW5hZ2VyLnJlc29sdmUoKTtcblx0XHRcdGNvbnN0IHNraWxsID0gcmVzdWx0LnNraWxscy5maW5kKChyKSA9PiByLnBhdGggPT09IHNraWxsUGF0aCk7XG5cblx0XHRcdGV4cGVjdChza2lsbD8ubWV0YWRhdGEuc291cmNlKS50b0JlKFwiYXV0b1wiKTtcblx0XHRcdGV4cGVjdChza2lsbD8ubWV0YWRhdGEuc2NvcGUpLnRvQmUoXCJwcm9qZWN0XCIpO1xuXHRcdFx0ZXhwZWN0KHNraWxsPy5tZXRhZGF0YS5iYXNlRGlyKS50b0JlKHByb2plY3RCYXNlRGlyKTtcblx0XHR9KTtcblxuXHRcdGl0KFwic2hvdWxkIHVzZSB+Ly5hZ2VudHMgYXMgYmFzZURpciBmb3IgdXNlciAuYWdlbnRzIHNraWxsc1wiLCBhc3luYyAoKSA9PiB7XG5cdFx0XHRjb25zdCBwcmV2aW91c0hvbWUgPSBwcm9jZXNzLmVudi5IT01FO1xuXHRcdFx0cHJvY2Vzcy5lbnYuSE9NRSA9IHRlbXBEaXI7XG5cblx0XHRcdHRyeSB7XG5cdFx0XHRcdGNvbnN0IGFnZW50c0Jhc2VEaXIgPSBqb2luKHRlbXBEaXIsIFwiLmFnZW50c1wiKTtcblx0XHRcdFx0Y29uc3Qgc2tpbGxQYXRoID0gam9pbihhZ2VudHNCYXNlRGlyLCBcInNraWxsc1wiLCBcInVzZXItYWdlbnRzXCIsIFwiU0tJTEwubWRcIik7XG5cdFx0XHRcdG1rZGlyU3luYyhqb2luKGFnZW50c0Jhc2VEaXIsIFwic2tpbGxzXCIsIFwidXNlci1hZ2VudHNcIiksIHsgcmVjdXJzaXZlOiB0cnVlIH0pO1xuXHRcdFx0XHR3cml0ZUZpbGVTeW5jKHNraWxsUGF0aCwgXCItLS1cXG5uYW1lOiB1c2VyLWFnZW50c1xcbmRlc2NyaXB0aW9uOiB1c2VyIGFnZW50c1xcbi0tLVxcblwiKTtcblxuXHRcdFx0XHRjb25zdCByZXN1bHQgPSBhd2FpdCBwYWNrYWdlTWFuYWdlci5yZXNvbHZlKCk7XG5cdFx0XHRcdGNvbnN0IHNraWxsID0gcmVzdWx0LnNraWxscy5maW5kKChyKSA9PiByLnBhdGggPT09IHNraWxsUGF0aCk7XG5cblx0XHRcdFx0ZXhwZWN0KHNraWxsPy5tZXRhZGF0YS5zb3VyY2UpLnRvQmUoXCJhdXRvXCIpO1xuXHRcdFx0XHRleHBlY3Qoc2tpbGw/Lm1ldGFkYXRhLnNjb3BlKS50b0JlKFwidXNlclwiKTtcblx0XHRcdFx0ZXhwZWN0KHNraWxsPy5tZXRhZGF0YS5iYXNlRGlyKS50b0JlKGFnZW50c0Jhc2VEaXIpO1xuXHRcdFx0fSBmaW5hbGx5IHtcblx0XHRcdFx0aWYgKHByZXZpb3VzSG9tZSA9PT0gdW5kZWZpbmVkKSB7XG5cdFx0XHRcdFx0ZGVsZXRlIHByb2Nlc3MuZW52LkhPTUU7XG5cdFx0XHRcdH0gZWxzZSB7XG5cdFx0XHRcdFx0cHJvY2Vzcy5lbnYuSE9NRSA9IHByZXZpb3VzSG9tZTtcblx0XHRcdFx0fVxuXHRcdFx0fVxuXHRcdH0pO1xuXG5cdFx0aXQoXCJzaG91bGQgdXNlIGVhY2ggcHJvamVjdCAuYWdlbnRzIGRpciBhcyBiYXNlRGlyIGZvciBwcm9qZWN0IC5hZ2VudHMgc2tpbGxzXCIsIGFzeW5jICgpID0+IHtcblx0XHRcdGNvbnN0IHJlcG9Sb290ID0gam9pbih0ZW1wRGlyLCBcInJlcG9cIik7XG5cdFx0XHRjb25zdCBuZXN0ZWRDd2QgPSBqb2luKHJlcG9Sb290LCBcInBhY2thZ2VzXCIsIFwiZmVhdHVyZVwiKTtcblx0XHRcdG1rZGlyU3luYyhuZXN0ZWRDd2QsIHsgcmVjdXJzaXZlOiB0cnVlIH0pO1xuXHRcdFx0bWtkaXJTeW5jKGpvaW4ocmVwb1Jvb3QsIFwiLmdpdFwiKSwgeyByZWN1cnNpdmU6IHRydWUgfSk7XG5cblx0XHRcdGNvbnN0IHJlcG9BZ2VudHNCYXNlRGlyID0gam9pbihyZXBvUm9vdCwgXCIuYWdlbnRzXCIpO1xuXHRcdFx0Y29uc3QgcmVwb1NraWxsID0gam9pbihyZXBvQWdlbnRzQmFzZURpciwgXCJza2lsbHNcIiwgXCJyZXBvXCIsIFwiU0tJTEwubWRcIik7XG5cdFx0XHRta2RpclN5bmMoam9pbihyZXBvQWdlbnRzQmFzZURpciwgXCJza2lsbHNcIiwgXCJyZXBvXCIpLCB7IHJlY3Vyc2l2ZTogdHJ1ZSB9KTtcblx0XHRcdHdyaXRlRmlsZVN5bmMocmVwb1NraWxsLCBcIi0tLVxcbm5hbWU6IHJlcG9cXG5kZXNjcmlwdGlvbjogcmVwb1xcbi0tLVxcblwiKTtcblxuXHRcdFx0Y29uc3QgcGFja2FnZUFnZW50c0Jhc2VEaXIgPSBqb2luKHJlcG9Sb290LCBcInBhY2thZ2VzXCIsIFwiLmFnZW50c1wiKTtcblx0XHRcdGNvbnN0IHBhY2thZ2VTa2lsbCA9IGpvaW4ocGFja2FnZUFnZW50c0Jhc2VEaXIsIFwic2tpbGxzXCIsIFwicGFja2FnZVwiLCBcIlNLSUxMLm1kXCIpO1xuXHRcdFx0bWtkaXJTeW5jKGpvaW4ocGFja2FnZUFnZW50c0Jhc2VEaXIsIFwic2tpbGxzXCIsIFwicGFja2FnZVwiKSwgeyByZWN1cnNpdmU6IHRydWUgfSk7XG5cdFx0XHR3cml0ZUZpbGVTeW5jKHBhY2thZ2VTa2lsbCwgXCItLS1cXG5uYW1lOiBwYWNrYWdlXFxuZGVzY3JpcHRpb246IHBhY2thZ2VcXG4tLS1cXG5cIik7XG5cblx0XHRcdGNvbnN0IHBtID0gbmV3IERlZmF1bHRQYWNrYWdlTWFuYWdlcih7XG5cdFx0XHRcdGN3ZDogbmVzdGVkQ3dkLFxuXHRcdFx0XHRhZ2VudERpcixcblx0XHRcdFx0c2V0dGluZ3NNYW5hZ2VyLFxuXHRcdFx0fSk7XG5cblx0XHRcdGNvbnN0IHJlc3VsdCA9IGF3YWl0IHBtLnJlc29sdmUoKTtcblx0XHRcdGNvbnN0IHJlc29sdmVkUmVwb1NraWxsID0gcmVzdWx0LnNraWxscy5maW5kKChyKSA9PiByLnBhdGggPT09IHJlcG9Ta2lsbCk7XG5cdFx0XHRjb25zdCByZXNvbHZlZFBhY2thZ2VTa2lsbCA9IHJlc3VsdC5za2lsbHMuZmluZCgocikgPT4gci5wYXRoID09PSBwYWNrYWdlU2tpbGwpO1xuXG5cdFx0XHRleHBlY3QocmVzb2x2ZWRSZXBvU2tpbGw/Lm1ldGFkYXRhLnNvdXJjZSkudG9CZShcImF1dG9cIik7XG5cdFx0XHRleHBlY3QocmVzb2x2ZWRSZXBvU2tpbGw/Lm1ldGFkYXRhLnNjb3BlKS50b0JlKFwicHJvamVjdFwiKTtcblx0XHRcdGV4cGVjdChyZXNvbHZlZFJlcG9Ta2lsbD8ubWV0YWRhdGEuYmFzZURpcikudG9CZShyZXBvQWdlbnRzQmFzZURpcik7XG5cdFx0XHRleHBlY3QocmVzb2x2ZWRQYWNrYWdlU2tpbGw/Lm1ldGFkYXRhLnNvdXJjZSkudG9CZShcImF1dG9cIik7XG5cdFx0XHRleHBlY3QocmVzb2x2ZWRQYWNrYWdlU2tpbGw/Lm1ldGFkYXRhLnNjb3BlKS50b0JlKFwicHJvamVjdFwiKTtcblx0XHRcdGV4cGVjdChyZXNvbHZlZFBhY2thZ2VTa2lsbD8ubWV0YWRhdGEuYmFzZURpcikudG9CZShwYWNrYWdlQWdlbnRzQmFzZURpcik7XG5cdFx0fSk7XG5cdH0pO1xuXG5cdGRlc2NyaWJlKFwiLmFnZW50cy9za2lsbHMgYXV0by1kaXNjb3ZlcnlcIiwgKCkgPT4ge1xuXHRcdGl0KFwic2hvdWxkIHNjYW4gLmFnZW50cy9za2lsbHMgZnJvbSBjd2QgdXAgdG8gZ2l0IHJlcG8gcm9vdFwiLCBhc3luYyAoKSA9PiB7XG5cdFx0XHRjb25zdCByZXBvUm9vdCA9IGpvaW4odGVtcERpciwgXCJyZXBvXCIpO1xuXHRcdFx0Y29uc3QgbmVzdGVkQ3dkID0gam9pbihyZXBvUm9vdCwgXCJwYWNrYWdlc1wiLCBcImZlYXR1cmVcIik7XG5cdFx0XHRta2RpclN5bmMobmVzdGVkQ3dkLCB7IHJlY3Vyc2l2ZTogdHJ1ZSB9KTtcblx0XHRcdG1rZGlyU3luYyhqb2luKHJlcG9Sb290LCBcIi5naXRcIiksIHsgcmVjdXJzaXZlOiB0cnVlIH0pO1xuXG5cdFx0XHRjb25zdCBhYm92ZVJlcG9Ta2lsbCA9IGpvaW4odGVtcERpciwgXCIuYWdlbnRzXCIsIFwic2tpbGxzXCIsIFwiYWJvdmUtcmVwb1wiLCBcIlNLSUxMLm1kXCIpO1xuXHRcdFx0bWtkaXJTeW5jKGpvaW4odGVtcERpciwgXCIuYWdlbnRzXCIsIFwic2tpbGxzXCIsIFwiYWJvdmUtcmVwb1wiKSwgeyByZWN1cnNpdmU6IHRydWUgfSk7XG5cdFx0XHR3cml0ZUZpbGVTeW5jKGFib3ZlUmVwb1NraWxsLCBcIi0tLVxcbm5hbWU6IGFib3ZlLXJlcG9cXG5kZXNjcmlwdGlvbjogYWJvdmVcXG4tLS1cXG5cIik7XG5cblx0XHRcdGNvbnN0IHJlcG9Sb290U2tpbGwgPSBqb2luKHJlcG9Sb290LCBcIi5hZ2VudHNcIiwgXCJza2lsbHNcIiwgXCJyZXBvLXJvb3RcIiwgXCJTS0lMTC5tZFwiKTtcblx0XHRcdG1rZGlyU3luYyhqb2luKHJlcG9Sb290LCBcIi5hZ2VudHNcIiwgXCJza2lsbHNcIiwgXCJyZXBvLXJvb3RcIiksIHsgcmVjdXJzaXZlOiB0cnVlIH0pO1xuXHRcdFx0d3JpdGVGaWxlU3luYyhyZXBvUm9vdFNraWxsLCBcIi0tLVxcbm5hbWU6IHJlcG8tcm9vdFxcbmRlc2NyaXB0aW9uOiByZXBvXFxuLS0tXFxuXCIpO1xuXG5cdFx0XHRjb25zdCBuZXN0ZWRTa2lsbCA9IGpvaW4ocmVwb1Jvb3QsIFwicGFja2FnZXNcIiwgXCIuYWdlbnRzXCIsIFwic2tpbGxzXCIsIFwibmVzdGVkXCIsIFwiU0tJTEwubWRcIik7XG5cdFx0XHRta2RpclN5bmMoam9pbihyZXBvUm9vdCwgXCJwYWNrYWdlc1wiLCBcIi5hZ2VudHNcIiwgXCJza2lsbHNcIiwgXCJuZXN0ZWRcIiksIHsgcmVjdXJzaXZlOiB0cnVlIH0pO1xuXHRcdFx0d3JpdGVGaWxlU3luYyhuZXN0ZWRTa2lsbCwgXCItLS1cXG5uYW1lOiBuZXN0ZWRcXG5kZXNjcmlwdGlvbjogbmVzdGVkXFxuLS0tXFxuXCIpO1xuXG5cdFx0XHRjb25zdCBwbSA9IG5ldyBEZWZhdWx0UGFja2FnZU1hbmFnZXIoe1xuXHRcdFx0XHRjd2Q6IG5lc3RlZEN3ZCxcblx0XHRcdFx0YWdlbnREaXIsXG5cdFx0XHRcdHNldHRpbmdzTWFuYWdlcixcblx0XHRcdH0pO1xuXG5cdFx0XHRjb25zdCByZXN1bHQgPSBhd2FpdCBwbS5yZXNvbHZlKCk7XG5cdFx0XHRleHBlY3QocmVzdWx0LnNraWxscy5zb21lKChyKSA9PiByLnBhdGggPT09IHJlcG9Sb290U2tpbGwgJiYgci5lbmFibGVkKSkudG9CZSh0cnVlKTtcblx0XHRcdGV4cGVjdChyZXN1bHQuc2tpbGxzLnNvbWUoKHIpID0+IHIucGF0aCA9PT0gbmVzdGVkU2tpbGwgJiYgci5lbmFibGVkKSkudG9CZSh0cnVlKTtcblx0XHRcdGV4cGVjdChyZXN1bHQuc2tpbGxzLnNvbWUoKHIpID0+IHIucGF0aCA9PT0gYWJvdmVSZXBvU2tpbGwpKS50b0JlKGZhbHNlKTtcblx0XHR9KTtcblxuXHRcdGl0KFwic2hvdWxkIHNjYW4gLmFnZW50cy9za2lsbHMgdXAgdG8gZmlsZXN5c3RlbSByb290IHdoZW4gbm90IGluIGEgZ2l0IHJlcG9cIiwgYXN5bmMgKCkgPT4ge1xuXHRcdFx0Y29uc3Qgbm9uUmVwb1Jvb3QgPSBqb2luKHRlbXBEaXIsIFwibm9uLXJlcG9cIik7XG5cdFx0XHRjb25zdCBuZXN0ZWRDd2QgPSBqb2luKG5vblJlcG9Sb290LCBcImFcIiwgXCJiXCIpO1xuXHRcdFx0bWtkaXJTeW5jKG5lc3RlZEN3ZCwgeyByZWN1cnNpdmU6IHRydWUgfSk7XG5cblx0XHRcdGNvbnN0IHJvb3RTa2lsbCA9IGpvaW4obm9uUmVwb1Jvb3QsIFwiLmFnZW50c1wiLCBcInNraWxsc1wiLCBcInJvb3RcIiwgXCJTS0lMTC5tZFwiKTtcblx0XHRcdG1rZGlyU3luYyhqb2luKG5vblJlcG9Sb290LCBcIi5hZ2VudHNcIiwgXCJza2lsbHNcIiwgXCJyb290XCIpLCB7IHJlY3Vyc2l2ZTogdHJ1ZSB9KTtcblx0XHRcdHdyaXRlRmlsZVN5bmMocm9vdFNraWxsLCBcIi0tLVxcbm5hbWU6IHJvb3RcXG5kZXNjcmlwdGlvbjogcm9vdFxcbi0tLVxcblwiKTtcblxuXHRcdFx0Y29uc3QgbWlkZGxlU2tpbGwgPSBqb2luKG5vblJlcG9Sb290LCBcImFcIiwgXCIuYWdlbnRzXCIsIFwic2tpbGxzXCIsIFwibWlkZGxlXCIsIFwiU0tJTEwubWRcIik7XG5cdFx0XHRta2RpclN5bmMoam9pbihub25SZXBvUm9vdCwgXCJhXCIsIFwiLmFnZW50c1wiLCBcInNraWxsc1wiLCBcIm1pZGRsZVwiKSwgeyByZWN1cnNpdmU6IHRydWUgfSk7XG5cdFx0XHR3cml0ZUZpbGVTeW5jKG1pZGRsZVNraWxsLCBcIi0tLVxcbm5hbWU6IG1pZGRsZVxcbmRlc2NyaXB0aW9uOiBtaWRkbGVcXG4tLS1cXG5cIik7XG5cblx0XHRcdGNvbnN0IHBtID0gbmV3IERlZmF1bHRQYWNrYWdlTWFuYWdlcih7XG5cdFx0XHRcdGN3ZDogbmVzdGVkQ3dkLFxuXHRcdFx0XHRhZ2VudERpcixcblx0XHRcdFx0c2V0dGluZ3NNYW5hZ2VyLFxuXHRcdFx0fSk7XG5cblx0XHRcdGNvbnN0IHJlc3VsdCA9IGF3YWl0IHBtLnJlc29sdmUoKTtcblx0XHRcdGV4cGVjdChyZXN1bHQuc2tpbGxzLnNvbWUoKHIpID0+IHIucGF0aCA9PT0gcm9vdFNraWxsICYmIHIuZW5hYmxlZCkpLnRvQmUodHJ1ZSk7XG5cdFx0XHRleHBlY3QocmVzdWx0LnNraWxscy5zb21lKChyKSA9PiByLnBhdGggPT09IG1pZGRsZVNraWxsICYmIHIuZW5hYmxlZCkpLnRvQmUodHJ1ZSk7XG5cdFx0fSk7XG5cblx0XHRpdChcInNob3VsZCBpZ25vcmUgcm9vdCBtYXJrZG93biBmaWxlcyBpbiAuYWdlbnRzL3NraWxsc1wiLCBhc3luYyAoKSA9PiB7XG5cdFx0XHRjb25zdCBhZ2VudHNTa2lsbHNEaXIgPSBqb2luKHRlbXBEaXIsIFwiLmFnZW50c1wiLCBcInNraWxsc1wiKTtcblx0XHRcdG1rZGlyU3luYyhqb2luKGFnZW50c1NraWxsc0RpciwgXCJuZXN0ZWQtc2tpbGxcIiksIHsgcmVjdXJzaXZlOiB0cnVlIH0pO1xuXHRcdFx0Y29uc3Qgcm9vdFNraWxsID0gam9pbihhZ2VudHNTa2lsbHNEaXIsIFwicm9vdC1maWxlLm1kXCIpO1xuXHRcdFx0Y29uc3QgbmVzdGVkU2tpbGwgPSBqb2luKGFnZW50c1NraWxsc0RpciwgXCJuZXN0ZWQtc2tpbGxcIiwgXCJTS0lMTC5tZFwiKTtcblx0XHRcdHdyaXRlRmlsZVN5bmMocm9vdFNraWxsLCBcIi0tLVxcbm5hbWU6IHJvb3QtZmlsZVxcbmRlc2NyaXB0aW9uOiBSb290IG1hcmtkb3duIGZpbGVcXG4tLS1cXG5cIik7XG5cdFx0XHR3cml0ZUZpbGVTeW5jKG5lc3RlZFNraWxsLCBcIi0tLVxcbm5hbWU6IG5lc3RlZC1za2lsbFxcbmRlc2NyaXB0aW9uOiBOZXN0ZWQgc2tpbGxcXG4tLS1cXG5cIik7XG5cblx0XHRcdGNvbnN0IHBtID0gbmV3IERlZmF1bHRQYWNrYWdlTWFuYWdlcih7XG5cdFx0XHRcdGN3ZDogam9pbih0ZW1wRGlyLCBcIndvcmtcIiksXG5cdFx0XHRcdGFnZW50RGlyLFxuXHRcdFx0XHRzZXR0aW5nc01hbmFnZXIsXG5cdFx0XHR9KTtcblx0XHRcdG1rZGlyU3luYyhqb2luKHRlbXBEaXIsIFwid29ya1wiKSwgeyByZWN1cnNpdmU6IHRydWUgfSk7XG5cblx0XHRcdGNvbnN0IHJlc3VsdCA9IGF3YWl0IHBtLnJlc29sdmUoKTtcblx0XHRcdGV4cGVjdChyZXN1bHQuc2tpbGxzLnNvbWUoKHIpID0+IHIucGF0aCA9PT0gcm9vdFNraWxsKSkudG9CZShmYWxzZSk7XG5cdFx0XHRleHBlY3QocmVzdWx0LnNraWxscy5zb21lKChyKSA9PiByLnBhdGggPT09IG5lc3RlZFNraWxsICYmIHIuZW5hYmxlZCkpLnRvQmUodHJ1ZSk7XG5cdFx0fSk7XG5cblx0XHRpdChcInNob3VsZCBrZWVwIH4vLmFnZW50cy9za2lsbHMgdXNlci1zY29wZWQgd2hlbiBjd2QgaXMgdW5kZXIgaG9tZSBpbiBhIG5vbi1naXQgZGlyZWN0b3J5XCIsIGFzeW5jICgpID0+IHtcblx0XHRcdGNvbnN0IHByZXZpb3VzSG9tZSA9IHByb2Nlc3MuZW52LkhPTUU7XG5cdFx0XHRwcm9jZXNzLmVudi5IT01FID0gdGVtcERpcjtcblxuXHRcdFx0dHJ5IHtcblx0XHRcdFx0Y29uc3QgY3dkID0gam9pbih0ZW1wRGlyLCBcInNjcmF0Y2hcIiwgXCJuZXN0ZWRcIik7XG5cdFx0XHRcdGNvbnN0IGxvY2FsQWdlbnREaXIgPSBqb2luKHRlbXBEaXIsIFwiLnBpXCIsIFwiYWdlbnRcIik7XG5cdFx0XHRcdGNvbnN0IGxvY2FsU2V0dGluZ3NNYW5hZ2VyID0gU2V0dGluZ3NNYW5hZ2VyLmluTWVtb3J5KCk7XG5cdFx0XHRcdG1rZGlyU3luYyhjd2QsIHsgcmVjdXJzaXZlOiB0cnVlIH0pO1xuXHRcdFx0XHRta2RpclN5bmMobG9jYWxBZ2VudERpciwgeyByZWN1cnNpdmU6IHRydWUgfSk7XG5cblx0XHRcdFx0Y29uc3QgaG9tZVNraWxsID0gam9pbih0ZW1wRGlyLCBcIi5hZ2VudHNcIiwgXCJza2lsbHNcIiwgXCJob21lLXNraWxsXCIsIFwiU0tJTEwubWRcIik7XG5cdFx0XHRcdG1rZGlyU3luYyhqb2luKHRlbXBEaXIsIFwiLmFnZW50c1wiLCBcInNraWxsc1wiLCBcImhvbWUtc2tpbGxcIiksIHsgcmVjdXJzaXZlOiB0cnVlIH0pO1xuXHRcdFx0XHR3cml0ZUZpbGVTeW5jKGhvbWVTa2lsbCwgXCItLS1cXG5uYW1lOiBob21lLXNraWxsXFxuZGVzY3JpcHRpb246IGhvbWVcXG4tLS1cXG5cIik7XG5cblx0XHRcdFx0Y29uc3QgcG0gPSBuZXcgRGVmYXVsdFBhY2thZ2VNYW5hZ2VyKHtcblx0XHRcdFx0XHRjd2QsXG5cdFx0XHRcdFx0YWdlbnREaXI6IGxvY2FsQWdlbnREaXIsXG5cdFx0XHRcdFx0c2V0dGluZ3NNYW5hZ2VyOiBsb2NhbFNldHRpbmdzTWFuYWdlcixcblx0XHRcdFx0fSk7XG5cblx0XHRcdFx0Y29uc3QgcmVzdWx0ID0gYXdhaXQgcG0ucmVzb2x2ZSgpO1xuXHRcdFx0XHRjb25zdCBtYXRjaGluZ1NraWxscyA9IHJlc3VsdC5za2lsbHMuZmlsdGVyKChyKSA9PiByLnBhdGggPT09IGhvbWVTa2lsbCk7XG5cdFx0XHRcdGV4cGVjdChtYXRjaGluZ1NraWxscykudG9IYXZlTGVuZ3RoKDEpO1xuXHRcdFx0XHRleHBlY3QobWF0Y2hpbmdTa2lsbHNbMF0/LmVuYWJsZWQpLnRvQmUodHJ1ZSk7XG5cdFx0XHRcdGV4cGVjdChtYXRjaGluZ1NraWxsc1swXT8ubWV0YWRhdGEuc2NvcGUpLnRvQmUoXCJ1c2VyXCIpO1xuXHRcdFx0XHRleHBlY3QobWF0Y2hpbmdTa2lsbHNbMF0/Lm1ldGFkYXRhLnNvdXJjZSkudG9CZShcImF1dG9cIik7XG5cdFx0XHR9IGZpbmFsbHkge1xuXHRcdFx0XHRpZiAocHJldmlvdXNIb21lID09PSB1bmRlZmluZWQpIHtcblx0XHRcdFx0XHRkZWxldGUgcHJvY2Vzcy5lbnYuSE9NRTtcblx0XHRcdFx0fSBlbHNlIHtcblx0XHRcdFx0XHRwcm9jZXNzLmVudi5IT01FID0gcHJldmlvdXNIb21lO1xuXHRcdFx0XHR9XG5cdFx0XHR9XG5cdFx0fSk7XG5cblx0XHRpdChcInNob3VsZCBkZWR1cGUgdXNlciBza2lsbCBlbnRyaWVzIHdoZW4gfi8ucGkvYWdlbnQvc2tpbGxzIGlzIGEgc3ltbGluayB0byB+Ly5hZ2VudHMvc2tpbGxzXCIsIGFzeW5jICgpID0+IHtcblx0XHRcdGNvbnN0IHByZXZpb3VzSG9tZSA9IHByb2Nlc3MuZW52LkhPTUU7XG5cdFx0XHRwcm9jZXNzLmVudi5IT01FID0gdGVtcERpcjtcblxuXHRcdFx0dHJ5IHtcblx0XHRcdFx0Y29uc3QgYWdlbnRTa2lsbHNEaXIgPSBqb2luKGFnZW50RGlyLCBcInNraWxsc1wiKTtcblx0XHRcdFx0Y29uc3QgYWdlbnRzU2tpbGxzRGlyID0gam9pbih0ZW1wRGlyLCBcIi5hZ2VudHNcIiwgXCJza2lsbHNcIik7XG5cdFx0XHRcdG1rZGlyU3luYyhhZ2VudHNTa2lsbHNEaXIsIHsgcmVjdXJzaXZlOiB0cnVlIH0pO1xuXHRcdFx0XHQvLyBVc2UganVuY3Rpb24gb24gV2luZG93cyB0byBhdm9pZCBFUEVSTSB3aGVuIHN5bWxpbmsgcHJpdmlsZWdlcyBhcmUgdW5hdmFpbGFibGUuXG5cdFx0XHRcdGNvbnN0IGRpcmVjdG9yeUxpbmtUeXBlID0gcHJvY2Vzcy5wbGF0Zm9ybSA9PT0gXCJ3aW4zMlwiID8gXCJqdW5jdGlvblwiIDogXCJkaXJcIjtcblx0XHRcdFx0c3ltbGlua1N5bmMoYWdlbnRzU2tpbGxzRGlyLCBhZ2VudFNraWxsc0RpciwgZGlyZWN0b3J5TGlua1R5cGUpO1xuXG5cdFx0XHRcdGNvbnN0IHNraWxsUGF0aCA9IGpvaW4oYWdlbnRzU2tpbGxzRGlyLCBcImZvb1wiLCBcIlNLSUxMLm1kXCIpO1xuXHRcdFx0XHRta2RpclN5bmMoam9pbihhZ2VudHNTa2lsbHNEaXIsIFwiZm9vXCIpLCB7IHJlY3Vyc2l2ZTogdHJ1ZSB9KTtcblx0XHRcdFx0d3JpdGVGaWxlU3luYyhza2lsbFBhdGgsIFwiLS0tXFxubmFtZTogZm9vXFxuZGVzY3JpcHRpb246IGZvb1xcbi0tLVxcblwiKTtcblxuXHRcdFx0XHRjb25zdCByZXN1bHQgPSBhd2FpdCBwYWNrYWdlTWFuYWdlci5yZXNvbHZlKCk7XG5cdFx0XHRcdGNvbnN0IGZvb1NraWxscyA9IHJlc3VsdC5za2lsbHMuZmlsdGVyKChyKSA9PiBwYXRoRW5kc1dpdGgoci5wYXRoLCBcImZvby9TS0lMTC5tZFwiKSk7XG5cblx0XHRcdFx0ZXhwZWN0KGZvb1NraWxscykudG9IYXZlTGVuZ3RoKDEpO1xuXHRcdFx0fSBmaW5hbGx5IHtcblx0XHRcdFx0aWYgKHByZXZpb3VzSG9tZSA9PT0gdW5kZWZpbmVkKSB7XG5cdFx0XHRcdFx0ZGVsZXRlIHByb2Nlc3MuZW52LkhPTUU7XG5cdFx0XHRcdH0gZWxzZSB7XG5cdFx0XHRcdFx0cHJvY2Vzcy5lbnYuSE9NRSA9IHByZXZpb3VzSG9tZTtcblx0XHRcdFx0fVxuXHRcdFx0fVxuXHRcdH0pO1xuXHR9KTtcblxuXHRkZXNjcmliZShcImlnbm9yZSBmaWxlc1wiLCAoKSA9PiB7XG5cdFx0aXQoXCJzaG91bGQgcmVzcGVjdCAuZ2l0aWdub3JlIGluIHNraWxsIGRpcmVjdG9yaWVzXCIsIGFzeW5jICgpID0+IHtcblx0XHRcdGNvbnN0IHNraWxsc0RpciA9IGpvaW4oYWdlbnREaXIsIFwic2tpbGxzXCIpO1xuXHRcdFx0bWtkaXJTeW5jKHNraWxsc0RpciwgeyByZWN1cnNpdmU6IHRydWUgfSk7XG5cdFx0XHR3cml0ZUZpbGVTeW5jKGpvaW4oc2tpbGxzRGlyLCBcIi5naXRpZ25vcmVcIiksIFwidmVudlxcbl9fcHljYWNoZV9fXFxuXCIpO1xuXG5cdFx0XHRjb25zdCBnb29kU2tpbGxEaXIgPSBqb2luKHNraWxsc0RpciwgXCJnb29kLXNraWxsXCIpO1xuXHRcdFx0bWtkaXJTeW5jKGdvb2RTa2lsbERpciwgeyByZWN1cnNpdmU6IHRydWUgfSk7XG5cdFx0XHR3cml0ZUZpbGVTeW5jKGpvaW4oZ29vZFNraWxsRGlyLCBcIlNLSUxMLm1kXCIpLCBcIi0tLVxcbm5hbWU6IGdvb2Qtc2tpbGxcXG5kZXNjcmlwdGlvbjogR29vZFxcbi0tLVxcbkNvbnRlbnRcIik7XG5cblx0XHRcdGNvbnN0IGlnbm9yZWRTa2lsbERpciA9IGpvaW4oc2tpbGxzRGlyLCBcInZlbnZcIiwgXCJiYWQtc2tpbGxcIik7XG5cdFx0XHRta2RpclN5bmMoaWdub3JlZFNraWxsRGlyLCB7IHJlY3Vyc2l2ZTogdHJ1ZSB9KTtcblx0XHRcdHdyaXRlRmlsZVN5bmMoam9pbihpZ25vcmVkU2tpbGxEaXIsIFwiU0tJTEwubWRcIiksIFwiLS0tXFxubmFtZTogYmFkLXNraWxsXFxuZGVzY3JpcHRpb246IEJhZFxcbi0tLVxcbkNvbnRlbnRcIik7XG5cblx0XHRcdHNldHRpbmdzTWFuYWdlci5zZXRTa2lsbFBhdGhzKFtcInNraWxsc1wiXSk7XG5cblx0XHRcdGNvbnN0IHJlc3VsdCA9IGF3YWl0IHBhY2thZ2VNYW5hZ2VyLnJlc29sdmUoKTtcblx0XHRcdGV4cGVjdChyZXN1bHQuc2tpbGxzLnNvbWUoKHIpID0+IHIucGF0aC5pbmNsdWRlcyhcImdvb2Qtc2tpbGxcIikgJiYgci5lbmFibGVkKSkudG9CZSh0cnVlKTtcblx0XHRcdGV4cGVjdChyZXN1bHQuc2tpbGxzLnNvbWUoKHIpID0+IHIucGF0aC5pbmNsdWRlcyhcInZlbnZcIikgJiYgci5lbmFibGVkKSkudG9CZShmYWxzZSk7XG5cdFx0fSk7XG5cblx0XHRpdChcInNob3VsZCBub3QgYXBwbHkgcGFyZW50IC5naXRpZ25vcmUgdG8gLnBpIGF1dG8tZGlzY292ZXJ5XCIsIGFzeW5jICgpID0+IHtcblx0XHRcdHdyaXRlRmlsZVN5bmMoam9pbih0ZW1wRGlyLCBcIi5naXRpZ25vcmVcIiksIFwiLnBpXFxuXCIpO1xuXG5cdFx0XHRjb25zdCBza2lsbERpciA9IGpvaW4odGVtcERpciwgXCIucGlcIiwgXCJza2lsbHNcIiwgXCJhdXRvLXNraWxsXCIpO1xuXHRcdFx0bWtkaXJTeW5jKHNraWxsRGlyLCB7IHJlY3Vyc2l2ZTogdHJ1ZSB9KTtcblx0XHRcdGNvbnN0IHNraWxsUGF0aCA9IGpvaW4oc2tpbGxEaXIsIFwiU0tJTEwubWRcIik7XG5cdFx0XHR3cml0ZUZpbGVTeW5jKHNraWxsUGF0aCwgXCItLS1cXG5uYW1lOiBhdXRvLXNraWxsXFxuZGVzY3JpcHRpb246IEF1dG9cXG4tLS1cXG5Db250ZW50XCIpO1xuXG5cdFx0XHRjb25zdCByZXN1bHQgPSBhd2FpdCBwYWNrYWdlTWFuYWdlci5yZXNvbHZlKCk7XG5cdFx0XHRleHBlY3QocmVzdWx0LnNraWxscy5zb21lKChyKSA9PiByLnBhdGggPT09IHNraWxsUGF0aCAmJiByLmVuYWJsZWQpKS50b0JlKHRydWUpO1xuXHRcdH0pO1xuXHR9KTtcblxuXHRkZXNjcmliZShcInJlc29sdmVFeHRlbnNpb25Tb3VyY2VzXCIsICgpID0+IHtcblx0XHRpdChcInNob3VsZCByZXNvbHZlIGxvY2FsIHBhdGhzXCIsIGFzeW5jICgpID0+IHtcblx0XHRcdGNvbnN0IGV4dFBhdGggPSBqb2luKHRlbXBEaXIsIFwiZXh0LnRzXCIpO1xuXHRcdFx0d3JpdGVGaWxlU3luYyhleHRQYXRoLCBcImV4cG9ydCBkZWZhdWx0IGZ1bmN0aW9uKCkge31cIik7XG5cblx0XHRcdGNvbnN0IHJlc3VsdCA9IGF3YWl0IHBhY2thZ2VNYW5hZ2VyLnJlc29sdmVFeHRlbnNpb25Tb3VyY2VzKFtleHRQYXRoXSk7XG5cdFx0XHRleHBlY3QocmVzdWx0LmV4dGVuc2lvbnMuc29tZSgocikgPT4gci5wYXRoID09PSBleHRQYXRoICYmIHIuZW5hYmxlZCkpLnRvQmUodHJ1ZSk7XG5cdFx0fSk7XG5cblx0XHRpdChcInNob3VsZCBoYW5kbGUgZGlyZWN0b3JpZXMgd2l0aCBwaSBtYW5pZmVzdFwiLCBhc3luYyAoKSA9PiB7XG5cdFx0XHRjb25zdCBwa2dEaXIgPSBqb2luKHRlbXBEaXIsIFwibXktcGFja2FnZVwiKTtcblx0XHRcdG1rZGlyU3luYyhwa2dEaXIsIHsgcmVjdXJzaXZlOiB0cnVlIH0pO1xuXHRcdFx0d3JpdGVGaWxlU3luYyhcblx0XHRcdFx0am9pbihwa2dEaXIsIFwicGFja2FnZS5qc29uXCIpLFxuXHRcdFx0XHRKU09OLnN0cmluZ2lmeSh7XG5cdFx0XHRcdFx0bmFtZTogXCJteS1wYWNrYWdlXCIsXG5cdFx0XHRcdFx0cGk6IHtcblx0XHRcdFx0XHRcdGV4dGVuc2lvbnM6IFtcIi4vc3JjL2luZGV4LnRzXCJdLFxuXHRcdFx0XHRcdFx0c2tpbGxzOiBbXCIuL3NraWxsc1wiXSxcblx0XHRcdFx0XHR9LFxuXHRcdFx0XHR9KSxcblx0XHRcdCk7XG5cdFx0XHRta2RpclN5bmMoam9pbihwa2dEaXIsIFwic3JjXCIpLCB7IHJlY3Vyc2l2ZTogdHJ1ZSB9KTtcblx0XHRcdHdyaXRlRmlsZVN5bmMoam9pbihwa2dEaXIsIFwic3JjXCIsIFwiaW5kZXgudHNcIiksIFwiZXhwb3J0IGRlZmF1bHQgZnVuY3Rpb24oKSB7fVwiKTtcblx0XHRcdG1rZGlyU3luYyhqb2luKHBrZ0RpciwgXCJza2lsbHNcIiwgXCJteS1za2lsbFwiKSwgeyByZWN1cnNpdmU6IHRydWUgfSk7XG5cdFx0XHR3cml0ZUZpbGVTeW5jKFxuXHRcdFx0XHRqb2luKHBrZ0RpciwgXCJza2lsbHNcIiwgXCJteS1za2lsbFwiLCBcIlNLSUxMLm1kXCIpLFxuXHRcdFx0XHRcIi0tLVxcbm5hbWU6IG15LXNraWxsXFxuZGVzY3JpcHRpb246IFRlc3RcXG4tLS1cXG5Db250ZW50XCIsXG5cdFx0XHQpO1xuXG5cdFx0XHRjb25zdCByZXN1bHQgPSBhd2FpdCBwYWNrYWdlTWFuYWdlci5yZXNvbHZlRXh0ZW5zaW9uU291cmNlcyhbcGtnRGlyXSk7XG5cdFx0XHRleHBlY3QocmVzdWx0LmV4dGVuc2lvbnMuc29tZSgocikgPT4gci5wYXRoID09PSBqb2luKHBrZ0RpciwgXCJzcmNcIiwgXCJpbmRleC50c1wiKSAmJiByLmVuYWJsZWQpKS50b0JlKHRydWUpO1xuXHRcdFx0Ly8gU2tpbGxzIHdpdGggU0tJTEwubWQgYXJlIHJldHVybmVkIGFzIGZpbGUgcGF0aHNcblx0XHRcdGV4cGVjdChyZXN1bHQuc2tpbGxzLnNvbWUoKHIpID0+IHIucGF0aCA9PT0gam9pbihwa2dEaXIsIFwic2tpbGxzXCIsIFwibXktc2tpbGxcIiwgXCJTS0lMTC5tZFwiKSAmJiByLmVuYWJsZWQpKS50b0JlKFxuXHRcdFx0XHR0cnVlLFxuXHRcdFx0KTtcblx0XHR9KTtcblxuXHRcdGl0KFwic2hvdWxkIGhhbmRsZSBkaXJlY3RvcmllcyB3aXRoIGF1dG8tZGlzY292ZXJ5IGxheW91dFwiLCBhc3luYyAoKSA9PiB7XG5cdFx0XHRjb25zdCBwa2dEaXIgPSBqb2luKHRlbXBEaXIsIFwiYXV0by1wa2dcIik7XG5cdFx0XHRta2RpclN5bmMoam9pbihwa2dEaXIsIFwiZXh0ZW5zaW9uc1wiKSwgeyByZWN1cnNpdmU6IHRydWUgfSk7XG5cdFx0XHRta2RpclN5bmMoam9pbihwa2dEaXIsIFwidGhlbWVzXCIpLCB7IHJlY3Vyc2l2ZTogdHJ1ZSB9KTtcblx0XHRcdHdyaXRlRmlsZVN5bmMoam9pbihwa2dEaXIsIFwiZXh0ZW5zaW9uc1wiLCBcIm1haW4udHNcIiksIFwiZXhwb3J0IGRlZmF1bHQgZnVuY3Rpb24oKSB7fVwiKTtcblx0XHRcdHdyaXRlRmlsZVN5bmMoam9pbihwa2dEaXIsIFwidGhlbWVzXCIsIFwiZGFyay5qc29uXCIpLCBcInt9XCIpO1xuXG5cdFx0XHRjb25zdCByZXN1bHQgPSBhd2FpdCBwYWNrYWdlTWFuYWdlci5yZXNvbHZlRXh0ZW5zaW9uU291cmNlcyhbcGtnRGlyXSk7XG5cdFx0XHRleHBlY3QocmVzdWx0LmV4dGVuc2lvbnMuc29tZSgocikgPT4gcGF0aEVuZHNXaXRoKHIucGF0aCwgXCJtYWluLnRzXCIpICYmIHIuZW5hYmxlZCkpLnRvQmUodHJ1ZSk7XG5cdFx0XHRleHBlY3QocmVzdWx0LnRoZW1lcy5zb21lKChyKSA9PiBwYXRoRW5kc1dpdGgoci5wYXRoLCBcImRhcmsuanNvblwiKSAmJiByLmVuYWJsZWQpKS50b0JlKHRydWUpO1xuXHRcdH0pO1xuXG5cdFx0aXQoXCJzaG91bGQgc3RvcCByZWN1cnNpbmcgd2hlbiBhIHBhY2thZ2Ugc2tpbGwgZGlyZWN0b3J5IGNvbnRhaW5zIFNLSUxMLm1kXCIsIGFzeW5jICgpID0+IHtcblx0XHRcdGNvbnN0IHBrZ0RpciA9IGpvaW4odGVtcERpciwgXCJza2lsbC1yb290LXBrZ1wiKTtcblx0XHRcdG1rZGlyU3luYyhqb2luKHBrZ0RpciwgXCJza2lsbHNcIiwgXCJyb290LXNraWxsXCIsIFwibmVzdGVkLXNraWxsXCIpLCB7IHJlY3Vyc2l2ZTogdHJ1ZSB9KTtcblx0XHRcdGNvbnN0IHJvb3RTa2lsbCA9IGpvaW4ocGtnRGlyLCBcInNraWxsc1wiLCBcInJvb3Qtc2tpbGxcIiwgXCJTS0lMTC5tZFwiKTtcblx0XHRcdGNvbnN0IG5lc3RlZFNraWxsID0gam9pbihwa2dEaXIsIFwic2tpbGxzXCIsIFwicm9vdC1za2lsbFwiLCBcIm5lc3RlZC1za2lsbFwiLCBcIlNLSUxMLm1kXCIpO1xuXHRcdFx0d3JpdGVGaWxlU3luYyhyb290U2tpbGwsIFwiLS0tXFxubmFtZTogcm9vdC1za2lsbFxcbmRlc2NyaXB0aW9uOiBSb290IHNraWxsXFxuLS0tXFxuXCIpO1xuXHRcdFx0d3JpdGVGaWxlU3luYyhuZXN0ZWRTa2lsbCwgXCItLS1cXG5uYW1lOiBuZXN0ZWQtc2tpbGxcXG5kZXNjcmlwdGlvbjogTmVzdGVkIHNraWxsXFxuLS0tXFxuXCIpO1xuXG5cdFx0XHRjb25zdCByZXN1bHQgPSBhd2FpdCBwYWNrYWdlTWFuYWdlci5yZXNvbHZlRXh0ZW5zaW9uU291cmNlcyhbcGtnRGlyXSk7XG5cdFx0XHRleHBlY3QocmVzdWx0LnNraWxscy5zb21lKChyKSA9PiByLnBhdGggPT09IHJvb3RTa2lsbCAmJiByLmVuYWJsZWQpKS50b0JlKHRydWUpO1xuXHRcdFx0ZXhwZWN0KHJlc3VsdC5za2lsbHMuc29tZSgocikgPT4gci5wYXRoID09PSBuZXN0ZWRTa2lsbCkpLnRvQmUoZmFsc2UpO1xuXHRcdH0pO1xuXHR9KTtcblxuXHRkZXNjcmliZShcInByb2dyZXNzIGNhbGxiYWNrXCIsICgpID0+IHtcblx0XHRpdChcInNob3VsZCBlbWl0IHByb2dyZXNzIGV2ZW50c1wiLCBhc3luYyAoKSA9PiB7XG5cdFx0XHRjb25zdCBldmVudHM6IFByb2dyZXNzRXZlbnRbXSA9IFtdO1xuXHRcdFx0cGFja2FnZU1hbmFnZXIuc2V0UHJvZ3Jlc3NDYWxsYmFjaygoZXZlbnQpID0+IGV2ZW50cy5wdXNoKGV2ZW50KSk7XG5cblx0XHRcdGNvbnN0IGV4dFBhdGggPSBqb2luKHRlbXBEaXIsIFwiZXh0LnRzXCIpO1xuXHRcdFx0d3JpdGVGaWxlU3luYyhleHRQYXRoLCBcImV4cG9ydCBkZWZhdWx0IGZ1bmN0aW9uKCkge31cIik7XG5cblx0XHRcdC8vIExvY2FsIHBhdGhzIGRvbid0IHRyaWdnZXIgaW5zdGFsbCBwcm9ncmVzcywgYnV0IHdlIGNhbiB2ZXJpZnkgdGhlIGNhbGxiYWNrIGlzIHNldFxuXHRcdFx0YXdhaXQgcGFja2FnZU1hbmFnZXIucmVzb2x2ZUV4dGVuc2lvblNvdXJjZXMoW2V4dFBhdGhdKTtcblxuXHRcdFx0Ly8gRm9yIG5vdyBqdXN0IHZlcmlmeSBubyBlcnJvcnMgLSBucG0vZ2l0IHdvdWxkIHRyaWdnZXIgYWN0dWFsIGV2ZW50c1xuXHRcdFx0ZXhwZWN0KGV2ZW50cy5sZW5ndGgpLnRvQmUoMCk7XG5cdFx0fSk7XG5cdH0pO1xuXG5cdGRlc2NyaWJlKFwid2luZG93cyBjb21tYW5kIHNwYXduaW5nXCIsICgpID0+IHtcblx0XHRpdChcInNob3VsZCBhdm9pZCB0aGUgc2hlbGwgZm9yIGdpdCBzbyBXaW5kb3dzIHBhdGhzIHdpdGggc3BhY2VzIHN0YXkgc2luZ2xlIGFyZ3VtZW50c1wiLCAoKSA9PiB7XG5cdFx0XHR2aS5zcHlPbihwcm9jZXNzLCBcInBsYXRmb3JtXCIsIFwiZ2V0XCIpLm1vY2tSZXR1cm5WYWx1ZShcIndpbjMyXCIpO1xuXHRcdFx0Y29uc3QgbWFuYWdlcldpdGhJbnRlcm5hbHMgPSBwYWNrYWdlTWFuYWdlciBhcyB1bmtub3duIGFzIHtcblx0XHRcdFx0c2hvdWxkVXNlV2luZG93c1NoZWxsKGNvbW1hbmQ6IHN0cmluZyk6IGJvb2xlYW47XG5cdFx0XHR9O1xuXG5cdFx0XHRleHBlY3QobWFuYWdlcldpdGhJbnRlcm5hbHMuc2hvdWxkVXNlV2luZG93c1NoZWxsKFwiZ2l0XCIpKS50b0JlKGZhbHNlKTtcblx0XHRcdGV4cGVjdChtYW5hZ2VyV2l0aEludGVybmFscy5zaG91bGRVc2VXaW5kb3dzU2hlbGwoXCJucG1cIikpLnRvQmUodHJ1ZSk7XG5cdFx0XHRleHBlY3QobWFuYWdlcldpdGhJbnRlcm5hbHMuc2hvdWxkVXNlV2luZG93c1NoZWxsKFwicG5wbVwiKSkudG9CZSh0cnVlKTtcblx0XHRcdGV4cGVjdChtYW5hZ2VyV2l0aEludGVybmFscy5zaG91bGRVc2VXaW5kb3dzU2hlbGwoXCJDOi9Qcm9ncmFtIEZpbGVzL25vZGVqcy9ucG0uY21kXCIpKS50b0JlKHRydWUpO1xuXHRcdH0pO1xuXHR9KTtcblxuXHRkZXNjcmliZShcIm5wbUNvbW1hbmRcIiwgKCkgPT4ge1xuXHRcdGl0KFwic2hvdWxkIHVzZSBucG1Db21tYW5kIGFyZ3YgZm9yIG5wbSBpbnN0YWxsc1wiLCBhc3luYyAoKSA9PiB7XG5cdFx0XHRzZXR0aW5nc01hbmFnZXIgPSBTZXR0aW5nc01hbmFnZXIuaW5NZW1vcnkoe1xuXHRcdFx0XHRucG1Db21tYW5kOiBbXCJtaXNlXCIsIFwiZXhlY1wiLCBcIm5vZGVAMjBcIiwgXCItLVwiLCBcIm5wbVwiXSxcblx0XHRcdH0pO1xuXHRcdFx0cGFja2FnZU1hbmFnZXIgPSBuZXcgRGVmYXVsdFBhY2thZ2VNYW5hZ2VyKHtcblx0XHRcdFx0Y3dkOiB0ZW1wRGlyLFxuXHRcdFx0XHRhZ2VudERpcixcblx0XHRcdFx0c2V0dGluZ3NNYW5hZ2VyLFxuXHRcdFx0fSk7XG5cblx0XHRcdGNvbnN0IHJ1bkNvbW1hbmRTcHkgPSB2aS5zcHlPbihwYWNrYWdlTWFuYWdlciBhcyBhbnksIFwicnVuQ29tbWFuZFwiKS5tb2NrUmVzb2x2ZWRWYWx1ZSh1bmRlZmluZWQpO1xuXG5cdFx0XHRhd2FpdCBwYWNrYWdlTWFuYWdlci5pbnN0YWxsKFwibnBtOkBzY29wZS9wa2dcIik7XG5cblx0XHRcdGV4cGVjdChydW5Db21tYW5kU3B5KS50b0hhdmVCZWVuQ2FsbGVkV2l0aChcblx0XHRcdFx0XCJtaXNlXCIsXG5cdFx0XHRcdFtcImV4ZWNcIiwgXCJub2RlQDIwXCIsIFwiLS1cIiwgXCJucG1cIiwgXCJpbnN0YWxsXCIsIFwiLWdcIiwgXCJAc2NvcGUvcGtnXCJdLFxuXHRcdFx0XHR1bmRlZmluZWQsXG5cdFx0XHQpO1xuXHRcdH0pO1xuXG5cdFx0aXQoXCJzaG91bGQgaW5zdGFsbCBnaXQgcGFja2FnZSBkZXBlbmRlbmNpZXMgd2l0aCAtLW9taXQ9ZGV2XCIsIGFzeW5jICgpID0+IHtcblx0XHRcdGNvbnN0IHNvdXJjZSA9IFwiZ2l0OmdpdGh1Yi5jb20vdXNlci9yZXBvXCI7XG5cdFx0XHRjb25zdCB0YXJnZXREaXIgPSBqb2luKGFnZW50RGlyLCBcImdpdFwiLCBcImdpdGh1Yi5jb21cIiwgXCJ1c2VyXCIsIFwicmVwb1wiKTtcblx0XHRcdGNvbnN0IHJ1bkNvbW1hbmRTcHkgPSB2aVxuXHRcdFx0XHQuc3B5T24ocGFja2FnZU1hbmFnZXIgYXMgYW55LCBcInJ1bkNvbW1hbmRcIilcblx0XHRcdFx0Lm1vY2tJbXBsZW1lbnRhdGlvbihhc3luYyAoLi4uY2FsbEFyZ3M6IHVua25vd25bXSkgPT4ge1xuXHRcdFx0XHRcdGNvbnN0IFtjb21tYW5kLCBhcmdzXSA9IGNhbGxBcmdzIGFzIFtzdHJpbmcsIHN0cmluZ1tdXTtcblx0XHRcdFx0XHRpZiAoY29tbWFuZCA9PT0gXCJnaXRcIiAmJiBhcmdzWzBdID09PSBcImNsb25lXCIpIHtcblx0XHRcdFx0XHRcdG1rZGlyU3luYyh0YXJnZXREaXIsIHsgcmVjdXJzaXZlOiB0cnVlIH0pO1xuXHRcdFx0XHRcdFx0d3JpdGVGaWxlU3luYyhqb2luKHRhcmdldERpciwgXCJwYWNrYWdlLmpzb25cIiksIEpTT04uc3RyaW5naWZ5KHsgbmFtZTogXCJyZXBvXCIsIHZlcnNpb246IFwiMS4wLjBcIiB9KSk7XG5cdFx0XHRcdFx0fVxuXHRcdFx0XHR9KTtcblxuXHRcdFx0YXdhaXQgcGFja2FnZU1hbmFnZXIuaW5zdGFsbChzb3VyY2UpO1xuXG5cdFx0XHRleHBlY3QocnVuQ29tbWFuZFNweSkudG9IYXZlQmVlbkNhbGxlZFdpdGgoXCJucG1cIiwgW1wiaW5zdGFsbFwiLCBcIi0tb21pdD1kZXZcIl0sIHsgY3dkOiB0YXJnZXREaXIgfSk7XG5cdFx0fSk7XG5cblx0XHRpdChcInNob3VsZCB1c2UgcGxhaW4gaW5zdGFsbCBmb3IgZ2l0IHBhY2thZ2UgZGVwZW5kZW5jaWVzIHdoZW4gbnBtQ29tbWFuZCBpcyBjb25maWd1cmVkXCIsIGFzeW5jICgpID0+IHtcblx0XHRcdHNldHRpbmdzTWFuYWdlciA9IFNldHRpbmdzTWFuYWdlci5pbk1lbW9yeSh7XG5cdFx0XHRcdG5wbUNvbW1hbmQ6IFtcInBucG1cIl0sXG5cdFx0XHR9KTtcblx0XHRcdHBhY2thZ2VNYW5hZ2VyID0gbmV3IERlZmF1bHRQYWNrYWdlTWFuYWdlcih7XG5cdFx0XHRcdGN3ZDogdGVtcERpcixcblx0XHRcdFx0YWdlbnREaXIsXG5cdFx0XHRcdHNldHRpbmdzTWFuYWdlcixcblx0XHRcdH0pO1xuXG5cdFx0XHRjb25zdCBzb3VyY2UgPSBcImdpdDpnaXRodWIuY29tL3VzZXIvcmVwb1wiO1xuXHRcdFx0Y29uc3QgdGFyZ2V0RGlyID0gam9pbihhZ2VudERpciwgXCJnaXRcIiwgXCJnaXRodWIuY29tXCIsIFwidXNlclwiLCBcInJlcG9cIik7XG5cdFx0XHRjb25zdCBydW5Db21tYW5kU3B5ID0gdmlcblx0XHRcdFx0LnNweU9uKHBhY2thZ2VNYW5hZ2VyIGFzIGFueSwgXCJydW5Db21tYW5kXCIpXG5cdFx0XHRcdC5tb2NrSW1wbGVtZW50YXRpb24oYXN5bmMgKC4uLmNhbGxBcmdzOiB1bmtub3duW10pID0+IHtcblx0XHRcdFx0XHRjb25zdCBbY29tbWFuZCwgYXJnc10gPSBjYWxsQXJncyBhcyBbc3RyaW5nLCBzdHJpbmdbXV07XG5cdFx0XHRcdFx0aWYgKGNvbW1hbmQgPT09IFwiZ2l0XCIgJiYgYXJnc1swXSA9PT0gXCJjbG9uZVwiKSB7XG5cdFx0XHRcdFx0XHRta2RpclN5bmModGFyZ2V0RGlyLCB7IHJlY3Vyc2l2ZTogdHJ1ZSB9KTtcblx0XHRcdFx0XHRcdHdyaXRlRmlsZVN5bmMoam9pbih0YXJnZXREaXIsIFwicGFja2FnZS5qc29uXCIpLCBKU09OLnN0cmluZ2lmeSh7IG5hbWU6IFwicmVwb1wiLCB2ZXJzaW9uOiBcIjEuMC4wXCIgfSkpO1xuXHRcdFx0XHRcdH1cblx0XHRcdFx0fSk7XG5cblx0XHRcdGF3YWl0IHBhY2thZ2VNYW5hZ2VyLmluc3RhbGwoc291cmNlKTtcblxuXHRcdFx0ZXhwZWN0KHJ1bkNvbW1hbmRTcHkpLnRvSGF2ZUJlZW5DYWxsZWRXaXRoKFwicG5wbVwiLCBbXCJpbnN0YWxsXCJdLCB7IGN3ZDogdGFyZ2V0RGlyIH0pO1xuXHRcdH0pO1xuXG5cdFx0aXQoXCJzaG91bGQgdXBkYXRlIGdpdCBwYWNrYWdlIGRlcGVuZGVuY2llcyB3aXRoIC0tb21pdD1kZXZcIiwgYXN5bmMgKCkgPT4ge1xuXHRcdFx0Y29uc3Qgc291cmNlID0gXCJnaXQ6Z2l0aHViLmNvbS91c2VyL3JlcG9cIjtcblx0XHRcdGNvbnN0IHRhcmdldERpciA9IGpvaW4odGVtcERpciwgXCIucGlcIiwgXCJnaXRcIiwgXCJnaXRodWIuY29tXCIsIFwidXNlclwiLCBcInJlcG9cIik7XG5cdFx0XHRta2RpclN5bmModGFyZ2V0RGlyLCB7IHJlY3Vyc2l2ZTogdHJ1ZSB9KTtcblx0XHRcdHdyaXRlRmlsZVN5bmMoam9pbih0YXJnZXREaXIsIFwicGFja2FnZS5qc29uXCIpLCBKU09OLnN0cmluZ2lmeSh7IG5hbWU6IFwicmVwb1wiLCB2ZXJzaW9uOiBcIjEuMC4wXCIgfSkpO1xuXHRcdFx0c2V0dGluZ3NNYW5hZ2VyLnNldFByb2plY3RQYWNrYWdlcyhbc291cmNlXSk7XG5cblx0XHRcdHZpLnNweU9uKHBhY2thZ2VNYW5hZ2VyIGFzIGFueSwgXCJydW5Db21tYW5kQ2FwdHVyZVwiKS5tb2NrSW1wbGVtZW50YXRpb24oYXN5bmMgKC4uLmNhbGxBcmdzOiB1bmtub3duW10pID0+IHtcblx0XHRcdFx0Y29uc3QgW19jb21tYW5kLCBhcmdzXSA9IGNhbGxBcmdzIGFzIFtzdHJpbmcsIHN0cmluZ1tdXTtcblx0XHRcdFx0aWYgKGFyZ3NbMF0gPT09IFwicmV2LXBhcnNlXCIgJiYgYXJnc1sxXSA9PT0gXCItLWFiYnJldi1yZWZcIiAmJiBhcmdzWzJdID09PSBcIkB7dXBzdHJlYW19XCIpIHtcblx0XHRcdFx0XHRyZXR1cm4gXCJvcmlnaW4vbWFpblwiO1xuXHRcdFx0XHR9XG5cdFx0XHRcdGlmIChhcmdzWzBdID09PSBcInJldi1wYXJzZVwiICYmIGFyZ3NbMV0gPT09IFwiQHt1cHN0cmVhbX1cIikge1xuXHRcdFx0XHRcdHJldHVybiBcInJlbW90ZS1oZWFkXCI7XG5cdFx0XHRcdH1cblx0XHRcdFx0aWYgKGFyZ3NbMF0gPT09IFwicmV2LXBhcnNlXCIgJiYgYXJnc1sxXSA9PT0gXCJIRUFEXCIpIHtcblx0XHRcdFx0XHRyZXR1cm4gXCJsb2NhbC1oZWFkXCI7XG5cdFx0XHRcdH1cblx0XHRcdFx0dGhyb3cgbmV3IEVycm9yKGBVbmV4cGVjdGVkIHJ1bkNvbW1hbmRDYXB0dXJlIGFyZ3M6ICR7YXJncy5qb2luKFwiIFwiKX1gKTtcblx0XHRcdH0pO1xuXHRcdFx0Y29uc3QgcnVuQ29tbWFuZFNweSA9IHZpLnNweU9uKHBhY2thZ2VNYW5hZ2VyIGFzIGFueSwgXCJydW5Db21tYW5kXCIpLm1vY2tSZXNvbHZlZFZhbHVlKHVuZGVmaW5lZCk7XG5cblx0XHRcdGF3YWl0IHBhY2thZ2VNYW5hZ2VyLnVwZGF0ZShzb3VyY2UpO1xuXG5cdFx0XHRleHBlY3QocnVuQ29tbWFuZFNweSkudG9IYXZlQmVlbkNhbGxlZFdpdGgoXCJucG1cIiwgW1wiaW5zdGFsbFwiLCBcIi0tb21pdD1kZXZcIl0sIHsgY3dkOiB0YXJnZXREaXIgfSk7XG5cdFx0fSk7XG5cblx0XHRpdChcInNob3VsZCB1c2UgcGxhaW4gaW5zdGFsbCB0aHJvdWdoIG5wbUNvbW1hbmQgYXJndiB3aGVuIHVwZGF0aW5nIGdpdCBwYWNrYWdlIGRlcGVuZGVuY2llc1wiLCBhc3luYyAoKSA9PiB7XG5cdFx0XHRzZXR0aW5nc01hbmFnZXIgPSBTZXR0aW5nc01hbmFnZXIuaW5NZW1vcnkoe1xuXHRcdFx0XHRucG1Db21tYW5kOiBbXCJtaXNlXCIsIFwiZXhlY1wiLCBcIm5vZGVAMjBcIiwgXCItLVwiLCBcInBucG1cIl0sXG5cdFx0XHR9KTtcblx0XHRcdHBhY2thZ2VNYW5hZ2VyID0gbmV3IERlZmF1bHRQYWNrYWdlTWFuYWdlcih7XG5cdFx0XHRcdGN3ZDogdGVtcERpcixcblx0XHRcdFx0YWdlbnREaXIsXG5cdFx0XHRcdHNldHRpbmdzTWFuYWdlcixcblx0XHRcdH0pO1xuXG5cdFx0XHRjb25zdCBzb3VyY2UgPSBcImdpdDpnaXRodWIuY29tL3VzZXIvcmVwb1wiO1xuXHRcdFx0Y29uc3QgdGFyZ2V0RGlyID0gam9pbih0ZW1wRGlyLCBcIi5waVwiLCBcImdpdFwiLCBcImdpdGh1Yi5jb21cIiwgXCJ1c2VyXCIsIFwicmVwb1wiKTtcblx0XHRcdG1rZGlyU3luYyh0YXJnZXREaXIsIHsgcmVjdXJzaXZlOiB0cnVlIH0pO1xuXHRcdFx0d3JpdGVGaWxlU3luYyhqb2luKHRhcmdldERpciwgXCJwYWNrYWdlLmpzb25cIiksIEpTT04uc3RyaW5naWZ5KHsgbmFtZTogXCJyZXBvXCIsIHZlcnNpb246IFwiMS4wLjBcIiB9KSk7XG5cdFx0XHRzZXR0aW5nc01hbmFnZXIuc2V0UHJvamVjdFBhY2thZ2VzKFtzb3VyY2VdKTtcblxuXHRcdFx0dmkuc3B5T24ocGFja2FnZU1hbmFnZXIgYXMgYW55LCBcInJ1bkNvbW1hbmRDYXB0dXJlXCIpLm1vY2tJbXBsZW1lbnRhdGlvbihhc3luYyAoLi4uY2FsbEFyZ3M6IHVua25vd25bXSkgPT4ge1xuXHRcdFx0XHRjb25zdCBbX2NvbW1hbmQsIGFyZ3NdID0gY2FsbEFyZ3MgYXMgW3N0cmluZywgc3RyaW5nW11dO1xuXHRcdFx0XHRpZiAoYXJnc1swXSA9PT0gXCJyZXYtcGFyc2VcIiAmJiBhcmdzWzFdID09PSBcIi0tYWJicmV2LXJlZlwiICYmIGFyZ3NbMl0gPT09IFwiQHt1cHN0cmVhbX1cIikge1xuXHRcdFx0XHRcdHJldHVybiBcIm9yaWdpbi9tYWluXCI7XG5cdFx0XHRcdH1cblx0XHRcdFx0aWYgKGFyZ3NbMF0gPT09IFwicmV2LXBhcnNlXCIgJiYgYXJnc1sxXSA9PT0gXCJAe3Vwc3RyZWFtfVwiKSB7XG5cdFx0XHRcdFx0cmV0dXJuIFwicmVtb3RlLWhlYWRcIjtcblx0XHRcdFx0fVxuXHRcdFx0XHRpZiAoYXJnc1swXSA9PT0gXCJyZXYtcGFyc2VcIiAmJiBhcmdzWzFdID09PSBcIkhFQURcIikge1xuXHRcdFx0XHRcdHJldHVybiBcImxvY2FsLWhlYWRcIjtcblx0XHRcdFx0fVxuXHRcdFx0XHR0aHJvdyBuZXcgRXJyb3IoYFVuZXhwZWN0ZWQgcnVuQ29tbWFuZENhcHR1cmUgYXJnczogJHthcmdzLmpvaW4oXCIgXCIpfWApO1xuXHRcdFx0fSk7XG5cdFx0XHRjb25zdCBydW5Db21tYW5kU3B5ID0gdmkuc3B5T24ocGFja2FnZU1hbmFnZXIgYXMgYW55LCBcInJ1bkNvbW1hbmRcIikubW9ja1Jlc29sdmVkVmFsdWUodW5kZWZpbmVkKTtcblxuXHRcdFx0YXdhaXQgcGFja2FnZU1hbmFnZXIudXBkYXRlKHNvdXJjZSk7XG5cblx0XHRcdGV4cGVjdChydW5Db21tYW5kU3B5KS50b0hhdmVCZWVuQ2FsbGVkV2l0aChcIm1pc2VcIiwgW1wiZXhlY1wiLCBcIm5vZGVAMjBcIiwgXCItLVwiLCBcInBucG1cIiwgXCJpbnN0YWxsXCJdLCB7XG5cdFx0XHRcdGN3ZDogdGFyZ2V0RGlyLFxuXHRcdFx0fSk7XG5cdFx0fSk7XG5cblx0XHRpdChcInNob3VsZCB1c2UgbnBtQ29tbWFuZCBhcmd2IGZvciBucG0gcm9vdCBsb29rdXAgYW5kIGludmFsaWRhdGUgY2FjaGVkIHJvb3Qgd2hlbiBucG1Db21tYW5kIGNoYW5nZXNcIiwgKCkgPT4ge1xuXHRcdFx0c2V0dGluZ3NNYW5hZ2VyID0gU2V0dGluZ3NNYW5hZ2VyLmluTWVtb3J5KHtcblx0XHRcdFx0bnBtQ29tbWFuZDogW1wibWlzZVwiLCBcImV4ZWNcIiwgXCJub2RlQDIwXCIsIFwiLS1cIiwgXCJucG1cIl0sXG5cdFx0XHR9KTtcblx0XHRcdHBhY2thZ2VNYW5hZ2VyID0gbmV3IERlZmF1bHRQYWNrYWdlTWFuYWdlcih7XG5cdFx0XHRcdGN3ZDogdGVtcERpcixcblx0XHRcdFx0YWdlbnREaXIsXG5cdFx0XHRcdHNldHRpbmdzTWFuYWdlcixcblx0XHRcdH0pO1xuXG5cdFx0XHRjb25zdCByb290MjAgPSBqb2luKHRlbXBEaXIsIFwibm9kZTIwXCIsIFwibGliXCIsIFwibm9kZV9tb2R1bGVzXCIpO1xuXHRcdFx0Y29uc3Qgcm9vdDIyID0gam9pbih0ZW1wRGlyLCBcIm5vZGUyMlwiLCBcImxpYlwiLCBcIm5vZGVfbW9kdWxlc1wiKTtcblx0XHRcdG1rZGlyU3luYyhqb2luKHJvb3QyMCwgXCJAc2NvcGVcIiwgXCJwa2dcIiksIHsgcmVjdXJzaXZlOiB0cnVlIH0pO1xuXG5cdFx0XHRjb25zdCBydW5Db21tYW5kU3luY1NweSA9IHZpXG5cdFx0XHRcdC5zcHlPbihwYWNrYWdlTWFuYWdlciBhcyBhbnksIFwicnVuQ29tbWFuZFN5bmNcIilcblx0XHRcdFx0Lm1vY2tJbXBsZW1lbnRhdGlvbigoLi4uY2FsbEFyZ3M6IHVua25vd25bXSkgPT4ge1xuXHRcdFx0XHRcdGNvbnN0IFtjb21tYW5kLCBhcmdzXSA9IGNhbGxBcmdzIGFzIFtzdHJpbmcsIHN0cmluZ1tdXTtcblx0XHRcdFx0XHRpZiAoY29tbWFuZCAhPT0gXCJtaXNlXCIpIHtcblx0XHRcdFx0XHRcdHRocm93IG5ldyBFcnJvcihgdW5leHBlY3RlZCBjb21tYW5kICR7Y29tbWFuZH1gKTtcblx0XHRcdFx0XHR9XG5cdFx0XHRcdFx0aWYgKGFyZ3NbMV0gPT09IFwibm9kZUAyMFwiKSB7XG5cdFx0XHRcdFx0XHRyZXR1cm4gcm9vdDIwO1xuXHRcdFx0XHRcdH1cblx0XHRcdFx0XHRpZiAoYXJnc1sxXSA9PT0gXCJub2RlQDIyXCIpIHtcblx0XHRcdFx0XHRcdHJldHVybiByb290MjI7XG5cdFx0XHRcdFx0fVxuXHRcdFx0XHRcdHRocm93IG5ldyBFcnJvcihgdW5leHBlY3RlZCBhcmdzICR7YXJncy5qb2luKFwiIFwiKX1gKTtcblx0XHRcdFx0fSk7XG5cblx0XHRcdGV4cGVjdChwYWNrYWdlTWFuYWdlci5nZXRJbnN0YWxsZWRQYXRoKFwibnBtOkBzY29wZS9wa2dcIiwgXCJ1c2VyXCIpKS50b0JlKGpvaW4ocm9vdDIwLCBcIkBzY29wZVwiLCBcInBrZ1wiKSk7XG5cdFx0XHRleHBlY3QocnVuQ29tbWFuZFN5bmNTcHkpLnRvSGF2ZUJlZW5OdGhDYWxsZWRXaXRoKDEsIFwibWlzZVwiLCBbXCJleGVjXCIsIFwibm9kZUAyMFwiLCBcIi0tXCIsIFwibnBtXCIsIFwicm9vdFwiLCBcIi1nXCJdKTtcblxuXHRcdFx0c2V0dGluZ3NNYW5hZ2VyLnNldE5wbUNvbW1hbmQoW1wibWlzZVwiLCBcImV4ZWNcIiwgXCJub2RlQDIyXCIsIFwiLS1cIiwgXCJucG1cIl0pO1xuXG5cdFx0XHRleHBlY3QocGFja2FnZU1hbmFnZXIuZ2V0SW5zdGFsbGVkUGF0aChcIm5wbTpAc2NvcGUvcGtnXCIsIFwidXNlclwiKSkudG9CZVVuZGVmaW5lZCgpO1xuXHRcdFx0ZXhwZWN0KHJ1bkNvbW1hbmRTeW5jU3B5KS50b0hhdmVCZWVuTnRoQ2FsbGVkV2l0aCgyLCBcIm1pc2VcIiwgW1wiZXhlY1wiLCBcIm5vZGVAMjJcIiwgXCItLVwiLCBcIm5wbVwiLCBcInJvb3RcIiwgXCItZ1wiXSk7XG5cdFx0fSk7XG5cdH0pO1xuXG5cdGRlc2NyaWJlKFwic291cmNlIHBhcnNpbmdcIiwgKCkgPT4ge1xuXHRcdGl0KFwic2hvdWxkIGVtaXQgcHJvZ3Jlc3MgZXZlbnRzIG9uIGluc3RhbGwgYXR0ZW1wdFwiLCBhc3luYyAoKSA9PiB7XG5cdFx0XHRjb25zdCBldmVudHM6IFByb2dyZXNzRXZlbnRbXSA9IFtdO1xuXHRcdFx0cGFja2FnZU1hbmFnZXIuc2V0UHJvZ3Jlc3NDYWxsYmFjaygoZXZlbnQpID0+IGV2ZW50cy5wdXNoKGV2ZW50KSk7XG5cblx0XHRcdC8vIFVzZSBwdWJsaWMgaW5zdGFsbCBtZXRob2Qgd2hpY2ggZW1pdHMgcHJvZ3Jlc3MgZXZlbnRzXG5cdFx0XHR0cnkge1xuXHRcdFx0XHRhd2FpdCBwYWNrYWdlTWFuYWdlci5pbnN0YWxsKFwibnBtOm5vbmV4aXN0ZW50LXBhY2thZ2VAMS4wLjBcIik7XG5cdFx0XHR9IGNhdGNoIHtcblx0XHRcdFx0Ly8gRXhwZWN0ZWQgdG8gZmFpbCAtIHBhY2thZ2UgZG9lc24ndCBleGlzdFxuXHRcdFx0fVxuXG5cdFx0XHQvLyBTaG91bGQgaGF2ZSBlbWl0dGVkIHN0YXJ0IGV2ZW50IGJlZm9yZSBmYWlsdXJlXG5cdFx0XHRleHBlY3QoZXZlbnRzLnNvbWUoKGUpID0+IGUudHlwZSA9PT0gXCJzdGFydFwiICYmIGUuYWN0aW9uID09PSBcImluc3RhbGxcIikpLnRvQmUodHJ1ZSk7XG5cdFx0XHQvLyBTaG91bGQgaGF2ZSBlbWl0dGVkIGVycm9yIGV2ZW50XG5cdFx0XHRleHBlY3QoZXZlbnRzLnNvbWUoKGUpID0+IGUudHlwZSA9PT0gXCJlcnJvclwiKSkudG9CZSh0cnVlKTtcblx0XHR9KTtcblxuXHRcdGl0KFwic2hvdWxkIHJlY29nbml6ZSBnaXRodWIgVVJMcyB3aXRob3V0IGdpdDogcHJlZml4XCIsIGFzeW5jICgpID0+IHtcblx0XHRcdGNvbnN0IGV2ZW50czogUHJvZ3Jlc3NFdmVudFtdID0gW107XG5cdFx0XHRwYWNrYWdlTWFuYWdlci5zZXRQcm9ncmVzc0NhbGxiYWNrKChldmVudCkgPT4gZXZlbnRzLnB1c2goZXZlbnQpKTtcblx0XHRcdGNvbnN0IHByZXZpb3VzR2l0VGVybWluYWxQcm9tcHQgPSBwcm9jZXNzLmVudi5HSVRfVEVSTUlOQUxfUFJPTVBUO1xuXHRcdFx0cHJvY2Vzcy5lbnYuR0lUX1RFUk1JTkFMX1BST01QVCA9IFwiMFwiO1xuXG5cdFx0XHR0cnkge1xuXHRcdFx0XHQvLyBUaGlzIHNob3VsZCBiZSBwYXJzZWQgYXMgYSBnaXQgc291cmNlLCBub3QgdGhyb3cgXCJ1bnN1cHBvcnRlZFwiXG5cdFx0XHRcdHRyeSB7XG5cdFx0XHRcdFx0YXdhaXQgcGFja2FnZU1hbmFnZXIuaW5zdGFsbChcImh0dHBzOi8vZ2l0aHViLmNvbS9ub25leGlzdGVudC9yZXBvXCIpO1xuXHRcdFx0XHR9IGNhdGNoIHtcblx0XHRcdFx0XHQvLyBFeHBlY3RlZCB0byBmYWlsIC0gcmVwbyBkb2Vzbid0IGV4aXN0XG5cdFx0XHRcdH1cblx0XHRcdH0gZmluYWxseSB7XG5cdFx0XHRcdGlmIChwcmV2aW91c0dpdFRlcm1pbmFsUHJvbXB0ID09PSB1bmRlZmluZWQpIHtcblx0XHRcdFx0XHRkZWxldGUgcHJvY2Vzcy5lbnYuR0lUX1RFUk1JTkFMX1BST01QVDtcblx0XHRcdFx0fSBlbHNlIHtcblx0XHRcdFx0XHRwcm9jZXNzLmVudi5HSVRfVEVSTUlOQUxfUFJPTVBUID0gcHJldmlvdXNHaXRUZXJtaW5hbFByb21wdDtcblx0XHRcdFx0fVxuXHRcdFx0fVxuXG5cdFx0XHQvLyBTaG91bGQgaGF2ZSBhdHRlbXB0ZWQgY2xvbmUsIG5vdCB0aHJvd24gdW5zdXBwb3J0ZWQgZXJyb3Jcblx0XHRcdGV4cGVjdChldmVudHMuc29tZSgoZSkgPT4gZS50eXBlID09PSBcInN0YXJ0XCIgJiYgZS5hY3Rpb24gPT09IFwiaW5zdGFsbFwiKSkudG9CZSh0cnVlKTtcblx0XHR9KTtcblxuXHRcdGl0KFwic2hvdWxkIHBhcnNlIHBhY2thZ2Ugc291cmNlIHR5cGVzIGZyb20gZG9jcyBleGFtcGxlc1wiLCAoKSA9PiB7XG5cdFx0XHRleHBlY3QoKHBhY2thZ2VNYW5hZ2VyIGFzIGFueSkucGFyc2VTb3VyY2UoXCJucG06QHNjb3BlL3BrZ0AxLjIuM1wiKS50eXBlKS50b0JlKFwibnBtXCIpO1xuXHRcdFx0ZXhwZWN0KChwYWNrYWdlTWFuYWdlciBhcyBhbnkpLnBhcnNlU291cmNlKFwibnBtOnBrZ1wiKS50eXBlKS50b0JlKFwibnBtXCIpO1xuXG5cdFx0XHRleHBlY3QoKHBhY2thZ2VNYW5hZ2VyIGFzIGFueSkucGFyc2VTb3VyY2UoXCJnaXQ6Z2l0aHViLmNvbS91c2VyL3JlcG9AdjFcIikudHlwZSkudG9CZShcImdpdFwiKTtcblx0XHRcdGV4cGVjdCgocGFja2FnZU1hbmFnZXIgYXMgYW55KS5wYXJzZVNvdXJjZShcImh0dHBzOi8vZ2l0aHViLmNvbS91c2VyL3JlcG9AdjFcIikudHlwZSkudG9CZShcImdpdFwiKTtcblx0XHRcdGV4cGVjdCgocGFja2FnZU1hbmFnZXIgYXMgYW55KS5wYXJzZVNvdXJjZShcImdpdDpnaXRAZ2l0aHViLmNvbTp1c2VyL3JlcG9AdjFcIikudHlwZSkudG9CZShcImdpdFwiKTtcblx0XHRcdGV4cGVjdCgocGFja2FnZU1hbmFnZXIgYXMgYW55KS5wYXJzZVNvdXJjZShcInNzaDovL2dpdEBnaXRodWIuY29tL3VzZXIvcmVwb0B2MVwiKS50eXBlKS50b0JlKFwiZ2l0XCIpO1xuXG5cdFx0XHRleHBlY3QoKHBhY2thZ2VNYW5hZ2VyIGFzIGFueSkucGFyc2VTb3VyY2UoXCIvYWJzb2x1dGUvcGF0aC90by9wYWNrYWdlXCIpLnR5cGUpLnRvQmUoXCJsb2NhbFwiKTtcblx0XHRcdGV4cGVjdCgocGFja2FnZU1hbmFnZXIgYXMgYW55KS5wYXJzZVNvdXJjZShcIi4vcmVsYXRpdmUvcGF0aC90by9wYWNrYWdlXCIpLnR5cGUpLnRvQmUoXCJsb2NhbFwiKTtcblx0XHRcdGV4cGVjdCgocGFja2FnZU1hbmFnZXIgYXMgYW55KS5wYXJzZVNvdXJjZShcIi4uL3JlbGF0aXZlL3BhdGgvdG8vcGFja2FnZVwiKS50eXBlKS50b0JlKFwibG9jYWxcIik7XG5cdFx0fSk7XG5cblx0XHRpdChcInNob3VsZCBuZXZlciBwYXJzZSBkb3QtcmVsYXRpdmUgcGF0aHMgYXMgZ2l0XCIsICgpID0+IHtcblx0XHRcdGNvbnN0IGRvdFNsYXNoID0gKHBhY2thZ2VNYW5hZ2VyIGFzIGFueSkucGFyc2VTb3VyY2UoXCIuL3BhY2thZ2VzL2FnZW50LXRpbWVyc1wiKTtcblx0XHRcdGV4cGVjdChkb3RTbGFzaC50eXBlKS50b0JlKFwibG9jYWxcIik7XG5cdFx0XHRleHBlY3QoZG90U2xhc2gucGF0aCkudG9CZShcIi4vcGFja2FnZXMvYWdlbnQtdGltZXJzXCIpO1xuXG5cdFx0XHRjb25zdCBkb3REb3RTbGFzaCA9IChwYWNrYWdlTWFuYWdlciBhcyBhbnkpLnBhcnNlU291cmNlKFwiLi4vcGFja2FnZXMvYWdlbnQtdGltZXJzXCIpO1xuXHRcdFx0ZXhwZWN0KGRvdERvdFNsYXNoLnR5cGUpLnRvQmUoXCJsb2NhbFwiKTtcblx0XHRcdGV4cGVjdChkb3REb3RTbGFzaC5wYXRoKS50b0JlKFwiLi4vcGFja2FnZXMvYWdlbnQtdGltZXJzXCIpO1xuXHRcdH0pO1xuXHR9KTtcblxuXHRkZXNjcmliZShcInNldHRpbmdzIHNvdXJjZSBub3JtYWxpemF0aW9uXCIsICgpID0+IHtcblx0XHRpdChcInNob3VsZCBzdG9yZSBnbG9iYWwgbG9jYWwgcGFja2FnZXMgcmVsYXRpdmUgdG8gYWdlbnQgc2V0dGluZ3MgYmFzZVwiLCAoKSA9PiB7XG5cdFx0XHRjb25zdCBwa2dEaXIgPSBqb2luKHRlbXBEaXIsIFwicGFja2FnZXNcIiwgXCJsb2NhbC1nbG9iYWwtcGtnXCIpO1xuXHRcdFx0bWtkaXJTeW5jKGpvaW4ocGtnRGlyLCBcImV4dGVuc2lvbnNcIiksIHsgcmVjdXJzaXZlOiB0cnVlIH0pO1xuXHRcdFx0d3JpdGVGaWxlU3luYyhqb2luKHBrZ0RpciwgXCJleHRlbnNpb25zXCIsIFwiaW5kZXgudHNcIiksIFwiZXhwb3J0IGRlZmF1bHQgZnVuY3Rpb24oKSB7fVwiKTtcblxuXHRcdFx0Y29uc3QgYWRkZWQgPSBwYWNrYWdlTWFuYWdlci5hZGRTb3VyY2VUb1NldHRpbmdzKFwiLi9wYWNrYWdlcy9sb2NhbC1nbG9iYWwtcGtnXCIpO1xuXHRcdFx0ZXhwZWN0KGFkZGVkKS50b0JlKHRydWUpO1xuXG5cdFx0XHRjb25zdCBzZXR0aW5ncyA9IHNldHRpbmdzTWFuYWdlci5nZXRHbG9iYWxTZXR0aW5ncygpO1xuXHRcdFx0Y29uc3QgcmVsID0gcmVsYXRpdmUoYWdlbnREaXIsIHBrZ0Rpcik7XG5cdFx0XHRjb25zdCBleHBlY3RlZCA9IHJlbC5zdGFydHNXaXRoKFwiLlwiKSA/IHJlbCA6IGAuLyR7cmVsfWA7XG5cdFx0XHRleHBlY3Qoc2V0dGluZ3MucGFja2FnZXM/LlswXSkudG9CZShleHBlY3RlZCk7XG5cdFx0fSk7XG5cblx0XHRpdChcInNob3VsZCBzdG9yZSBwcm9qZWN0IGxvY2FsIHBhY2thZ2VzIHJlbGF0aXZlIHRvIC5waSBzZXR0aW5ncyBiYXNlXCIsICgpID0+IHtcblx0XHRcdGNvbnN0IHByb2plY3RQa2dEaXIgPSBqb2luKHRlbXBEaXIsIFwicHJvamVjdC1sb2NhbC1wa2dcIik7XG5cdFx0XHRta2RpclN5bmMoam9pbihwcm9qZWN0UGtnRGlyLCBcImV4dGVuc2lvbnNcIiksIHsgcmVjdXJzaXZlOiB0cnVlIH0pO1xuXHRcdFx0d3JpdGVGaWxlU3luYyhqb2luKHByb2plY3RQa2dEaXIsIFwiZXh0ZW5zaW9uc1wiLCBcImluZGV4LnRzXCIpLCBcImV4cG9ydCBkZWZhdWx0IGZ1bmN0aW9uKCkge31cIik7XG5cblx0XHRcdGNvbnN0IGFkZGVkID0gcGFja2FnZU1hbmFnZXIuYWRkU291cmNlVG9TZXR0aW5ncyhcIi4vcHJvamVjdC1sb2NhbC1wa2dcIiwgeyBsb2NhbDogdHJ1ZSB9KTtcblx0XHRcdGV4cGVjdChhZGRlZCkudG9CZSh0cnVlKTtcblxuXHRcdFx0Y29uc3Qgc2V0dGluZ3MgPSBzZXR0aW5nc01hbmFnZXIuZ2V0UHJvamVjdFNldHRpbmdzKCk7XG5cdFx0XHRjb25zdCByZWwgPSByZWxhdGl2ZShqb2luKHRlbXBEaXIsIFwiLnBpXCIpLCBwcm9qZWN0UGtnRGlyKTtcblx0XHRcdGNvbnN0IGV4cGVjdGVkID0gcmVsLnN0YXJ0c1dpdGgoXCIuXCIpID8gcmVsIDogYC4vJHtyZWx9YDtcblx0XHRcdGV4cGVjdChzZXR0aW5ncy5wYWNrYWdlcz8uWzBdKS50b0JlKGV4cGVjdGVkKTtcblx0XHR9KTtcblxuXHRcdGl0KFwic2hvdWxkIHJlbW92ZSBsb2NhbCBwYWNrYWdlIGVudHJpZXMgdXNpbmcgZXF1aXZhbGVudCBwYXRoIGZvcm1zXCIsICgpID0+IHtcblx0XHRcdGNvbnN0IHBrZ0RpciA9IGpvaW4odGVtcERpciwgXCJyZW1vdmUtbG9jYWwtcGtnXCIpO1xuXHRcdFx0bWtkaXJTeW5jKGpvaW4ocGtnRGlyLCBcImV4dGVuc2lvbnNcIiksIHsgcmVjdXJzaXZlOiB0cnVlIH0pO1xuXHRcdFx0d3JpdGVGaWxlU3luYyhqb2luKHBrZ0RpciwgXCJleHRlbnNpb25zXCIsIFwiaW5kZXgudHNcIiksIFwiZXhwb3J0IGRlZmF1bHQgZnVuY3Rpb24oKSB7fVwiKTtcblxuXHRcdFx0cGFja2FnZU1hbmFnZXIuYWRkU291cmNlVG9TZXR0aW5ncyhcIi4vcmVtb3ZlLWxvY2FsLXBrZ1wiKTtcblx0XHRcdGNvbnN0IHJlbW92ZWQgPSBwYWNrYWdlTWFuYWdlci5yZW1vdmVTb3VyY2VGcm9tU2V0dGluZ3MoYCR7cGtnRGlyfS9gKTtcblx0XHRcdGV4cGVjdChyZW1vdmVkKS50b0JlKHRydWUpO1xuXHRcdFx0ZXhwZWN0KHNldHRpbmdzTWFuYWdlci5nZXRHbG9iYWxTZXR0aW5ncygpLnBhY2thZ2VzID8/IFtdKS50b0hhdmVMZW5ndGgoMCk7XG5cdFx0fSk7XG5cdH0pO1xuXG5cdGRlc2NyaWJlKFwiSFRUUFMgZ2l0IFVSTCBwYXJzaW5nIChvbGQgYmVoYXZpb3IpXCIsICgpID0+IHtcblx0XHRpdChcInNob3VsZCBwYXJzZSBIVFRQUyBHaXRIdWIgVVJMcyBjb3JyZWN0bHlcIiwgYXN5bmMgKCkgPT4ge1xuXHRcdFx0Y29uc3QgcGFyc2VkID0gKHBhY2thZ2VNYW5hZ2VyIGFzIGFueSkucGFyc2VTb3VyY2UoXCJodHRwczovL2dpdGh1Yi5jb20vdXNlci9yZXBvXCIpO1xuXHRcdFx0ZXhwZWN0KHBhcnNlZC50eXBlKS50b0JlKFwiZ2l0XCIpO1xuXHRcdFx0ZXhwZWN0KHBhcnNlZC5ob3N0KS50b0JlKFwiZ2l0aHViLmNvbVwiKTtcblx0XHRcdGV4cGVjdChwYXJzZWQucGF0aCkudG9CZShcInVzZXIvcmVwb1wiKTtcblx0XHRcdGV4cGVjdChwYXJzZWQucGlubmVkKS50b0JlKGZhbHNlKTtcblx0XHR9KTtcblxuXHRcdGl0KFwic2hvdWxkIHBhcnNlIEhUVFBTIFVSTHMgd2l0aCBnaXQ6IHByZWZpeFwiLCBhc3luYyAoKSA9PiB7XG5cdFx0XHRjb25zdCBwYXJzZWQgPSAocGFja2FnZU1hbmFnZXIgYXMgYW55KS5wYXJzZVNvdXJjZShcImdpdDpodHRwczovL2dpdGh1Yi5jb20vdXNlci9yZXBvXCIpO1xuXHRcdFx0ZXhwZWN0KHBhcnNlZC50eXBlKS50b0JlKFwiZ2l0XCIpO1xuXHRcdFx0ZXhwZWN0KHBhcnNlZC5ob3N0KS50b0JlKFwiZ2l0aHViLmNvbVwiKTtcblx0XHRcdGV4cGVjdChwYXJzZWQucGF0aCkudG9CZShcInVzZXIvcmVwb1wiKTtcblx0XHR9KTtcblxuXHRcdGl0KFwic2hvdWxkIHBhcnNlIEhUVFBTIFVSTHMgd2l0aCByZWZcIiwgYXN5bmMgKCkgPT4ge1xuXHRcdFx0Y29uc3QgcGFyc2VkID0gKHBhY2thZ2VNYW5hZ2VyIGFzIGFueSkucGFyc2VTb3VyY2UoXCJodHRwczovL2dpdGh1Yi5jb20vdXNlci9yZXBvQHYxLjIuM1wiKTtcblx0XHRcdGV4cGVjdChwYXJzZWQudHlwZSkudG9CZShcImdpdFwiKTtcblx0XHRcdGV4cGVjdChwYXJzZWQuaG9zdCkudG9CZShcImdpdGh1Yi5jb21cIik7XG5cdFx0XHRleHBlY3QocGFyc2VkLnBhdGgpLnRvQmUoXCJ1c2VyL3JlcG9cIik7XG5cdFx0XHRleHBlY3QocGFyc2VkLnJlZikudG9CZShcInYxLjIuM1wiKTtcblx0XHRcdGV4cGVjdChwYXJzZWQucGlubmVkKS50b0JlKHRydWUpO1xuXHRcdH0pO1xuXG5cdFx0aXQoXCJzaG91bGQgcGFyc2UgaG9zdC9wYXRoIHNob3J0aGFuZCBvbmx5IHdpdGggZ2l0OiBwcmVmaXhcIiwgYXN5bmMgKCkgPT4ge1xuXHRcdFx0Y29uc3QgcGFyc2VkID0gKHBhY2thZ2VNYW5hZ2VyIGFzIGFueSkucGFyc2VTb3VyY2UoXCJnaXQ6Z2l0aHViLmNvbS91c2VyL3JlcG9cIik7XG5cdFx0XHRleHBlY3QocGFyc2VkLnR5cGUpLnRvQmUoXCJnaXRcIik7XG5cdFx0XHRleHBlY3QocGFyc2VkLmhvc3QpLnRvQmUoXCJnaXRodWIuY29tXCIpO1xuXHRcdFx0ZXhwZWN0KHBhcnNlZC5wYXRoKS50b0JlKFwidXNlci9yZXBvXCIpO1xuXHRcdH0pO1xuXG5cdFx0aXQoXCJzaG91bGQgdHJlYXQgaG9zdC9wYXRoIHNob3J0aGFuZCBhcyBsb2NhbCB3aXRob3V0IGdpdDogcHJlZml4XCIsIGFzeW5jICgpID0+IHtcblx0XHRcdGNvbnN0IHBhcnNlZCA9IChwYWNrYWdlTWFuYWdlciBhcyBhbnkpLnBhcnNlU291cmNlKFwiZ2l0aHViLmNvbS91c2VyL3JlcG9cIik7XG5cdFx0XHRleHBlY3QocGFyc2VkLnR5cGUpLnRvQmUoXCJsb2NhbFwiKTtcblx0XHR9KTtcblxuXHRcdGl0KFwic2hvdWxkIHBhcnNlIEhUVFBTIFVSTHMgd2l0aCAuZ2l0IHN1ZmZpeFwiLCBhc3luYyAoKSA9PiB7XG5cdFx0XHRjb25zdCBwYXJzZWQgPSAocGFja2FnZU1hbmFnZXIgYXMgYW55KS5wYXJzZVNvdXJjZShcImh0dHBzOi8vZ2l0aHViLmNvbS91c2VyL3JlcG8uZ2l0XCIpO1xuXHRcdFx0ZXhwZWN0KHBhcnNlZC50eXBlKS50b0JlKFwiZ2l0XCIpO1xuXHRcdFx0ZXhwZWN0KHBhcnNlZC5ob3N0KS50b0JlKFwiZ2l0aHViLmNvbVwiKTtcblx0XHRcdGV4cGVjdChwYXJzZWQucGF0aCkudG9CZShcInVzZXIvcmVwb1wiKTtcblx0XHR9KTtcblxuXHRcdGl0KFwic2hvdWxkIHBhcnNlIEdpdExhYiBIVFRQUyBVUkxzXCIsIGFzeW5jICgpID0+IHtcblx0XHRcdGNvbnN0IHBhcnNlZCA9IChwYWNrYWdlTWFuYWdlciBhcyBhbnkpLnBhcnNlU291cmNlKFwiaHR0cHM6Ly9naXRsYWIuY29tL3VzZXIvcmVwb1wiKTtcblx0XHRcdGV4cGVjdChwYXJzZWQudHlwZSkudG9CZShcImdpdFwiKTtcblx0XHRcdGV4cGVjdChwYXJzZWQuaG9zdCkudG9CZShcImdpdGxhYi5jb21cIik7XG5cdFx0XHRleHBlY3QocGFyc2VkLnBhdGgpLnRvQmUoXCJ1c2VyL3JlcG9cIik7XG5cdFx0fSk7XG5cblx0XHRpdChcInNob3VsZCBwYXJzZSBCaXRidWNrZXQgSFRUUFMgVVJMc1wiLCBhc3luYyAoKSA9PiB7XG5cdFx0XHRjb25zdCBwYXJzZWQgPSAocGFja2FnZU1hbmFnZXIgYXMgYW55KS5wYXJzZVNvdXJjZShcImh0dHBzOi8vYml0YnVja2V0Lm9yZy91c2VyL3JlcG9cIik7XG5cdFx0XHRleHBlY3QocGFyc2VkLnR5cGUpLnRvQmUoXCJnaXRcIik7XG5cdFx0XHRleHBlY3QocGFyc2VkLmhvc3QpLnRvQmUoXCJiaXRidWNrZXQub3JnXCIpO1xuXHRcdFx0ZXhwZWN0KHBhcnNlZC5wYXRoKS50b0JlKFwidXNlci9yZXBvXCIpO1xuXHRcdH0pO1xuXG5cdFx0aXQoXCJzaG91bGQgcGFyc2UgQ29kZWJlcmcgSFRUUFMgVVJMc1wiLCBhc3luYyAoKSA9PiB7XG5cdFx0XHRjb25zdCBwYXJzZWQgPSAocGFja2FnZU1hbmFnZXIgYXMgYW55KS5wYXJzZVNvdXJjZShcImh0dHBzOi8vY29kZWJlcmcub3JnL3VzZXIvcmVwb1wiKTtcblx0XHRcdGV4cGVjdChwYXJzZWQudHlwZSkudG9CZShcImdpdFwiKTtcblx0XHRcdGV4cGVjdChwYXJzZWQuaG9zdCkudG9CZShcImNvZGViZXJnLm9yZ1wiKTtcblx0XHRcdGV4cGVjdChwYXJzZWQucGF0aCkudG9CZShcInVzZXIvcmVwb1wiKTtcblx0XHR9KTtcblxuXHRcdGl0KFwic2hvdWxkIGdlbmVyYXRlIGNvcnJlY3QgcGFja2FnZSBpZGVudGl0eSBmb3IgcHJvdG9jb2wgYW5kIGdpdDotcHJlZml4ZWQgVVJMc1wiLCBhc3luYyAoKSA9PiB7XG5cdFx0XHRjb25zdCBpZGVudGl0eTEgPSAocGFja2FnZU1hbmFnZXIgYXMgYW55KS5nZXRQYWNrYWdlSWRlbnRpdHkoXCJodHRwczovL2dpdGh1Yi5jb20vdXNlci9yZXBvXCIpO1xuXHRcdFx0Y29uc3QgaWRlbnRpdHkyID0gKHBhY2thZ2VNYW5hZ2VyIGFzIGFueSkuZ2V0UGFja2FnZUlkZW50aXR5KFwiaHR0cHM6Ly9naXRodWIuY29tL3VzZXIvcmVwb0B2MS4wLjBcIik7XG5cdFx0XHRjb25zdCBpZGVudGl0eTMgPSAocGFja2FnZU1hbmFnZXIgYXMgYW55KS5nZXRQYWNrYWdlSWRlbnRpdHkoXCJnaXQ6Z2l0aHViLmNvbS91c2VyL3JlcG9cIik7XG5cdFx0XHRjb25zdCBpZGVudGl0eTQgPSAocGFja2FnZU1hbmFnZXIgYXMgYW55KS5nZXRQYWNrYWdlSWRlbnRpdHkoXCJodHRwczovL2dpdGh1Yi5jb20vdXNlci9yZXBvLmdpdFwiKTtcblxuXHRcdFx0Ly8gQWxsIHNob3VsZCBoYXZlIHRoZSBzYW1lIGlkZW50aXR5IChub3JtYWxpemVkKVxuXHRcdFx0ZXhwZWN0KGlkZW50aXR5MSkudG9CZShcImdpdDpnaXRodWIuY29tL3VzZXIvcmVwb1wiKTtcblx0XHRcdGV4cGVjdChpZGVudGl0eTIpLnRvQmUoXCJnaXQ6Z2l0aHViLmNvbS91c2VyL3JlcG9cIik7XG5cdFx0XHRleHBlY3QoaWRlbnRpdHkzKS50b0JlKFwiZ2l0OmdpdGh1Yi5jb20vdXNlci9yZXBvXCIpO1xuXHRcdFx0ZXhwZWN0KGlkZW50aXR5NCkudG9CZShcImdpdDpnaXRodWIuY29tL3VzZXIvcmVwb1wiKTtcblx0XHR9KTtcblxuXHRcdGl0KFwic2hvdWxkIGRlZHVwbGljYXRlIGdpdCBVUkxzIHdpdGggZGlmZmVyZW50IHN1cHBvcnRlZCBmb3JtYXRzXCIsIGFzeW5jICgpID0+IHtcblx0XHRcdGNvbnN0IHBrZ0RpciA9IGpvaW4odGVtcERpciwgXCJodHRwcy1kZWR1cC1wa2dcIik7XG5cdFx0XHRta2RpclN5bmMoam9pbihwa2dEaXIsIFwiZXh0ZW5zaW9uc1wiKSwgeyByZWN1cnNpdmU6IHRydWUgfSk7XG5cdFx0XHR3cml0ZUZpbGVTeW5jKGpvaW4ocGtnRGlyLCBcImV4dGVuc2lvbnNcIiwgXCJ0ZXN0LnRzXCIpLCBcImV4cG9ydCBkZWZhdWx0IGZ1bmN0aW9uKCkge31cIik7XG5cblx0XHRcdC8vIE1vY2sgdGhlIHBhY2thZ2UgYXMgaWYgaXQgd2VyZSBjbG9uZWQgZnJvbSBkaWZmZXJlbnQgVVJMIGZvcm1hdHNcblx0XHRcdC8vIEluIHJlYWxpdHksIHRoZXNlIHdvdWxkIGFsbCBwb2ludCB0byB0aGUgc2FtZSBsb2NhbCBkaXIgYWZ0ZXIgaW5zdGFsbFxuXHRcdFx0c2V0dGluZ3NNYW5hZ2VyLnNldFBhY2thZ2VzKFtcblx0XHRcdFx0XCJodHRwczovL2dpdGh1Yi5jb20vdXNlci9yZXBvXCIsXG5cdFx0XHRcdFwiZ2l0OmdpdGh1Yi5jb20vdXNlci9yZXBvXCIsXG5cdFx0XHRcdFwiaHR0cHM6Ly9naXRodWIuY29tL3VzZXIvcmVwby5naXRcIixcblx0XHRcdF0pO1xuXG5cdFx0XHQvLyBTaW5jZSB0aGVzZSBVUkxzIGRvbid0IGFjdHVhbGx5IGV4aXN0IGFuZCB3ZSBjYW4ndCBjbG9uZSB0aGVtLFxuXHRcdFx0Ly8gd2UgdmVyaWZ5IHRoZXkgcHJvZHVjZSB0aGUgc2FtZSBpZGVudGl0eVxuXHRcdFx0Y29uc3QgaWQxID0gKHBhY2thZ2VNYW5hZ2VyIGFzIGFueSkuZ2V0UGFja2FnZUlkZW50aXR5KFwiaHR0cHM6Ly9naXRodWIuY29tL3VzZXIvcmVwb1wiKTtcblx0XHRcdGNvbnN0IGlkMiA9IChwYWNrYWdlTWFuYWdlciBhcyBhbnkpLmdldFBhY2thZ2VJZGVudGl0eShcImdpdDpnaXRodWIuY29tL3VzZXIvcmVwb1wiKTtcblx0XHRcdGNvbnN0IGlkMyA9IChwYWNrYWdlTWFuYWdlciBhcyBhbnkpLmdldFBhY2thZ2VJZGVudGl0eShcImh0dHBzOi8vZ2l0aHViLmNvbS91c2VyL3JlcG8uZ2l0XCIpO1xuXG5cdFx0XHRleHBlY3QoaWQxKS50b0JlKGlkMik7XG5cdFx0XHRleHBlY3QoaWQyKS50b0JlKGlkMyk7XG5cdFx0fSk7XG5cblx0XHRpdChcInNob3VsZCBoYW5kbGUgSFRUUFMgVVJMcyB3aXRoIHJlZnMgaW4gcmVzb2x2ZVwiLCBhc3luYyAoKSA9PiB7XG5cdFx0XHQvLyBUaGlzIHRlc3RzIHRoYXQgdGhlIHJlZiBpcyBwcm9wZXJseSBleHRyYWN0ZWQgYW5kIHN0b3JlZFxuXHRcdFx0Y29uc3QgcGFyc2VkID0gKHBhY2thZ2VNYW5hZ2VyIGFzIGFueSkucGFyc2VTb3VyY2UoXCJodHRwczovL2dpdGh1Yi5jb20vdXNlci9yZXBvQG1haW5cIik7XG5cdFx0XHRleHBlY3QocGFyc2VkLnJlZikudG9CZShcIm1haW5cIik7XG5cdFx0XHRleHBlY3QocGFyc2VkLnBpbm5lZCkudG9CZSh0cnVlKTtcblxuXHRcdFx0Y29uc3QgcGFyc2VkMiA9IChwYWNrYWdlTWFuYWdlciBhcyBhbnkpLnBhcnNlU291cmNlKFwiaHR0cHM6Ly9naXRodWIuY29tL3VzZXIvcmVwb0BmZWF0dXJlL2JyYW5jaFwiKTtcblx0XHRcdGV4cGVjdChwYXJzZWQyLnJlZikudG9CZShcImZlYXR1cmUvYnJhbmNoXCIpO1xuXHRcdH0pO1xuXHR9KTtcblxuXHRkZXNjcmliZShcInBhdHRlcm4gZmlsdGVyaW5nIGluIHRvcC1sZXZlbCBhcnJheXNcIiwgKCkgPT4ge1xuXHRcdGl0KFwic2hvdWxkIGV4Y2x1ZGUgZXh0ZW5zaW9ucyB3aXRoICEgcGF0dGVyblwiLCBhc3luYyAoKSA9PiB7XG5cdFx0XHRjb25zdCBleHREaXIgPSBqb2luKGFnZW50RGlyLCBcImV4dGVuc2lvbnNcIik7XG5cdFx0XHRta2RpclN5bmMoZXh0RGlyLCB7IHJlY3Vyc2l2ZTogdHJ1ZSB9KTtcblx0XHRcdHdyaXRlRmlsZVN5bmMoam9pbihleHREaXIsIFwia2VlcC50c1wiKSwgXCJleHBvcnQgZGVmYXVsdCBmdW5jdGlvbigpIHt9XCIpO1xuXHRcdFx0d3JpdGVGaWxlU3luYyhqb2luKGV4dERpciwgXCJyZW1vdmUudHNcIiksIFwiZXhwb3J0IGRlZmF1bHQgZnVuY3Rpb24oKSB7fVwiKTtcblxuXHRcdFx0c2V0dGluZ3NNYW5hZ2VyLnNldEV4dGVuc2lvblBhdGhzKFtcImV4dGVuc2lvbnNcIiwgXCIhKiovcmVtb3ZlLnRzXCJdKTtcblxuXHRcdFx0Y29uc3QgcmVzdWx0ID0gYXdhaXQgcGFja2FnZU1hbmFnZXIucmVzb2x2ZSgpO1xuXHRcdFx0ZXhwZWN0KHJlc3VsdC5leHRlbnNpb25zLnNvbWUoKHIpID0+IGlzRW5hYmxlZChyLCBcImtlZXAudHNcIikpKS50b0JlKHRydWUpO1xuXHRcdFx0ZXhwZWN0KHJlc3VsdC5leHRlbnNpb25zLnNvbWUoKHIpID0+IGlzRGlzYWJsZWQociwgXCJyZW1vdmUudHNcIikpKS50b0JlKHRydWUpO1xuXHRcdH0pO1xuXG5cdFx0aXQoXCJzaG91bGQgZmlsdGVyIHRoZW1lcyB3aXRoIGdsb2IgcGF0dGVybnNcIiwgYXN5bmMgKCkgPT4ge1xuXHRcdFx0Y29uc3QgdGhlbWVzRGlyID0gam9pbihhZ2VudERpciwgXCJ0aGVtZXNcIik7XG5cdFx0XHRta2RpclN5bmModGhlbWVzRGlyLCB7IHJlY3Vyc2l2ZTogdHJ1ZSB9KTtcblx0XHRcdHdyaXRlRmlsZVN5bmMoam9pbih0aGVtZXNEaXIsIFwiZGFyay5qc29uXCIpLCBcInt9XCIpO1xuXHRcdFx0d3JpdGVGaWxlU3luYyhqb2luKHRoZW1lc0RpciwgXCJsaWdodC5qc29uXCIpLCBcInt9XCIpO1xuXHRcdFx0d3JpdGVGaWxlU3luYyhqb2luKHRoZW1lc0RpciwgXCJmdW5reS5qc29uXCIpLCBcInt9XCIpO1xuXG5cdFx0XHRzZXR0aW5nc01hbmFnZXIuc2V0VGhlbWVQYXRocyhbXCJ0aGVtZXNcIiwgXCIhZnVua3kuanNvblwiXSk7XG5cblx0XHRcdGNvbnN0IHJlc3VsdCA9IGF3YWl0IHBhY2thZ2VNYW5hZ2VyLnJlc29sdmUoKTtcblx0XHRcdGV4cGVjdChyZXN1bHQudGhlbWVzLnNvbWUoKHIpID0+IGlzRW5hYmxlZChyLCBcImRhcmsuanNvblwiKSkpLnRvQmUodHJ1ZSk7XG5cdFx0XHRleHBlY3QocmVzdWx0LnRoZW1lcy5zb21lKChyKSA9PiBpc0VuYWJsZWQociwgXCJsaWdodC5qc29uXCIpKSkudG9CZSh0cnVlKTtcblx0XHRcdGV4cGVjdChyZXN1bHQudGhlbWVzLnNvbWUoKHIpID0+IGlzRGlzYWJsZWQociwgXCJmdW5reS5qc29uXCIpKSkudG9CZSh0cnVlKTtcblx0XHR9KTtcblxuXHRcdGl0KFwic2hvdWxkIGZpbHRlciBwcm9tcHRzIHdpdGggZXhjbHVzaW9uIHBhdHRlcm5cIiwgYXN5bmMgKCkgPT4ge1xuXHRcdFx0Y29uc3QgcHJvbXB0c0RpciA9IGpvaW4oYWdlbnREaXIsIFwicHJvbXB0c1wiKTtcblx0XHRcdG1rZGlyU3luYyhwcm9tcHRzRGlyLCB7IHJlY3Vyc2l2ZTogdHJ1ZSB9KTtcblx0XHRcdHdyaXRlRmlsZVN5bmMoam9pbihwcm9tcHRzRGlyLCBcInJldmlldy5tZFwiKSwgXCJSZXZpZXcgY29kZVwiKTtcblx0XHRcdHdyaXRlRmlsZVN5bmMoam9pbihwcm9tcHRzRGlyLCBcImV4cGxhaW4ubWRcIiksIFwiRXhwbGFpbiBjb2RlXCIpO1xuXG5cdFx0XHRzZXR0aW5nc01hbmFnZXIuc2V0UHJvbXB0VGVtcGxhdGVQYXRocyhbXCJwcm9tcHRzXCIsIFwiIWV4cGxhaW4ubWRcIl0pO1xuXG5cdFx0XHRjb25zdCByZXN1bHQgPSBhd2FpdCBwYWNrYWdlTWFuYWdlci5yZXNvbHZlKCk7XG5cdFx0XHRleHBlY3QocmVzdWx0LnByb21wdHMuc29tZSgocikgPT4gaXNFbmFibGVkKHIsIFwicmV2aWV3Lm1kXCIpKSkudG9CZSh0cnVlKTtcblx0XHRcdGV4cGVjdChyZXN1bHQucHJvbXB0cy5zb21lKChyKSA9PiBpc0Rpc2FibGVkKHIsIFwiZXhwbGFpbi5tZFwiKSkpLnRvQmUodHJ1ZSk7XG5cdFx0fSk7XG5cblx0XHRpdChcInNob3VsZCBmaWx0ZXIgc2tpbGxzIHdpdGggZXhjbHVzaW9uIHBhdHRlcm5cIiwgYXN5bmMgKCkgPT4ge1xuXHRcdFx0Y29uc3Qgc2tpbGxzRGlyID0gam9pbihhZ2VudERpciwgXCJza2lsbHNcIik7XG5cdFx0XHRta2RpclN5bmMoam9pbihza2lsbHNEaXIsIFwiZ29vZC1za2lsbFwiKSwgeyByZWN1cnNpdmU6IHRydWUgfSk7XG5cdFx0XHRta2RpclN5bmMoam9pbihza2lsbHNEaXIsIFwiYmFkLXNraWxsXCIpLCB7IHJlY3Vyc2l2ZTogdHJ1ZSB9KTtcblx0XHRcdHdyaXRlRmlsZVN5bmMoXG5cdFx0XHRcdGpvaW4oc2tpbGxzRGlyLCBcImdvb2Qtc2tpbGxcIiwgXCJTS0lMTC5tZFwiKSxcblx0XHRcdFx0XCItLS1cXG5uYW1lOiBnb29kLXNraWxsXFxuZGVzY3JpcHRpb246IEdvb2RcXG4tLS1cXG5Db250ZW50XCIsXG5cdFx0XHQpO1xuXHRcdFx0d3JpdGVGaWxlU3luYyhcblx0XHRcdFx0am9pbihza2lsbHNEaXIsIFwiYmFkLXNraWxsXCIsIFwiU0tJTEwubWRcIiksXG5cdFx0XHRcdFwiLS0tXFxubmFtZTogYmFkLXNraWxsXFxuZGVzY3JpcHRpb246IEJhZFxcbi0tLVxcbkNvbnRlbnRcIixcblx0XHRcdCk7XG5cblx0XHRcdHNldHRpbmdzTWFuYWdlci5zZXRTa2lsbFBhdGhzKFtcInNraWxsc1wiLCBcIiEqKi9iYWQtc2tpbGxcIl0pO1xuXG5cdFx0XHRjb25zdCByZXN1bHQgPSBhd2FpdCBwYWNrYWdlTWFuYWdlci5yZXNvbHZlKCk7XG5cdFx0XHRleHBlY3QocmVzdWx0LnNraWxscy5zb21lKChyKSA9PiBpc0VuYWJsZWQociwgXCJnb29kLXNraWxsXCIsIFwiaW5jbHVkZXNcIikpKS50b0JlKHRydWUpO1xuXHRcdFx0ZXhwZWN0KHJlc3VsdC5za2lsbHMuc29tZSgocikgPT4gaXNEaXNhYmxlZChyLCBcImJhZC1za2lsbFwiLCBcImluY2x1ZGVzXCIpKSkudG9CZSh0cnVlKTtcblx0XHR9KTtcblxuXHRcdGl0KFwic2hvdWxkIHdvcmsgd2l0aG91dCBwYXR0ZXJucyAoYmFja3dhcmQgY29tcGF0aWJsZSlcIiwgYXN5bmMgKCkgPT4ge1xuXHRcdFx0Y29uc3QgZXh0RGlyID0gam9pbihhZ2VudERpciwgXCJleHRlbnNpb25zXCIpO1xuXHRcdFx0bWtkaXJTeW5jKGV4dERpciwgeyByZWN1cnNpdmU6IHRydWUgfSk7XG5cdFx0XHRjb25zdCBleHRQYXRoID0gam9pbihleHREaXIsIFwibXktZXh0LnRzXCIpO1xuXHRcdFx0d3JpdGVGaWxlU3luYyhleHRQYXRoLCBcImV4cG9ydCBkZWZhdWx0IGZ1bmN0aW9uKCkge31cIik7XG5cblx0XHRcdHNldHRpbmdzTWFuYWdlci5zZXRFeHRlbnNpb25QYXRocyhbXCJleHRlbnNpb25zL215LWV4dC50c1wiXSk7XG5cblx0XHRcdGNvbnN0IHJlc3VsdCA9IGF3YWl0IHBhY2thZ2VNYW5hZ2VyLnJlc29sdmUoKTtcblx0XHRcdGV4cGVjdChyZXN1bHQuZXh0ZW5zaW9ucy5zb21lKChyKSA9PiByLnBhdGggPT09IGV4dFBhdGggJiYgci5lbmFibGVkKSkudG9CZSh0cnVlKTtcblx0XHR9KTtcblx0fSk7XG5cblx0ZGVzY3JpYmUoXCJwYXR0ZXJuIGZpbHRlcmluZyBpbiBwaSBtYW5pZmVzdFwiLCAoKSA9PiB7XG5cdFx0aXQoXCJzaG91bGQgc3VwcG9ydCBnbG9iIHBhdHRlcm5zIGluIG1hbmlmZXN0IGV4dGVuc2lvbnNcIiwgYXN5bmMgKCkgPT4ge1xuXHRcdFx0Y29uc3QgcGtnRGlyID0gam9pbih0ZW1wRGlyLCBcIm1hbmlmZXN0LXBrZ1wiKTtcblx0XHRcdG1rZGlyU3luYyhqb2luKHBrZ0RpciwgXCJleHRlbnNpb25zXCIpLCB7IHJlY3Vyc2l2ZTogdHJ1ZSB9KTtcblx0XHRcdG1rZGlyU3luYyhqb2luKHBrZ0RpciwgXCJub2RlX21vZHVsZXMvZGVwL2V4dGVuc2lvbnNcIiksIHsgcmVjdXJzaXZlOiB0cnVlIH0pO1xuXHRcdFx0d3JpdGVGaWxlU3luYyhqb2luKHBrZ0RpciwgXCJleHRlbnNpb25zXCIsIFwibG9jYWwudHNcIiksIFwiZXhwb3J0IGRlZmF1bHQgZnVuY3Rpb24oKSB7fVwiKTtcblx0XHRcdHdyaXRlRmlsZVN5bmMoam9pbihwa2dEaXIsIFwibm9kZV9tb2R1bGVzL2RlcC9leHRlbnNpb25zXCIsIFwicmVtb3RlLnRzXCIpLCBcImV4cG9ydCBkZWZhdWx0IGZ1bmN0aW9uKCkge31cIik7XG5cdFx0XHR3cml0ZUZpbGVTeW5jKGpvaW4ocGtnRGlyLCBcIm5vZGVfbW9kdWxlcy9kZXAvZXh0ZW5zaW9uc1wiLCBcInNraXAudHNcIiksIFwiZXhwb3J0IGRlZmF1bHQgZnVuY3Rpb24oKSB7fVwiKTtcblx0XHRcdHdyaXRlRmlsZVN5bmMoXG5cdFx0XHRcdGpvaW4ocGtnRGlyLCBcInBhY2thZ2UuanNvblwiKSxcblx0XHRcdFx0SlNPTi5zdHJpbmdpZnkoe1xuXHRcdFx0XHRcdG5hbWU6IFwibWFuaWZlc3QtcGtnXCIsXG5cdFx0XHRcdFx0cGk6IHtcblx0XHRcdFx0XHRcdGV4dGVuc2lvbnM6IFtcImV4dGVuc2lvbnNcIiwgXCJub2RlX21vZHVsZXMvZGVwL2V4dGVuc2lvbnNcIiwgXCIhKiovc2tpcC50c1wiXSxcblx0XHRcdFx0XHR9LFxuXHRcdFx0XHR9KSxcblx0XHRcdCk7XG5cblx0XHRcdGNvbnN0IHJlc3VsdCA9IGF3YWl0IHBhY2thZ2VNYW5hZ2VyLnJlc29sdmVFeHRlbnNpb25Tb3VyY2VzKFtwa2dEaXJdKTtcblx0XHRcdGV4cGVjdChyZXN1bHQuZXh0ZW5zaW9ucy5zb21lKChyKSA9PiBpc0VuYWJsZWQociwgXCJsb2NhbC50c1wiKSkpLnRvQmUodHJ1ZSk7XG5cdFx0XHRleHBlY3QocmVzdWx0LmV4dGVuc2lvbnMuc29tZSgocikgPT4gaXNFbmFibGVkKHIsIFwicmVtb3RlLnRzXCIpKSkudG9CZSh0cnVlKTtcblx0XHRcdGV4cGVjdChyZXN1bHQuZXh0ZW5zaW9ucy5zb21lKChyKSA9PiBwYXRoRW5kc1dpdGgoci5wYXRoLCBcInNraXAudHNcIikpKS50b0JlKGZhbHNlKTtcblx0XHR9KTtcblxuXHRcdGl0KFwic2hvdWxkIHN1cHBvcnQgZ2xvYiBwYXR0ZXJucyBpbiBtYW5pZmVzdCBza2lsbHNcIiwgYXN5bmMgKCkgPT4ge1xuXHRcdFx0Y29uc3QgcGtnRGlyID0gam9pbih0ZW1wRGlyLCBcInNraWxsLW1hbmlmZXN0LXBrZ1wiKTtcblx0XHRcdG1rZGlyU3luYyhqb2luKHBrZ0RpciwgXCJza2lsbHMvZ29vZC1za2lsbFwiKSwgeyByZWN1cnNpdmU6IHRydWUgfSk7XG5cdFx0XHRta2RpclN5bmMoam9pbihwa2dEaXIsIFwic2tpbGxzL2JhZC1za2lsbFwiKSwgeyByZWN1cnNpdmU6IHRydWUgfSk7XG5cdFx0XHR3cml0ZUZpbGVTeW5jKFxuXHRcdFx0XHRqb2luKHBrZ0RpciwgXCJza2lsbHMvZ29vZC1za2lsbFwiLCBcIlNLSUxMLm1kXCIpLFxuXHRcdFx0XHRcIi0tLVxcbm5hbWU6IGdvb2Qtc2tpbGxcXG5kZXNjcmlwdGlvbjogR29vZFxcbi0tLVxcbkNvbnRlbnRcIixcblx0XHRcdCk7XG5cdFx0XHR3cml0ZUZpbGVTeW5jKFxuXHRcdFx0XHRqb2luKHBrZ0RpciwgXCJza2lsbHMvYmFkLXNraWxsXCIsIFwiU0tJTEwubWRcIiksXG5cdFx0XHRcdFwiLS0tXFxubmFtZTogYmFkLXNraWxsXFxuZGVzY3JpcHRpb246IEJhZFxcbi0tLVxcbkNvbnRlbnRcIixcblx0XHRcdCk7XG5cdFx0XHR3cml0ZUZpbGVTeW5jKFxuXHRcdFx0XHRqb2luKHBrZ0RpciwgXCJwYWNrYWdlLmpzb25cIiksXG5cdFx0XHRcdEpTT04uc3RyaW5naWZ5KHtcblx0XHRcdFx0XHRuYW1lOiBcInNraWxsLW1hbmlmZXN0LXBrZ1wiLFxuXHRcdFx0XHRcdHBpOiB7XG5cdFx0XHRcdFx0XHRza2lsbHM6IFtcInNraWxsc1wiLCBcIiEqKi9iYWQtc2tpbGxcIl0sXG5cdFx0XHRcdFx0fSxcblx0XHRcdFx0fSksXG5cdFx0XHQpO1xuXG5cdFx0XHRjb25zdCByZXN1bHQgPSBhd2FpdCBwYWNrYWdlTWFuYWdlci5yZXNvbHZlRXh0ZW5zaW9uU291cmNlcyhbcGtnRGlyXSk7XG5cdFx0XHRleHBlY3QocmVzdWx0LnNraWxscy5zb21lKChyKSA9PiBpc0VuYWJsZWQociwgXCJnb29kLXNraWxsXCIsIFwiaW5jbHVkZXNcIikpKS50b0JlKHRydWUpO1xuXHRcdFx0ZXhwZWN0KHJlc3VsdC5za2lsbHMuc29tZSgocikgPT4gci5wYXRoLmluY2x1ZGVzKFwiYmFkLXNraWxsXCIpKSkudG9CZShmYWxzZSk7XG5cdFx0fSk7XG5cblx0XHRpdChcInNob3VsZCBleHBhbmQgcG9zaXRpdmUgZ2xvYiBtYW5pZmVzdCBlbnRyaWVzIGJlZm9yZSBjb2xsZWN0aW5nIHNraWxsc1wiLCBhc3luYyAoKSA9PiB7XG5cdFx0XHRjb25zdCBwa2dEaXIgPSBqb2luKHRlbXBEaXIsIFwic2tpbGwtbWFuaWZlc3QtZ2xvYi1wa2dcIik7XG5cdFx0XHRta2RpclN5bmMoam9pbihwa2dEaXIsIFwicGx1Z2lucy9wZGYtdG8tbWFya2Rvd24vc2tpbGxzL3BkZi10by1tYXJrZG93blwiKSwgeyByZWN1cnNpdmU6IHRydWUgfSk7XG5cdFx0XHRta2RpclN5bmMoam9pbihwa2dEaXIsIFwicGx1Z2lucy9udXRyaWVudC1kd3Mvc2tpbGxzL2RvY3VtZW50LXByb2Nlc3Nvci1hcGlcIiksIHsgcmVjdXJzaXZlOiB0cnVlIH0pO1xuXHRcdFx0d3JpdGVGaWxlU3luYyhcblx0XHRcdFx0am9pbihwa2dEaXIsIFwicGx1Z2lucy9wZGYtdG8tbWFya2Rvd24vc2tpbGxzL3BkZi10by1tYXJrZG93blwiLCBcIlNLSUxMLm1kXCIpLFxuXHRcdFx0XHRcIi0tLVxcbm5hbWU6IHBkZi10by1tYXJrZG93blxcbmRlc2NyaXB0aW9uOiBQREYgdG8gTWFya2Rvd25cXG4tLS1cXG5Db250ZW50XCIsXG5cdFx0XHQpO1xuXHRcdFx0d3JpdGVGaWxlU3luYyhcblx0XHRcdFx0am9pbihwa2dEaXIsIFwicGx1Z2lucy9udXRyaWVudC1kd3Mvc2tpbGxzL2RvY3VtZW50LXByb2Nlc3Nvci1hcGlcIiwgXCJTS0lMTC5tZFwiKSxcblx0XHRcdFx0XCItLS1cXG5uYW1lOiBkb2N1bWVudC1wcm9jZXNzb3ItYXBpXFxuZGVzY3JpcHRpb246IERXU1xcbi0tLVxcbkNvbnRlbnRcIixcblx0XHRcdCk7XG5cdFx0XHR3cml0ZUZpbGVTeW5jKFxuXHRcdFx0XHRqb2luKHBrZ0RpciwgXCJwYWNrYWdlLmpzb25cIiksXG5cdFx0XHRcdEpTT04uc3RyaW5naWZ5KHtcblx0XHRcdFx0XHRuYW1lOiBcInNraWxsLW1hbmlmZXN0LWdsb2ItcGtnXCIsXG5cdFx0XHRcdFx0cGk6IHtcblx0XHRcdFx0XHRcdHNraWxsczogW1wiLi9wbHVnaW5zLyovc2tpbGxzXCJdLFxuXHRcdFx0XHRcdH0sXG5cdFx0XHRcdH0pLFxuXHRcdFx0KTtcblxuXHRcdFx0Y29uc3QgcmVzdWx0ID0gYXdhaXQgcGFja2FnZU1hbmFnZXIucmVzb2x2ZUV4dGVuc2lvblNvdXJjZXMoW3BrZ0Rpcl0pO1xuXHRcdFx0ZXhwZWN0KHJlc3VsdC5za2lsbHMuc29tZSgocikgPT4gaXNFbmFibGVkKHIsIFwicGRmLXRvLW1hcmtkb3duXCIsIFwiaW5jbHVkZXNcIikpKS50b0JlKHRydWUpO1xuXHRcdFx0ZXhwZWN0KHJlc3VsdC5za2lsbHMuc29tZSgocikgPT4gaXNFbmFibGVkKHIsIFwiZG9jdW1lbnQtcHJvY2Vzc29yLWFwaVwiLCBcImluY2x1ZGVzXCIpKSkudG9CZSh0cnVlKTtcblx0XHR9KTtcblx0fSk7XG5cblx0ZGVzY3JpYmUoXCJwYXR0ZXJuIGZpbHRlcmluZyBpbiBwYWNrYWdlIGZpbHRlcnNcIiwgKCkgPT4ge1xuXHRcdGl0KFwic2hvdWxkIGFwcGx5IHVzZXIgZmlsdGVycyBvbiB0b3Agb2YgbWFuaWZlc3QgZmlsdGVycyAobm90IHJlcGxhY2UpXCIsIGFzeW5jICgpID0+IHtcblx0XHRcdC8vIE1hbmlmZXN0IGV4Y2x1ZGVzIGJhei50cywgdXNlciBleGNsdWRlcyBiYXIudHNcblx0XHRcdC8vIFJlc3VsdCBzaG91bGQgZXhjbHVkZSBCT1RIXG5cdFx0XHRjb25zdCBwa2dEaXIgPSBqb2luKHRlbXBEaXIsIFwibGF5ZXJlZC1wa2dcIik7XG5cdFx0XHRta2RpclN5bmMoam9pbihwa2dEaXIsIFwiZXh0ZW5zaW9uc1wiKSwgeyByZWN1cnNpdmU6IHRydWUgfSk7XG5cdFx0XHR3cml0ZUZpbGVTeW5jKGpvaW4ocGtnRGlyLCBcImV4dGVuc2lvbnNcIiwgXCJmb28udHNcIiksIFwiZXhwb3J0IGRlZmF1bHQgZnVuY3Rpb24oKSB7fVwiKTtcblx0XHRcdHdyaXRlRmlsZVN5bmMoam9pbihwa2dEaXIsIFwiZXh0ZW5zaW9uc1wiLCBcImJhci50c1wiKSwgXCJleHBvcnQgZGVmYXVsdCBmdW5jdGlvbigpIHt9XCIpO1xuXHRcdFx0d3JpdGVGaWxlU3luYyhqb2luKHBrZ0RpciwgXCJleHRlbnNpb25zXCIsIFwiYmF6LnRzXCIpLCBcImV4cG9ydCBkZWZhdWx0IGZ1bmN0aW9uKCkge31cIik7XG5cdFx0XHR3cml0ZUZpbGVTeW5jKFxuXHRcdFx0XHRqb2luKHBrZ0RpciwgXCJwYWNrYWdlLmpzb25cIiksXG5cdFx0XHRcdEpTT04uc3RyaW5naWZ5KHtcblx0XHRcdFx0XHRuYW1lOiBcImxheWVyZWQtcGtnXCIsXG5cdFx0XHRcdFx0cGk6IHtcblx0XHRcdFx0XHRcdGV4dGVuc2lvbnM6IFtcImV4dGVuc2lvbnNcIiwgXCIhKiovYmF6LnRzXCJdLFxuXHRcdFx0XHRcdH0sXG5cdFx0XHRcdH0pLFxuXHRcdFx0KTtcblxuXHRcdFx0Ly8gVXNlciBmaWx0ZXIgYWRkcyBleGNsdXNpb24gZm9yIGJhci50c1xuXHRcdFx0c2V0dGluZ3NNYW5hZ2VyLnNldFBhY2thZ2VzKFtcblx0XHRcdFx0e1xuXHRcdFx0XHRcdHNvdXJjZTogcGtnRGlyLFxuXHRcdFx0XHRcdGV4dGVuc2lvbnM6IFtcIiEqKi9iYXIudHNcIl0sXG5cdFx0XHRcdFx0c2tpbGxzOiBbXSxcblx0XHRcdFx0XHRwcm9tcHRzOiBbXSxcblx0XHRcdFx0XHR0aGVtZXM6IFtdLFxuXHRcdFx0XHR9LFxuXHRcdFx0XSk7XG5cblx0XHRcdGNvbnN0IHJlc3VsdCA9IGF3YWl0IHBhY2thZ2VNYW5hZ2VyLnJlc29sdmUoKTtcblx0XHRcdC8vIGZvby50cyBzaG91bGQgYmUgaW5jbHVkZWQgKG5vdCBleGNsdWRlZCBieSBhbnlvbmUpXG5cdFx0XHRleHBlY3QocmVzdWx0LmV4dGVuc2lvbnMuc29tZSgocikgPT4gaXNFbmFibGVkKHIsIFwiZm9vLnRzXCIpKSkudG9CZSh0cnVlKTtcblx0XHRcdC8vIGJhci50cyBzaG91bGQgYmUgZXhjbHVkZWQgKGJ5IHVzZXIpXG5cdFx0XHRleHBlY3QocmVzdWx0LmV4dGVuc2lvbnMuc29tZSgocikgPT4gaXNEaXNhYmxlZChyLCBcImJhci50c1wiKSkpLnRvQmUodHJ1ZSk7XG5cdFx0XHQvLyBiYXoudHMgc2hvdWxkIGJlIGV4Y2x1ZGVkIChieSBtYW5pZmVzdClcblx0XHRcdGV4cGVjdChyZXN1bHQuZXh0ZW5zaW9ucy5zb21lKChyKSA9PiBwYXRoRW5kc1dpdGgoci5wYXRoLCBcImJhei50c1wiKSkpLnRvQmUoZmFsc2UpO1xuXHRcdH0pO1xuXG5cdFx0aXQoXCJzaG91bGQgZXhjbHVkZSBleHRlbnNpb25zIGZyb20gcGFja2FnZSB3aXRoICEgcGF0dGVyblwiLCBhc3luYyAoKSA9PiB7XG5cdFx0XHRjb25zdCBwa2dEaXIgPSBqb2luKHRlbXBEaXIsIFwicGF0dGVybi1wa2dcIik7XG5cdFx0XHRta2RpclN5bmMoam9pbihwa2dEaXIsIFwiZXh0ZW5zaW9uc1wiKSwgeyByZWN1cnNpdmU6IHRydWUgfSk7XG5cdFx0XHR3cml0ZUZpbGVTeW5jKGpvaW4ocGtnRGlyLCBcImV4dGVuc2lvbnNcIiwgXCJmb28udHNcIiksIFwiZXhwb3J0IGRlZmF1bHQgZnVuY3Rpb24oKSB7fVwiKTtcblx0XHRcdHdyaXRlRmlsZVN5bmMoam9pbihwa2dEaXIsIFwiZXh0ZW5zaW9uc1wiLCBcImJhci50c1wiKSwgXCJleHBvcnQgZGVmYXVsdCBmdW5jdGlvbigpIHt9XCIpO1xuXHRcdFx0d3JpdGVGaWxlU3luYyhqb2luKHBrZ0RpciwgXCJleHRlbnNpb25zXCIsIFwiYmF6LnRzXCIpLCBcImV4cG9ydCBkZWZhdWx0IGZ1bmN0aW9uKCkge31cIik7XG5cblx0XHRcdHNldHRpbmdzTWFuYWdlci5zZXRQYWNrYWdlcyhbXG5cdFx0XHRcdHtcblx0XHRcdFx0XHRzb3VyY2U6IHBrZ0Rpcixcblx0XHRcdFx0XHRleHRlbnNpb25zOiBbXCIhKiovYmF6LnRzXCJdLFxuXHRcdFx0XHRcdHNraWxsczogW10sXG5cdFx0XHRcdFx0cHJvbXB0czogW10sXG5cdFx0XHRcdFx0dGhlbWVzOiBbXSxcblx0XHRcdFx0fSxcblx0XHRcdF0pO1xuXG5cdFx0XHRjb25zdCByZXN1bHQgPSBhd2FpdCBwYWNrYWdlTWFuYWdlci5yZXNvbHZlKCk7XG5cdFx0XHRleHBlY3QocmVzdWx0LmV4dGVuc2lvbnMuc29tZSgocikgPT4gaXNFbmFibGVkKHIsIFwiZm9vLnRzXCIpKSkudG9CZSh0cnVlKTtcblx0XHRcdGV4cGVjdChyZXN1bHQuZXh0ZW5zaW9ucy5zb21lKChyKSA9PiBpc0VuYWJsZWQociwgXCJiYXIudHNcIikpKS50b0JlKHRydWUpO1xuXHRcdFx0ZXhwZWN0KHJlc3VsdC5leHRlbnNpb25zLnNvbWUoKHIpID0+IGlzRGlzYWJsZWQociwgXCJiYXoudHNcIikpKS50b0JlKHRydWUpO1xuXHRcdH0pO1xuXG5cdFx0aXQoXCJzaG91bGQgZmlsdGVyIHRoZW1lcyBmcm9tIHBhY2thZ2VcIiwgYXN5bmMgKCkgPT4ge1xuXHRcdFx0Y29uc3QgcGtnRGlyID0gam9pbih0ZW1wRGlyLCBcInRoZW1lLXBrZ1wiKTtcblx0XHRcdG1rZGlyU3luYyhqb2luKHBrZ0RpciwgXCJ0aGVtZXNcIiksIHsgcmVjdXJzaXZlOiB0cnVlIH0pO1xuXHRcdFx0d3JpdGVGaWxlU3luYyhqb2luKHBrZ0RpciwgXCJ0aGVtZXNcIiwgXCJuaWNlLmpzb25cIiksIFwie31cIik7XG5cdFx0XHR3cml0ZUZpbGVTeW5jKGpvaW4ocGtnRGlyLCBcInRoZW1lc1wiLCBcInVnbHkuanNvblwiKSwgXCJ7fVwiKTtcblxuXHRcdFx0c2V0dGluZ3NNYW5hZ2VyLnNldFBhY2thZ2VzKFtcblx0XHRcdFx0e1xuXHRcdFx0XHRcdHNvdXJjZTogcGtnRGlyLFxuXHRcdFx0XHRcdGV4dGVuc2lvbnM6IFtdLFxuXHRcdFx0XHRcdHNraWxsczogW10sXG5cdFx0XHRcdFx0cHJvbXB0czogW10sXG5cdFx0XHRcdFx0dGhlbWVzOiBbXCIhdWdseS5qc29uXCJdLFxuXHRcdFx0XHR9LFxuXHRcdFx0XSk7XG5cblx0XHRcdGNvbnN0IHJlc3VsdCA9IGF3YWl0IHBhY2thZ2VNYW5hZ2VyLnJlc29sdmUoKTtcblx0XHRcdGV4cGVjdChyZXN1bHQudGhlbWVzLnNvbWUoKHIpID0+IGlzRW5hYmxlZChyLCBcIm5pY2UuanNvblwiKSkpLnRvQmUodHJ1ZSk7XG5cdFx0XHRleHBlY3QocmVzdWx0LnRoZW1lcy5zb21lKChyKSA9PiBpc0Rpc2FibGVkKHIsIFwidWdseS5qc29uXCIpKSkudG9CZSh0cnVlKTtcblx0XHR9KTtcblxuXHRcdGl0KFwic2hvdWxkIGNvbWJpbmUgaW5jbHVkZSBhbmQgZXhjbHVkZSBwYXR0ZXJuc1wiLCBhc3luYyAoKSA9PiB7XG5cdFx0XHRjb25zdCBwa2dEaXIgPSBqb2luKHRlbXBEaXIsIFwiY29tYm8tcGtnXCIpO1xuXHRcdFx0bWtkaXJTeW5jKGpvaW4ocGtnRGlyLCBcImV4dGVuc2lvbnNcIiksIHsgcmVjdXJzaXZlOiB0cnVlIH0pO1xuXHRcdFx0d3JpdGVGaWxlU3luYyhqb2luKHBrZ0RpciwgXCJleHRlbnNpb25zXCIsIFwiYWxwaGEudHNcIiksIFwiZXhwb3J0IGRlZmF1bHQgZnVuY3Rpb24oKSB7fVwiKTtcblx0XHRcdHdyaXRlRmlsZVN5bmMoam9pbihwa2dEaXIsIFwiZXh0ZW5zaW9uc1wiLCBcImJldGEudHNcIiksIFwiZXhwb3J0IGRlZmF1bHQgZnVuY3Rpb24oKSB7fVwiKTtcblx0XHRcdHdyaXRlRmlsZVN5bmMoam9pbihwa2dEaXIsIFwiZXh0ZW5zaW9uc1wiLCBcImdhbW1hLnRzXCIpLCBcImV4cG9ydCBkZWZhdWx0IGZ1bmN0aW9uKCkge31cIik7XG5cblx0XHRcdHNldHRpbmdzTWFuYWdlci5zZXRQYWNrYWdlcyhbXG5cdFx0XHRcdHtcblx0XHRcdFx0XHRzb3VyY2U6IHBrZ0Rpcixcblx0XHRcdFx0XHRleHRlbnNpb25zOiBbXCIqKi9hbHBoYS50c1wiLCBcIioqL2JldGEudHNcIiwgXCIhKiovYmV0YS50c1wiXSxcblx0XHRcdFx0XHRza2lsbHM6IFtdLFxuXHRcdFx0XHRcdHByb21wdHM6IFtdLFxuXHRcdFx0XHRcdHRoZW1lczogW10sXG5cdFx0XHRcdH0sXG5cdFx0XHRdKTtcblxuXHRcdFx0Y29uc3QgcmVzdWx0ID0gYXdhaXQgcGFja2FnZU1hbmFnZXIucmVzb2x2ZSgpO1xuXHRcdFx0ZXhwZWN0KHJlc3VsdC5leHRlbnNpb25zLnNvbWUoKHIpID0+IGlzRW5hYmxlZChyLCBcImFscGhhLnRzXCIpKSkudG9CZSh0cnVlKTtcblx0XHRcdGV4cGVjdChyZXN1bHQuZXh0ZW5zaW9ucy5zb21lKChyKSA9PiBpc0Rpc2FibGVkKHIsIFwiYmV0YS50c1wiKSkpLnRvQmUodHJ1ZSk7XG5cdFx0XHRleHBlY3QocmVzdWx0LmV4dGVuc2lvbnMuc29tZSgocikgPT4gaXNEaXNhYmxlZChyLCBcImdhbW1hLnRzXCIpKSkudG9CZSh0cnVlKTtcblx0XHR9KTtcblxuXHRcdGl0KFwic2hvdWxkIHdvcmsgd2l0aCBkaXJlY3QgcGF0aHMgKG5vIHBhdHRlcm5zKVwiLCBhc3luYyAoKSA9PiB7XG5cdFx0XHRjb25zdCBwa2dEaXIgPSBqb2luKHRlbXBEaXIsIFwiZGlyZWN0LXBrZ1wiKTtcblx0XHRcdG1rZGlyU3luYyhqb2luKHBrZ0RpciwgXCJleHRlbnNpb25zXCIpLCB7IHJlY3Vyc2l2ZTogdHJ1ZSB9KTtcblx0XHRcdHdyaXRlRmlsZVN5bmMoam9pbihwa2dEaXIsIFwiZXh0ZW5zaW9uc1wiLCBcIm9uZS50c1wiKSwgXCJleHBvcnQgZGVmYXVsdCBmdW5jdGlvbigpIHt9XCIpO1xuXHRcdFx0d3JpdGVGaWxlU3luYyhqb2luKHBrZ0RpciwgXCJleHRlbnNpb25zXCIsIFwidHdvLnRzXCIpLCBcImV4cG9ydCBkZWZhdWx0IGZ1bmN0aW9uKCkge31cIik7XG5cblx0XHRcdHNldHRpbmdzTWFuYWdlci5zZXRQYWNrYWdlcyhbXG5cdFx0XHRcdHtcblx0XHRcdFx0XHRzb3VyY2U6IHBrZ0Rpcixcblx0XHRcdFx0XHRleHRlbnNpb25zOiBbXCJleHRlbnNpb25zL29uZS50c1wiXSxcblx0XHRcdFx0XHRza2lsbHM6IFtdLFxuXHRcdFx0XHRcdHByb21wdHM6IFtdLFxuXHRcdFx0XHRcdHRoZW1lczogW10sXG5cdFx0XHRcdH0sXG5cdFx0XHRdKTtcblxuXHRcdFx0Y29uc3QgcmVzdWx0ID0gYXdhaXQgcGFja2FnZU1hbmFnZXIucmVzb2x2ZSgpO1xuXHRcdFx0ZXhwZWN0KHJlc3VsdC5leHRlbnNpb25zLnNvbWUoKHIpID0+IGlzRW5hYmxlZChyLCBcIm9uZS50c1wiKSkpLnRvQmUodHJ1ZSk7XG5cdFx0XHRleHBlY3QocmVzdWx0LmV4dGVuc2lvbnMuc29tZSgocikgPT4gaXNEaXNhYmxlZChyLCBcInR3by50c1wiKSkpLnRvQmUodHJ1ZSk7XG5cdFx0fSk7XG5cdH0pO1xuXG5cdGRlc2NyaWJlKFwiZm9yY2UtaW5jbHVkZSBwYXR0ZXJuc1wiLCAoKSA9PiB7XG5cdFx0aXQoXCJzaG91bGQgZm9yY2UtaW5jbHVkZSBleHRlbnNpb25zIHdpdGggKyBwYXR0ZXJuIGFmdGVyIGV4Y2x1c2lvblwiLCBhc3luYyAoKSA9PiB7XG5cdFx0XHRjb25zdCBleHREaXIgPSBqb2luKGFnZW50RGlyLCBcImV4dGVuc2lvbnNcIik7XG5cdFx0XHRta2RpclN5bmMoZXh0RGlyLCB7IHJlY3Vyc2l2ZTogdHJ1ZSB9KTtcblx0XHRcdHdyaXRlRmlsZVN5bmMoam9pbihleHREaXIsIFwia2VlcC50c1wiKSwgXCJleHBvcnQgZGVmYXVsdCBmdW5jdGlvbigpIHt9XCIpO1xuXHRcdFx0d3JpdGVGaWxlU3luYyhqb2luKGV4dERpciwgXCJleGNsdWRlZC50c1wiKSwgXCJleHBvcnQgZGVmYXVsdCBmdW5jdGlvbigpIHt9XCIpO1xuXHRcdFx0d3JpdGVGaWxlU3luYyhqb2luKGV4dERpciwgXCJmb3JjZS1iYWNrLnRzXCIpLCBcImV4cG9ydCBkZWZhdWx0IGZ1bmN0aW9uKCkge31cIik7XG5cblx0XHRcdC8vIEV4Y2x1ZGUgYWxsLCB0aGVuIGZvcmNlLWluY2x1ZGUgb25lIGJhY2tcblx0XHRcdHNldHRpbmdzTWFuYWdlci5zZXRFeHRlbnNpb25QYXRocyhbXCJleHRlbnNpb25zXCIsIFwiIWV4dGVuc2lvbnMvKi50c1wiLCBcIitleHRlbnNpb25zL2ZvcmNlLWJhY2sudHNcIl0pO1xuXG5cdFx0XHRjb25zdCByZXN1bHQgPSBhd2FpdCBwYWNrYWdlTWFuYWdlci5yZXNvbHZlKCk7XG5cdFx0XHRleHBlY3QocmVzdWx0LmV4dGVuc2lvbnMuc29tZSgocikgPT4gaXNEaXNhYmxlZChyLCBcImtlZXAudHNcIikpKS50b0JlKHRydWUpO1xuXHRcdFx0ZXhwZWN0KHJlc3VsdC5leHRlbnNpb25zLnNvbWUoKHIpID0+IGlzRGlzYWJsZWQociwgXCJleGNsdWRlZC50c1wiKSkpLnRvQmUodHJ1ZSk7XG5cdFx0XHRleHBlY3QocmVzdWx0LmV4dGVuc2lvbnMuc29tZSgocikgPT4gaXNFbmFibGVkKHIsIFwiZm9yY2UtYmFjay50c1wiKSkpLnRvQmUodHJ1ZSk7XG5cdFx0fSk7XG5cblx0XHRpdChcInNob3VsZCBmb3JjZS1pbmNsdWRlIG92ZXJyaWRlcyBleGNsdWRlIGluIHBhY2thZ2UgZmlsdGVyc1wiLCBhc3luYyAoKSA9PiB7XG5cdFx0XHRjb25zdCBwa2dEaXIgPSBqb2luKHRlbXBEaXIsIFwiZm9yY2UtcGtnXCIpO1xuXHRcdFx0bWtkaXJTeW5jKGpvaW4ocGtnRGlyLCBcImV4dGVuc2lvbnNcIiksIHsgcmVjdXJzaXZlOiB0cnVlIH0pO1xuXHRcdFx0d3JpdGVGaWxlU3luYyhqb2luKHBrZ0RpciwgXCJleHRlbnNpb25zXCIsIFwiYWxwaGEudHNcIiksIFwiZXhwb3J0IGRlZmF1bHQgZnVuY3Rpb24oKSB7fVwiKTtcblx0XHRcdHdyaXRlRmlsZVN5bmMoam9pbihwa2dEaXIsIFwiZXh0ZW5zaW9uc1wiLCBcImJldGEudHNcIiksIFwiZXhwb3J0IGRlZmF1bHQgZnVuY3Rpb24oKSB7fVwiKTtcblx0XHRcdHdyaXRlRmlsZVN5bmMoam9pbihwa2dEaXIsIFwiZXh0ZW5zaW9uc1wiLCBcImdhbW1hLnRzXCIpLCBcImV4cG9ydCBkZWZhdWx0IGZ1bmN0aW9uKCkge31cIik7XG5cblx0XHRcdHNldHRpbmdzTWFuYWdlci5zZXRQYWNrYWdlcyhbXG5cdFx0XHRcdHtcblx0XHRcdFx0XHRzb3VyY2U6IHBrZ0Rpcixcblx0XHRcdFx0XHRleHRlbnNpb25zOiBbXCIhKiovKi50c1wiLCBcIitleHRlbnNpb25zL2JldGEudHNcIl0sXG5cdFx0XHRcdFx0c2tpbGxzOiBbXSxcblx0XHRcdFx0XHRwcm9tcHRzOiBbXSxcblx0XHRcdFx0XHR0aGVtZXM6IFtdLFxuXHRcdFx0XHR9LFxuXHRcdFx0XSk7XG5cblx0XHRcdGNvbnN0IHJlc3VsdCA9IGF3YWl0IHBhY2thZ2VNYW5hZ2VyLnJlc29sdmUoKTtcblx0XHRcdGV4cGVjdChyZXN1bHQuZXh0ZW5zaW9ucy5zb21lKChyKSA9PiBpc0Rpc2FibGVkKHIsIFwiYWxwaGEudHNcIikpKS50b0JlKHRydWUpO1xuXHRcdFx0ZXhwZWN0KHJlc3VsdC5leHRlbnNpb25zLnNvbWUoKHIpID0+IGlzRW5hYmxlZChyLCBcImJldGEudHNcIikpKS50b0JlKHRydWUpO1xuXHRcdFx0ZXhwZWN0KHJlc3VsdC5leHRlbnNpb25zLnNvbWUoKHIpID0+IGlzRGlzYWJsZWQociwgXCJnYW1tYS50c1wiKSkpLnRvQmUodHJ1ZSk7XG5cdFx0fSk7XG5cblx0XHRpdChcInNob3VsZCBmb3JjZS1pbmNsdWRlIG11bHRpcGxlIHJlc291cmNlc1wiLCBhc3luYyAoKSA9PiB7XG5cdFx0XHRjb25zdCBwa2dEaXIgPSBqb2luKHRlbXBEaXIsIFwibXVsdGktZm9yY2UtcGtnXCIpO1xuXHRcdFx0bWtkaXJTeW5jKGpvaW4ocGtnRGlyLCBcInNraWxscy9za2lsbC1hXCIpLCB7IHJlY3Vyc2l2ZTogdHJ1ZSB9KTtcblx0XHRcdG1rZGlyU3luYyhqb2luKHBrZ0RpciwgXCJza2lsbHMvc2tpbGwtYlwiKSwgeyByZWN1cnNpdmU6IHRydWUgfSk7XG5cdFx0XHRta2RpclN5bmMoam9pbihwa2dEaXIsIFwic2tpbGxzL3NraWxsLWNcIiksIHsgcmVjdXJzaXZlOiB0cnVlIH0pO1xuXHRcdFx0d3JpdGVGaWxlU3luYyhqb2luKHBrZ0RpciwgXCJza2lsbHMvc2tpbGwtYVwiLCBcIlNLSUxMLm1kXCIpLCBcIi0tLVxcbm5hbWU6IHNraWxsLWFcXG5kZXNjcmlwdGlvbjogQVxcbi0tLVxcbkNvbnRlbnRcIik7XG5cdFx0XHR3cml0ZUZpbGVTeW5jKGpvaW4ocGtnRGlyLCBcInNraWxscy9za2lsbC1iXCIsIFwiU0tJTEwubWRcIiksIFwiLS0tXFxubmFtZTogc2tpbGwtYlxcbmRlc2NyaXB0aW9uOiBCXFxuLS0tXFxuQ29udGVudFwiKTtcblx0XHRcdHdyaXRlRmlsZVN5bmMoam9pbihwa2dEaXIsIFwic2tpbGxzL3NraWxsLWNcIiwgXCJTS0lMTC5tZFwiKSwgXCItLS1cXG5uYW1lOiBza2lsbC1jXFxuZGVzY3JpcHRpb246IENcXG4tLS1cXG5Db250ZW50XCIpO1xuXG5cdFx0XHRzZXR0aW5nc01hbmFnZXIuc2V0UGFja2FnZXMoW1xuXHRcdFx0XHR7XG5cdFx0XHRcdFx0c291cmNlOiBwa2dEaXIsXG5cdFx0XHRcdFx0ZXh0ZW5zaW9uczogW10sXG5cdFx0XHRcdFx0c2tpbGxzOiBbXCIhKiovKlwiLCBcIitza2lsbHMvc2tpbGwtYVwiLCBcIitza2lsbHMvc2tpbGwtY1wiXSxcblx0XHRcdFx0XHRwcm9tcHRzOiBbXSxcblx0XHRcdFx0XHR0aGVtZXM6IFtdLFxuXHRcdFx0XHR9LFxuXHRcdFx0XSk7XG5cblx0XHRcdGNvbnN0IHJlc3VsdCA9IGF3YWl0IHBhY2thZ2VNYW5hZ2VyLnJlc29sdmUoKTtcblx0XHRcdGV4cGVjdChyZXN1bHQuc2tpbGxzLnNvbWUoKHIpID0+IGlzRW5hYmxlZChyLCBcInNraWxsLWFcIiwgXCJpbmNsdWRlc1wiKSkpLnRvQmUodHJ1ZSk7XG5cdFx0XHRleHBlY3QocmVzdWx0LnNraWxscy5zb21lKChyKSA9PiBpc0Rpc2FibGVkKHIsIFwic2tpbGwtYlwiLCBcImluY2x1ZGVzXCIpKSkudG9CZSh0cnVlKTtcblx0XHRcdGV4cGVjdChyZXN1bHQuc2tpbGxzLnNvbWUoKHIpID0+IGlzRW5hYmxlZChyLCBcInNraWxsLWNcIiwgXCJpbmNsdWRlc1wiKSkpLnRvQmUodHJ1ZSk7XG5cdFx0fSk7XG5cblx0XHRpdChcInNob3VsZCBmb3JjZS1pbmNsdWRlIGFmdGVyIHNwZWNpZmljIGV4Y2x1c2lvblwiLCBhc3luYyAoKSA9PiB7XG5cdFx0XHRjb25zdCBleHREaXIgPSBqb2luKGFnZW50RGlyLCBcImV4dGVuc2lvbnNcIik7XG5cdFx0XHRta2RpclN5bmMoZXh0RGlyLCB7IHJlY3Vyc2l2ZTogdHJ1ZSB9KTtcblx0XHRcdHdyaXRlRmlsZVN5bmMoam9pbihleHREaXIsIFwiYS50c1wiKSwgXCJleHBvcnQgZGVmYXVsdCBmdW5jdGlvbigpIHt9XCIpO1xuXHRcdFx0d3JpdGVGaWxlU3luYyhqb2luKGV4dERpciwgXCJiLnRzXCIpLCBcImV4cG9ydCBkZWZhdWx0IGZ1bmN0aW9uKCkge31cIik7XG5cblx0XHRcdC8vIFNwZWNpZmljYWxseSBleGNsdWRlIGIudHMsIHRoZW4gZm9yY2UgaXQgYmFja1xuXHRcdFx0c2V0dGluZ3NNYW5hZ2VyLnNldEV4dGVuc2lvblBhdGhzKFtcImV4dGVuc2lvbnNcIiwgXCIhZXh0ZW5zaW9ucy9iLnRzXCIsIFwiK2V4dGVuc2lvbnMvYi50c1wiXSk7XG5cblx0XHRcdGNvbnN0IHJlc3VsdCA9IGF3YWl0IHBhY2thZ2VNYW5hZ2VyLnJlc29sdmUoKTtcblx0XHRcdGV4cGVjdChyZXN1bHQuZXh0ZW5zaW9ucy5zb21lKChyKSA9PiBpc0VuYWJsZWQociwgXCJhLnRzXCIpKSkudG9CZSh0cnVlKTtcblx0XHRcdGV4cGVjdChyZXN1bHQuZXh0ZW5zaW9ucy5zb21lKChyKSA9PiBpc0VuYWJsZWQociwgXCJiLnRzXCIpKSkudG9CZSh0cnVlKTtcblx0XHR9KTtcblxuXHRcdGl0KFwic2hvdWxkIGhhbmRsZSBmb3JjZS1pbmNsdWRlIGluIG1hbmlmZXN0IHBhdHRlcm5zXCIsIGFzeW5jICgpID0+IHtcblx0XHRcdGNvbnN0IHBrZ0RpciA9IGpvaW4odGVtcERpciwgXCJtYW5pZmVzdC1mb3JjZS1wa2dcIik7XG5cdFx0XHRta2RpclN5bmMoam9pbihwa2dEaXIsIFwiZXh0ZW5zaW9uc1wiKSwgeyByZWN1cnNpdmU6IHRydWUgfSk7XG5cdFx0XHR3cml0ZUZpbGVTeW5jKGpvaW4ocGtnRGlyLCBcImV4dGVuc2lvbnNcIiwgXCJvbmUudHNcIiksIFwiZXhwb3J0IGRlZmF1bHQgZnVuY3Rpb24oKSB7fVwiKTtcblx0XHRcdHdyaXRlRmlsZVN5bmMoam9pbihwa2dEaXIsIFwiZXh0ZW5zaW9uc1wiLCBcInR3by50c1wiKSwgXCJleHBvcnQgZGVmYXVsdCBmdW5jdGlvbigpIHt9XCIpO1xuXHRcdFx0d3JpdGVGaWxlU3luYyhqb2luKHBrZ0RpciwgXCJleHRlbnNpb25zXCIsIFwidGhyZWUudHNcIiksIFwiZXhwb3J0IGRlZmF1bHQgZnVuY3Rpb24oKSB7fVwiKTtcblx0XHRcdHdyaXRlRmlsZVN5bmMoXG5cdFx0XHRcdGpvaW4ocGtnRGlyLCBcInBhY2thZ2UuanNvblwiKSxcblx0XHRcdFx0SlNPTi5zdHJpbmdpZnkoe1xuXHRcdFx0XHRcdG5hbWU6IFwibWFuaWZlc3QtZm9yY2UtcGtnXCIsXG5cdFx0XHRcdFx0cGk6IHtcblx0XHRcdFx0XHRcdGV4dGVuc2lvbnM6IFtcImV4dGVuc2lvbnNcIiwgXCIhKiovdHdvLnRzXCIsIFwiK2V4dGVuc2lvbnMvdHdvLnRzXCJdLFxuXHRcdFx0XHRcdH0sXG5cdFx0XHRcdH0pLFxuXHRcdFx0KTtcblxuXHRcdFx0Y29uc3QgcmVzdWx0ID0gYXdhaXQgcGFja2FnZU1hbmFnZXIucmVzb2x2ZUV4dGVuc2lvblNvdXJjZXMoW3BrZ0Rpcl0pO1xuXHRcdFx0ZXhwZWN0KHJlc3VsdC5leHRlbnNpb25zLnNvbWUoKHIpID0+IGlzRW5hYmxlZChyLCBcIm9uZS50c1wiKSkpLnRvQmUodHJ1ZSk7XG5cdFx0XHRleHBlY3QocmVzdWx0LmV4dGVuc2lvbnMuc29tZSgocikgPT4gaXNFbmFibGVkKHIsIFwidHdvLnRzXCIpKSkudG9CZSh0cnVlKTtcblx0XHRcdGV4cGVjdChyZXN1bHQuZXh0ZW5zaW9ucy5zb21lKChyKSA9PiBpc0VuYWJsZWQociwgXCJ0aHJlZS50c1wiKSkpLnRvQmUodHJ1ZSk7XG5cdFx0fSk7XG5cblx0XHRpdChcInNob3VsZCBmb3JjZS1pbmNsdWRlIHRoZW1lc1wiLCBhc3luYyAoKSA9PiB7XG5cdFx0XHRjb25zdCB0aGVtZXNEaXIgPSBqb2luKGFnZW50RGlyLCBcInRoZW1lc1wiKTtcblx0XHRcdG1rZGlyU3luYyh0aGVtZXNEaXIsIHsgcmVjdXJzaXZlOiB0cnVlIH0pO1xuXHRcdFx0d3JpdGVGaWxlU3luYyhqb2luKHRoZW1lc0RpciwgXCJkYXJrLmpzb25cIiksIFwie31cIik7XG5cdFx0XHR3cml0ZUZpbGVTeW5jKGpvaW4odGhlbWVzRGlyLCBcImxpZ2h0Lmpzb25cIiksIFwie31cIik7XG5cdFx0XHR3cml0ZUZpbGVTeW5jKGpvaW4odGhlbWVzRGlyLCBcInNwZWNpYWwuanNvblwiKSwgXCJ7fVwiKTtcblxuXHRcdFx0c2V0dGluZ3NNYW5hZ2VyLnNldFRoZW1lUGF0aHMoW1widGhlbWVzXCIsIFwiIXRoZW1lcy8qLmpzb25cIiwgXCIrdGhlbWVzL3NwZWNpYWwuanNvblwiXSk7XG5cblx0XHRcdGNvbnN0IHJlc3VsdCA9IGF3YWl0IHBhY2thZ2VNYW5hZ2VyLnJlc29sdmUoKTtcblx0XHRcdGV4cGVjdChyZXN1bHQudGhlbWVzLnNvbWUoKHIpID0+IGlzRGlzYWJsZWQociwgXCJkYXJrLmpzb25cIikpKS50b0JlKHRydWUpO1xuXHRcdFx0ZXhwZWN0KHJlc3VsdC50aGVtZXMuc29tZSgocikgPT4gaXNEaXNhYmxlZChyLCBcImxpZ2h0Lmpzb25cIikpKS50b0JlKHRydWUpO1xuXHRcdFx0ZXhwZWN0KHJlc3VsdC50aGVtZXMuc29tZSgocikgPT4gaXNFbmFibGVkKHIsIFwic3BlY2lhbC5qc29uXCIpKSkudG9CZSh0cnVlKTtcblx0XHR9KTtcblxuXHRcdGl0KFwic2hvdWxkIGZvcmNlLWluY2x1ZGUgcHJvbXB0c1wiLCBhc3luYyAoKSA9PiB7XG5cdFx0XHRjb25zdCBwcm9tcHRzRGlyID0gam9pbihhZ2VudERpciwgXCJwcm9tcHRzXCIpO1xuXHRcdFx0bWtkaXJTeW5jKHByb21wdHNEaXIsIHsgcmVjdXJzaXZlOiB0cnVlIH0pO1xuXHRcdFx0d3JpdGVGaWxlU3luYyhqb2luKHByb21wdHNEaXIsIFwicmV2aWV3Lm1kXCIpLCBcIlJldmlld1wiKTtcblx0XHRcdHdyaXRlRmlsZVN5bmMoam9pbihwcm9tcHRzRGlyLCBcImV4cGxhaW4ubWRcIiksIFwiRXhwbGFpblwiKTtcblx0XHRcdHdyaXRlRmlsZVN5bmMoam9pbihwcm9tcHRzRGlyLCBcImRlYnVnLm1kXCIpLCBcIkRlYnVnXCIpO1xuXG5cdFx0XHRzZXR0aW5nc01hbmFnZXIuc2V0UHJvbXB0VGVtcGxhdGVQYXRocyhbXCJwcm9tcHRzXCIsIFwiIXByb21wdHMvKi5tZFwiLCBcIitwcm9tcHRzL2RlYnVnLm1kXCJdKTtcblxuXHRcdFx0Y29uc3QgcmVzdWx0ID0gYXdhaXQgcGFja2FnZU1hbmFnZXIucmVzb2x2ZSgpO1xuXHRcdFx0ZXhwZWN0KHJlc3VsdC5wcm9tcHRzLnNvbWUoKHIpID0+IGlzRGlzYWJsZWQociwgXCJyZXZpZXcubWRcIikpKS50b0JlKHRydWUpO1xuXHRcdFx0ZXhwZWN0KHJlc3VsdC5wcm9tcHRzLnNvbWUoKHIpID0+IGlzRGlzYWJsZWQociwgXCJleHBsYWluLm1kXCIpKSkudG9CZSh0cnVlKTtcblx0XHRcdGV4cGVjdChyZXN1bHQucHJvbXB0cy5zb21lKChyKSA9PiBpc0VuYWJsZWQociwgXCJkZWJ1Zy5tZFwiKSkpLnRvQmUodHJ1ZSk7XG5cdFx0fSk7XG5cdH0pO1xuXG5cdGRlc2NyaWJlKFwiZm9yY2UtZXhjbHVkZSBwYXR0ZXJuc1wiLCAoKSA9PiB7XG5cdFx0aXQoXCJzaG91bGQgZm9yY2UtZXhjbHVkZSB0b3AtbGV2ZWwgcmVzb3VyY2VzXCIsIGFzeW5jICgpID0+IHtcblx0XHRcdGNvbnN0IGV4dERpciA9IGpvaW4oYWdlbnREaXIsIFwiZXh0ZW5zaW9uc1wiKTtcblx0XHRcdG1rZGlyU3luYyhleHREaXIsIHsgcmVjdXJzaXZlOiB0cnVlIH0pO1xuXHRcdFx0d3JpdGVGaWxlU3luYyhqb2luKGV4dERpciwgXCJhbHBoYS50c1wiKSwgXCJleHBvcnQgZGVmYXVsdCBmdW5jdGlvbigpIHt9XCIpO1xuXHRcdFx0d3JpdGVGaWxlU3luYyhqb2luKGV4dERpciwgXCJiZXRhLnRzXCIpLCBcImV4cG9ydCBkZWZhdWx0IGZ1bmN0aW9uKCkge31cIik7XG5cblx0XHRcdHNldHRpbmdzTWFuYWdlci5zZXRFeHRlbnNpb25QYXRocyhbXCJleHRlbnNpb25zXCIsIFwiK2V4dGVuc2lvbnMvYWxwaGEudHNcIiwgXCItZXh0ZW5zaW9ucy9hbHBoYS50c1wiXSk7XG5cblx0XHRcdGNvbnN0IHJlc3VsdCA9IGF3YWl0IHBhY2thZ2VNYW5hZ2VyLnJlc29sdmUoKTtcblx0XHRcdGV4cGVjdChyZXN1bHQuZXh0ZW5zaW9ucy5zb21lKChyKSA9PiBpc0Rpc2FibGVkKHIsIFwiYWxwaGEudHNcIikpKS50b0JlKHRydWUpO1xuXHRcdFx0ZXhwZWN0KHJlc3VsdC5leHRlbnNpb25zLnNvbWUoKHIpID0+IGlzRW5hYmxlZChyLCBcImJldGEudHNcIikpKS50b0JlKHRydWUpO1xuXHRcdH0pO1xuXG5cdFx0aXQoXCJzaG91bGQgZm9yY2UtZXhjbHVkZSBpbiBwYWNrYWdlIGZpbHRlcnNcIiwgYXN5bmMgKCkgPT4ge1xuXHRcdFx0Y29uc3QgcGtnRGlyID0gam9pbih0ZW1wRGlyLCBcImZvcmNlLWV4Y2x1ZGUtcGtnXCIpO1xuXHRcdFx0bWtkaXJTeW5jKGpvaW4ocGtnRGlyLCBcImV4dGVuc2lvbnNcIiksIHsgcmVjdXJzaXZlOiB0cnVlIH0pO1xuXHRcdFx0d3JpdGVGaWxlU3luYyhqb2luKHBrZ0RpciwgXCJleHRlbnNpb25zXCIsIFwiYWxwaGEudHNcIiksIFwiZXhwb3J0IGRlZmF1bHQgZnVuY3Rpb24oKSB7fVwiKTtcblx0XHRcdHdyaXRlRmlsZVN5bmMoam9pbihwa2dEaXIsIFwiZXh0ZW5zaW9uc1wiLCBcImJldGEudHNcIiksIFwiZXhwb3J0IGRlZmF1bHQgZnVuY3Rpb24oKSB7fVwiKTtcblxuXHRcdFx0c2V0dGluZ3NNYW5hZ2VyLnNldFBhY2thZ2VzKFtcblx0XHRcdFx0e1xuXHRcdFx0XHRcdHNvdXJjZTogcGtnRGlyLFxuXHRcdFx0XHRcdGV4dGVuc2lvbnM6IFtcImV4dGVuc2lvbnMvKi50c1wiLCBcIitleHRlbnNpb25zL2FscGhhLnRzXCIsIFwiLWV4dGVuc2lvbnMvYWxwaGEudHNcIl0sXG5cdFx0XHRcdFx0c2tpbGxzOiBbXSxcblx0XHRcdFx0XHRwcm9tcHRzOiBbXSxcblx0XHRcdFx0XHR0aGVtZXM6IFtdLFxuXHRcdFx0XHR9LFxuXHRcdFx0XSk7XG5cblx0XHRcdGNvbnN0IHJlc3VsdCA9IGF3YWl0IHBhY2thZ2VNYW5hZ2VyLnJlc29sdmUoKTtcblx0XHRcdGV4cGVjdChyZXN1bHQuZXh0ZW5zaW9ucy5zb21lKChyKSA9PiBpc0Rpc2FibGVkKHIsIFwiYWxwaGEudHNcIikpKS50b0JlKHRydWUpO1xuXHRcdFx0ZXhwZWN0KHJlc3VsdC5leHRlbnNpb25zLnNvbWUoKHIpID0+IGlzRW5hYmxlZChyLCBcImJldGEudHNcIikpKS50b0JlKHRydWUpO1xuXHRcdH0pO1xuXHR9KTtcblxuXHRkZXNjcmliZShcInBhY2thZ2UgZGVkdXBsaWNhdGlvblwiLCAoKSA9PiB7XG5cdFx0aXQoXCJzaG91bGQgZGVkdXBlIHNhbWUgbG9jYWwgcGFja2FnZSBpbiBnbG9iYWwgYW5kIHByb2plY3QgKHByb2plY3Qgd2lucylcIiwgYXN5bmMgKCkgPT4ge1xuXHRcdFx0Y29uc3QgcGtnRGlyID0gam9pbih0ZW1wRGlyLCBcInNoYXJlZC1wa2dcIik7XG5cdFx0XHRta2RpclN5bmMoam9pbihwa2dEaXIsIFwiZXh0ZW5zaW9uc1wiKSwgeyByZWN1cnNpdmU6IHRydWUgfSk7XG5cdFx0XHR3cml0ZUZpbGVTeW5jKGpvaW4ocGtnRGlyLCBcImV4dGVuc2lvbnNcIiwgXCJzaGFyZWQudHNcIiksIFwiZXhwb3J0IGRlZmF1bHQgZnVuY3Rpb24oKSB7fVwiKTtcblxuXHRcdFx0Ly8gU2FtZSBwYWNrYWdlIGluIGJvdGggZ2xvYmFsIGFuZCBwcm9qZWN0XG5cdFx0XHRzZXR0aW5nc01hbmFnZXIuc2V0UGFja2FnZXMoW3BrZ0Rpcl0pOyAvLyBnbG9iYWxcblx0XHRcdHNldHRpbmdzTWFuYWdlci5zZXRQcm9qZWN0UGFja2FnZXMoW3BrZ0Rpcl0pOyAvLyBwcm9qZWN0XG5cblx0XHRcdC8vIERlYnVnOiB2ZXJpZnkgc2V0dGluZ3MgYXJlIHN0b3JlZCBjb3JyZWN0bHlcblx0XHRcdGNvbnN0IGdsb2JhbFNldHRpbmdzID0gc2V0dGluZ3NNYW5hZ2VyLmdldEdsb2JhbFNldHRpbmdzKCk7XG5cdFx0XHRjb25zdCBwcm9qZWN0U2V0dGluZ3MgPSBzZXR0aW5nc01hbmFnZXIuZ2V0UHJvamVjdFNldHRpbmdzKCk7IiwidHJ1bmNhdGVkIjp0cnVlLCJ0cnVuY2F0ZWRCeSI6ImJ5dGVzIiwidG90YWxMaW5lcyI6MTc1NiwidG90YWxCeXRlcyI6NzQyNjcsIm91dHB1dExpbmVzIjoxMjEzLCJvdXRwdXRCeXRlcyI6NTExNTAsImxhc3RMaW5lUGFydGlhbCI6ZmFsc2UsImZpcnN0TGluZUV4Y2VlZHNMaW1pdCI6ZmFsc2UsIm1heExpbmVzIjoyMDAwLCJtYXhCeXRlcyI6NTEyMDB9fSwiaXNFcnJvciI6ZmFsc2UsInRpbWVzdGFtcCI6MTc3NzU2NDE4NTY3OX19LHsidHlwZSI6Im1lc3NhZ2UiLCJpZCI6ImQ4ZWQxZDBkIiwicGFyZW50SWQiOiJjOTQ3NWVkOSIsInRpbWVzdGFtcCI6IjIwMjYtMDQtMzBUMTU6NDk6NDUuNjgwWiIsIm1lc3NhZ2UiOnsicm9sZSI6InRvb2xSZXN1bHQiLCJ0b29sQ2FsbElkIjoicmVhZDo0IiwidG9vbE5hbWUiOiJyZWFkIiwiY29udGVudCI6W3sidHlwZSI6InRleHQiLCJ0ZXh0IjoiXHRwcml2YXRlIGFzeW5jIGluc3RhbGxOcG0oc291cmNlOiBOcG1Tb3VyY2UsIHNjb3BlOiBTb3VyY2VTY29wZSwgdGVtcG9yYXJ5OiBib29sZWFuKTogUHJvbWlzZTx2b2lkPiB7XG5cdFx0aWYgKHNjb3BlID09PSBcInVzZXJcIiAmJiAhdGVtcG9yYXJ5KSB7XG5cdFx0XHRhd2FpdCB0aGlzLnJ1bk5wbUNvbW1hbmQoW1wiaW5zdGFsbFwiLCBcIi1nXCIsIHNvdXJjZS5zcGVjXSk7XG5cdFx0XHRyZXR1cm47XG5cdFx0fVxuXHRcdGNvbnN0IGluc3RhbGxSb290ID0gdGhpcy5nZXROcG1JbnN0YWxsUm9vdChzY29wZSwgdGVtcG9yYXJ5KTtcblx0XHR0aGlzLmVuc3VyZU5wbVByb2plY3QoaW5zdGFsbFJvb3QpO1xuXHRcdGF3YWl0IHRoaXMucnVuTnBtQ29tbWFuZChbXCJpbnN0YWxsXCIsIHNvdXJjZS5zcGVjLCBcIi0tcHJlZml4XCIsIGluc3RhbGxSb290XSk7XG5cdH1cblxuXHRwcml2YXRlIGFzeW5jIHVuaW5zdGFsbE5wbShzb3VyY2U6IE5wbVNvdXJjZSwgc2NvcGU6IFNvdXJjZVNjb3BlKTogUHJvbWlzZTx2b2lkPiB7XG5cdFx0aWYgKHNjb3BlID09PSBcInVzZXJcIikge1xuXHRcdFx0YXdhaXQgdGhpcy5ydW5OcG1Db21tYW5kKFtcInVuaW5zdGFsbFwiLCBcIi1nXCIsIHNvdXJjZS5uYW1lXSk7XG5cdFx0XHRyZXR1cm47XG5cdFx0fVxuXHRcdGNvbnN0IGluc3RhbGxSb290ID0gdGhpcy5nZXROcG1JbnN0YWxsUm9vdChzY29wZSwgZmFsc2UpO1xuXHRcdGlmICghZXhpc3RzU3luYyhpbnN0YWxsUm9vdCkpIHtcblx0XHRcdHJldHVybjtcblx0XHR9XG5cdFx0YXdhaXQgdGhpcy5ydW5OcG1Db21tYW5kKFtcInVuaW5zdGFsbFwiLCBzb3VyY2UubmFtZSwgXCItLXByZWZpeFwiLCBpbnN0YWxsUm9vdF0pO1xuXHR9XG5cblx0cHJpdmF0ZSBhc3luYyBpbnN0YWxsR2l0KHNvdXJjZTogR2l0U291cmNlLCBzY29wZTogU291cmNlU2NvcGUpOiBQcm9taXNlPHZvaWQ+IHtcblx0XHRjb25zdCB0YXJnZXREaXIgPSB0aGlzLmdldEdpdEluc3RhbGxQYXRoKHNvdXJjZSwgc2NvcGUpO1xuXHRcdGlmIChleGlzdHNTeW5jKHRhcmdldERpcikpIHtcblx0XHRcdHJldHVybjtcblx0XHR9XG5cdFx0Y29uc3QgZ2l0Um9vdCA9IHRoaXMuZ2V0R2l0SW5zdGFsbFJvb3Qoc2NvcGUpO1xuXHRcdGlmIChnaXRSb290KSB7XG5cdFx0XHR0aGlzLmVuc3VyZUdpdElnbm9yZShnaXRSb290KTtcblx0XHR9XG5cdFx0bWtkaXJTeW5jKGRpcm5hbWUodGFyZ2V0RGlyKSwgeyByZWN1cnNpdmU6IHRydWUgfSk7XG5cblx0XHRhd2FpdCB0aGlzLnJ1bkNvbW1hbmQoXCJnaXRcIiwgW1wiY2xvbmVcIiwgc291cmNlLnJlcG8sIHRhcmdldERpcl0pO1xuXHRcdGlmIChzb3VyY2UucmVmKSB7XG5cdFx0XHRhd2FpdCB0aGlzLnJ1bkNvbW1hbmQoXCJnaXRcIiwgW1wiY2hlY2tvdXRcIiwgc291cmNlLnJlZl0sIHsgY3dkOiB0YXJnZXREaXIgfSk7XG5cdFx0fVxuXHRcdGNvbnN0IHBhY2thZ2VKc29uUGF0aCA9IGpvaW4odGFyZ2V0RGlyLCBcInBhY2thZ2UuanNvblwiKTtcblx0XHRpZiAoZXhpc3RzU3luYyhwYWNrYWdlSnNvblBhdGgpKSB7XG5cdFx0XHRhd2FpdCB0aGlzLnJ1bk5wbUNvbW1hbmQodGhpcy5nZXRHaXREZXBlbmRlbmN5SW5zdGFsbEFyZ3MoKSwgeyBjd2Q6IHRhcmdldERpciB9KTtcblx0XHR9XG5cdH1cblxuXHRwcml2YXRlIGFzeW5jIHVwZGF0ZUdpdChzb3VyY2U6IEdpdFNvdXJjZSwgc2NvcGU6IFNvdXJjZVNjb3BlKTogUHJvbWlzZTx2b2lkPiB7XG5cdFx0Y29uc3QgdGFyZ2V0RGlyID0gdGhpcy5nZXRHaXRJbnN0YWxsUGF0aChzb3VyY2UsIHNjb3BlKTtcblx0XHRpZiAoIWV4aXN0c1N5bmModGFyZ2V0RGlyKSkge1xuXHRcdFx0YXdhaXQgdGhpcy5pbnN0YWxsR2l0KHNvdXJjZSwgc2NvcGUpO1xuXHRcdFx0cmV0dXJuO1xuXHRcdH1cblxuXHRcdGNvbnN0IHRhcmdldCA9IGF3YWl0IHRoaXMuZ2V0TG9jYWxHaXRVcGRhdGVUYXJnZXQodGFyZ2V0RGlyKTtcblxuXHRcdC8vIEZldGNoIG9ubHkgdGhlIHJlZiB3ZSB3aWxsIHJlc2V0IHRvLCBhdm9pZGluZyB1bnJlbGF0ZWQgYnJhbmNoL3RhZyBub2lzZS5cblx0XHRhd2FpdCB0aGlzLnJ1bkNvbW1hbmQoXCJnaXRcIiwgdGFyZ2V0LmZldGNoQXJncywgeyBjd2Q6IHRhcmdldERpciB9KTtcblxuXHRcdGNvbnN0IGxvY2FsSGVhZCA9IGF3YWl0IHRoaXMucnVuQ29tbWFuZENhcHR1cmUoXCJnaXRcIiwgW1wicmV2LXBhcnNlXCIsIFwiSEVBRFwiXSwge1xuXHRcdFx0Y3dkOiB0YXJnZXREaXIsXG5cdFx0XHR0aW1lb3V0TXM6IE5FVFdPUktfVElNRU9VVF9NUyxcblx0XHR9KTtcblx0XHRjb25zdCByZWZyZXNoZWRUYXJnZXRIZWFkID0gYXdhaXQgdGhpcy5ydW5Db21tYW5kQ2FwdHVyZShcImdpdFwiLCBbXCJyZXYtcGFyc2VcIiwgdGFyZ2V0LnJlZl0sIHtcblx0XHRcdGN3ZDogdGFyZ2V0RGlyLFxuXHRcdFx0dGltZW91dE1zOiBORVRXT1JLX1RJTUVPVVRfTVMsXG5cdFx0fSk7XG5cdFx0aWYgKGxvY2FsSGVhZC50cmltKCkgPT09IHJlZnJlc2hlZFRhcmdldEhlYWQudHJpbSgpKSB7XG5cdFx0XHRyZXR1cm47XG5cdFx0fVxuXG5cdFx0YXdhaXQgdGhpcy5ydW5Db21tYW5kKFwiZ2l0XCIsIFtcInJlc2V0XCIsIFwiLS1oYXJkXCIsIHRhcmdldC5yZWZdLCB7IGN3ZDogdGFyZ2V0RGlyIH0pO1xuXG5cdFx0Ly8gQ2xlYW4gdW50cmFja2VkIGZpbGVzIChleHRlbnNpb25zIHNob3VsZCBiZSBwcmlzdGluZSlcblx0XHRhd2FpdCB0aGlzLnJ1bkNvbW1hbmQoXCJnaXRcIiwgW1wiY2xlYW5cIiwgXCItZmR4XCJdLCB7IGN3ZDogdGFyZ2V0RGlyIH0pO1xuXG5cdFx0Y29uc3QgcGFja2FnZUpzb25QYXRoID0gam9pbih0YXJnZXREaXIsIFwicGFja2FnZS5qc29uXCIpO1xuXHRcdGlmIChleGlzdHNTeW5jKHBhY2thZ2VKc29uUGF0aCkpIHtcblx0XHRcdGF3YWl0IHRoaXMucnVuTnBtQ29tbWFuZCh0aGlzLmdldEdpdERlcGVuZGVuY3lJbnN0YWxsQXJncygpLCB7IGN3ZDogdGFyZ2V0RGlyIH0pO1xuXHRcdH1cblx0fVxuXG5cdHByaXZhdGUgYXN5bmMgcmVmcmVzaFRlbXBvcmFyeUdpdFNvdXJjZShzb3VyY2U6IEdpdFNvdXJjZSwgc291cmNlU3RyOiBzdHJpbmcpOiBQcm9taXNlPHZvaWQ+IHtcblx0XHRpZiAoaXNPZmZsaW5lTW9kZUVuYWJsZWQoKSkge1xuXHRcdFx0cmV0dXJuO1xuXHRcdH1cblx0XHR0cnkge1xuXHRcdFx0YXdhaXQgdGhpcy53aXRoUHJvZ3Jlc3MoXCJwdWxsXCIsIHNvdXJjZVN0ciwgYFJlZnJlc2hpbmcgJHtzb3VyY2VTdHJ9Li4uYCwgYXN5bmMgKCkgPT4ge1xuXHRcdFx0XHRhd2FpdCB0aGlzLnVwZGF0ZUdpdChzb3VyY2UsIFwidGVtcG9yYXJ5XCIpO1xuXHRcdFx0fSk7XG5cdFx0fSBjYXRjaCB7XG5cdFx0XHQvLyBLZWVwIGNhY2hlZCB0ZW1wb3JhcnkgY2hlY2tvdXQgaWYgcmVmcmVzaCBmYWlscy5cblx0XHR9XG5cdH1cblxuXHRwcml2YXRlIGFzeW5jIHJlbW92ZUdpdChzb3VyY2U6IEdpdFNvdXJjZSwgc2NvcGU6IFNvdXJjZVNjb3BlKTogUHJvbWlzZTx2b2lkPiB7XG5cdFx0Y29uc3QgdGFyZ2V0RGlyID0gdGhpcy5nZXRHaXRJbnN0YWxsUGF0aChzb3VyY2UsIHNjb3BlKTtcblx0XHRpZiAoIWV4aXN0c1N5bmModGFyZ2V0RGlyKSkgcmV0dXJuO1xuXHRcdHJtU3luYyh0YXJnZXREaXIsIHsgcmVjdXJzaXZlOiB0cnVlLCBmb3JjZTogdHJ1ZSB9KTtcblx0XHR0aGlzLnBydW5lRW1wdHlHaXRQYXJlbnRzKHRhcmdldERpciwgdGhpcy5nZXRHaXRJbnN0YWxsUm9vdChzY29wZSkpO1xuXHR9XG5cblx0cHJpdmF0ZSBwcnVuZUVtcHR5R2l0UGFyZW50cyh0YXJnZXREaXI6IHN0cmluZywgaW5zdGFsbFJvb3Q6IHN0cmluZyB8IHVuZGVmaW5lZCk6IHZvaWQge1xuXHRcdGlmICghaW5zdGFsbFJvb3QpIHJldHVybjtcblx0XHRjb25zdCByZXNvbHZlZFJvb3QgPSByZXNvbHZlKGluc3RhbGxSb290KTtcblx0XHRsZXQgY3VycmVudCA9IGRpcm5hbWUodGFyZ2V0RGlyKTtcblx0XHR3aGlsZSAoY3VycmVudC5zdGFydHNXaXRoKHJlc29sdmVkUm9vdCkgJiYgY3VycmVudCAhPT0gcmVzb2x2ZWRSb290KSB7XG5cdFx0XHRpZiAoIWV4aXN0c1N5bmMoY3VycmVudCkpIHtcblx0XHRcdFx0Y3VycmVudCA9IGRpcm5hbWUoY3VycmVudCk7XG5cdFx0XHRcdGNvbnRpbnVlO1xuXHRcdFx0fVxuXHRcdFx0Y29uc3QgZW50cmllcyA9IHJlYWRkaXJTeW5jKGN1cnJlbnQpO1xuXHRcdFx0aWYgKGVudHJpZXMubGVuZ3RoID4gMCkge1xuXHRcdFx0XHRicmVhaztcblx0XHRcdH1cblx0XHRcdHRyeSB7XG5cdFx0XHRcdHJtU3luYyhjdXJyZW50LCB7IHJlY3Vyc2l2ZTogdHJ1ZSwgZm9yY2U6IHRydWUgfSk7XG5cdFx0XHR9IGNhdGNoIHtcblx0XHRcdFx0YnJlYWs7XG5cdFx0XHR9XG5cdFx0XHRjdXJyZW50ID0gZGlybmFtZShjdXJyZW50KTtcblx0XHR9XG5cdH1cblxuXHRwcml2YXRlIGVuc3VyZU5wbVByb2plY3QoaW5zdGFsbFJvb3Q6IHN0cmluZyk6IHZvaWQge1xuXHRcdGlmICghZXhpc3RzU3luYyhpbnN0YWxsUm9vdCkpIHtcblx0XHRcdG1rZGlyU3luYyhpbnN0YWxsUm9vdCwgeyByZWN1cnNpdmU6IHRydWUgfSk7XG5cdFx0fVxuXHRcdHRoaXMuZW5zdXJlR2l0SWdub3JlKGluc3RhbGxSb290KTtcblx0XHRjb25zdCBwYWNrYWdlSnNvblBhdGggPSBqb2luKGluc3RhbGxSb290LCBcInBhY2thZ2UuanNvblwiKTtcblx0XHRpZiAoIWV4aXN0c1N5bmMocGFja2FnZUpzb25QYXRoKSkge1xuXHRcdFx0Y29uc3QgcGtnSnNvbiA9IHsgbmFtZTogXCJwaS1leHRlbnNpb25zXCIsIHByaXZhdGU6IHRydWUgfTtcblx0XHRcdHdyaXRlRmlsZVN5bmMocGFja2FnZUpzb25QYXRoLCBKU09OLnN0cmluZ2lmeShwa2dKc29uLCBudWxsLCAyKSwgXCJ1dGYtOFwiKTtcblx0XHR9XG5cdH1cblxuXHRwcml2YXRlIGVuc3VyZUdpdElnbm9yZShkaXI6IHN0cmluZyk6IHZvaWQge1xuXHRcdGlmICghZXhpc3RzU3luYyhkaXIpKSB7XG5cdFx0XHRta2RpclN5bmMoZGlyLCB7IHJlY3Vyc2l2ZTogdHJ1ZSB9KTtcblx0XHR9XG5cdFx0Y29uc3QgaWdub3JlUGF0aCA9IGpvaW4oZGlyLCBcIi5naXRpZ25vcmVcIik7XG5cdFx0aWYgKCFleGlzdHNTeW5jKGlnbm9yZVBhdGgpKSB7XG5cdFx0XHR3cml0ZUZpbGVTeW5jKGlnbm9yZVBhdGgsIFwiKlxcbiEuZ2l0aWdub3JlXFxuXCIsIFwidXRmLThcIik7XG5cdFx0fVxuXHR9XG5cblx0cHJpdmF0ZSBnZXROcG1JbnN0YWxsUm9vdChzY29wZTogU291cmNlU2NvcGUsIHRlbXBvcmFyeTogYm9vbGVhbik6IHN0cmluZyB7XG5cdFx0aWYgKHRlbXBvcmFyeSkge1xuXHRcdFx0cmV0dXJuIHRoaXMuZ2V0VGVtcG9yYXJ5RGlyKFwibnBtXCIpO1xuXHRcdH1cblx0XHRpZiAoc2NvcGUgPT09IFwicHJvamVjdFwiKSB7XG5cdFx0XHRyZXR1cm4gam9pbih0aGlzLmN3ZCwgQ09ORklHX0RJUl9OQU1FLCBcIm5wbVwiKTtcblx0XHR9XG5cdFx0cmV0dXJuIGpvaW4odGhpcy5nZXRHbG9iYWxOcG1Sb290KCksIFwiLi5cIik7XG5cdH1cblxuXHRwcml2YXRlIGdldEdsb2JhbE5wbVJvb3QoKTogc3RyaW5nIHtcblx0XHRjb25zdCBucG1Db21tYW5kID0gdGhpcy5nZXROcG1Db21tYW5kKCk7XG5cdFx0Y29uc3QgY29tbWFuZEtleSA9IFtucG1Db21tYW5kLmNvbW1hbmQsIC4uLm5wbUNvbW1hbmQuYXJnc10uam9pbihcIlxcMFwiKTtcblx0XHRpZiAodGhpcy5nbG9iYWxOcG1Sb290ICYmIHRoaXMuZ2xvYmFsTnBtUm9vdENvbW1hbmRLZXkgPT09IGNvbW1hbmRLZXkpIHtcblx0XHRcdHJldHVybiB0aGlzLmdsb2JhbE5wbVJvb3Q7XG5cdFx0fVxuXHRcdGNvbnN0IGlzQnVuUGFja2FnZU1hbmFnZXIgPSBucG1Db21tYW5kLmNvbW1hbmQgPT09IFwiYnVuXCI7XG5cdFx0aWYgKGlzQnVuUGFja2FnZU1hbmFnZXIpIHtcblx0XHRcdGNvbnN0IGJpbkRpciA9IHRoaXMucnVuTnBtQ29tbWFuZFN5bmMoW1wicG1cIiwgXCJiaW5cIiwgXCItZ1wiXSkudHJpbSgpO1xuXHRcdFx0dGhpcy5nbG9iYWxOcG1Sb290ID0gam9pbihkaXJuYW1lKGJpbkRpciksIFwiaW5zdGFsbFwiLCBcImdsb2JhbFwiLCBcIm5vZGVfbW9kdWxlc1wiKTtcblx0XHR9IGVsc2Uge1xuXHRcdFx0dGhpcy5nbG9iYWxOcG1Sb290ID0gdGhpcy5ydW5OcG1Db21tYW5kU3luYyhbXCJyb290XCIsIFwiLWdcIl0pLnRyaW0oKTtcblx0XHR9XG5cdFx0dGhpcy5nbG9iYWxOcG1Sb290Q29tbWFuZEtleSA9IGNvbW1hbmRLZXk7XG5cdFx0cmV0dXJuIHRoaXMuZ2xvYmFsTnBtUm9vdDtcblx0fVxuXG5cdHByaXZhdGUgZ2V0TnBtSW5zdGFsbFBhdGgoc291cmNlOiBOcG1Tb3VyY2UsIHNjb3BlOiBTb3VyY2VTY29wZSk6IHN0cmluZyB7XG5cdFx0aWYgKHNjb3BlID09PSBcInRlbXBvcmFyeVwiKSB7XG5cdFx0XHRyZXR1cm4gam9pbih0aGlzLmdldFRlbXBvcmFyeURpcihcIm5wbVwiKSwgXCJub2RlX21vZHVsZXNcIiwgc291cmNlLm5hbWUpO1xuXHRcdH1cblx0XHRpZiAoc2NvcGUgPT09IFwicHJvamVjdFwiKSB7XG5cdFx0XHRyZXR1cm4gam9pbih0aGlzLmN3ZCwgQ09ORklHX0RJUl9OQU1FLCBcIm5wbVwiLCBcIm5vZGVfbW9kdWxlc1wiLCBzb3VyY2UubmFtZSk7XG5cdFx0fVxuXHRcdHJldHVybiBqb2luKHRoaXMuZ2V0R2xvYmFsTnBtUm9vdCgpLCBzb3VyY2UubmFtZSk7XG5cdH1cblxuXHRwcml2YXRlIGdldEdpdEluc3RhbGxQYXRoKHNvdXJjZTogR2l0U291cmNlLCBzY29wZTogU291cmNlU2NvcGUpOiBzdHJpbmcge1xuXHRcdGlmIChzY29wZSA9PT0gXCJ0ZW1wb3JhcnlcIikge1xuXHRcdFx0cmV0dXJuIHRoaXMuZ2V0VGVtcG9yYXJ5RGlyKGBnaXQtJHtzb3VyY2UuaG9zdH1gLCBzb3VyY2UucGF0aCk7XG5cdFx0fVxuXHRcdGlmIChzY29wZSA9PT0gXCJwcm9qZWN0XCIpIHtcblx0XHRcdHJldHVybiBqb2luKHRoaXMuY3dkLCBDT05GSUdfRElSX05BTUUsIFwiZ2l0XCIsIHNvdXJjZS5ob3N0LCBzb3VyY2UucGF0aCk7XG5cdFx0fVxuXHRcdHJldHVybiBqb2luKHRoaXMuYWdlbnREaXIsIFwiZ2l0XCIsIHNvdXJjZS5ob3N0LCBzb3VyY2UucGF0aCk7XG5cdH1cblxuXHRwcml2YXRlIGdldEdpdEluc3RhbGxSb290KHNjb3BlOiBTb3VyY2VTY29wZSk6IHN0cmluZyB8IHVuZGVmaW5lZCB7XG5cdFx0aWYgKHNjb3BlID09PSBcInRlbXBvcmFyeVwiKSB7XG5cdFx0XHRyZXR1cm4gdW5kZWZpbmVkO1xuXHRcdH1cblx0XHRpZiAoc2NvcGUgPT09IFwicHJvamVjdFwiKSB7XG5cdFx0XHRyZXR1cm4gam9pbih0aGlzLmN3ZCwgQ09ORklHX0RJUl9OQU1FLCBcImdpdFwiKTtcblx0XHR9XG5cdFx0cmV0dXJuIGpvaW4odGhpcy5hZ2VudERpciwgXCJnaXRcIik7XG5cdH1cblxuXHRwcml2YXRlIGdldFRlbXBvcmFyeURpcihwcmVmaXg6IHN0cmluZywgc3VmZml4Pzogc3RyaW5nKTogc3RyaW5nIHtcblx0XHRjb25zdCBoYXNoID0gY3JlYXRlSGFzaChcInNoYTI1NlwiKVxuXHRcdFx0LnVwZGF0ZShgJHtwcmVmaXh9LSR7c3VmZml4ID8/IFwiXCJ9YClcblx0XHRcdC5kaWdlc3QoXCJoZXhcIilcblx0XHRcdC5zbGljZSgwLCA4KTtcblx0XHRyZXR1cm4gam9pbih0bXBkaXIoKSwgXCJwaS1leHRlbnNpb25zXCIsIHByZWZpeCwgaGFzaCwgc3VmZml4ID8/IFwiXCIpO1xuXHR9XG5cblx0cHJpdmF0ZSBnZXRCYXNlRGlyRm9yU2NvcGUoc2NvcGU6IFNvdXJjZVNjb3BlKTogc3RyaW5nIHtcblx0XHRpZiAoc2NvcGUgPT09IFwicHJvamVjdFwiKSB7XG5cdFx0XHRyZXR1cm4gam9pbih0aGlzLmN3ZCwgQ09ORklHX0RJUl9OQU1FKTtcblx0XHR9XG5cdFx0aWYgKHNjb3BlID09PSBcInVzZXJcIikge1xuXHRcdFx0cmV0dXJuIHRoaXMuYWdlbnREaXI7XG5cdFx0fVxuXHRcdHJldHVybiB0aGlzLmN3ZDtcblx0fVxuXG5cdHByaXZhdGUgcmVzb2x2ZVBhdGgoaW5wdXQ6IHN0cmluZyk6IHN0cmluZyB7XG5cdFx0Y29uc3QgdHJpbW1lZCA9IGlucHV0LnRyaW0oKTtcblx0XHRpZiAodHJpbW1lZCA9PT0gXCJ+XCIpIHJldHVybiBnZXRIb21lRGlyKCk7XG5cdFx0aWYgKHRyaW1tZWQuc3RhcnRzV2l0aChcIn4vXCIpKSByZXR1cm4gam9pbihnZXRIb21lRGlyKCksIHRyaW1tZWQuc2xpY2UoMikpO1xuXHRcdGlmICh0cmltbWVkLnN0YXJ0c1dpdGgoXCJ+XCIpKSByZXR1cm4gam9pbihnZXRIb21lRGlyKCksIHRyaW1tZWQuc2xpY2UoMSkpO1xuXHRcdHJldHVybiByZXNvbHZlKHRoaXMuY3dkLCB0cmltbWVkKTtcblx0fVxuXG5cdHByaXZhdGUgcmVzb2x2ZVBhdGhGcm9tQmFzZShpbnB1dDogc3RyaW5nLCBiYXNlRGlyOiBzdHJpbmcpOiBzdHJpbmcge1xuXHRcdGNvbnN0IHRyaW1tZWQgPSBpbnB1dC50cmltKCk7XG5cdFx0aWYgKHRyaW1tZWQgPT09IFwiflwiKSByZXR1cm4gZ2V0SG9tZURpcigpO1xuXHRcdGlmICh0cmltbWVkLnN0YXJ0c1dpdGgoXCJ+L1wiKSkgcmV0dXJuIGpvaW4oZ2V0SG9tZURpcigpLCB0cmltbWVkLnNsaWNlKDIpKTtcblx0XHRpZiAodHJpbW1lZC5zdGFydHNXaXRoKFwiflwiKSkgcmV0dXJuIGpvaW4oZ2V0SG9tZURpcigpLCB0cmltbWVkLnNsaWNlKDEpKTtcblx0XHRyZXR1cm4gcmVzb2x2ZShiYXNlRGlyLCB0cmltbWVkKTtcblx0fVxuXG5cdHByaXZhdGUgY29sbGVjdFBhY2thZ2VSZXNvdXJjZXMoXG5cdFx0cGFja2FnZVJvb3Q6IHN0cmluZyxcblx0XHRhY2N1bXVsYXRvcjogUmVzb3VyY2VBY2N1bXVsYXRvcixcblx0XHRmaWx0ZXI6IFBhY2thZ2VGaWx0ZXIgfCB1bmRlZmluZWQsXG5cdFx0bWV0YWRhdGE6IFBhdGhNZXRhZGF0YSxcblx0KTogYm9vbGVhbiB7XG5cdFx0aWYgKGZpbHRlcikge1xuXHRcdFx0Zm9yIChjb25zdCByZXNvdXJjZVR5cGUgb2YgUkVTT1VSQ0VfVFlQRVMpIHtcblx0XHRcdFx0Y29uc3QgcGF0dGVybnMgPSBmaWx0ZXJbcmVzb3VyY2VUeXBlIGFzIGtleW9mIFBhY2thZ2VGaWx0ZXJdO1xuXHRcdFx0XHRjb25zdCB0YXJnZXQgPSB0aGlzLmdldFRhcmdldE1hcChhY2N1bXVsYXRvciwgcmVzb3VyY2VUeXBlKTtcblx0XHRcdFx0aWYgKHBhdHRlcm5zICE9PSB1bmRlZmluZWQpIHtcblx0XHRcdFx0XHR0aGlzLmFwcGx5UGFja2FnZUZpbHRlcihwYWNrYWdlUm9vdCwgcGF0dGVybnMsIHJlc291cmNlVHlwZSwgdGFyZ2V0LCBtZXRhZGF0YSk7XG5cdFx0XHRcdH0gZWxzZSB7XG5cdFx0XHRcdFx0dGhpcy5jb2xsZWN0RGVmYXVsdFJlc291cmNlcyhwYWNrYWdlUm9vdCwgcmVzb3VyY2VUeXBlLCB0YXJnZXQsIG1ldGFkYXRhKTtcblx0XHRcdFx0fVxuXHRcdFx0fVxuXHRcdFx0cmV0dXJuIHRydWU7XG5cdFx0fVxuXG5cdFx0Y29uc3QgbWFuaWZlc3QgPSB0aGlzLnJlYWRQaU1hbmlmZXN0KHBhY2thZ2VSb290KTtcblx0XHRpZiAobWFuaWZlc3QpIHtcblx0XHRcdGZvciAoY29uc3QgcmVzb3VyY2VUeXBlIG9mIFJFU09VUkNFX1RZUEVTKSB7XG5cdFx0XHRcdGNvbnN0IGVudHJpZXMgPSBtYW5pZmVzdFtyZXNvdXJjZVR5cGUgYXMga2V5b2YgUGlNYW5pZmVzdF07XG5cdFx0XHRcdHRoaXMuYWRkTWFuaWZlc3RFbnRyaWVzKFxuXHRcdFx0XHRcdGVudHJpZXMsXG5cdFx0XHRcdFx0cGFja2FnZVJvb3QsXG5cdFx0XHRcdFx0cmVzb3VyY2VUeXBlLFxuXHRcdFx0XHRcdHRoaXMuZ2V0VGFyZ2V0TWFwKGFjY3VtdWxhdG9yLCByZXNvdXJjZVR5cGUpLFxuXHRcdFx0XHRcdG1ldGFkYXRhLFxuXHRcdFx0XHQpO1xuXHRcdFx0fVxuXHRcdFx0cmV0dXJuIHRydWU7XG5cdFx0fVxuXG5cdFx0bGV0IGhhc0FueURpciA9IGZhbHNlO1xuXHRcdGZvciAoY29uc3QgcmVzb3VyY2VUeXBlIG9mIFJFU09VUkNFX1RZUEVTKSB7XG5cdFx0XHRjb25zdCBkaXIgPSBqb2luKHBhY2thZ2VSb290LCByZXNvdXJjZVR5cGUpO1xuXHRcdFx0aWYgKGV4aXN0c1N5bmMoZGlyKSkge1xuXHRcdFx0XHQvLyBDb2xsZWN0IGFsbCBmaWxlcyBmcm9tIHRoZSBkaXJlY3RvcnkgKGFsbCBlbmFibGVkIGJ5IGRlZmF1bHQpXG5cdFx0XHRcdGNvbnN0IGZpbGVzID0gY29sbGVjdFJlc291cmNlRmlsZXMoZGlyLCByZXNvdXJjZVR5cGUpO1xuXHRcdFx0XHRmb3IgKGNvbnN0IGYgb2YgZmlsZXMpIHtcblx0XHRcdFx0XHR0aGlzLmFkZFJlc291cmNlKHRoaXMuZ2V0VGFyZ2V0TWFwKGFjY3VtdWxhdG9yLCByZXNvdXJjZVR5cGUpLCBmLCBtZXRhZGF0YSwgdHJ1ZSk7XG5cdFx0XHRcdH1cblx0XHRcdFx0aGFzQW55RGlyID0gdHJ1ZTtcblx0XHRcdH1cblx0XHR9XG5cdFx0cmV0dXJuIGhhc0FueURpcjtcblx0fVxuXG5cdHByaXZhdGUgY29sbGVjdERlZmF1bHRSZXNvdXJjZXMoXG5cdFx0cGFja2FnZVJvb3Q6IHN0cmluZyxcblx0XHRyZXNvdXJjZVR5cGU6IFJlc291cmNlVHlwZSxcblx0XHR0YXJnZXQ6IE1hcDxzdHJpbmcsIHsgbWV0YWRhdGE6IFBhdGhNZXRhZGF0YTsgZW5hYmxlZDogYm9vbGVhbiB9Pixcblx0XHRtZXRhZGF0YTogUGF0aE1ldGFkYXRhLFxuXHQpOiB2b2lkIHtcblx0XHRjb25zdCBtYW5pZmVzdCA9IHRoaXMucmVhZFBpTWFuaWZlc3QocGFja2FnZVJvb3QpO1xuXHRcdGNvbnN0IGVudHJpZXMgPSBtYW5pZmVzdD8uW3Jlc291cmNlVHlwZSBhcyBrZXlvZiBQaU1hbmlmZXN0XTtcblx0XHRpZiAoZW50cmllcykge1xuXHRcdFx0dGhpcy5hZGRNYW5pZmVzdEVudHJpZXMoZW50cmllcywgcGFja2FnZVJvb3QsIHJlc291cmNlVHlwZSwgdGFyZ2V0LCBtZXRhZGF0YSk7XG5cdFx0XHRyZXR1cm47XG5cdFx0fVxuXHRcdGNvbnN0IGRpciA9IGpvaW4ocGFja2FnZVJvb3QsIHJlc291cmNlVHlwZSk7XG5cdFx0aWYgKGV4aXN0c1N5bmMoZGlyKSkge1xuXHRcdFx0Ly8gQ29sbGVjdCBhbGwgZmlsZXMgZnJvbSB0aGUgZGlyZWN0b3J5IChhbGwgZW5hYmxlZCBieSBkZWZhdWx0KVxuXHRcdFx0Y29uc3QgZmlsZXMgPSBjb2xsZWN0UmVzb3VyY2VGaWxlcyhkaXIsIHJlc291cmNlVHlwZSk7XG5cdFx0XHRmb3IgKGNvbnN0IGYgb2YgZmlsZXMpIHtcblx0XHRcdFx0dGhpcy5hZGRSZXNvdXJjZSh0YXJnZXQsIGYsIG1ldGFkYXRhLCB0cnVlKTtcblx0XHRcdH1cblx0XHR9XG5cdH1cblxuXHRwcml2YXRlIGFwcGx5UGFja2FnZUZpbHRlcihcblx0XHRwYWNrYWdlUm9vdDogc3RyaW5nLFxuXHRcdHVzZXJQYXR0ZXJuczogc3RyaW5nW10sXG5cdFx0cmVzb3VyY2VUeXBlOiBSZXNvdXJjZVR5cGUsXG5cdFx0dGFyZ2V0OiBNYXA8c3RyaW5nLCB7IG1ldGFkYXRhOiBQYXRoTWV0YWRhdGE7IGVuYWJsZWQ6IGJvb2xlYW4gfT4sXG5cdFx0bWV0YWRhdGE6IFBhdGhNZXRhZGF0YSxcblx0KTogdm9pZCB7XG5cdFx0Y29uc3QgeyBhbGxGaWxlcyB9ID0gdGhpcy5jb2xsZWN0TWFuaWZlc3RGaWxlcyhwYWNrYWdlUm9vdCwgcmVzb3VyY2VUeXBlKTtcblxuXHRcdGlmICh1c2VyUGF0dGVybnMubGVuZ3RoID09PSAwKSB7XG5cdFx0XHQvLyBFbXB0eSBhcnJheSBleHBsaWNpdGx5IGRpc2FibGVzIGFsbCByZXNvdXJjZXMgb2YgdGhpcyB0eXBlXG5cdFx0XHRmb3IgKGNvbnN0IGYgb2YgYWxsRmlsZXMpIHtcblx0XHRcdFx0dGhpcy5hZGRSZXNvdXJjZSh0YXJnZXQsIGYsIG1ldGFkYXRhLCBmYWxzZSk7XG5cdFx0XHR9XG5cdFx0XHRyZXR1cm47XG5cdFx0fVxuXG5cdFx0Ly8gQXBwbHkgdXNlciBwYXR0ZXJuc1xuXHRcdGNvbnN0IGVuYWJsZWRCeVVzZXIgPSBhcHBseVBhdHRlcm5zKGFsbEZpbGVzLCB1c2VyUGF0dGVybnMsIHBhY2thZ2VSb290KTtcblxuXHRcdGZvciAoY29uc3QgZiBvZiBhbGxGaWxlcykge1xuXHRcdFx0Y29uc3QgZW5hYmxlZCA9IGVuYWJsZWRCeVVzZXIuaGFzKGYpO1xuXHRcdFx0dGhpcy5hZGRSZXNvdXJjZSh0YXJnZXQsIGYsIG1ldGFkYXRhLCBlbmFibGVkKTtcblx0XHR9XG5cdH1cblxuXHQvKipcblx0ICogQ29sbGVjdCBhbGwgZmlsZXMgZnJvbSBhIHBhY2thZ2UgZm9yIGEgcmVzb3VyY2UgdHlwZSwgYXBwbHlpbmcgbWFuaWZlc3QgcGF0dGVybnMuXG5cdCAqIFJldHVybnMgeyBhbGxGaWxlcywgZW5hYmxlZEJ5TWFuaWZlc3QgfSB3aGVyZSBlbmFibGVkQnlNYW5pZmVzdCBpcyB0aGUgc2V0IG9mIGZpbGVzXG5cdCAqIHRoYXQgcGFzcyB0aGUgbWFuaWZlc3QncyBvd24gcGF0dGVybnMuXG5cdCAqL1xuXHRwcml2YXRlIGNvbGxlY3RNYW5pZmVzdEZpbGVzKFxuXHRcdHBhY2thZ2VSb290OiBzdHJpbmcsXG5cdFx0cmVzb3VyY2VUeXBlOiBSZXNvdXJjZVR5cGUsXG5cdCk6IHsgYWxsRmlsZXM6IHN0cmluZ1tdOyBlbmFibGVkQnlNYW5pZmVzdDogU2V0PHN0cmluZz4gfSB7XG5cdFx0Y29uc3QgbWFuaWZlc3QgPSB0aGlzLnJlYWRQaU1hbmlmZXN0KHBhY2thZ2VSb290KTtcblx0XHRjb25zdCBlbnRyaWVzID0gbWFuaWZlc3Q/LltyZXNvdXJjZVR5cGUgYXMga2V5b2YgUGlNYW5pZmVzdF07XG5cdFx0aWYgKGVudHJpZXMgJiYgZW50cmllcy5sZW5ndGggPiAwKSB7XG5cdFx0XHRjb25zdCBhbGxGaWxlcyA9IHRoaXMuY29sbGVjdEZpbGVzRnJvbU1hbmlmZXN0RW50cmllcyhlbnRyaWVzLCBwYWNrYWdlUm9vdCwgcmVzb3VyY2VUeXBlKTtcblx0XHRcdGNvbnN0IG1hbmlmZXN0UGF0dGVybnMgPSBlbnRyaWVzLmZpbHRlcihpc092ZXJyaWRlUGF0dGVybik7XG5cdFx0XHRjb25zdCBlbmFibGVkQnlNYW5pZmVzdCA9XG5cdFx0XHRcdG1hbmlmZXN0UGF0dGVybnMubGVuZ3RoID4gMCA/IGFwcGx5UGF0dGVybnMoYWxsRmlsZXMsIG1hbmlmZXN0UGF0dGVybnMsIHBhY2thZ2VSb290KSA6IG5ldyBTZXQoYWxsRmlsZXMpO1xuXHRcdFx0cmV0dXJuIHsgYWxsRmlsZXM6IEFycmF5LmZyb20oZW5hYmxlZEJ5TWFuaWZlc3QpLCBlbmFibGVkQnlNYW5pZmVzdCB9O1xuXHRcdH1cblxuXHRcdGNvbnN0IGNvbnZlbnRpb25EaXIgPSBqb2luKHBhY2thZ2VSb290LCByZXNvdXJjZVR5cGUpO1xuXHRcdGlmICghZXhpc3RzU3luYyhjb252ZW50aW9uRGlyKSkge1xuXHRcdFx0cmV0dXJuIHsgYWxsRmlsZXM6IFtdLCBlbmFibGVkQnlNYW5pZmVzdDogbmV3IFNldCgpIH07XG5cdFx0fVxuXHRcdGNvbnN0IGFsbEZpbGVzID0gY29sbGVjdFJlc291cmNlRmlsZXMoY29udmVudGlvbkRpciwgcmVzb3VyY2VUeXBlKTtcblx0XHRyZXR1cm4geyBhbGxGaWxlcywgZW5hYmxlZEJ5TWFuaWZlc3Q6IG5ldyBTZXQoYWxsRmlsZXMpIH07XG5cdH1cblxuXHRwcml2YXRlIHJlYWRQaU1hbmlmZXN0KHBhY2thZ2VSb290OiBzdHJpbmcpOiBQaU1hbmlmZXN0IHwgbnVsbCB7XG5cdFx0Y29uc3QgcGFja2FnZUpzb25QYXRoID0gam9pbihwYWNrYWdlUm9vdCwgXCJwYWNrYWdlLmpzb25cIik7XG5cdFx0aWYgKCFleGlzdHNTeW5jKHBhY2thZ2VKc29uUGF0aCkpIHtcblx0XHRcdHJldHVybiBudWxsO1xuXHRcdH1cblxuXHRcdHRyeSB7XG5cdFx0XHRjb25zdCBjb250ZW50ID0gcmVhZEZpbGVTeW5jKHBhY2thZ2VKc29uUGF0aCwgXCJ1dGYtOFwiKTtcblx0XHRcdGNvbnN0IHBrZyA9IEpTT04ucGFyc2UoY29udGVudCkgYXMgeyBwaT86IFBpTWFuaWZlc3QgfTtcblx0XHRcdHJldHVybiBwa2cucGkgPz8gbnVsbDtcblx0XHR9IGNhdGNoIHtcblx0XHRcdHJldHVybiBudWxsO1xuXHRcdH1cblx0fVxuXG5cdHByaXZhdGUgYWRkTWFuaWZlc3RFbnRyaWVzKFxuXHRcdGVudHJpZXM6IHN0cmluZ1tdIHwgdW5kZWZpbmVkLFxuXHRcdHJvb3Q6IHN0cmluZyxcblx0XHRyZXNvdXJjZVR5cGU6IFJlc291cmNlVHlwZSxcblx0XHR0YXJnZXQ6IE1hcDxzdHJpbmcsIHsgbWV0YWRhdGE6IFBhdGhNZXRhZGF0YTsgZW5hYmxlZDogYm9vbGVhbiB9Pixcblx0XHRtZXRhZGF0YTogUGF0aE1ldGFkYXRhLFxuXHQpOiB2b2lkIHtcblx0XHRpZiAoIWVudHJpZXMpIHJldHVybjtcblxuXHRcdGNvbnN0IGFsbEZpbGVzID0gdGhpcy5jb2xsZWN0RmlsZXNGcm9tTWFuaWZlc3RFbnRyaWVzKGVudHJpZXMsIHJvb3QsIHJlc291cmNlVHlwZSk7XG5cdFx0Y29uc3QgcGF0dGVybnMgPSBlbnRyaWVzLmZpbHRlcihpc092ZXJyaWRlUGF0dGVybik7XG5cdFx0Y29uc3QgZW5hYmxlZFBhdGhzID0gYXBwbHlQYXR0ZXJucyhhbGxGaWxlcywgcGF0dGVybnMsIHJvb3QpO1xuXG5cdFx0Zm9yIChjb25zdCBmIG9mIGFsbEZpbGVzKSB7XG5cdFx0XHRpZiAoZW5hYmxlZFBhdGhzLmhhcyhmKSkge1xuXHRcdFx0XHR0aGlzLmFkZFJlc291cmNlKHRhcmdldCwgZiwgbWV0YWRhdGEsIHRydWUpO1xuXHRcdFx0fVxuXHRcdH1cblx0fVxuXG5cdHByaXZhdGUgY29sbGVjdEZpbGVzRnJvbU1hbmlmZXN0RW50cmllcyhlbnRyaWVzOiBzdHJpbmdbXSwgcm9vdDogc3RyaW5nLCByZXNvdXJjZVR5cGU6IFJlc291cmNlVHlwZSk6IHN0cmluZ1tdIHtcblx0XHRjb25zdCBzb3VyY2VFbnRyaWVzID0gZW50cmllcy5maWx0ZXIoKGVudHJ5KSA9PiAhaXNPdmVycmlkZVBhdHRlcm4oZW50cnkpKTtcblx0XHRjb25zdCByZXNvbHZlZCA9IHNvdXJjZUVudHJpZXMuZmxhdE1hcCgoZW50cnkpID0+IHtcblx0XHRcdGlmICghaGFzR2xvYlBhdHRlcm4oZW50cnkpKSB7XG5cdFx0XHRcdHJldHVybiBbcmVzb2x2ZShyb290LCBlbnRyeSldO1xuXHRcdFx0fVxuXG5cdFx0XHRyZXR1cm4gZ2xvYlN5bmMoZW50cnksIHtcblx0XHRcdFx0Y3dkOiByb290LFxuXHRcdFx0XHRhYnNvbHV0ZTogdHJ1ZSxcblx0XHRcdFx0ZG90OiBmYWxzZSxcblx0XHRcdFx0bm9kaXI6IGZhbHNlLFxuXHRcdFx0fSkubWFwKChtYXRjaCkgPT4gcmVzb2x2ZShtYXRjaCkpO1xuXHRcdH0pO1xuXHRcdHJldHVybiB0aGlzLmNvbGxlY3RGaWxlc0Zyb21QYXRocyhyZXNvbHZlZCwgcmVzb3VyY2VUeXBlKTtcblx0fVxuXG5cdHByaXZhdGUgcmVzb2x2ZUxvY2FsRW50cmllcyhcblx0XHRlbnRyaWVzOiBzdHJpbmdbXSxcblx0XHRyZXNvdXJjZVR5cGU6IFJlc291cmNlVHlwZSxcblx0XHR0YXJnZXQ6IE1hcDxzdHJpbmcsIHsgbWV0YWRhdGE6IFBhdGhNZXRhZGF0YTsgZW5hYmxlZDogYm9vbGVhbiB9Pixcblx0XHRtZXRhZGF0YTogUGF0aE1ldGFkYXRhLFxuXHRcdGJhc2VEaXI6IHN0cmluZyxcblx0KTogdm9pZCB7XG5cdFx0aWYgKGVudHJpZXMubGVuZ3RoID09PSAwKSByZXR1cm47XG5cblx0XHQvLyBDb2xsZWN0IGFsbCBmaWxlcyBmcm9tIHBsYWluIGVudHJpZXMgKG5vbi1wYXR0ZXJuIGVudHJpZXMpXG5cdFx0Y29uc3QgeyBwbGFpbiwgcGF0dGVybnMgfSA9IHNwbGl0UGF0dGVybnMoZW50cmllcyk7XG5cdFx0Y29uc3QgcmVzb2x2ZWRQbGFpbiA9IHBsYWluLm1hcCgocCkgPT4gdGhpcy5yZXNvbHZlUGF0aEZyb21CYXNlKHAsIGJhc2VEaXIpKTtcblx0XHRjb25zdCBhbGxGaWxlcyA9IHRoaXMuY29sbGVjdEZpbGVzRnJvbVBhdGhzKHJlc29sdmVkUGxhaW4sIHJlc291cmNlVHlwZSk7XG5cblx0XHQvLyBEZXRlcm1pbmUgd2hpY2ggZmlsZXMgYXJlIGVuYWJsZWQgYmFzZWQgb24gcGF0dGVybnNcblx0XHRjb25zdCBlbmFibGVkUGF0aHMgPSBhcHBseVBhdHRlcm5zKGFsbEZpbGVzLCBwYXR0ZXJucywgYmFzZURpcik7XG5cblx0XHQvLyBBZGQgYWxsIGZpbGVzIHdpdGggdGhlaXIgZW5hYmxlZCBzdGF0ZVxuXHRcdGZvciAoY29uc3QgZiBvZiBhbGxGaWxlcykge1xuXHRcdFx0dGhpcy5hZGRSZXNvdXJjZSh0YXJnZXQsIGYsIG1ldGFkYXRhLCBlbmFibGVkUGF0aHMuaGFzKGYpKTtcblx0XHR9XG5cdH1cblxuXHRwcml2YXRlIGFkZEF1dG9EaXNjb3ZlcmVkUmVzb3VyY2VzKFxuXHRcdGFjY3VtdWxhdG9yOiBSZXNvdXJjZUFjY3VtdWxhdG9yLFxuXHRcdGdsb2JhbFNldHRpbmdzOiBSZXR1cm5UeXBlPFNldHRpbmdzTWFuYWdlcltcImdldEdsb2JhbFNldHRpbmdzXCJdPixcblx0XHRwcm9qZWN0U2V0dGluZ3M6IFJldHVyblR5cGU8U2V0dGluZ3NNYW5hZ2VyW1wiZ2V0UHJvamVjdFNldHRpbmdzXCJdPixcblx0XHRnbG9iYWxCYXNlRGlyOiBzdHJpbmcsXG5cdFx0cHJvamVjdEJhc2VEaXI6IHN0cmluZyxcblx0KTogdm9pZCB7XG5cdFx0Y29uc3QgdXNlck1ldGFkYXRhOiBQYXRoTWV0YWRhdGEgPSB7XG5cdFx0XHRzb3VyY2U6IFwiYXV0b1wiLFxuXHRcdFx0c2NvcGU6IFwidXNlclwiLFxuXHRcdFx0b3JpZ2luOiBcInRvcC1sZXZlbFwiLFxuXHRcdFx0YmFzZURpcjogZ2xvYmFsQmFzZURpcixcblx0XHR9O1xuXHRcdGNvbnN0IHByb2plY3RNZXRhZGF0YTogUGF0aE1ldGFkYXRhID0ge1xuXHRcdFx0c291cmNlOiBcImF1dG9cIixcblx0XHRcdHNjb3BlOiBcInByb2plY3RcIixcblx0XHRcdG9yaWdpbjogXCJ0b3AtbGV2ZWxcIixcblx0XHRcdGJhc2VEaXI6IHByb2plY3RCYXNlRGlyLFxuXHRcdH07XG5cblx0XHRjb25zdCB1c2VyT3ZlcnJpZGVzID0ge1xuXHRcdFx0ZXh0ZW5zaW9uczogKGdsb2JhbFNldHRpbmdzLmV4dGVuc2lvbnMgPz8gW10pIGFzIHN0cmluZ1tdLFxuXHRcdFx0c2tpbGxzOiAoZ2xvYmFsU2V0dGluZ3Muc2tpbGxzID8/IFtdKSBhcyBzdHJpbmdbXSxcblx0XHRcdHByb21wdHM6IChnbG9iYWxTZXR0aW5ncy5wcm9tcHRzID8/IFtdKSBhcyBzdHJpbmdbXSxcblx0XHRcdHRoZW1lczogKGdsb2JhbFNldHRpbmdzLnRoZW1lcyA/PyBbXSkgYXMgc3RyaW5nW10sXG5cdFx0fTtcblx0XHRjb25zdCBwcm9qZWN0T3ZlcnJpZGVzID0ge1xuXHRcdFx0ZXh0ZW5zaW9uczogKHByb2plY3RTZXR0aW5ncy5leHRlbnNpb25zID8/IFtdKSBhcyBzdHJpbmdbXSxcblx0XHRcdHNraWxsczogKHByb2plY3RTZXR0aW5ncy5za2lsbHMgPz8gW10pIGFzIHN0cmluZ1tdLFxuXHRcdFx0cHJvbXB0czogKHByb2plY3RTZXR0aW5ncy5wcm9tcHRzID8/IFtdKSBhcyBzdHJpbmdbXSxcblx0XHRcdHRoZW1lczogKHByb2plY3RTZXR0aW5ncy50aGVtZXMgPz8gW10pIGFzIHN0cmluZ1tdLFxuXHRcdH07XG5cblx0XHRjb25zdCB1c2VyRGlycyA9IHtcblx0XHRcdGV4dGVuc2lvbnM6IGpvaW4oZ2xvYmFsQmFzZURpciwgXCJleHRlbnNpb25zXCIpLFxuXHRcdFx0c2tpbGxzOiBqb2luKGdsb2JhbEJhc2VEaXIsIFwic2tpbGxzXCIpLFxuXHRcdFx0cHJvbXB0czogam9pbihnbG9iYWxCYXNlRGlyLCBcInByb21wdHNcIiksXG5cdFx0XHR0aGVtZXM6IGpvaW4oZ2xvYmFsQmFzZURpciwgXCJ0aGVtZXNcIiksXG5cdFx0fTtcblx0XHRjb25zdCBwcm9qZWN0RGlycyA9IHtcblx0XHRcdGV4dGVuc2lvbnM6IGpvaW4ocHJvamVjdEJhc2VEaXIsIFwiZXh0ZW5zaW9uc1wiKSxcblx0XHRcdHNraWxsczogam9pbihwcm9qZWN0QmFzZURpciwgXCJza2lsbHNcIiksXG5cdFx0XHRwcm9tcHRzOiBqb2luKHByb2plY3RCYXNlRGlyLCBcInByb21wdHNcIiksXG5cdFx0XHR0aGVtZXM6IGpvaW4ocHJvamVjdEJhc2VEaXIsIFwidGhlbWVzXCIpLFxuXHRcdH07XG5cdFx0Y29uc3QgdXNlckFnZW50c1NraWxsc0RpciA9IGpvaW4oZ2V0SG9tZURpcigpLCBcIi5hZ2VudHNcIiwgXCJza2lsbHNcIik7XG5cdFx0Y29uc3QgcHJvamVjdEFnZW50c1NraWxsRGlycyA9IGNvbGxlY3RBbmNlc3RvckFnZW50c1NraWxsRGlycyh0aGlzLmN3ZCkuZmlsdGVyKFxuXHRcdFx0KGRpcikgPT4gcmVzb2x2ZShkaXIpICE9PSByZXNvbHZlKHVzZXJBZ2VudHNTa2lsbHNEaXIpLFxuXHRcdCk7XG5cblx0XHRjb25zdCBhZGRSZXNvdXJjZXMgPSAoXG5cdFx0XHRyZXNvdXJjZVR5cGU6IFJlc291cmNlVHlwZSxcblx0XHRcdHBhdGhzOiBzdHJpbmdbXSxcblx0XHRcdG1ldGFkYXRhOiBQYXRoTWV0YWRhdGEsXG5cdFx0XHRvdmVycmlkZXM6IHN0cmluZ1tdLFxuXHRcdFx0YmFzZURpcjogc3RyaW5nLFxuXHRcdCkgPT4ge1xuXHRcdFx0Y29uc3QgdGFyZ2V0ID0gdGhpcy5nZXRUYXJnZXRNYXAoYWNjdW11bGF0b3IsIHJlc291cmNlVHlwZSk7XG5cdFx0XHRmb3IgKGNvbnN0IHBhdGggb2YgcGF0aHMpIHtcblx0XHRcdFx0Y29uc3QgZW5hYmxlZCA9IGlzRW5hYmxlZEJ5T3ZlcnJpZGVzKHBhdGgsIG92ZXJyaWRlcywgYmFzZURpcik7XG5cdFx0XHRcdHRoaXMuYWRkUmVzb3VyY2UodGFyZ2V0LCBwYXRoLCBtZXRhZGF0YSwgZW5hYmxlZCk7XG5cdFx0XHR9XG5cdFx0fTtcblxuXHRcdGFkZFJlc291cmNlcyhcblx0XHRcdFwiZXh0ZW5zaW9uc1wiLFxuXHRcdFx0Y29sbGVjdEF1dG9FeHRlbnNpb25FbnRyaWVzKHByb2plY3REaXJzLmV4dGVuc2lvbnMpLFxuXHRcdFx0cHJvamVjdE1ldGFkYXRhLFxuXHRcdFx0cHJvamVjdE92ZXJyaWRlcy5leHRlbnNpb25zLFxuXHRcdFx0cHJvamVjdEJhc2VEaXIsXG5cdFx0KTtcblx0XHRhZGRSZXNvdXJjZXMoXG5cdFx0XHRcInNraWxsc1wiLFxuXHRcdFx0W1xuXHRcdFx0XHQuLi5jb2xsZWN0QXV0b1NraWxsRW50cmllcyhwcm9qZWN0RGlycy5za2lsbHMsIFwicGlcIiksXG5cdFx0XHRcdC4uLnByb2plY3RBZ2VudHNTa2lsbERpcnMuZmxhdE1hcCgoZGlyKSA9PiBjb2xsZWN0QXV0b1NraWxsRW50cmllcyhkaXIsIFwiYWdlbnRzXCIpKSxcblx0XHRcdF0sXG5cdFx0XHRwcm9qZWN0TWV0YWRhdGEsXG5cdFx0XHRwcm9qZWN0T3ZlcnJpZGVzLnNraWxscyxcblx0XHRcdHByb2plY3RCYXNlRGlyLFxuXHRcdCk7XG5cdFx0YWRkUmVzb3VyY2VzKFxuXHRcdFx0XCJwcm9tcHRzXCIsXG5cdFx0XHRjb2xsZWN0QXV0b1Byb21wdEVudHJpZXMocHJvamVjdERpcnMucHJvbXB0cyksXG5cdFx0XHRwcm9qZWN0TWV0YWRhdGEsXG5cdFx0XHRwcm9qZWN0T3ZlcnJpZGVzLnByb21wdHMsXG5cdFx0XHRwcm9qZWN0QmFzZURpcixcblx0XHQpO1xuXHRcdGFkZFJlc291cmNlcyhcblx0XHRcdFwidGhlbWVzXCIsXG5cdFx0XHRjb2xsZWN0QXV0b1RoZW1lRW50cmllcyhwcm9qZWN0RGlycy50aGVtZXMpLFxuXHRcdFx0cHJvamVjdE1ldGFkYXRhLFxuXHRcdFx0cHJvamVjdE92ZXJyaWRlcy50aGVtZXMsXG5cdFx0XHRwcm9qZWN0QmFzZURpcixcblx0XHQpO1xuXG5cdFx0YWRkUmVzb3VyY2VzKFxuXHRcdFx0XCJleHRlbnNpb25zXCIsXG5cdFx0XHRjb2xsZWN0QXV0b0V4dGVuc2lvbkVudHJpZXModXNlckRpcnMuZXh0ZW5zaW9ucyksXG5cdFx0XHR1c2VyTWV0YWRhdGEsXG5cdFx0XHR1c2VyT3ZlcnJpZGVzLmV4dGVuc2lvbnMsXG5cdFx0XHRnbG9iYWxCYXNlRGlyLFxuXHRcdCk7XG5cdFx0YWRkUmVzb3VyY2VzKFxuXHRcdFx0XCJza2lsbHNcIixcblx0XHRcdFsuLi5jb2xsZWN0QXV0b1NraWxsRW50cmllcyh1c2VyRGlycy5za2lsbHMsIFwicGlcIiksIC4uLmNvbGxlY3RBdXRvU2tpbGxFbnRyaWVzKHVzZXJBZ2VudHNTa2lsbHNEaXIsIFwiYWdlbnRzXCIpXSxcblx0XHRcdHVzZXJNZXRhZGF0YSxcblx0XHRcdHVzZXJPdmVycmlkZXMuc2tpbGxzLFxuXHRcdFx0Z2xvYmFsQmFzZURpcixcblx0XHQpO1xuXHRcdGFkZFJlc291cmNlcyhcblx0XHRcdFwicHJvbXB0c1wiLFxuXHRcdFx0Y29sbGVjdEF1dG9Qcm9tcHRFbnRyaWVzKHVzZXJEaXJzLnByb21wdHMpLFxuXHRcdFx0dXNlck1ldGFkYXRhLFxuXHRcdFx0dXNlck92ZXJyaWRlcy5wcm9tcHRzLFxuXHRcdFx0Z2xvYmFsQmFzZURpcixcblx0XHQpO1xuXHRcdGFkZFJlc291cmNlcyhcblx0XHRcdFwidGhlbWVzXCIsXG5cdFx0XHRjb2xsZWN0QXV0b1RoZW1lRW50cmllcyh1c2VyRGlycy50aGVtZXMpLFxuXHRcdFx0dXNlck1ldGFkYXRhLFxuXHRcdFx0dXNlck92ZXJyaWRlcy50aGVtZXMsXG5cdFx0XHRnbG9iYWxCYXNlRGlyLFxuXHRcdCk7XG5cdH1cblxuXHRwcml2YXRlIGNvbGxlY3RGaWxlc0Zyb21QYXRocyhwYXRoczogc3RyaW5nW10sIHJlc291cmNlVHlwZTogUmVzb3VyY2VUeXBlKTogc3RyaW5nW10ge1xuXHRcdGNvbnN0IGZpbGVzOiBzdHJpbmdbXSA9IFtdO1xuXHRcdGZvciAoY29uc3QgcCBvZiBwYXRocykge1xuXHRcdFx0aWYgKCFleGlzdHNTeW5jKHApKSBjb250aW51ZTtcblxuXHRcdFx0dHJ5IHtcblx0XHRcdFx0Y29uc3Qgc3RhdHMgPSBzdGF0U3luYyhwKTtcblx0XHRcdFx0aWYgKHN0YXRzLmlzRmlsZSgpKSB7XG5cdFx0XHRcdFx0ZmlsZXMucHVzaChwKTtcblx0XHRcdFx0fSBlbHNlIGlmIChzdGF0cy5pc0RpcmVjdG9yeSgpKSB7XG5cdFx0XHRcdFx0ZmlsZXMucHVzaCguLi5jb2xsZWN0UmVzb3VyY2VGaWxlcyhwLCByZXNvdXJjZVR5cGUpKTtcblx0XHRcdFx0fVxuXHRcdFx0fSBjYXRjaCB7XG5cdFx0XHRcdC8vIElnbm9yZSBlcnJvcnNcblx0XHRcdH1cblx0XHR9XG5cdFx0cmV0dXJuIGZpbGVzO1xuXHR9XG5cblx0cHJpdmF0ZSBnZXRUYXJnZXRNYXAoXG5cdFx0YWNjdW11bGF0b3I6IFJlc291cmNlQWNjdW11bGF0b3IsXG5cdFx0cmVzb3VyY2VUeXBlOiBSZXNvdXJjZVR5cGUsXG5cdCk6IE1hcDxzdHJpbmcsIHsgbWV0YWRhdGE6IFBhdGhNZXRhZGF0YTsgZW5hYmxlZDogYm9vbGVhbiB9PiB7XG5cdFx0c3dpdGNoIChyZXNvdXJjZVR5cGUpIHtcblx0XHRcdGNhc2UgXCJleHRlbnNpb25zXCI6XG5cdFx0XHRcdHJldHVybiBhY2N1bXVsYXRvci5leHRlbnNpb25zO1xuXHRcdFx0Y2FzZSBcInNraWxsc1wiOlxuXHRcdFx0XHRyZXR1cm4gYWNjdW11bGF0b3Iuc2tpbGxzO1xuXHRcdFx0Y2FzZSBcInByb21wdHNcIjpcblx0XHRcdFx0cmV0dXJuIGFjY3VtdWxhdG9yLnByb21wdHM7XG5cdFx0XHRjYXNlIFwidGhlbWVzXCI6XG5cdFx0XHRcdHJldHVybiBhY2N1bXVsYXRvci50aGVtZXM7XG5cdFx0XHRkZWZhdWx0OlxuXHRcdFx0XHR0aHJvdyBuZXcgRXJyb3IoYFVua25vd24gcmVzb3VyY2UgdHlwZTogJHtyZXNvdXJjZVR5cGV9YCk7XG5cdFx0fVxuXHR9XG5cblx0cHJpdmF0ZSBhZGRSZXNvdXJjZShcblx0XHRtYXA6IE1hcDxzdHJpbmcsIHsgbWV0YWRhdGE6IFBhdGhNZXRhZGF0YTsgZW5hYmxlZDogYm9vbGVhbiB9Pixcblx0XHRwYXRoOiBzdHJpbmcsXG5cdFx0bWV0YWRhdGE6IFBhdGhNZXRhZGF0YSxcblx0XHRlbmFibGVkOiBib29sZWFuLFxuXHQpOiB2b2lkIHtcblx0XHRpZiAoIXBhdGgpIHJldHVybjtcblx0XHRpZiAoIW1hcC5oYXMocGF0aCkpIHtcblx0XHRcdG1hcC5zZXQocGF0aCwgeyBtZXRhZGF0YSwgZW5hYmxlZCB9KTtcblx0XHR9XG5cdH1cblxuXHRwcml2YXRlIGNyZWF0ZUFjY3VtdWxhdG9yKCk6IFJlc291cmNlQWNjdW11bGF0b3Ige1xuXHRcdHJldHVybiB7XG5cdFx0XHRleHRlbnNpb25zOiBuZXcgTWFwKCksXG5cdFx0XHRza2lsbHM6IG5ldyBNYXAoKSxcblx0XHRcdHByb21wdHM6IG5ldyBNYXAoKSxcblx0XHRcdHRoZW1lczogbmV3IE1hcCgpLFxuXHRcdH07XG5cdH1cblxuXHRwcml2YXRlIHRvUmVzb2x2ZWRQYXRocyhhY2N1bXVsYXRvcjogUmVzb3VyY2VBY2N1bXVsYXRvcik6IFJlc29sdmVkUGF0aHMge1xuXHRcdGNvbnN0IG1hcFRvUmVzb2x2ZWQgPSAoXG5cdFx0XHRlbnRyaWVzOiBNYXA8c3RyaW5nLCB7IG1ldGFkYXRhOiBQYXRoTWV0YWRhdGE7IGVuYWJsZWQ6IGJvb2xlYW4gfT4sXG5cdFx0KTogUmVzb2x2ZWRSZXNvdXJjZVtdID0+IHtcblx0XHRcdGNvbnN0IHJlc29sdmVkID0gQXJyYXkuZnJvbShlbnRyaWVzLmVudHJpZXMoKSkubWFwKChbcGF0aCwgeyBtZXRhZGF0YSwgZW5hYmxlZCB9XSkgPT4gKHtcblx0XHRcdFx0cGF0aCxcblx0XHRcdFx0ZW5hYmxlZCxcblx0XHRcdFx0bWV0YWRhdGEsXG5cdFx0XHR9KSk7XG5cdFx0XHRyZXNvbHZlZC5zb3J0KChhLCBiKSA9PiByZXNvdXJjZVByZWNlZGVuY2VSYW5rKGEubWV0YWRhdGEpIC0gcmVzb3VyY2VQcmVjZWRlbmNlUmFuayhiLm1ldGFkYXRhKSk7XG5cblx0XHRcdGNvbnN0IHNlZW4gPSBuZXcgU2V0PHN0cmluZz4oKTtcblx0XHRcdHJldHVybiByZXNvbHZlZC5maWx0ZXIoKGVudHJ5KSA9PiB7XG5cdFx0XHRcdGNvbnN0IGNhbm9uaWNhbFBhdGggPSBjYW5vbmljYWxpemVQYXRoKGVudHJ5LnBhdGgpO1xuXHRcdFx0XHRpZiAoc2Vlbi5oYXMoY2Fub25pY2FsUGF0aCkpIHJldHVybiBmYWxzZTtcblx0XHRcdFx0c2Vlbi5hZGQoY2Fub25pY2FsUGF0aCk7XG5cdFx0XHRcdHJldHVybiB0cnVlO1xuXHRcdFx0fSk7XG5cdFx0fTtcblxuXHRcdHJldHVybiB7XG5cdFx0XHRleHRlbnNpb25zOiBtYXBUb1Jlc29sdmVkKGFjY3VtdWxhdG9yLmV4dGVuc2lvbnMpLFxuXHRcdFx0c2tpbGxzOiBtYXBUb1Jlc29sdmVkKGFjY3VtdWxhdG9yLnNraWxscyksXG5cdFx0XHRwcm9tcHRzOiBtYXBUb1Jlc29sdmVkKGFjY3VtdWxhdG9yLnByb21wdHMpLFxuXHRcdFx0dGhlbWVzOiBtYXBUb1Jlc29sdmVkKGFjY3VtdWxhdG9yLnRoZW1lcyksXG5cdFx0fTtcblx0fVxuXG5cdHByaXZhdGUgc2hvdWxkVXNlV2luZG93c1NoZWxsKGNvbW1hbmQ6IHN0cmluZyk6IGJvb2xlYW4ge1xuXHRcdGlmIChwcm9jZXNzLnBsYXRmb3JtICE9PSBcIndpbjMyXCIpIHtcblx0XHRcdHJldHVybiBmYWxzZTtcblx0XHR9XG5cdFx0Y29uc3QgY29tbWFuZE5hbWUgPSBiYXNlbmFtZShjb21tYW5kKS50b0xvd2VyQ2FzZSgpO1xuXHRcdHJldHVybiAoXG5cdFx0XHRjb21tYW5kTmFtZSA9PT0gXCJucG1cIiB8fFxuXHRcdFx0Y29tbWFuZE5hbWUgPT09IFwibnB4XCIgfHxcblx0XHRcdGNvbW1hbmROYW1lID09PSBcInBucG1cIiB8fFxuXHRcdFx0Y29tbWFuZE5hbWUgPT09IFwieWFyblwiIHx8XG5cdFx0XHRjb21tYW5kTmFtZSA9PT0gXCJ5YXJucGtnXCIgfHxcblx0XHRcdGNvbW1hbmROYW1lID09PSBcImNvcmVwYWNrXCIgfHxcblx0XHRcdGNvbW1hbmROYW1lLmVuZHNXaXRoKFwiLmNtZFwiKSB8fFxuXHRcdFx0Y29tbWFuZE5hbWUuZW5kc1dpdGgoXCIuYmF0XCIpXG5cdFx0KTtcblx0fVxuXG5cdHByaXZhdGUgc3Bhd25Db21tYW5kKGNvbW1hbmQ6IHN0cmluZywgYXJnczogc3RyaW5nW10sIG9wdGlvbnM/OiB7IGN3ZD86IHN0cmluZyB9KTogQ2hpbGRQcm9jZXNzIHtcblx0XHRyZXR1cm4gc3Bhd24oY29tbWFuZCwgYXJncywge1xuXHRcdFx0Y3dkOiBvcHRpb25zPy5jd2QsXG5cdFx0XHRzdGRpbzogaXNTdGRvdXRUYWtlbk92ZXIoKSA/IFtcImlnbm9yZVwiLCAyLCAyXSA6IFwiaW5oZXJpdFwiLFxuXHRcdFx0c2hlbGw6IHRoaXMuc2hvdWxkVXNlV2luZG93c1NoZWxsKGNvbW1hbmQpLFxuXHRcdFx0ZW52OiBnZXRFbnYoKSxcblx0XHR9KTtcblx0fVxuXG5cdHByaXZhdGUgc3Bhd25DYXB0dXJlQ29tbWFuZChcblx0XHRjb21tYW5kOiBzdHJpbmcsXG5cdFx0YXJnczogc3RyaW5nW10sXG5cdFx0b3B0aW9ucz86IHsgY3dkPzogc3RyaW5nOyBlbnY/OiBSZWNvcmQ8c3RyaW5nLCBzdHJpbmc+IH0sXG5cdCk6IENoaWxkUHJvY2Vzc0J5U3RkaW88bnVsbCwgUmVhZGFibGUsIFJlYWRhYmxlPiB7XG5cdFx0Y29uc3QgYmFzZUVudiA9IGdldEVudigpO1xuXHRcdHJldHVybiBzcGF3bihjb21tYW5kLCBhcmdzLCB7XG5cdFx0XHRjd2Q6IG9wdGlvbnM/LmN3ZCxcblx0XHRcdHN0ZGlvOiBbXCJpZ25vcmVcIiwgXCJwaXBlXCIsIFwicGlwZVwiXSxcblx0XHRcdHNoZWxsOiB0aGlzLnNob3VsZFVzZVdpbmRvd3NTaGVsbChjb21tYW5kKSxcblx0XHRcdGVudjogb3B0aW9ucz8uZW52ID8geyAuLi5iYXNlRW52LCAuLi5vcHRpb25zLmVudiB9IDogYmFzZUVudixcblx0XHR9KTtcblx0fVxuXG5cdHByaXZhdGUgcnVuQ29tbWFuZENhcHR1cmUoXG5cdFx0Y29tbWFuZDogc3RyaW5nLFxuXHRcdGFyZ3M6IHN0cmluZ1tdLFxuXHRcdG9wdGlvbnM/OiB7IGN3ZD86IHN0cmluZzsgdGltZW91dE1zPzogbnVtYmVyOyBlbnY/OiBSZWNvcmQ8c3RyaW5nLCBzdHJpbmc+IH0sXG5cdCk6IFByb21pc2U8c3RyaW5nPiB7XG5cdFx0cmV0dXJuIG5ldyBQcm9taXNlKChyZXNvbHZlUHJvbWlzZSwgcmVqZWN0KSA9PiB7XG5cdFx0XHRjb25zdCBjaGlsZCA9IHRoaXMuc3Bhd25DYXB0dXJlQ29tbWFuZChjb21tYW5kLCBhcmdzLCBvcHRpb25zKTtcblx0XHRcdGxldCBzdGRvdXQgPSBcIlwiO1xuXHRcdFx0bGV0IHN0ZGVyciA9IFwiXCI7XG5cdFx0XHRsZXQgdGltZWRPdXQgPSBmYWxzZTtcblx0XHRcdGNvbnN0IHRpbWVvdXQgPVxuXHRcdFx0XHR0eXBlb2Ygb3B0aW9ucz8udGltZW91dE1zID09PSBcIm51bWJlclwiXG5cdFx0XHRcdFx0PyBzZXRUaW1lb3V0KCgpID0+IHtcblx0XHRcdFx0XHRcdFx0dGltZWRPdXQgPSB0cnVlO1xuXHRcdFx0XHRcdFx0XHRjaGlsZC5raWxsKCk7XG5cdFx0XHRcdFx0XHR9LCBvcHRpb25zLnRpbWVvdXRNcylcblx0XHRcdFx0XHQ6IHVuZGVmaW5lZDtcblxuXHRcdFx0Y2hpbGQuc3Rkb3V0Py5vbihcImRhdGFcIiwgKGRhdGEpID0+IHtcblx0XHRcdFx0c3Rkb3V0ICs9IGRhdGEudG9TdHJpbmcoKTtcblx0XHRcdH0pO1xuXHRcdFx0Y2hpbGQuc3RkZXJyPy5vbihcImRhdGFcIiwgKGRhdGEpID0+IHtcblx0XHRcdFx0c3RkZXJyICs9IGRhdGEudG9TdHJpbmcoKTtcblx0XHRcdH0pO1xuXHRcdFx0Y2hpbGQub25jZShcImVycm9yXCIsIChlcnJvcikgPT4ge1xuXHRcdFx0XHRpZiAodGltZW91dCkgY2xlYXJUaW1lb3V0KHRpbWVvdXQpO1xuXHRcdFx0XHRyZWplY3QoZXJyb3IpO1xuXHRcdFx0fSk7XG5cdFx0XHRjaGlsZC5vbmNlKFwiY2xvc2VcIiwgKGNvZGUsIHNpZ25hbCkgPT4ge1xuXHRcdFx0XHRpZiAodGltZW91dCkgY2xlYXJUaW1lb3V0KHRpbWVvdXQpO1xuXHRcdFx0XHRpZiAodGltZWRPdXQpIHtcblx0XHRcdFx0XHRyZWplY3QobmV3IEVycm9yKGAke2NvbW1hbmR9ICR7YXJncy5qb2luKFwiIFwiKX0gdGltZWQgb3V0IGFmdGVyICR7b3B0aW9ucz8udGltZW91dE1zfW1zYCkpO1xuXHRcdFx0XHRcdHJldHVybjtcblx0XHRcdFx0fVxuXHRcdFx0XHRpZiAoY29kZSA9PT0gMCkge1xuXHRcdFx0XHRcdHJlc29sdmVQcm9taXNlKHN0ZG91dC50cmltKCkpO1xuXHRcdFx0XHRcdHJldHVybjtcblx0XHRcdFx0fVxuXHRcdFx0XHRjb25zdCBleGl0U3RhdHVzID0gY29kZSA9PT0gbnVsbCA/IGBzaWduYWwgJHtzaWduYWwgPz8gXCJ1bmtub3duXCJ9YCA6IGBjb2RlICR7Y29kZX1gO1xuXHRcdFx0XHRyZWplY3QobmV3IEVycm9yKGAke2NvbW1hbmR9ICR7YXJncy5qb2luKFwiIFwiKX0gZmFpbGVkIHdpdGggJHtleGl0U3RhdHVzfTogJHtzdGRlcnIgfHwgc3Rkb3V0fWApKTtcblx0XHRcdH0pO1xuXHRcdH0pO1xuXHR9XG5cblx0cHJpdmF0ZSBydW5Db21tYW5kKGNvbW1hbmQ6IHN0cmluZywgYXJnczogc3RyaW5nW10sIG9wdGlvbnM/OiB7IGN3ZD86IHN0cmluZyB9KTogUHJvbWlzZTx2b2lkPiB7XG5cdFx0cmV0dXJuIG5ldyBQcm9taXNlKChyZXNvbHZlUHJvbWlzZSwgcmVqZWN0KSA9PiB7XG5cdFx0XHRjb25zdCBjaGlsZCA9IHRoaXMuc3Bhd25Db21tYW5kKGNvbW1hbmQsIGFyZ3MsIG9wdGlvbnMpO1xuXHRcdFx0Y2hpbGQub24oXCJlcnJvclwiLCByZWplY3QpO1xuXHRcdFx0Y2hpbGQub24oXCJleGl0XCIsIChjb2RlKSA9PiB7XG5cdFx0XHRcdGlmIChjb2RlID09PSAwKSB7XG5cdFx0XHRcdFx0cmVzb2x2ZVByb21pc2UoKTtcblx0XHRcdFx0fSBlbHNlIHtcblx0XHRcdFx0XHRyZWplY3QobmV3IEVycm9yKGAke2NvbW1hbmR9ICR7YXJncy5qb2luKFwiIFwiKX0gZmFpbGVkIHdpdGggY29kZSAke2NvZGV9YCkpO1xuXHRcdFx0XHR9XG5cdFx0XHR9KTtcblx0XHR9KTtcblx0fVxuXG5cdHByaXZhdGUgcnVuQ29tbWFuZFN5bmMoY29tbWFuZDogc3RyaW5nLCBhcmdzOiBzdHJpbmdbXSk6IHN0cmluZyB7XG5cdFx0Y29uc3QgcmVzdWx0ID0gc3Bhd25TeW5jKGNvbW1hbmQsIGFyZ3MsIHtcblx0XHRcdHN0ZGlvOiBbXCJpZ25vcmVcIiwgXCJwaXBlXCIsIFwicGlwZVwiXSxcblx0XHRcdGVuY29kaW5nOiBcInV0Zi04XCIsXG5cdFx0XHRzaGVsbDogdGhpcy5zaG91bGRVc2VXaW5kb3dzU2hlbGwoY29tbWFuZCksXG5cdFx0XHRlbnY6IGdldEVudigpLFxuXHRcdH0pO1xuXHRcdGlmIChyZXN1bHQuZXJyb3IgfHwgcmVzdWx0LnN0YXR1cyAhPT0gMCkge1xuXHRcdFx0dGhyb3cgbmV3IEVycm9yKFxuXHRcdFx0XHRgRmFpbGVkIHRvIHJ1biAke2NvbW1hbmR9ICR7YXJncy5qb2luKFwiIFwiKX06ICR7cmVzdWx0LmVycm9yPy5tZXNzYWdlIHx8IHJlc3VsdC5zdGRlcnIgfHwgcmVzdWx0LnN0ZG91dH1gLFxuXHRcdFx0KTtcblx0XHR9XG5cdFx0cmV0dXJuIChyZXN1bHQuc3Rkb3V0IHx8IHJlc3VsdC5zdGRlcnIgfHwgXCJcIikudHJpbSgpO1xuXHR9XG59XG4ifV0sImlzRXJyb3IiOmZhbHNlLCJ0aW1lc3RhbXAiOjE3Nzc1NjQxODU2Nzl9fSx7InR5cGUiOiJtZXNzYWdlIiwiaWQiOiIyNzZhMGRiZCIsInBhcmVudElkIjoiZDhlZDFkMGQiLCJ0aW1lc3RhbXAiOiIyMDI2LTA0LTMwVDE1OjUwOjE2LjM1OFoiLCJtZXNzYWdlIjp7InJvbGUiOiJhc3Npc3RhbnQiLCJjb250ZW50IjpbeyJ0eXBlIjoidGhpbmtpbmciLCJ0aGlua2luZyI6Ik5vdyBJIGhhdmUgYSBjbGVhciB1bmRlcnN0YW5kaW5nIG9mIHRoZSBpc3N1ZSBhbmQgdGhlIGZpeCBuZWVkZWQuIExldCBtZSBhbHNvIGNoZWNrIHRoZSBgZ2V0UmVzb3VyY2VQYXR0ZXJuYCBtZXRob2QgaW4gYGNvbmZpZy1zZWxlY3Rvci50c2AgYmVjYXVzZSBpdCB1c2VzIGBnZXRUb3BMZXZlbEJhc2VEaXIoc2NvcGUpYCB3aGljaCBtYXkgbmVlZCB1cGRhdGluZyBzaW5jZSBgLmFnZW50c2Agc2tpbGxzIG5vdyBoYXZlIHRoZWlyIG93biBgYmFzZURpcmAuXG5cbkxldCBtZSBsb29rIGF0IHdoYXQgYGdldFJlc291cmNlUGF0dGVybmAgZG9lczpcblxuYGBgdHNcbnByaXZhdGUgZ2V0UmVzb3VyY2VQYXR0ZXJuKGl0ZW06IFJlc291cmNlSXRlbSk6IHN0cmluZyB7XG4gICAgY29uc3Qgc2NvcGUgPSBpdGVtLm1ldGFkYXRhLnNjb3BlIGFzIFwidXNlclwiIHwgXCJwcm9qZWN0XCI7XG4gICAgY29uc3QgYmFzZURpciA9IHRoaXMuZ2V0VG9wTGV2ZWxCYXNlRGlyKHNjb3BlKTtcbiAgICByZXR1cm4gcmVsYXRpdmUoYmFzZURpciwgaXRlbS5wYXRoKTtcbn1cbmBgYFxuXG5UaGlzIGlzIHVzZWQgd2hlbiB0b2dnbGluZyB0b3AtbGV2ZWwgcmVzb3VyY2VzLiBGb3IgYC5hZ2VudHNgIHNraWxscywgd2UgbmVlZCB0aGUgcGF0dGVybiB0byBiZSByZWxhdGl2ZSB0byB0aGUgYC5hZ2VudHNgIGRpciwgbm90IGAucGlgIGRpci4gQnV0IHdhaXQsIHRoZSB0b2dnbGUgY3VycmVudGx5IHVzZXMgYGdldFRvcExldmVsQmFzZURpcihzY29wZSlgIHdoaWNoIHJldHVybnMgYGN3ZC8ucGlgIG9yIGBhZ2VudERpcmAuIElmIGAuYWdlbnRzYCBza2lsbHMgYXJlIHRvZ2dsZWQsIHRoZSBwYXR0ZXJuIHdvdWxkIGJlIHdyb25nLlxuXG5BY3R1YWxseSwgbG9va2luZyBtb3JlIGNhcmVmdWxseSAtIGZvciBhdXRvLWRpc2NvdmVyZWQgc2tpbGxzIGZyb20gYC5hZ2VudHNgLCB3aGVuIHRvZ2dsZWQsIHRoZSBvdmVycmlkZSBwYXR0ZXJuIHNob3VsZCBiZSBzdG9yZWQgcmVsYXRpdmUgdG8gdGhlIGAuYWdlbnRzYCBiYXNlIGRpci4gU2luY2Ugd2Ugbm93IGhhdmUgYG1ldGFkYXRhLmJhc2VEaXJgIG9uIHRoZXNlIGl0ZW1zLCB3ZSBjYW4gdXNlIHRoYXQgaW5zdGVhZCBvZiBgZ2V0VG9wTGV2ZWxCYXNlRGlyYC5cblxuTGV0IG1lIHZlcmlmeTogYGdldFRvcExldmVsQmFzZURpcihzY29wZSlgIHJldHVybnM6XG4tIHByb2plY3Q6IGBqb2luKHRoaXMuY3dkLCBDT05GSUdfRElSX05BTUUpYCDihpIgYGN3ZC8ucGlgXG4tIHVzZXI6IGB0aGlzLmFnZW50RGlyYCDihpIgYH4vLnBpL2FnZW50YFxuXG5Gb3IgYC5hZ2VudHNgIHNraWxscywgYG1ldGFkYXRhLmJhc2VEaXJgIGlzIGB+Ly5hZ2VudHNgIG9yIGBjd2QvLmFnZW50c2AuIFNvIHdoZW4gdG9nZ2xpbmcsIHdlIHNob3VsZCB1c2UgYGl0ZW0ubWV0YWRhdGEuYmFzZURpcmAgaWYgYXZhaWxhYmxlLlxuXG5MZXQgbWUgbG9vayBhdCBgZ2V0UmVzb3VyY2VQYXR0ZXJuYCBhZ2FpbjpcblxuYGBgdHNcbnByaXZhdGUgZ2V0UmVzb3VyY2VQYXR0ZXJuKGl0ZW06IFJlc291cmNlSXRlbSk6IHN0cmluZyB7XG4gICAgY29uc3Qgc2NvcGUgPSBpdGVtLm1ldGFkYXRhLnNjb3BlIGFzIFwidXNlclwiIHwgXCJwcm9qZWN0XCI7XG4gICAgY29uc3QgYmFzZURpciA9IHRoaXMuZ2V0VG9wTGV2ZWxCYXNlRGlyKHNjb3BlKTtcbiAgICByZXR1cm4gcmVsYXRpdmUoYmFzZURpciwgaXRlbS5wYXRoKTtcbn1cbmBgYFxuXG5UaGlzIHNob3VsZCBwcm9iYWJseSBiZTpcbmBgYHRzXG5wcml2YXRlIGdldFJlc291cmNlUGF0dGVybihpdGVtOiBSZXNvdXJjZUl0ZW0pOiBzdHJpbmcge1xuICAgIGNvbnN0IGJhc2VEaXIgPSBpdGVtLm1ldGFkYXRhLmJhc2VEaXIgPz8gdGhpcy5nZXRUb3BMZXZlbEJhc2VEaXIoaXRlbS5tZXRhZGF0YS5zY29wZSBhcyBcInVzZXJcIiB8IFwicHJvamVjdFwiKTtcbiAgICByZXR1cm4gcmVsYXRpdmUoYmFzZURpciwgaXRlbS5wYXRoKTtcbn1cbmBgYFxuXG5Ob3cgbGV0IG1lIGltcGxlbWVudCB0aGUgY2hhbmdlczpcblxuMS4gSW4gYHBhY2thZ2UtbWFuYWdlci50c2A6IFVwZGF0ZSBgYWRkQXV0b0Rpc2NvdmVyZWRSZXNvdXJjZXNgIHRvIHByZXNlcnZlIHJvb3QgcHJvdmVuYW5jZSBmb3IgYC5hZ2VudHNgIHNraWxsc1xuMi4gSW4gYGNvbmZpZy1zZWxlY3Rvci50c2A6IFVwZGF0ZSBgYnVpbGRHcm91cHNgIGdyb3VwIGtleSwgYGdldEdyb3VwTGFiZWxgLCBhbmQgYGdldFJlc291cmNlUGF0dGVybmBcblxuTGV0IG1lIGFsc28gY2hlY2sgaWYgYGhvbWVkaXJgIGlzIGFscmVhZHkgaW1wb3J0ZWQgaW4gYGNvbmZpZy1zZWxlY3Rvci50c2AuIExvb2tpbmcgYXQgdGhlIGltcG9ydHM6XG5cbmBgYHRzXG5pbXBvcnQgeyBiYXNlbmFtZSwgZGlybmFtZSwgam9pbiwgcmVsYXRpdmUgfSBmcm9tIFwibm9kZTpwYXRoXCI7XG5gYGBcblxuSSBuZWVkIHRvIGFkZCBgaG9tZWRpcmAgZnJvbSBgbm9kZTpvc2AuXG5cbkxldCBtZSBpbXBsZW1lbnQgdGhlIGZpeCBzdGVwIGJ5IHN0ZXAuXG5cbkZpcnN0LCBwYWNrYWdlLW1hbmFnZXIudHMgY2hhbmdlczpcblxuSW4gYGFkZEF1dG9EaXNjb3ZlcmVkUmVzb3VyY2VzYCwgdGhlIGN1cnJlbnQgY29kZTpcbmBgYHRzXG5hZGRSZXNvdXJjZXMoXG4gICAgXCJza2lsbHNcIixcbiAgICBbXG4gICAgICAgIC4uLmNvbGxlY3RBdXRvU2tpbGxFbnRyaWVzKHByb2plY3REaXJzLnNraWxscywgXCJwaVwiKSxcbiAgICAgICAgLi4ucHJvamVjdEFnZW50c1NraWxsRGlycy5mbGF0TWFwKChkaXIpID0+IGNvbGxlY3RBdXRvU2tpbGxFbnRyaWVzKGRpciwgXCJhZ2VudHNcIikpLFxuICAgIF0sXG4gICAgcHJvamVjdE1ldGFkYXRhLFxuICAgIHByb2plY3RPdmVycmlkZXMuc2tpbGxzLFxuICAgIHByb2plY3RCYXNlRGlyLFxuKTtcbmBgYFxuXG5TaG91bGQgYmUgY2hhbmdlZCB0bzpcbmBgYHRzXG5mb3IgKGNvbnN0IHNvdXJjZSBvZiBwcm9qZWN0U2tpbGxTb3VyY2VzKSB7XG4gICAgYWRkUmVzb3VyY2VzKFwic2tpbGxzXCIsIHNvdXJjZS5wYXRocywgc291cmNlLm1ldGFkYXRhLCBwcm9qZWN0T3ZlcnJpZGVzLnNraWxscywgc291cmNlLmJhc2VEaXIpO1xuIiwidGhpbmtpbmdTaWduYXR1cmUiOiJyZWFzb25pbmcifV0sImFwaSI6Im9wZW5haS1jb21wbGV0aW9ucyIsInByb3ZpZGVyIjoib3BlbmNvZGUtZ28iLCJtb2RlbCI6ImtpbWktazIuNiIsInVzYWdlIjp7ImlucHV0IjowLCJvdXRwdXQiOjAsImNhY2hlUmVhZCI6MCwiY2FjaGVXcml0ZSI6MCwidG90YWxUb2tlbnMiOjAsImNvc3QiOnsiaW5wdXQiOjAsIm91dHB1dCI6MCwiY2FjaGVSZWFkIjowLCJjYWNoZVdyaXRlIjowLCJ0b3RhbCI6MH19LCJzdG9wUmVhc29uIjoiYWJvcnRlZCIsInRpbWVzdGFtcCI6MTc3NzU2NDE4NTY4MCwicmVzcG9uc2VJZCI6Imdlbi0xNzc3NTY0MTg1LXJScWFvZEs2NW9IdmZLaVFYaURLIiwiZXJyb3JNZXNzYWdlIjoiT3BlcmF0aW9uIGFib3J0ZWQifX0seyJ0eXBlIjoibW9kZWxfY2hhbmdlIiwiaWQiOiI0Y2Y4ZWQ1MyIsInBhcmVudElkIjoiZDNkN2MzMGIiLCJ0aW1lc3RhbXAiOiIyMDI2LTA0LTMwVDE1OjUwOjI1LjMzNVoiLCJwcm92aWRlciI6InN5bnRoZXRpYyIsIm1vZGVsSWQiOiJoZjptb29uc2hvdGFpL0tpbWktSzIuNSJ9LHsidHlwZSI6InRoaW5raW5nX2xldmVsX2NoYW5nZSIsImlkIjoiMjY1NWMwMjciLCJwYXJlbnRJZCI6IjRjZjhlZDUzIiwidGltZXN0YW1wIjoiMjAyNi0wNC0zMFQxNTo1MDoyNi42MjNaIiwidGhpbmtpbmdMZXZlbCI6Im1pbmltYWwifSx7InR5cGUiOiJ0aGlua2luZ19sZXZlbF9jaGFuZ2UiLCJpZCI6Ijc1NGEwMTBlIiwicGFyZW50SWQiOiIyNjU1YzAyNyIsInRpbWVzdGFtcCI6IjIwMjYtMDQtMzBUMTU6NTA6MjcuMjAyWiIsInRoaW5raW5nTGV2ZWwiOiJsb3cifSx7InR5cGUiOiJ0aGlua2luZ19sZXZlbF9jaGFuZ2UiLCJpZCI6IjNkMWMxNjc2IiwicGFyZW50SWQiOiI3NTRhMDEwZSIsInRpbWVzdGFtcCI6IjIwMjYtMDQtMzBUMTU6NTA6MjcuMzY4WiIsInRoaW5raW5nTGV2ZWwiOiJtZWRpdW0ifSx7InR5cGUiOiJ0aGlua2luZ19sZXZlbF9jaGFuZ2UiLCJpZCI6ImY5YmVjNjhhIiwicGFyZW50SWQiOiIzZDFjMTY3NiIsInRpbWVzdGFtcCI6IjIwMjYtMDQtMzBUMTU6NTA6MjcuNTIzWiIsInRoaW5raW5nTGV2ZWwiOiJoaWdoIn0seyJ0eXBlIjoidGhpbmtpbmdfbGV2ZWxfY2hhbmdlIiwiaWQiOiI5NGNlMmE2ZSIsInBhcmVudElkIjoiZjliZWM2OGEiLCJ0aW1lc3RhbXAiOiIyMDI2LTA0LTMwVDE1OjUwOjI3LjgzNVoiLCJ0aGlua2luZ0xldmVsIjoib2ZmIn0seyJ0eXBlIjoibWVzc2FnZSIsImlkIjoiMWFhZWI5OWUiLCJwYXJlbnRJZCI6Ijk0Y2UyYTZlIiwidGltZXN0YW1wIjoiMjAyNi0wNC0zMFQxNTo1MDoyOC43MzZaIiwibWVzc2FnZSI6eyJyb2xlIjoidXNlciIsImNvbnRlbnQiOlt7InR5cGUiOiJ0ZXh0IiwidGV4dCI6ImltcGxlbWVudCB0aGUgZml4IHRvIHRoZSBidWcgdXNpbmcgdGhlIGZpeCBkaXJlY3Rpb24gYW5kIGNoZWNrIHRoYXQgYWxsIG9mIHRoZSB0ZXN0cyBwYXNzIn1dLCJ0aW1lc3RhbXAiOjE3Nzc1NjQyMjg3MzV9fSx7InR5cGUiOiJtZXNzYWdlIiwiaWQiOiJkMjZkMDM2MCIsInBhcmVudElkIjoiMWFhZWI5OWUiLCJ0aW1lc3RhbXAiOiIyMDI2LTA0LTMwVDE1OjUwOjMyLjAzM1oiLCJtZXNzYWdlIjp7InJvbGUiOiJhc3Npc3RhbnQiLCJjb250ZW50IjpbeyJ0eXBlIjoidGhpbmtpbmciLCJ0aGlua2luZyI6IiBUaGUgdXNlciB3YW50cyBtZSB0byBpbXBsZW1lbnQgYSBmaXggZm9yIGEgYnVnIGluIHRoZSBwYWNrYWdlLW1hbmFnZXIudHMgZmlsZSB3aGVyZSBhdXRvLWRpc2NvdmVyZWQgc2tpbGxzIGZyb20gYH4vLmFnZW50cy9za2lsbHNgIGFyZSBpbmNvcnJlY3RseSBncm91cGVkIHVuZGVyIGBVc2VyICh+Ly5waS9hZ2VudC8pYCBiZWNhdXNlIHRoZXkgc2hhcmUgdGhlIHNhbWUgbWV0YWRhdGEuXG5cbkxldCBtZSBzdGFydCBieSByZWFkaW5nIHRoZSByZWxldmFudCBmaWxlcyB0byB1bmRlcnN0YW5kIHRoZSBjdXJyZW50IGltcGxlbWVudGF0aW9uOlxuXG4xLiBGaXJzdCwgSSdsbCByZWFkIHRoZSBwYWNrYWdlLW1hbmFnZXIudHMgZmlsZSB0byBzZWUgdGhlIGN1cnJlbnQgaW1wbGVtZW50YXRpb25cbjIuIFRoZW4gcmVhZCB0aGUgY29uZmlnLXNlbGVjdG9yLnRzIHRvIHVuZGVyc3RhbmQgdGhlIGdyb3VwaW5nIGxvZ2ljXG4zLiBMb29rIGF0IHRoZSB0ZXN0IGZpbGUgdG8gdW5kZXJzdGFuZCB3aGF0IG5lZWRzIHRvIHBhc3NcblxuTGV0IG1lIHN0YXJ0IGJ5IHJlYWRpbmcgdGhlc2UgZmlsZXMiLCJ0aGlua2luZ1NpZ25hdHVyZSI6InJlYXNvbmluZyJ9LHsidHlwZSI6InRvb2xDYWxsIiwiaWQiOiJmdW5jdGlvbnMucmVhZDowIiwibmFtZSI6InJlYWQiLCJhcmd1bWVudHMiOnsicGF0aCI6InBhY2thZ2VzL2NvZGluZy1hZ2VudC9zcmMvY29yZS9wYWNrYWdlLW1hbmFnZXIudHMifX0seyJ0eXBlIjoidG9vbENhbGwiLCJpZCI6ImZ1bmN0aW9ucy5yZWFkOjEiLCJuYW1lIjoicmVhZCIsImFyZ3VtZW50cyI6eyJwYXRoIjoicGFja2FnZXMvY29kaW5nLWFnZW50L3NyYy9tb2Rlcy9pbnRlcmFjdGl2ZS9jb21wb25lbnRzL2NvbmZpZy1zZWxlY3Rvci50cyJ9fV0sImFwaSI6Im9wZW5haS1jb21wbGV0aW9ucyIsInByb3ZpZGVyIjoic3ludGhldGljIiwibW9kZWwiOiJoZjptb29uc2hvdGFpL0tpbWktSzIuNSIsInVzYWdlIjp7ImlucHV0IjoxMTcyOCwib3V0cHV0IjoxNjYsImNhY2hlUmVhZCI6MTYwLCJjYWNoZVdyaXRlIjowLCJ0b3RhbFRva2VucyI6MTIwNTQsImNvc3QiOnsiaW5wdXQiOjAuMDA1Mjc3Niwib3V0cHV0IjowLjAwMDU2NDQwMDAwMDAwMDAwMDEsImNhY2hlUmVhZCI6MC4wMDAwNzIsImNhY2hlV3JpdGUiOjAsInRvdGFsIjowLjAwNTkxNH19LCJzdG9wUmVhc29uIjoidG9vbFVzZSIsInRpbWVzdGFtcCI6MTc3NzU2NDIyODczNiwicmVzcG9uc2VJZCI6ImNoYXRjbXBsLTg3YWIwNjExMzBmMzk2YmMifX0seyJ0eXBlIjoibWVzc2FnZSIsImlkIjoiMjY1NzJkYjkiLCJwYXJlbnRJZCI6ImQyNmQwMzYwIiwidGltZXN0YW1wIjoiMjAyNi0wNC0zMFQxNTo1MDozMi4xODBaIiwibWVzc2FnZSI6eyJyb2xlIjoidG9vbFJlc3VsdCIsInRvb2xDYWxsSWQiOiJmdW5jdGlvbnMucmVhZDowIiwidG9vbE5hbWUiOiJyZWFkIiwiY29udGVudCI6W3sidHlwZSI6InRleHQiLCJ0ZXh0IjoiaW1wb3J0IHsgdHlwZSBDaGlsZFByb2Nlc3MsIHR5cGUgQ2hpbGRQcm9jZXNzQnlTdGRpbywgc3Bhd24sIHNwYXduU3luYyB9IGZyb20gXCJub2RlOmNoaWxkX3Byb2Nlc3NcIjtcbmltcG9ydCB7IGNyZWF0ZUhhc2ggfSBmcm9tIFwibm9kZTpjcnlwdG9cIjtcbmltcG9ydCB7IGV4aXN0c1N5bmMsIG1rZGlyU3luYywgcmVhZGRpclN5bmMsIHJlYWRGaWxlU3luYywgcm1TeW5jLCBzdGF0U3luYywgd3JpdGVGaWxlU3luYyB9IGZyb20gXCJub2RlOmZzXCI7XG5pbXBvcnQgeyBob21lZGlyLCB0bXBkaXIgfSBmcm9tIFwibm9kZTpvc1wiO1xuXG5mdW5jdGlvbiBnZXRFbnYoKTogTm9kZUpTLlByb2Nlc3NFbnYge1xuXHRpZiAocHJvY2Vzcy5wbGF0Zm9ybSAhPT0gXCJsaW51eFwiIHx8IE9iamVjdC5rZXlzKHByb2Nlc3MuZW52KS5sZW5ndGggPiAwKSB7XG5cdFx0cmV0dXJuIHByb2Nlc3MuZW52O1xuXHR9XG5cdHRyeSB7XG5cdFx0Y29uc3QgZGF0YSA9IHJlYWRGaWxlU3luYyhcIi9wcm9jL3NlbGYvZW52aXJvblwiLCBcInV0Zi04XCIpO1xuXHRcdGNvbnN0IGVudjogTm9kZUpTLlByb2Nlc3NFbnYgPSB7fTtcblx0XHRmb3IgKGNvbnN0IGVudHJ5IG9mIGRhdGEuc3BsaXQoXCJcXDBcIikpIHtcblx0XHRcdGNvbnN0IGlkeCA9IGVudHJ5LmluZGV4T2YoXCI9XCIpO1xuXHRcdFx0aWYgKGlkeCA+IDApIHtcblx0XHRcdFx0ZW52W2VudHJ5LnNsaWNlKDAsIGlkeCldID0gZW50cnkuc2xpY2UoaWR4ICsgMSk7XG5cdFx0XHR9XG5cdFx0fVxuXHRcdHJldHVybiBlbnY7XG5cdH0gY2F0Y2gge1xuXHRcdHJldHVybiBwcm9jZXNzLmVudjtcblx0fVxufVxuXG5pbXBvcnQgeyBiYXNlbmFtZSwgZGlybmFtZSwgam9pbiwgcmVsYXRpdmUsIHJlc29sdmUsIHNlcCB9IGZyb20gXCJub2RlOnBhdGhcIjtcbmltcG9ydCB0eXBlIHsgUmVhZGFibGUgfSBmcm9tIFwibm9kZTpzdHJlYW1cIjtcbmltcG9ydCB7IGdsb2JTeW5jIH0gZnJvbSBcImdsb2JcIjtcbmltcG9ydCBpZ25vcmUgZnJvbSBcImlnbm9yZVwiO1xuaW1wb3J0IHsgbWluaW1hdGNoIH0gZnJvbSBcIm1pbmltYXRjaFwiO1xuaW1wb3J0IHsgQ09ORklHX0RJUl9OQU1FIH0gZnJvbSBcIi4uL2NvbmZpZy5qc1wiO1xuaW1wb3J0IHsgdHlwZSBHaXRTb3VyY2UsIHBhcnNlR2l0VXJsIH0gZnJvbSBcIi4uL3V0aWxzL2dpdC5qc1wiO1xuaW1wb3J0IHsgY2Fub25pY2FsaXplUGF0aCwgaXNMb2NhbFBhdGggfSBmcm9tIFwiLi4vdXRpbHMvcGF0aHMuanNcIjtcbmltcG9ydCB7IGlzU3Rkb3V0VGFrZW5PdmVyIH0gZnJvbSBcIi4vb3V0cHV0LWd1YXJkLmpzXCI7XG5pbXBvcnQgdHlwZSB7IFBhY2thZ2VTb3VyY2UsIFNldHRpbmdzTWFuYWdlciB9IGZyb20gXCIuL3NldHRpbmdzLW1hbmFnZXIuanNcIjtcblxuY29uc3QgTkVUV09SS19USU1FT1VUX01TID0gMTAwMDA7XG5jb25zdCBVUERBVEVfQ0hFQ0tfQ09OQ1VSUkVOQ1kgPSA0O1xuY29uc3QgR0lUX1VQREFURV9DT05DVVJSRU5DWSA9IDQ7XG5cbmZ1bmN0aW9uIGlzT2ZmbGluZU1vZGVFbmFibGVkKCk6IGJvb2xlYW4ge1xuXHRjb25zdCB2YWx1ZSA9IHByb2Nlc3MuZW52LlBJX09GRkxJTkU7XG5cdGlmICghdmFsdWUpIHJldHVybiBmYWxzZTtcblx0cmV0dXJuIHZhbHVlID09PSBcIjFcIiB8fCB2YWx1ZS50b0xvd2VyQ2FzZSgpID09PSBcInRydWVcIiB8fCB2YWx1ZS50b0xvd2VyQ2FzZSgpID09PSBcInllc1wiO1xufVxuXG5leHBvcnQgaW50ZXJmYWNlIFBhdGhNZXRhZGF0YSB7XG5cdHNvdXJjZTogc3RyaW5nO1xuXHRzY29wZTogU291cmNlU2NvcGU7XG5cdG9yaWdpbjogXCJwYWNrYWdlXCIgfCBcInRvcC1sZXZlbFwiO1xuXHRiYXNlRGlyPzogc3RyaW5nO1xufVxuXG5leHBvcnQgaW50ZXJmYWNlIFJlc29sdmVkUmVzb3VyY2Uge1xuXHRwYXRoOiBzdHJpbmc7XG5cdGVuYWJsZWQ6IGJvb2xlYW47XG5cdG1ldGFkYXRhOiBQYXRoTWV0YWRhdGE7XG59XG5cbmV4cG9ydCBpbnRlcmZhY2UgUmVzb2x2ZWRQYXRocyB7XG5cdGV4dGVuc2lvbnM6IFJlc29sdmVkUmVzb3VyY2VbXTtcblx0c2tpbGxzOiBSZXNvbHZlZFJlc291cmNlW107XG5cdHByb21wdHM6IFJlc29sdmVkUmVzb3VyY2VbXTtcblx0dGhlbWVzOiBSZXNvbHZlZFJlc291cmNlW107XG59XG5cbmV4cG9ydCB0eXBlIE1pc3NpbmdTb3VyY2VBY3Rpb24gPSBcImluc3RhbGxcIiB8IFwic2tpcFwiIHwgXCJlcnJvclwiO1xuXG5leHBvcnQgaW50ZXJmYWNlIFByb2dyZXNzRXZlbnQge1xuXHR0eXBlOiBcInN0YXJ0XCIgfCBcInByb2dyZXNzXCIgfCBcImNvbXBsZXRlXCIgfCBcImVycm9yXCI7XG5cdGFjdGlvbjogXCJpbnN0YWxsXCIgfCBcInJlbW92ZVwiIHwgXCJ1cGRhdGVcIiB8IFwiY2xvbmVcIiB8IFwicHVsbFwiO1xuXHRzb3VyY2U6IHN0cmluZztcblx0bWVzc2FnZT86IHN0cmluZztcbn1cblxuZXhwb3J0IHR5cGUgUHJvZ3Jlc3NDYWxsYmFjayA9IChldmVudDogUHJvZ3Jlc3NFdmVudCkgPT4gdm9pZDtcblxuZXhwb3J0IGludGVyZmFjZSBQYWNrYWdlVXBkYXRlIHtcblx0c291cmNlOiBzdHJpbmc7XG5cdGRpc3BsYXlOYW1lOiBzdHJpbmc7XG5cdHR5cGU6IFwibnBtXCIgfCBcImdpdFwiO1xuXHRzY29wZTogRXhjbHVkZTxTb3VyY2VTY29wZSwgXCJ0ZW1wb3JhcnlcIj47XG59XG5cbmV4cG9ydCBpbnRlcmZhY2UgQ29uZmlndXJlZFBhY2thZ2Uge1xuXHRzb3VyY2U6IHN0cmluZztcblx0c2NvcGU6IFwidXNlclwiIHwgXCJwcm9qZWN0XCI7XG5cdGZpbHRlcmVkOiBib29sZWFuO1xuXHRpbnN0YWxsZWRQYXRoPzogc3RyaW5nO1xufVxuXG5leHBvcnQgaW50ZXJmYWNlIFBhY2thZ2VNYW5hZ2VyIHtcblx0cmVzb2x2ZShvbk1pc3Npbmc/OiAoc291cmNlOiBzdHJpbmcpID0+IFByb21pc2U8TWlzc2luZ1NvdXJjZUFjdGlvbj4pOiBQcm9taXNlPFJlc29sdmVkUGF0aHM+O1xuXHRpbnN0YWxsKHNvdXJjZTogc3RyaW5nLCBvcHRpb25zPzogeyBsb2NhbD86IGJvb2xlYW4gfSk6IFByb21pc2U8dm9pZD47XG5cdGluc3RhbGxBbmRQZXJzaXN0KHNvdXJjZTogc3RyaW5nLCBvcHRpb25zPzogeyBsb2NhbD86IGJvb2xlYW4gfSk6IFByb21pc2U8dm9pZD47XG5cdHJlbW92ZShzb3VyY2U6IHN0cmluZywgb3B0aW9ucz86IHsgbG9jYWw/OiBib29sZWFuIH0pOiBQcm9taXNlPHZvaWQ+O1xuXHRyZW1vdmVBbmRQZXJzaXN0KHNvdXJjZTogc3RyaW5nLCBvcHRpb25zPzogeyBsb2NhbD86IGJvb2xlYW4gfSk6IFByb21pc2U8Ym9vbGVhbj47XG5cdHVwZGF0ZShzb3VyY2U/OiBzdHJpbmcpOiBQcm9taXNlPHZvaWQ+O1xuXHRsaXN0Q29uZmlndXJlZFBhY2thZ2VzKCk6IENvbmZpZ3VyZWRQYWNrYWdlW107XG5cdHJlc29sdmVFeHRlbnNpb25Tb3VyY2VzKFxuXHRcdHNvdXJjZXM6IHN0cmluZ1tdLFxuXHRcdG9wdGlvbnM/OiB7IGxvY2FsPzogYm9vbGVhbjsgdGVtcG9yYXJ5PzogYm9vbGVhbiB9LFxuXHQpOiBQcm9taXNlPFJlc29sdmVkUGF0aHM+O1xuXHRhZGRTb3VyY2VUb1NldHRpbmdzKHNvdXJjZTogc3RyaW5nLCBvcHRpb25zPzogeyBsb2NhbD86IGJvb2xlYW4gfSk6IGJvb2xlYW47XG5cdHJlbW92ZVNvdXJjZUZyb21TZXR0aW5ncyhzb3VyY2U6IHN0cmluZywgb3B0aW9ucz86IHsgbG9jYWw/OiBib29sZWFuIH0pOiBib29sZWFuO1xuXHRzZXRQcm9ncmVzc0NhbGxiYWNrKGNhbGxiYWNrOiBQcm9ncmVzc0NhbGxiYWNrIHwgdW5kZWZpbmVkKTogdm9pZDtcblx0Z2V0SW5zdGFsbGVkUGF0aChzb3VyY2U6IHN0cmluZywgc2NvcGU6IFwidXNlclwiIHwgXCJwcm9qZWN0XCIpOiBzdHJpbmcgfCB1bmRlZmluZWQ7XG59XG5cbmludGVyZmFjZSBQYWNrYWdlTWFuYWdlck9wdGlvbnMge1xuXHRjd2Q6IHN0cmluZztcblx0YWdlbnREaXI6IHN0cmluZztcblx0c2V0dGluZ3NNYW5hZ2VyOiBTZXR0aW5nc01hbmFnZXI7XG59XG5cbnR5cGUgU291cmNlU2NvcGUgPSBcInVzZXJcIiB8IFwicHJvamVjdFwiIHwgXCJ0ZW1wb3JhcnlcIjtcblxudHlwZSBOcG1Tb3VyY2UgPSB7XG5cdHR5cGU6IFwibnBtXCI7XG5cdHNwZWM6IHN0cmluZztcblx0bmFtZTogc3RyaW5nO1xuXHRwaW5uZWQ6IGJvb2xlYW47XG59O1xuXG50eXBlIExvY2FsU291cmNlID0ge1xuXHR0eXBlOiBcImxvY2FsXCI7XG5cdHBhdGg6IHN0cmluZztcbn07XG5cbnR5cGUgUGFyc2VkU291cmNlID0gTnBtU291cmNlIHwgR2l0U291cmNlIHwgTG9jYWxTb3VyY2U7XG5cbnR5cGUgSW5zdGFsbGVkU291cmNlU2NvcGUgPSBFeGNsdWRlPFNvdXJjZVNjb3BlLCBcInRlbXBvcmFyeVwiPjtcblxuaW50ZXJmYWNlIENvbmZpZ3VyZWRVcGRhdGVTb3VyY2Uge1xuXHRzb3VyY2U6IHN0cmluZztcblx0c2NvcGU6IEluc3RhbGxlZFNvdXJjZVNjb3BlO1xufVxuXG5pbnRlcmZhY2UgTnBtVXBkYXRlVGFyZ2V0IGV4dGVuZHMgQ29uZmlndXJlZFVwZGF0ZVNvdXJjZSB7XG5cdHBhcnNlZDogTnBtU291cmNlO1xufVxuXG5pbnRlcmZhY2UgR2l0VXBkYXRlVGFyZ2V0IGV4dGVuZHMgQ29uZmlndXJlZFVwZGF0ZVNvdXJjZSB7XG5cdHBhcnNlZDogR2l0U291cmNlO1xufVxuXG5pbnRlcmZhY2UgUGlNYW5pZmVzdCB7XG5cdGV4dGVuc2lvbnM/OiBzdHJpbmdbXTtcblx0c2tpbGxzPzogc3RyaW5nW107XG5cdHByb21wdHM/OiBzdHJpbmdbXTtcblx0dGhlbWVzPzogc3RyaW5nW107XG59XG5cbmludGVyZmFjZSBSZXNvdXJjZUFjY3VtdWxhdG9yIHtcblx0ZXh0ZW5zaW9uczogTWFwPHN0cmluZywgeyBtZXRhZGF0YTogUGF0aE1ldGFkYXRhOyBlbmFibGVkOiBib29sZWFuIH0+O1xuXHRza2lsbHM6IE1hcDxzdHJpbmcsIHsgbWV0YWRhdGE6IFBhdGhNZXRhZGF0YTsgZW5hYmxlZDogYm9vbGVhbiB9Pjtcblx0cHJvbXB0czogTWFwPHN0cmluZywgeyBtZXRhZGF0YTogUGF0aE1ldGFkYXRhOyBlbmFibGVkOiBib29sZWFuIH0+O1xuXHR0aGVtZXM6IE1hcDxzdHJpbmcsIHsgbWV0YWRhdGE6IFBhdGhNZXRhZGF0YTsgZW5hYmxlZDogYm9vbGVhbiB9Pjtcbn1cblxuLyoqXG4gKiBDb21wdXRlIGEgbnVtZXJpYyBwcmVjZWRlbmNlIHJhbmsgZm9yIGEgcmVzb3VyY2UgYmFzZWQgb24gaXRzIG1ldGFkYXRhLlxuICogTG93ZXIgcmFuayA9IGhpZ2hlciBwcmVjZWRlbmNlLiBVc2VkIHRvIHNvcnQgcmVzb2x2ZWQgcmVzb3VyY2VzIHNvIHRoYXRcbiAqIG5hbWUtY29sbGlzaW9uIHJlc29sdXRpb24gKFwiZmlyc3Qgd2luc1wiKSBwcm9kdWNlcyB0aGUgY29ycmVjdCBvdXRjb21lLlxuICpcbiAqIFByZWNlZGVuY2UgKGhpZ2hlc3QgdG8gbG93ZXN0KTpcbiAqICAgMCAgcHJvamVjdCArIHNldHRpbmdzIGVudHJ5IChzb3VyY2U6IFwibG9jYWxcIiwgc2NvcGU6IFwicHJvamVjdFwiKVxuICogICAxICBwcm9qZWN0ICsgYXV0by1kaXNjb3ZlcmVkIChzb3VyY2U6IFwiYXV0b1wiLCBzY29wZTogXCJwcm9qZWN0XCIpXG4gKiAgIDIgIHVzZXIgKyBzZXR0aW5ncyBlbnRyeSAoc291cmNlOiBcImxvY2FsXCIsIHNjb3BlOiBcInVzZXJcIilcbiAqICAgMyAgdXNlciArIGF1dG8tZGlzY292ZXJlZCAoc291cmNlOiBcImF1dG9cIiwgc2NvcGU6IFwidXNlclwiKVxuICogICA0ICBwYWNrYWdlIHJlc291cmNlIChvcmlnaW46IFwicGFja2FnZVwiKVxuICovXG5mdW5jdGlvbiByZXNvdXJjZVByZWNlZGVuY2VSYW5rKG06IFBhdGhNZXRhZGF0YSk6IG51bWJlciB7XG5cdGlmIChtLm9yaWdpbiA9PT0gXCJwYWNrYWdlXCIpIHJldHVybiA0O1xuXHRjb25zdCBzY29wZUJhc2UgPSBtLnNjb3BlID09PSBcInByb2plY3RcIiA/IDAgOiAyO1xuXHRyZXR1cm4gc2NvcGVCYXNlICsgKG0uc291cmNlID09PSBcImxvY2FsXCIgPyAwIDogMSk7XG59XG5cbmludGVyZmFjZSBQYWNrYWdlRmlsdGVyIHtcblx0ZXh0ZW5zaW9ucz86IHN0cmluZ1tdO1xuXHRza2lsbHM/OiBzdHJpbmdbXTtcblx0cHJvbXB0cz86IHN0cmluZ1tdO1xuXHR0aGVtZXM/OiBzdHJpbmdbXTtcbn1cblxudHlwZSBSZXNvdXJjZVR5cGUgPSBcImV4dGVuc2lvbnNcIiB8IFwic2tpbGxzXCIgfCBcInByb21wdHNcIiB8IFwidGhlbWVzXCI7XG5cbmNvbnN0IFJFU09VUkNFX1RZUEVTOiBSZXNvdXJjZVR5cGVbXSA9IFtcImV4dGVuc2lvbnNcIiwgXCJza2lsbHNcIiwgXCJwcm9tcHRzXCIsIFwidGhlbWVzXCJdO1xuXG5jb25zdCBGSUxFX1BBVFRFUk5TOiBSZWNvcmQ8UmVzb3VyY2VUeXBlLCBSZWdFeHA+ID0ge1xuXHRleHRlbnNpb25zOiAvXFwuKHRzfGpzKSQvLFxuXHRza2lsbHM6IC9cXC5tZCQvLFxuXHRwcm9tcHRzOiAvXFwubWQkLyxcblx0dGhlbWVzOiAvXFwuanNvbiQvLFxufTtcblxuY29uc3QgSUdOT1JFX0ZJTEVfTkFNRVMgPSBbXCIuZ2l0aWdub3JlXCIsIFwiLmlnbm9yZVwiLCBcIi5mZGlnbm9yZVwiXTtcblxudHlwZSBJZ25vcmVNYXRjaGVyID0gUmV0dXJuVHlwZTx0eXBlb2YgaWdub3JlPjtcblxuZnVuY3Rpb24gdG9Qb3NpeFBhdGgocDogc3RyaW5nKTogc3RyaW5nIHtcblx0cmV0dXJuIHAuc3BsaXQoc2VwKS5qb2luKFwiL1wiKTtcbn1cblxuZnVuY3Rpb24gZ2V0SG9tZURpcigpOiBzdHJpbmcge1xuXHRyZXR1cm4gcHJvY2Vzcy5lbnYuSE9NRSB8fCBob21lZGlyKCk7XG59XG5cbmZ1bmN0aW9uIHByZWZpeElnbm9yZVBhdHRlcm4obGluZTogc3RyaW5nLCBwcmVmaXg6IHN0cmluZyk6IHN0cmluZyB8IG51bGwge1xuXHRjb25zdCB0cmltbWVkID0gbGluZS50cmltKCk7XG5cdGlmICghdHJpbW1lZCkgcmV0dXJuIG51bGw7XG5cdGlmICh0cmltbWVkLnN0YXJ0c1dpdGgoXCIjXCIpICYmICF0cmltbWVkLnN0YXJ0c1dpdGgoXCJcXFxcI1wiKSkgcmV0dXJuIG51bGw7XG5cblx0bGV0IHBhdHRlcm4gPSBsaW5lO1xuXHRsZXQgbmVnYXRlZCA9IGZhbHNlO1xuXG5cdGlmIChwYXR0ZXJuLnN0YXJ0c1dpdGgoXCIhXCIpKSB7XG5cdFx0bmVnYXRlZCA9IHRydWU7XG5cdFx0cGF0dGVybiA9IHBhdHRlcm4uc2xpY2UoMSk7XG5cdH0gZWxzZSBpZiAocGF0dGVybi5zdGFydHNXaXRoKFwiXFxcXCFcIikpIHtcblx0XHRwYXR0ZXJuID0gcGF0dGVybi5zbGljZSgxKTtcblx0fVxuXG5cdGlmIChwYXR0ZXJuLnN0YXJ0c1dpdGgoXCIvXCIpKSB7XG5cdFx0cGF0dGVybiA9IHBhdHRlcm4uc2xpY2UoMSk7XG5cdH1cblxuXHRjb25zdCBwcmVmaXhlZCA9IHByZWZpeCA/IGAke3ByZWZpeH0ke3BhdHRlcm59YCA6IHBhdHRlcm47XG5cdHJldHVybiBuZWdhdGVkID8gYCEke3ByZWZpeGVkfWAgOiBwcmVmaXhlZDtcbn1cblxuZnVuY3Rpb24gYWRkSWdub3JlUnVsZXMoaWc6IElnbm9yZU1hdGNoZXIsIGRpcjogc3RyaW5nLCByb290RGlyOiBzdHJpbmcpOiB2b2lkIHtcblx0Y29uc3QgcmVsYXRpdmVEaXIgPSByZWxhdGl2ZShyb290RGlyLCBkaXIpO1xuXHRjb25zdCBwcmVmaXggPSByZWxhdGl2ZURpciA/IGAke3RvUG9zaXhQYXRoKHJlbGF0aXZlRGlyKX0vYCA6IFwiXCI7XG5cblx0Zm9yIChjb25zdCBmaWxlbmFtZSBvZiBJR05PUkVfRklMRV9OQU1FUykge1xuXHRcdGNvbnN0IGlnbm9yZVBhdGggPSBqb2luKGRpciwgZmlsZW5hbWUpO1xuXHRcdGlmICghZXhpc3RzU3luYyhpZ25vcmVQYXRoKSkgY29udGludWU7XG5cdFx0dHJ5IHtcblx0XHRcdGNvbnN0IGNvbnRlbnQgPSByZWFkRmlsZVN5bmMoaWdub3JlUGF0aCwgXCJ1dGYtOFwiKTtcblx0XHRcdGNvbnN0IHBhdHRlcm5zID0gY29udGVudFxuXHRcdFx0XHQuc3BsaXQoL1xccj9cXG4vKVxuXHRcdFx0XHQubWFwKChsaW5lKSA9PiBwcmVmaXhJZ25vcmVQYXR0ZXJuKGxpbmUsIHByZWZpeCkpXG5cdFx0XHRcdC5maWx0ZXIoKGxpbmUpOiBsaW5lIGlzIHN0cmluZyA9PiBCb29sZWFuKGxpbmUpKTtcblx0XHRcdGlmIChwYXR0ZXJucy5sZW5ndGggPiAwKSB7XG5cdFx0XHRcdGlnLmFkZChwYXR0ZXJucyk7XG5cdFx0XHR9XG5cdFx0fSBjYXRjaCB7fVxuXHR9XG59XG5cbmZ1bmN0aW9uIGlzUGF0dGVybihzOiBzdHJpbmcpOiBib29sZWFuIHtcblx0cmV0dXJuIHMuc3RhcnRzV2l0aChcIiFcIikgfHwgcy5zdGFydHNXaXRoKFwiK1wiKSB8fCBzLnN0YXJ0c1dpdGgoXCItXCIpIHx8IHMuaW5jbHVkZXMoXCIqXCIpIHx8IHMuaW5jbHVkZXMoXCI/XCIpO1xufVxuXG5mdW5jdGlvbiBpc092ZXJyaWRlUGF0dGVybihzOiBzdHJpbmcpOiBib29sZWFuIHtcblx0cmV0dXJuIHMuc3RhcnRzV2l0aChcIiFcIikgfHwgcy5zdGFydHNXaXRoKFwiK1wiKSB8fCBzLnN0YXJ0c1dpdGgoXCItXCIpO1xufVxuXG5mdW5jdGlvbiBoYXNHbG9iUGF0dGVybihzOiBzdHJpbmcpOiBib29sZWFuIHtcblx0cmV0dXJuIHMuaW5jbHVkZXMoXCIqXCIpIHx8IHMuaW5jbHVkZXMoXCI/XCIpO1xufVxuXG5mdW5jdGlvbiBzcGxpdFBhdHRlcm5zKGVudHJpZXM6IHN0cmluZ1tdKTogeyBwbGFpbjogc3RyaW5nW107IHBhdHRlcm5zOiBzdHJpbmdbXSB9IHtcblx0Y29uc3QgcGxhaW46IHN0cmluZ1tdID0gW107XG5cdGNvbnN0IHBhdHRlcm5zOiBzdHJpbmdbXSA9IFtdO1xuXHRmb3IgKGNvbnN0IGVudHJ5IG9mIGVudHJpZXMpIHtcblx0XHRpZiAoaXNQYXR0ZXJuKGVudHJ5KSkge1xuXHRcdFx0cGF0dGVybnMucHVzaChlbnRyeSk7XG5cdFx0fSBlbHNlIHtcblx0XHRcdHBsYWluLnB1c2goZW50cnkpO1xuXHRcdH1cblx0fVxuXHRyZXR1cm4geyBwbGFpbiwgcGF0dGVybnMgfTtcbn1cblxuZnVuY3Rpb24gY29sbGVjdEZpbGVzKFxuXHRkaXI6IHN0cmluZyxcblx0ZmlsZVBhdHRlcm46IFJlZ0V4cCxcblx0c2tpcE5vZGVNb2R1bGVzID0gdHJ1ZSxcblx0aWdub3JlTWF0Y2hlcj86IElnbm9yZU1hdGNoZXIsXG5cdHJvb3REaXI/OiBzdHJpbmcsXG4pOiBzdHJpbmdbXSB7XG5cdGNvbnN0IGZpbGVzOiBzdHJpbmdbXSA9IFtdO1xuXHRpZiAoIWV4aXN0c1N5bmMoZGlyKSkgcmV0dXJuIGZpbGVzO1xuXG5cdGNvbnN0IHJvb3QgPSByb290RGlyID8/IGRpcjtcblx0Y29uc3QgaWcgPSBpZ25vcmVNYXRjaGVyID8/IGlnbm9yZSgpO1xuXHRhZGRJZ25vcmVSdWxlcyhpZywgZGlyLCByb290KTtcblxuXHR0cnkge1xuXHRcdGNvbnN0IGVudHJpZXMgPSByZWFkZGlyU3luYyhkaXIsIHsgd2l0aEZpbGVUeXBlczogdHJ1ZSB9KTtcblx0XHRmb3IgKGNvbnN0IGVudHJ5IG9mIGVudHJpZXMpIHtcblx0XHRcdGlmIChlbnRyeS5uYW1lLnN0YXJ0c1dpdGgoXCIuXCIpKSBjb250aW51ZTtcblx0XHRcdGlmIChza2lwTm9kZU1vZHVsZXMgJiYgZW50cnkubmFtZSA9PT0gXCJub2RlX21vZHVsZXNcIikgY29udGludWU7XG5cblx0XHRcdGNvbnN0IGZ1bGxQYXRoID0gam9pbihkaXIsIGVudHJ5Lm5hbWUpO1xuXHRcdFx0bGV0IGlzRGlyID0gZW50cnkuaXNEaXJlY3RvcnkoKTtcblx0XHRcdGxldCBpc0ZpbGUgPSBlbnRyeS5pc0ZpbGUoKTtcblxuXHRcdFx0aWYgKGVudHJ5LmlzU3ltYm9saWNMaW5rKCkpIHtcblx0XHRcdFx0dHJ5IHtcblx0XHRcdFx0XHRjb25zdCBzdGF0cyA9IHN0YXRTeW5jKGZ1bGxQYXRoKTtcblx0XHRcdFx0XHRpc0RpciA9IHN0YXRzLmlzRGlyZWN0b3J5KCk7XG5cdFx0XHRcdFx0aXNGaWxlID0gc3RhdHMuaXNGaWxlKCk7XG5cdFx0XHRcdH0gY2F0Y2gge1xuXHRcdFx0XHRcdGNvbnRpbnVlO1xuXHRcdFx0XHR9XG5cdFx0XHR9XG5cblx0XHRcdGNvbnN0IHJlbFBhdGggPSB0b1Bvc2l4UGF0aChyZWxhdGl2ZShyb290LCBmdWxsUGF0aCkpO1xuXHRcdFx0Y29uc3QgaWdub3JlUGF0aCA9IGlzRGlyID8gYCR7cmVsUGF0aH0vYCA6IHJlbFBhdGg7XG5cdFx0XHRpZiAoaWcuaWdub3JlcyhpZ25vcmVQYXRoKSkgY29udGludWU7XG5cblx0XHRcdGlmIChpc0Rpcikge1xuXHRcdFx0XHRmaWxlcy5wdXNoKC4uLmNvbGxlY3RGaWxlcyhmdWxsUGF0aCwgZmlsZVBhdHRlcm4sIHNraXBOb2RlTW9kdWxlcywgaWcsIHJvb3QpKTtcblx0XHRcdH0gZWxzZSBpZiAoaXNGaWxlICYmIGZpbGVQYXR0ZXJuLnRlc3QoZW50cnkubmFtZSkpIHtcblx0XHRcdFx0ZmlsZXMucHVzaChmdWxsUGF0aCk7XG5cdFx0XHR9XG5cdFx0fVxuXHR9IGNhdGNoIHtcblx0XHQvLyBJZ25vcmUgZXJyb3JzXG5cdH1cblxuXHRyZXR1cm4gZmlsZXM7XG59XG5cbnR5cGUgU2tpbGxEaXNjb3ZlcnlNb2RlID0gXCJwaVwiIHwgXCJhZ2VudHNcIjtcblxuZnVuY3Rpb24gY29sbGVjdFNraWxsRW50cmllcyhcblx0ZGlyOiBzdHJpbmcsXG5cdG1vZGU6IFNraWxsRGlzY292ZXJ5TW9kZSxcblx0aWdub3JlTWF0Y2hlcj86IElnbm9yZU1hdGNoZXIsXG5cdHJvb3REaXI/OiBzdHJpbmcsXG4pOiBzdHJpbmdbXSB7XG5cdGNvbnN0IGVudHJpZXM6IHN0cmluZ1tdID0gW107XG5cdGlmICghZXhpc3RzU3luYyhkaXIpKSByZXR1cm4gZW50cmllcztcblxuXHRjb25zdCByb290ID0gcm9vdERpciA/PyBkaXI7XG5cdGNvbnN0IGlnID0gaWdub3JlTWF0Y2hlciA/PyBpZ25vcmUoKTtcblx0YWRkSWdub3JlUnVsZXMoaWcsIGRpciwgcm9vdCk7XG5cblx0dHJ5IHtcblx0XHRjb25zdCBkaXJFbnRyaWVzID0gcmVhZGRpclN5bmMoZGlyLCB7IHdpdGhGaWxlVHlwZXM6IHRydWUgfSk7XG5cblx0XHRmb3IgKGNvbnN0IGVudHJ5IG9mIGRpckVudHJpZXMpIHtcblx0XHRcdGlmIChlbnRyeS5uYW1lICE9PSBcIlNLSUxMLm1kXCIpIHtcblx0XHRcdFx0Y29udGludWU7XG5cdFx0XHR9XG5cblx0XHRcdGNvbnN0IGZ1bGxQYXRoID0gam9pbihkaXIsIGVudHJ5Lm5hbWUpO1xuXHRcdFx0bGV0IGlzRmlsZSA9IGVudHJ5LmlzRmlsZSgpO1xuXHRcdFx0aWYgKGVudHJ5LmlzU3ltYm9saWNMaW5rKCkpIHtcblx0XHRcdFx0dHJ5IHtcblx0XHRcdFx0XHRpc0ZpbGUgPSBzdGF0U3luYyhmdWxsUGF0aCkuaXNGaWxlKCk7XG5cdFx0XHRcdH0gY2F0Y2gge1xuXHRcdFx0XHRcdGNvbnRpbnVlO1xuXHRcdFx0XHR9XG5cdFx0XHR9XG5cblx0XHRcdGNvbnN0IHJlbFBhdGggPSB0b1Bvc2l4UGF0aChyZWxhdGl2ZShyb290LCBmdWxsUGF0aCkpO1xuXHRcdFx0aWYgKGlzRmlsZSAmJiAhaWcuaWdub3JlcyhyZWxQYXRoKSkge1xuXHRcdFx0XHRlbnRyaWVzLnB1c2goZnVsbFBhdGgpO1xuXHRcdFx0XHRyZXR1cm4gZW50cmllcztcblx0XHRcdH1cblx0XHR9XG5cblx0XHRmb3IgKGNvbnN0IGVudHJ5IG9mIGRpckVudHJpZXMpIHtcblx0XHRcdGlmIChlbnRyeS5uYW1lLnN0YXJ0c1dpdGgoXCIuXCIpKSBjb250aW51ZTtcblx0XHRcdGlmIChlbnRyeS5uYW1lID09PSBcIm5vZGVfbW9kdWxlc1wiKSBjb250aW51ZTtcblxuXHRcdFx0Y29uc3QgZnVsbFBhdGggPSBqb2luKGRpciwgZW50cnkubmFtZSk7XG5cdFx0XHRsZXQgaXNEaXIgPSBlbnRyeS5pc0RpcmVjdG9yeSgpO1xuXHRcdFx0bGV0IGlzRmlsZSA9IGVudHJ5LmlzRmlsZSgpO1xuXG5cdFx0XHRpZiAoZW50cnkuaXNTeW1ib2xpY0xpbmsoKSkge1xuXHRcdFx0XHR0cnkge1xuXHRcdFx0XHRcdGNvbnN0IHN0YXRzID0gc3RhdFN5bmMoZnVsbFBhdGgpO1xuXHRcdFx0XHRcdGlzRGlyID0gc3RhdHMuaXNEaXJlY3RvcnkoKTtcblx0XHRcdFx0XHRpc0ZpbGUgPSBzdGF0cy5pc0ZpbGUoKTtcblx0XHRcdFx0fSBjYXRjaCB7XG5cdFx0XHRcdFx0Y29udGludWU7XG5cdFx0XHRcdH1cblx0XHRcdH1cblxuXHRcdFx0Y29uc3QgcmVsUGF0aCA9IHRvUG9zaXhQYXRoKHJlbGF0aXZlKHJvb3QsIGZ1bGxQYXRoKSk7XG5cdFx0XHRpZiAobW9kZSA9PT0gXCJwaVwiICYmIGRpciA9PT0gcm9vdCAmJiBpc0ZpbGUgJiYgZW50cnkubmFtZS5lbmRzV2l0aChcIi5tZFwiKSAmJiAhaWcuaWdub3JlcyhyZWxQYXRoKSkge1xuXHRcdFx0XHRlbnRyaWVzLnB1c2goZnVsbFBhdGgpO1xuXHRcdFx0XHRjb250aW51ZTtcblx0XHRcdH1cblxuXHRcdFx0aWYgKCFpc0RpcikgY29udGludWU7XG5cdFx0XHRpZiAoaWcuaWdub3JlcyhgJHtyZWxQYXRofS9gKSkgY29udGludWU7XG5cblx0XHRcdGVudHJpZXMucHVzaCguLi5jb2xsZWN0U2tpbGxFbnRyaWVzKGZ1bGxQYXRoLCBtb2RlLCBpZywgcm9vdCkpO1xuXHRcdH1cblx0fSBjYXRjaCB7XG5cdFx0Ly8gSWdub3JlIGVycm9yc1xuXHR9XG5cblx0cmV0dXJuIGVudHJpZXM7XG59XG5cbmZ1bmN0aW9uIGNvbGxlY3RBdXRvU2tpbGxFbnRyaWVzKGRpcjogc3RyaW5nLCBtb2RlOiBTa2lsbERpc2NvdmVyeU1vZGUpOiBzdHJpbmdbXSB7XG5cdHJldHVybiBjb2xsZWN0U2tpbGxFbnRyaWVzKGRpciwgbW9kZSk7XG59XG5cbmZ1bmN0aW9uIGZpbmRHaXRSZXBvUm9vdChzdGFydERpcjogc3RyaW5nKTogc3RyaW5nIHwgbnVsbCB7XG5cdGxldCBkaXIgPSByZXNvbHZlKHN0YXJ0RGlyKTtcblx0d2hpbGUgKHRydWUpIHtcblx0XHRpZiAoZXhpc3RzU3luYyhqb2luKGRpciwgXCIuZ2l0XCIpKSkge1xuXHRcdFx0cmV0dXJuIGRpcjtcblx0XHR9XG5cdFx0Y29uc3QgcGFyZW50ID0gZGlybmFtZShkaXIpO1xuXHRcdGlmIChwYXJlbnQgPT09IGRpcikge1xuXHRcdFx0cmV0dXJuIG51bGw7XG5cdFx0fVxuXHRcdGRpciA9IHBhcmVudDtcblx0fVxufVxuXG5mdW5jdGlvbiBjb2xsZWN0QW5jZXN0b3JBZ2VudHNTa2lsbERpcnMoc3RhcnREaXI6IHN0cmluZyk6IHN0cmluZ1tdIHtcblx0Y29uc3Qgc2tpbGxEaXJzOiBzdHJpbmdbXSA9IFtdO1xuXHRjb25zdCByZXNvbHZlZFN0YXJ0RGlyID0gcmVzb2x2ZShzdGFydERpcik7XG5cdGNvbnN0IGdpdFJlcG9Sb290ID0gZmluZEdpdFJlcG9Sb290KHJlc29sdmVkU3RhcnREaXIpO1xuXG5cdGxldCBkaXIgPSByZXNvbHZlZFN0YXJ0RGlyO1xuXHR3aGlsZSAodHJ1ZSkge1xuXHRcdHNraWxsRGlycy5wdXNoKGpvaW4oZGlyLCBcIi5hZ2VudHNcIiwgXCJza2lsbHNcIikpO1xuXHRcdGlmIChnaXRSZXBvUm9vdCAmJiBkaXIgPT09IGdpdFJlcG9Sb290KSB7XG5cdFx0XHRicmVhaztcblx0XHR9XG5cdFx0Y29uc3QgcGFyZW50ID0gZGlybmFtZShkaXIpO1xuXHRcdGlmIChwYXJlbnQgPT09IGRpcikge1xuXHRcdFx0YnJlYWs7XG5cdFx0fVxuXHRcdGRpciA9IHBhcmVudDtcblx0fVxuXG5cdHJldHVybiBza2lsbERpcnM7XG59XG5cbmZ1bmN0aW9uIGNvbGxlY3RBdXRvUHJvbXB0RW50cmllcyhkaXI6IHN0cmluZyk6IHN0cmluZ1tdIHtcblx0Y29uc3QgZW50cmllczogc3RyaW5nW10gPSBbXTtcblx0aWYgKCFleGlzdHNTeW5jKGRpcikpIHJldHVybiBlbnRyaWVzO1xuXG5cdGNvbnN0IGlnID0gaWdub3JlKCk7XG5cdGFkZElnbm9yZVJ1bGVzKGlnLCBkaXIsIGRpcik7XG5cblx0dHJ5IHtcblx0XHRjb25zdCBkaXJFbnRyaWVzID0gcmVhZGRpclN5bmMoZGlyLCB7IHdpdGhGaWxlVHlwZXM6IHRydWUgfSk7XG5cdFx0Zm9yIChjb25zdCBlbnRyeSBvZiBkaXJFbnRyaWVzKSB7XG5cdFx0XHRpZiAoZW50cnkubmFtZS5zdGFydHNXaXRoKFwiLlwiKSkgY29udGludWU7XG5cdFx0XHRpZiAoZW50cnkubmFtZSA9PT0gXCJub2RlX21vZHVsZXNcIikgY29udGludWU7XG5cblx0XHRcdGNvbnN0IGZ1bGxQYXRoID0gam9pbihkaXIsIGVudHJ5Lm5hbWUpO1xuXHRcdFx0bGV0IGlzRmlsZSA9IGVudHJ5LmlzRmlsZSgpO1xuXHRcdFx0aWYgKGVudHJ5LmlzU3ltYm9saWNMaW5rKCkpIHtcblx0XHRcdFx0dHJ5IHtcblx0XHRcdFx0XHRpc0ZpbGUgPSBzdGF0U3luYyhmdWxsUGF0aCkuaXNGaWxlKCk7XG5cdFx0XHRcdH0gY2F0Y2gge1xuXHRcdFx0XHRcdGNvbnRpbnVlO1xuXHRcdFx0XHR9XG5cdFx0XHR9XG5cblx0XHRcdGNvbnN0IHJlbFBhdGggPSB0b1Bvc2l4UGF0aChyZWxhdGl2ZShkaXIsIGZ1bGxQYXRoKSk7XG5cdFx0XHRpZiAoaWcuaWdub3JlcyhyZWxQYXRoKSkgY29udGludWU7XG5cblx0XHRcdGlmIChpc0ZpbGUgJiYgZW50cnkubmFtZS5lbmRzV2l0aChcIi5tZFwiKSkge1xuXHRcdFx0XHRlbnRyaWVzLnB1c2goZnVsbFBhdGgpO1xuXHRcdFx0fVxuXHRcdH1cblx0fSBjYXRjaCB7XG5cdFx0Ly8gSWdub3JlIGVycm9yc1xuXHR9XG5cblx0cmV0dXJuIGVudHJpZXM7XG59XG5cbmZ1bmN0aW9uIGNvbGxlY3RBdXRvVGhlbWVFbnRyaWVzKGRpcjogc3RyaW5nKTogc3RyaW5nW10ge1xuXHRjb25zdCBlbnRyaWVzOiBzdHJpbmdbXSA9IFtdO1xuXHRpZiAoIWV4aXN0c1N5bmMoZGlyKSkgcmV0dXJuIGVudHJpZXM7XG5cblx0Y29uc3QgaWcgPSBpZ25vcmUoKTtcblx0YWRkSWdub3JlUnVsZXMoaWcsIGRpciwgZGlyKTtcblxuXHR0cnkge1xuXHRcdGNvbnN0IGRpckVudHJpZXMgPSByZWFkZGlyU3luYyhkaXIsIHsgd2l0aEZpbGVUeXBlczogdHJ1ZSB9KTtcblx0XHRmb3IgKGNvbnN0IGVudHJ5IG9mIGRpckVudHJpZXMpIHtcblx0XHRcdGlmIChlbnRyeS5uYW1lLnN0YXJ0c1dpdGgoXCIuXCIpKSBjb250aW51ZTtcblx0XHRcdGlmIChlbnRyeS5uYW1lID09PSBcIm5vZGVfbW9kdWxlc1wiKSBjb250aW51ZTtcblxuXHRcdFx0Y29uc3QgZnVsbFBhdGggPSBqb2luKGRpciwgZW50cnkubmFtZSk7XG5cdFx0XHRsZXQgaXNGaWxlID0gZW50cnkuaXNGaWxlKCk7XG5cdFx0XHRpZiAoZW50cnkuaXNTeW1ib2xpY0xpbmsoKSkge1xuXHRcdFx0XHR0cnkge1xuXHRcdFx0XHRcdGlzRmlsZSA9IHN0YXRTeW5jKGZ1bGxQYXRoKS5pc0ZpbGUoKTtcblx0XHRcdFx0fSBjYXRjaCB7XG5cdFx0XHRcdFx0Y29udGludWU7XG5cdFx0XHRcdH1cblx0XHRcdH1cblxuXHRcdFx0Y29uc3QgcmVsUGF0aCA9IHRvUG9zaXhQYXRoKHJlbGF0aXZlKGRpciwgZnVsbFBhdGgpKTtcblx0XHRcdGlmIChpZy5pZ25vcmVzKHJlbFBhdGgpKSBjb250aW51ZTtcblxuXHRcdFx0aWYgKGlzRmlsZSAmJiBlbnRyeS5uYW1lLmVuZHNXaXRoKFwiLmpzb25cIikpIHtcblx0XHRcdFx0ZW50cmllcy5wdXNoKGZ1bGxQYXRoKTtcblx0XHRcdH1cblx0XHR9XG5cdH0gY2F0Y2gge1xuXHRcdC8vIElnbm9yZSBlcnJvcnNcblx0fVxuXG5cdHJldHVybiBlbnRyaWVzO1xufVxuXG5mdW5jdGlvbiByZWFkUGlNYW5pZmVzdEZpbGUocGFja2FnZUpzb25QYXRoOiBzdHJpbmcpOiBQaU1hbmlmZXN0IHwgbnVsbCB7XG5cdHRyeSB7XG5cdFx0Y29uc3QgY29udGVudCA9IHJlYWRGaWxlU3luYyhwYWNrYWdlSnNvblBhdGgsIFwidXRmLThcIik7XG5cdFx0Y29uc3QgcGtnID0gSlNPTi5wYXJzZShjb250ZW50KSBhcyB7IHBpPzogUGlNYW5pZmVzdCB9O1xuXHRcdHJldHVybiBwa2cucGkgPz8gbnVsbDtcblx0fSBjYXRjaCB7XG5cdFx0cmV0dXJuIG51bGw7XG5cdH1cbn1cblxuZnVuY3Rpb24gcmVzb2x2ZUV4dGVuc2lvbkVudHJpZXMoZGlyOiBzdHJpbmcpOiBzdHJpbmdbXSB8IG51bGwge1xuXHRjb25zdCBwYWNrYWdlSnNvblBhdGggPSBqb2luKGRpciwgXCJwYWNrYWdlLmpzb25cIik7XG5cdGlmIChleGlzdHNTeW5jKHBhY2thZ2VKc29uUGF0aCkpIHtcblx0XHRjb25zdCBtYW5pZmVzdCA9IHJlYWRQaU1hbmlmZXN0RmlsZShwYWNrYWdlSnNvblBhdGgpO1xuXHRcdGlmIChtYW5pZmVzdD8uZXh0ZW5zaW9ucz8ubGVuZ3RoKSB7XG5cdFx0XHRjb25zdCBlbnRyaWVzOiBzdHJpbmdbXSA9IFtdO1xuXHRcdFx0Zm9yIChjb25zdCBleHRQYXRoIG9mIG1hbmlmZXN0LmV4dGVuc2lvbnMpIHtcblx0XHRcdFx0Y29uc3QgcmVzb2x2ZWRFeHRQYXRoID0gcmVzb2x2ZShkaXIsIGV4dFBhdGgpO1xuXHRcdFx0XHRpZiAoZXhpc3RzU3luYyhyZXNvbHZlZEV4dFBhdGgpKSB7XG5cdFx0XHRcdFx0ZW50cmllcy5wdXNoKHJlc29sdmVkRXh0UGF0aCk7XG5cdFx0XHRcdH1cblx0XHRcdH1cblx0XHRcdGlmIChlbnRyaWVzLmxlbmd0aCA+IDApIHtcblx0XHRcdFx0cmV0dXJuIGVudHJpZXM7XG5cdFx0XHR9XG5cdFx0fVxuXHR9XG5cblx0Y29uc3QgaW5kZXhUcyA9IGpvaW4oZGlyLCBcImluZGV4LnRzXCIpO1xuXHRjb25zdCBpbmRleEpzID0gam9pbihkaXIsIFwiaW5kZXguanNcIik7XG5cdGlmIChleGlzdHNTeW5jKGluZGV4VHMpKSB7XG5cdFx0cmV0dXJuIFtpbmRleFRzXTtcblx0fVxuXHRpZiAoZXhpc3RzU3luYyhpbmRleEpzKSkge1xuXHRcdHJldHVybiBbaW5kZXhKc107XG5cdH1cblxuXHRyZXR1cm4gbnVsbDtcbn1cblxuZnVuY3Rpb24gY29sbGVjdEF1dG9FeHRlbnNpb25FbnRyaWVzKGRpcjogc3RyaW5nKTogc3RyaW5nW10ge1xuXHRjb25zdCBlbnRyaWVzOiBzdHJpbmdbXSA9IFtdO1xuXHRpZiAoIWV4aXN0c1N5bmMoZGlyKSkgcmV0dXJuIGVudHJpZXM7XG5cblx0Ly8gRmlyc3QgY2hlY2sgaWYgdGhpcyBkaXJlY3RvcnkgaXRzZWxmIGhhcyBleHBsaWNpdCBleHRlbnNpb24gZW50cmllcyAocGFja2FnZS5qc29uIG9yIGluZGV4KVxuXHRjb25zdCByb290RW50cmllcyA9IHJlc29sdmVFeHRlbnNpb25FbnRyaWVzKGRpcik7XG5cdGlmIChyb290RW50cmllcykge1xuXHRcdHJldHVybiByb290RW50cmllcztcblx0fVxuXG5cdC8vIE90aGVyd2lzZSwgZGlzY292ZXIgZXh0ZW5zaW9ucyBmcm9tIGRpcmVjdG9yeSBjb250ZW50c1xuXHRjb25zdCBpZyA9IGlnbm9yZSgpO1xuXHRhZGRJZ25vcmVSdWxlcyhpZywgZGlyLCBkaXIpO1xuXG5cdHRyeSB7XG5cdFx0Y29uc3QgZGlyRW50cmllcyA9IHJlYWRkaXJTeW5jKGRpciwgeyB3aXRoRmlsZVR5cGVzOiB0cnVlIH0pO1xuXHRcdGZvciAoY29uc3QgZW50cnkgb2YgZGlyRW50cmllcykge1xuXHRcdFx0aWYgKGVudHJ5Lm5hbWUuc3RhcnRzV2l0aChcIi5cIikpIGNvbnRpbnVlO1xuXHRcdFx0aWYgKGVudHJ5Lm5hbWUgPT09IFwibm9kZV9tb2R1bGVzXCIpIGNvbnRpbnVlO1xuXG5cdFx0XHRjb25zdCBmdWxsUGF0aCA9IGpvaW4oZGlyLCBlbnRyeS5uYW1lKTtcblx0XHRcdGxldCBpc0RpciA9IGVudHJ5LmlzRGlyZWN0b3J5KCk7XG5cdFx0XHRsZXQgaXNGaWxlID0gZW50cnkuaXNGaWxlKCk7XG5cblx0XHRcdGlmIChlbnRyeS5pc1N5bWJvbGljTGluaygpKSB7XG5cdFx0XHRcdHRyeSB7XG5cdFx0XHRcdFx0Y29uc3Qgc3RhdHMgPSBzdGF0U3luYyhmdWxsUGF0aCk7XG5cdFx0XHRcdFx0aXNEaXIgPSBzdGF0cy5pc0RpcmVjdG9yeSgpO1xuXHRcdFx0XHRcdGlzRmlsZSA9IHN0YXRzLmlzRmlsZSgpO1xuXHRcdFx0XHR9IGNhdGNoIHtcblx0XHRcdFx0XHRjb250aW51ZTtcblx0XHRcdFx0fVxuXHRcdFx0fVxuXG5cdFx0XHRjb25zdCByZWxQYXRoID0gdG9Qb3NpeFBhdGgocmVsYXRpdmUoZGlyLCBmdWxsUGF0aCkpO1xuXHRcdFx0Y29uc3QgaWdub3JlUGF0aCA9IGlzRGlyID8gYCR7cmVsUGF0aH0vYCA6IHJlbFBhdGg7XG5cdFx0XHRpZiAoaWcuaWdub3JlcyhpZ25vcmVQYXRoKSkgY29udGludWU7XG5cblx0XHRcdGlmIChpc0ZpbGUgJiYgKGVudHJ5Lm5hbWUuZW5kc1dpdGgoXCIudHNcIikgfHwgZW50cnkubmFtZS5lbmRzV2l0aChcIi5qc1wiKSkpIHtcblx0XHRcdFx0ZW50cmllcy5wdXNoKGZ1bGxQYXRoKTtcblx0XHRcdH0gZWxzZSBpZiAoaXNEaXIpIHtcblx0XHRcdFx0Y29uc3QgcmVzb2x2ZWRFbnRyaWVzID0gcmVzb2x2ZUV4dGVuc2lvbkVudHJpZXMoZnVsbFBhdGgpO1xuXHRcdFx0XHRpZiAocmVzb2x2ZWRFbnRyaWVzKSB7XG5cdFx0XHRcdFx0ZW50cmllcy5wdXNoKC4uLnJlc29sdmVkRW50cmllcyk7XG5cdFx0XHRcdH1cblx0XHRcdH1cblx0XHR9XG5cdH0gY2F0Y2gge1xuXHRcdC8vIElnbm9yZSBlcnJvcnNcblx0fVxuXG5cdHJldHVybiBlbnRyaWVzO1xufVxuXG4vKipcbiAqIENvbGxlY3QgcmVzb3VyY2UgZmlsZXMgZnJvbSBhIGRpcmVjdG9yeSBiYXNlZCBvbiByZXNvdXJjZSB0eXBlLlxuICogRXh0ZW5zaW9ucyB1c2Ugc21hcnQgZGlzY292ZXJ5IChpbmRleC50cyBpbiBzdWJkaXJzKSwgb3RoZXJzIHVzZSByZWN1cnNpdmUgY29sbGVjdGlvbi5cbiAqL1xuZnVuY3Rpb24gY29sbGVjdFJlc291cmNlRmlsZXMoZGlyOiBzdHJpbmcsIHJlc291cmNlVHlwZTogUmVzb3VyY2VUeXBlKTogc3RyaW5nW10ge1xuXHRpZiAocmVzb3VyY2VUeXBlID09PSBcInNraWxsc1wiKSB7XG5cdFx0cmV0dXJuIGNvbGxlY3RTa2lsbEVudHJpZXMoZGlyLCBcInBpXCIpO1xuXHR9XG5cdGlmIChyZXNvdXJjZVR5cGUgPT09IFwiZXh0ZW5zaW9uc1wiKSB7XG5cdFx0cmV0dXJuIGNvbGxlY3RBdXRvRXh0ZW5zaW9uRW50cmllcyhkaXIpO1xuXHR9XG5cdHJldHVybiBjb2xsZWN0RmlsZXMoZGlyLCBGSUxFX1BBVFRFUk5TW3Jlc291cmNlVHlwZV0pO1xufVxuXG5mdW5jdGlvbiBtYXRjaGVzQW55UGF0dGVybihmaWxlUGF0aDogc3RyaW5nLCBwYXR0ZXJuczogc3RyaW5nW10sIGJhc2VEaXI6IHN0cmluZyk6IGJvb2xlYW4ge1xuXHRjb25zdCByZWwgPSB0b1Bvc2l4UGF0aChyZWxhdGl2ZShiYXNlRGlyLCBmaWxlUGF0aCkpO1xuXHRjb25zdCBuYW1lID0gYmFzZW5hbWUoZmlsZVBhdGgpO1xuXHRjb25zdCBmaWxlUGF0aFBvc2l4ID0gdG9Qb3NpeFBhdGgoZmlsZVBhdGgpO1xuXHRjb25zdCBpc1NraWxsRmlsZSA9IG5hbWUgPT09IFwiU0tJTEwubWRcIjtcblx0Y29uc3QgcGFyZW50RGlyID0gaXNTa2lsbEZpbGUgPyBkaXJuYW1lKGZpbGVQYXRoKSA6IHVuZGVmaW5lZDtcblx0Y29uc3QgcGFyZW50UmVsID0gaXNTa2lsbEZpbGUgPyB0b1Bvc2l4UGF0aChyZWxhdGl2ZShiYXNlRGlyLCBwYXJlbnREaXIhKSkgOiB1bmRlZmluZWQ7XG5cdGNvbnN0IHBhcmVudE5hbWUgPSBpc1NraWxsRmlsZSA/IGJhc2VuYW1lKHBhcmVudERpciEpIDogdW5kZWZpbmVkO1xuXHRjb25zdCBwYXJlbnREaXJQb3NpeCA9IGlzU2tpbGxGaWxlID8gdG9Qb3NpeFBhdGgocGFyZW50RGlyISkgOiB1bmRlZmluZWQ7XG5cblx0cmV0dXJuIHBhdHRlcm5zLnNvbWUoKHBhdHRlcm4pID0+IHtcblx0XHRjb25zdCBub3JtYWxpemVkUGF0dGVybiA9IHRvUG9zaXhQYXRoKHBhdHRlcm4pO1xuXHRcdGlmIChcblx0XHRcdG1pbmltYXRjaChyZWwsIG5vcm1hbGl6ZWRQYXR0ZXJuKSB8fFxuXHRcdFx0bWluaW1hdGNoKG5hbWUsIG5vcm1hbGl6ZWRQYXR0ZXJuKSB8fFxuXHRcdFx0bWluaW1hdGNoKGZpbGVQYXRoUG9zaXgsIG5vcm1hbGl6ZWRQYXR0ZXJuKVxuXHRcdCkge1xuXHRcdFx0cmV0dXJuIHRydWU7XG5cdFx0fVxuXHRcdGlmICghaXNTa2lsbEZpbGUpIHJldHVybiBmYWxzZTtcblx0XHRyZXR1cm4gKFxuXHRcdFx0bWluaW1hdGNoKHBhcmVudFJlbCEsIG5vcm1hbGl6ZWRQYXR0ZXJuKSB8fFxuXHRcdFx0bWluaW1hdGNoKHBhcmVudE5hbWUhLCBub3JtYWxpemVkUGF0dGVybikgfHxcblx0XHRcdG1pbmltYXRjaChwYXJlbnREaXJQb3NpeCEsIG5vcm1hbGl6ZWRQYXR0ZXJuKVxuXHRcdCk7XG5cdH0pO1xufVxuXG5mdW5jdGlvbiBub3JtYWxpemVFeGFjdFBhdHRlcm4ocGF0dGVybjogc3RyaW5nKTogc3RyaW5nIHtcblx0Y29uc3Qgbm9ybWFsaXplZCA9IHBhdHRlcm4uc3RhcnRzV2l0aChcIi4vXCIpIHx8IHBhdHRlcm4uc3RhcnRzV2l0aChcIi5cXFxcXCIpID8gcGF0dGVybi5zbGljZSgyKSA6IHBhdHRlcm47XG5cdHJldHVybiB0b1Bvc2l4UGF0aChub3JtYWxpemVkKTtcbn1cblxuZnVuY3Rpb24gbWF0Y2hlc0FueUV4YWN0UGF0dGVybihmaWxlUGF0aDogc3RyaW5nLCBwYXR0ZXJuczogc3RyaW5nW10sIGJhc2VEaXI6IHN0cmluZyk6IGJvb2xlYW4ge1xuXHRpZiAocGF0dGVybnMubGVuZ3RoID09PSAwKSByZXR1cm4gZmFsc2U7XG5cdGNvbnN0IHJlbCA9IHRvUG9zaXhQYXRoKHJlbGF0aXZlKGJhc2VEaXIsIGZpbGVQYXRoKSk7XG5cdGNvbnN0IG5hbWUgPSBiYXNlbmFtZShmaWxlUGF0aCk7XG5cdGNvbnN0IGZpbGVQYXRoUG9zaXggPSB0b1Bvc2l4UGF0aChmaWxlUGF0aCk7XG5cdGNvbnN0IGlzU2tpbGxGaWxlID0gbmFtZSA9PT0gXCJTS0lMTC5tZFwiO1xuXHRjb25zdCBwYXJlbnREaXIgPSBpc1NraWxsRmlsZSA/IGRpcm5hbWUoZmlsZVBhdGgpIDogdW5kZWZpbmVkO1xuXHRjb25zdCBwYXJlbnRSZWwgPSBpc1NraWxsRmlsZSA/IHRvUG9zaXhQYXRoKHJlbGF0aXZlKGJhc2VEaXIsIHBhcmVudERpciEpKSA6IHVuZGVmaW5lZDtcblx0Y29uc3QgcGFyZW50RGlyUG9zaXggPSBpc1NraWxsRmlsZSA/IHRvUG9zaXhQYXRoKHBhcmVudERpciEpIDogdW5kZWZpbmVkO1xuXG5cdHJldHVybiBwYXR0ZXJucy5zb21lKChwYXR0ZXJuKSA9PiB7XG5cdFx0Y29uc3Qgbm9ybWFsaXplZCA9IG5vcm1hbGl6ZUV4YWN0UGF0dGVybihwYXR0ZXJuKTtcblx0XHRpZiAobm9ybWFsaXplZCA9PT0gcmVsIHx8IG5vcm1hbGl6ZWQgPT09IGZpbGVQYXRoUG9zaXgpIHtcblx0XHRcdHJldHVybiB0cnVlO1xuXHRcdH1cblx0XHRpZiAoIWlzU2tpbGxGaWxlKSByZXR1cm4gZmFsc2U7XG5cdFx0cmV0dXJuIG5vcm1hbGl6ZWQgPT09IHBhcmVudFJlbCB8fCBub3JtYWxpemVkID09PSBwYXJlbnREaXJQb3NpeDtcblx0fSk7XG59XG5cbmZ1bmN0aW9uIGdldE92ZXJyaWRlUGF0dGVybnMoZW50cmllczogc3RyaW5nW10pOiBzdHJpbmdbXSB7XG5cdHJldHVybiBlbnRyaWVzLmZpbHRlcigocGF0dGVybikgPT4gcGF0dGVybi5zdGFydHNXaXRoKFwiIVwiKSB8fCBwYXR0ZXJuLnN0YXJ0c1dpdGgoXCIrXCIpIHx8IHBhdHRlcm4uc3RhcnRzV2l0aChcIi1cIikpO1xufVxuXG5mdW5jdGlvbiBpc0VuYWJsZWRCeU92ZXJyaWRlcyhmaWxlUGF0aDogc3RyaW5nLCBwYXR0ZXJuczogc3RyaW5nW10sIGJhc2VEaXI6IHN0cmluZyk6IGJvb2xlYW4ge1xuXHRjb25zdCBvdmVycmlkZXMgPSBnZXRPdmVycmlkZVBhdHRlcm5zKHBhdHRlcm5zKTtcblx0Y29uc3QgZXhjbHVkZXMgPSBvdmVycmlkZXMuZmlsdGVyKChwYXR0ZXJuKSA9PiBwYXR0ZXJuLnN0YXJ0c1dpdGgoXCIhXCIpKS5tYXAoKHBhdHRlcm4pID0+IHBhdHRlcm4uc2xpY2UoMSkpO1xuXHRjb25zdCBmb3JjZUluY2x1ZGVzID0gb3ZlcnJpZGVzLmZpbHRlcigocGF0dGVybikgPT4gcGF0dGVybi5zdGFydHNXaXRoKFwiK1wiKSkubWFwKChwYXR0ZXJuKSA9PiBwYXR0ZXJuLnNsaWNlKDEpKTtcblx0Y29uc3QgZm9yY2VFeGNsdWRlcyA9IG92ZXJyaWRlcy5maWx0ZXIoKHBhdHRlcm4pID0+IHBhdHRlcm4uc3RhcnRzV2l0aChcIi1cIikpLm1hcCgocGF0dGVybikgPT4gcGF0dGVybi5zbGljZSgxKSk7XG5cblx0bGV0IGVuYWJsZWQgPSB0cnVlO1xuXHRpZiAoZXhjbHVkZXMubGVuZ3RoID4gMCAmJiBtYXRjaGVzQW55UGF0dGVybihmaWxlUGF0aCwgZXhjbHVkZXMsIGJhc2VEaXIpKSB7XG5cdFx0ZW5hYmxlZCA9IGZhbHNlO1xuXHR9XG5cdGlmIChmb3JjZUluY2x1ZGVzLmxlbmd0aCA+IDAgJiYgbWF0Y2hlc0FueUV4YWN0UGF0dGVybihmaWxlUGF0aCwgZm9yY2VJbmNsdWRlcywgYmFzZURpcikpIHtcblx0XHRlbmFibGVkID0gdHJ1ZTtcblx0fVxuXHRpZiAoZm9yY2VFeGNsdWRlcy5sZW5ndGggPiAwICYmIG1hdGNoZXNBbnlFeGFjdFBhdHRlcm4oZmlsZVBhdGgsIGZvcmNlRXhjbHVkZXMsIGJhc2VEaXIpKSB7XG5cdFx0ZW5hYmxlZCA9IGZhbHNlO1xuXHR9XG5cdHJldHVybiBlbmFibGVkO1xufVxuXG4vKipcbiAqIEFwcGx5IHBhdHRlcm5zIHRvIHBhdGhzIGFuZCByZXR1cm4gYSBTZXQgb2YgZW5hYmxlZCBwYXRocy5cbiAqIFBhdHRlcm4gdHlwZXM6XG4gKiAtIFBsYWluIHBhdHRlcm5zOiBpbmNsdWRlIG1hdGNoaW5nIHBhdGhzXG4gKiAtIGAhcGF0dGVybmA6IGV4Y2x1ZGUgbWF0Y2hpbmcgcGF0aHNcbiAqIC0gYCtwYXRoYDogZm9yY2UtaW5jbHVkZSBleGFjdCBwYXRoIChvdmVycmlkZXMgZXhjbHVzaW9ucylcbiAqIC0gYC1wYXRoYDogZm9yY2UtZXhjbHVkZSBleGFjdCBwYXRoIChvdmVycmlkZXMgZm9yY2UtaW5jbHVkZXMpXG4gKi9cbmZ1bmN0aW9uIGFwcGx5UGF0dGVybnMoYWxsUGF0aHM6IHN0cmluZ1tdLCBwYXR0ZXJuczogc3RyaW5nW10sIGJhc2VEaXI6IHN0cmluZyk6IFNldDxzdHJpbmc+IHtcblx0Y29uc3QgaW5jbHVkZXM6IHN0cmluZ1tdID0gW107XG5cdGNvbnN0IGV4Y2x1ZGVzOiBzdHJpbmdbXSA9IFtdO1xuXHRjb25zdCBmb3JjZUluY2x1ZGVzOiBzdHJpbmdbXSA9IFtdO1xuXHRjb25zdCBmb3JjZUV4Y2x1ZGVzOiBzdHJpbmdbXSA9IFtdO1xuXG5cdGZvciAoY29uc3QgcCBvZiBwYXR0ZXJucykge1xuXHRcdGlmIChwLnN0YXJ0c1dpdGgoXCIrXCIpKSB7XG5cdFx0XHRmb3JjZUluY2x1ZGVzLnB1c2gocC5zbGljZSgxKSk7XG5cdFx0fSBlbHNlIGlmIChwLnN0YXJ0c1dpdGgoXCItXCIpKSB7XG5cdFx0XHRmb3JjZUV4Y2x1ZGVzLnB1c2gocC5zbGljZSgxKSk7XG5cdFx0fSBlbHNlIGlmIChwLnN0YXJ0c1dpdGgoXCIhXCIpKSB7XG5cdFx0XHRleGNsdWRlcy5wdXNoKHAuc2xpY2UoMSkpO1xuXHRcdH0gZWxzZSB7XG5cdFx0XHRpbmNsdWRlcy5wdXNoKHApO1xuXHRcdH1cblx0fVxuXG5cdC8vIFN0ZXAgMTogQXBwbHkgaW5jbHVkZXMgKG9yIGFsbCBpZiBubyBpbmNsdWRlcylcblx0bGV0IHJlc3VsdDogc3RyaW5nW107XG5cdGlmIChpbmNsdWRlcy5sZW5ndGggPT09IDApIHtcblx0XHRyZXN1bHQgPSBbLi4uYWxsUGF0aHNdO1xuXHR9IGVsc2Uge1xuXHRcdHJlc3VsdCA9IGFsbFBhdGhzLmZpbHRlcigoZmlsZVBhdGgpID0+IG1hdGNoZXNBbnlQYXR0ZXJuKGZpbGVQYXRoLCBpbmNsdWRlcywgYmFzZURpcikpO1xuXHR9XG5cblx0Ly8gU3RlcCAyOiBBcHBseSBleGNsdWRlc1xuXHRpZiAoZXhjbHVkZXMubGVuZ3RoID4gMCkge1xuXHRcdHJlc3VsdCA9IHJlc3VsdC5maWx0ZXIoKGZpbGVQYXRoKSA9PiAhbWF0Y2hlc0FueVBhdHRlcm4oZmlsZVBhdGgsIGV4Y2x1ZGVzLCBiYXNlRGlyKSk7XG5cdH1cblxuXHQvLyBTdGVwIDM6IEZvcmNlLWluY2x1ZGUgKGFkZCBiYWNrIGZyb20gYWxsUGF0aHMsIG92ZXJyaWRpbmcgZXhjbHVzaW9ucylcblx0aWYgKGZvcmNlSW5jbHVkZXMubGVuZ3RoID4gMCkge1xuXHRcdGZvciAoY29uc3QgZmlsZVBhdGggb2YgYWxsUGF0aHMpIHtcblx0XHRcdGlmICghcmVzdWx0LmluY2x1ZGVzKGZpbGVQYXRoKSAmJiBtYXRjaGVzQW55RXhhY3RQYXR0ZXJuKGZpbGVQYXRoLCBmb3JjZUluY2x1ZGVzLCBiYXNlRGlyKSkge1xuXHRcdFx0XHRyZXN1bHQucHVzaChmaWxlUGF0aCk7XG5cdFx0XHR9XG5cdFx0fVxuXHR9XG5cblx0Ly8gU3RlcCA0OiBGb3JjZS1leGNsdWRlIChyZW1vdmUgZXZlbiBpZiBpbmNsdWRlZCBvciBmb3JjZS1pbmNsdWRlZClcblx0aWYgKGZvcmNlRXhjbHVkZXMubGVuZ3RoID4gMCkge1xuXHRcdHJlc3VsdCA9IHJlc3VsdC5maWx0ZXIoKGZpbGVQYXRoKSA9PiAhbWF0Y2hlc0FueUV4YWN0UGF0dGVybihmaWxlUGF0aCwgZm9yY2VFeGNsdWRlcywgYmFzZURpcikpO1xuXHR9XG5cblx0cmV0dXJuIG5ldyBTZXQocmVzdWx0KTtcbn1cblxuZXhwb3J0IGNsYXNzIERlZmF1bHRQYWNrYWdlTWFuYWdlciBpbXBsZW1lbnRzIFBhY2thZ2VNYW5hZ2VyIHtcblx0cHJpdmF0ZSBjd2Q6IHN0cmluZztcblx0cHJpdmF0ZSBhZ2VudERpcjogc3RyaW5nO1xuXHRwcml2YXRlIHNldHRpbmdzTWFuYWdlcjogU2V0dGluZ3NNYW5hZ2VyO1xuXHRwcml2YXRlIGdsb2JhbE5wbVJvb3Q6IHN0cmluZyB8IHVuZGVmaW5lZDtcblx0cHJpdmF0ZSBnbG9iYWxOcG1Sb290Q29tbWFuZEtleTogc3RyaW5nIHwgdW5kZWZpbmVkO1xuXHRwcml2YXRlIHByb2dyZXNzQ2FsbGJhY2s6IFByb2dyZXNzQ2FsbGJhY2sgfCB1bmRlZmluZWQ7XG5cblx0Y29uc3RydWN0b3Iob3B0aW9uczogUGFja2FnZU1hbmFnZXJPcHRpb25zKSB7XG5cdFx0dGhpcy5jd2QgPSBvcHRpb25zLmN3ZDtcblx0XHR0aGlzLmFnZW50RGlyID0gb3B0aW9ucy5hZ2VudERpcjtcblx0XHR0aGlzLnNldHRpbmdzTWFuYWdlciA9IG9wdGlvbnMuc2V0dGluZ3NNYW5hZ2VyO1xuXHR9XG5cblx0c2V0UHJvZ3Jlc3NDYWxsYmFjayhjYWxsYmFjazogUHJvZ3Jlc3NDYWxsYmFjayB8IHVuZGVmaW5lZCk6IHZvaWQge1xuXHRcdHRoaXMucHJvZ3Jlc3NDYWxsYmFjayA9IGNhbGxiYWNrO1xuXHR9XG5cblx0YWRkU291cmNlVG9TZXR0aW5ncyhzb3VyY2U6IHN0cmluZywgb3B0aW9ucz86IHsgbG9jYWw/OiBib29sZWFuIH0pOiBib29sZWFuIHtcblx0XHRjb25zdCBzY29wZTogU291cmNlU2NvcGUgPSBvcHRpb25zPy5sb2NhbCA/IFwicHJvamVjdFwiIDogXCJ1c2VyXCI7XG5cdFx0Y29uc3QgY3VycmVudFNldHRpbmdzID1cblx0XHRcdHNjb3BlID09PSBcInByb2plY3RcIiA/IHRoaXMuc2V0dGluZ3NNYW5hZ2VyLmdldFByb2plY3RTZXR0aW5ncygpIDogdGhpcy5zZXR0aW5nc01hbmFnZXIuZ2V0R2xvYmFsU2V0dGluZ3MoKTtcblx0XHRjb25zdCBjdXJyZW50UGFja2FnZXMgPSBjdXJyZW50U2V0dGluZ3MucGFja2FnZXMgPz8gW107XG5cdFx0Y29uc3Qgbm9ybWFsaXplZFNvdXJjZSA9IHRoaXMubm9ybWFsaXplUGFja2FnZVNvdXJjZUZvclNldHRpbmdzKHNvdXJjZSwgc2NvcGUpO1xuXHRcdGNvbnN0IGV4aXN0cyA9IGN1cnJlbnRQYWNrYWdlcy5zb21lKChleGlzdGluZykgPT4gdGhpcy5wYWNrYWdlU291cmNlc01hdGNoKGV4aXN0aW5nLCBzb3VyY2UsIHNjb3BlKSk7XG5cdFx0aWYgKGV4aXN0cykge1xuXHRcdFx0cmV0dXJuIGZhbHNlO1xuXHRcdH1cblx0XHRjb25zdCBuZXh0UGFja2FnZXMgPSBbLi4uY3VycmVudFBhY2thZ2VzLCBub3JtYWxpemVkU291cmNlXTtcblx0XHRpZiAoc2NvcGUgPT09IFwicHJvamVjdFwiKSB7XG5cdFx0XHR0aGlzLnNldHRpbmdzTWFuYWdlci5zZXRQcm9qZWN0UGFja2FnZXMobmV4dFBhY2thZ2VzKTtcblx0XHR9IGVsc2Uge1xuXHRcdFx0dGhpcy5zZXR0aW5nc01hbmFnZXIuc2V0UGFja2FnZXMobmV4dFBhY2thZ2VzKTtcblx0XHR9XG5cdFx0cmV0dXJuIHRydWU7XG5cdH1cblxuXHRyZW1vdmVTb3VyY2VGcm9tU2V0dGluZ3Moc291cmNlOiBzdHJpbmcsIG9wdGlvbnM/OiB7IGxvY2FsPzogYm9vbGVhbiB9KTogYm9vbGVhbiB7XG5cdFx0Y29uc3Qgc2NvcGU6IFNvdXJjZVNjb3BlID0gb3B0aW9ucz8ubG9jYWwgPyBcInByb2plY3RcIiA6IFwidXNlclwiO1xuXHRcdGNvbnN0IGN1cnJlbnRTZXR0aW5ncyA9XG5cdFx0XHRzY29wZSA9PT0gXCJwcm9qZWN0XCIgPyB0aGlzLnNldHRpbmdzTWFuYWdlci5nZXRQcm9qZWN0U2V0dGluZ3MoKSA6IHRoaXMuc2V0dGluZ3NNYW5hZ2VyLmdldEdsb2JhbFNldHRpbmdzKCk7XG5cdFx0Y29uc3QgY3VycmVudFBhY2thZ2VzID0gY3VycmVudFNldHRpbmdzLnBhY2thZ2VzID8/IFtdO1xuXHRcdGNvbnN0IG5leHRQYWNrYWdlcyA9IGN1cnJlbnRQYWNrYWdlcy5maWx0ZXIoKGV4aXN0aW5nKSA9PiAhdGhpcy5wYWNrYWdlU291cmNlc01hdGNoKGV4aXN0aW5nLCBzb3VyY2UsIHNjb3BlKSk7XG5cdFx0Y29uc3QgY2hhbmdlZCA9IG5leHRQYWNrYWdlcy5sZW5ndGggIT09IGN1cnJlbnRQYWNrYWdlcy5sZW5ndGg7XG5cdFx0aWYgKCFjaGFuZ2VkKSB7XG5cdFx0XHRyZXR1cm4gZmFsc2U7XG5cdFx0fVxuXHRcdGlmIChzY29wZSA9PT0gXCJwcm9qZWN0XCIpIHtcblx0XHRcdHRoaXMuc2V0dGluZ3NNYW5hZ2VyLnNldFByb2plY3RQYWNrYWdlcyhuZXh0UGFja2FnZXMpO1xuXHRcdH0gZWxzZSB7XG5cdFx0XHR0aGlzLnNldHRpbmdzTWFuYWdlci5zZXRQYWNrYWdlcyhuZXh0UGFja2FnZXMpO1xuXHRcdH1cblx0XHRyZXR1cm4gdHJ1ZTtcblx0fVxuXG5cdGdldEluc3RhbGxlZFBhdGgoc291cmNlOiBzdHJpbmcsIHNjb3BlOiBcInVzZXJcIiB8IFwicHJvamVjdFwiKTogc3RyaW5nIHwgdW5kZWZpbmVkIHtcblx0XHRjb25zdCBwYXJzZWQgPSB0aGlzLnBhcnNlU291cmNlKHNvdXJjZSk7XG5cdFx0aWYgKHBhcnNlZC50eXBlID09PSBcIm5wbVwiKSB7XG5cdFx0XHRjb25zdCBwYXRoID0gdGhpcy5nZXROcG1JbnN0YWxsUGF0aChwYXJzZWQsIHNjb3BlKTtcblx0XHRcdHJldHVybiBleGlzdHNTeW5jKHBhdGgpID8gcGF0aCA6IHVuZGVmaW5lZDtcblx0XHR9XG5cdFx0aWYgKHBhcnNlZC50eXBlID09PSBcImdpdFwiKSB7XG5cdFx0XHRjb25zdCBwYXRoID0gdGhpcy5nZXRHaXRJbnN0YWxsUGF0aChwYXJzZWQsIHNjb3BlKTtcblx0XHRcdHJldHVybiBleGlzdHNTeW5jKHBhdGgpID8gcGF0aCA6IHVuZGVmaW5lZDtcblx0XHR9XG5cdFx0aWYgKHBhcnNlZC50eXBlID09PSBcImxvY2FsXCIpIHtcblx0XHRcdGNvbnN0IGJhc2VEaXIgPSB0aGlzLmdldEJhc2VEaXJGb3JTY29wZShzY29wZSk7XG5cdFx0XHRjb25zdCBwYXRoID0gdGhpcy5yZXNvbHZlUGF0aEZyb21CYXNlKHBhcnNlZC5wYXRoLCBiYXNlRGlyKTtcblx0XHRcdHJldHVybiBleGlzdHNTeW5jKHBhdGgpID8gcGF0aCA6IHVuZGVmaW5lZDtcblx0XHR9XG5cdFx0cmV0dXJuIHVuZGVmaW5lZDtcblx0fVxuXG5cdHByaXZhdGUgZW1pdFByb2dyZXNzKGV2ZW50OiBQcm9ncmVzc0V2ZW50KTogdm9pZCB7XG5cdFx0dGhpcy5wcm9ncmVzc0NhbGxiYWNrPy4oZXZlbnQpO1xuXHR9XG5cblx0cHJpdmF0ZSBhc3luYyB3aXRoUHJvZ3Jlc3MoXG5cdFx0YWN0aW9uOiBQcm9ncmVzc0V2ZW50W1wiYWN0aW9uXCJdLFxuXHRcdHNvdXJjZTogc3RyaW5nLFxuXHRcdG1lc3NhZ2U6IHN0cmluZyxcblx0XHRvcGVyYXRpb246ICgpID0+IFByb21pc2U8dm9pZD4sXG5cdCk6IFByb21pc2U8dm9pZD4ge1xuXHRcdHRoaXMuZW1pdFByb2dyZXNzKHsgdHlwZTogXCJzdGFydFwiLCBhY3Rpb24sIHNvdXJjZSwgbWVzc2FnZSB9KTtcblx0XHR0cnkge1xuXHRcdFx0YXdhaXQgb3BlcmF0aW9uKCk7XG5cdFx0XHR0aGlzLmVtaXRQcm9ncmVzcyh7IHR5cGU6IFwiY29tcGxldGVcIiwgYWN0aW9uLCBzb3VyY2UgfSk7XG5cdFx0fSBjYXRjaCAoZXJyb3IpIHtcblx0XHRcdGNvbnN0IGVycm9yTWVzc2FnZSA9IGVycm9yIGluc3RhbmNlb2YgRXJyb3IgPyBlcnJvci5tZXNzYWdlIDogU3RyaW5nKGVycm9yKTtcblx0XHRcdHRoaXMuZW1pdFByb2dyZXNzKHsgdHlwZTogXCJlcnJvclwiLCBhY3Rpb24sIHNvdXJjZSwgbWVzc2FnZTogZXJyb3JNZXNzYWdlIH0pO1xuXHRcdFx0dGhyb3cgZXJyb3I7XG5cdFx0fVxuXHR9XG5cblx0YXN5bmMgcmVzb2x2ZShvbk1pc3Npbmc/OiAoc291cmNlOiBzdHJpbmcpID0+IFByb21pc2U8TWlzc2luZ1NvdXJjZUFjdGlvbj4pOiBQcm9taXNlPFJlc29sdmVkUGF0aHM+IHtcblx0XHRjb25zdCBhY2N1bXVsYXRvciA9IHRoaXMuY3JlYXRlQWNjdW11bGF0b3IoKTtcblx0XHRjb25zdCBnbG9iYWxTZXR0aW5ncyA9IHRoaXMuc2V0dGluZ3NNYW5hZ2VyLmdldEdsb2JhbFNldHRpbmdzKCk7XG5cdFx0Y29uc3QgcHJvamVjdFNldHRpbmdzID0gdGhpcy5zZXR0aW5nc01hbmFnZXIuZ2V0UHJvamVjdFNldHRpbmdzKCk7XG5cblx0XHQvLyBDb2xsZWN0IGFsbCBwYWNrYWdlcyB3aXRoIHNjb3BlIChwcm9qZWN0IGZpcnN0IHNvIGN3ZCByZXNvdXJjZXMgd2luIGNvbGxpc2lvbnMpXG5cdFx0Y29uc3QgYWxsUGFja2FnZXM6IEFycmF5PHsgcGtnOiBQYWNrYWdlU291cmNlOyBzY29wZTogU291cmNlU2NvcGUgfT4gPSBbXTtcblx0XHRmb3IgKGNvbnN0IHBrZyBvZiBwcm9qZWN0U2V0dGluZ3MucGFja2FnZXMgPz8gW10pIHtcblx0XHRcdGFsbFBhY2thZ2VzLnB1c2goeyBwa2csIHNjb3BlOiBcInByb2plY3RcIiB9KTtcblx0XHR9XG5cdFx0Zm9yIChjb25zdCBwa2cgb2YgZ2xvYmFsU2V0dGluZ3MucGFja2FnZXMgPz8gW10pIHtcblx0XHRcdGFsbFBhY2thZ2VzLnB1c2goeyBwa2csIHNjb3BlOiBcInVzZXJcIiB9KTtcblx0XHR9XG5cblx0XHQvLyBEZWR1cGU6IHByb2plY3Qgc2NvcGUgd2lucyBvdmVyIGdsb2JhbCBmb3Igc2FtZSBwYWNrYWdlIGlkZW50aXR5XG5cdFx0Y29uc3QgcGFja2FnZVNvdXJjZXMgPSB0aGlzLmRlZHVwZVBhY2thZ2VzKGFsbFBhY2thZ2VzKTtcblx0XHRhd2FpdCB0aGlzLnJlc29sdmVQYWNrYWdlU291cmNlcyhwYWNrYWdlU291cmNlcywgYWNjdW11bGF0b3IsIG9uTWlzc2luZyk7XG5cblx0XHRjb25zdCBnbG9iYWxCYXNlRGlyID0gdGhpcy5hZ2VudERpcjtcblx0XHRjb25zdCBwcm9qZWN0QmFzZURpciA9IGpvaW4odGhpcy5jd2QsIENPTkZJR19ESVJfTkFNRSk7XG5cblx0XHRmb3IgKGNvbnN0IHJlc291cmNlVHlwZSBvZiBSRVNPVVJDRV9UWVBFUykge1xuXHRcdFx0Y29uc3QgdGFyZ2V0ID0gdGhpcy5nZXRUYXJnZXRNYXAoYWNjdW11bGF0b3IsIHJlc291cmNlVHlwZSk7XG5cdFx0XHRjb25zdCBnbG9iYWxFbnRyaWVzID0gKGdsb2JhbFNldHRpbmdzW3Jlc291cmNlVHlwZV0gPz8gW10pIGFzIHN0cmluZ1tdO1xuXHRcdFx0Y29uc3QgcHJvamVjdEVudHJpZXMgPSAocHJvamVjdFNldHRpbmdzW3Jlc291cmNlVHlwZV0gPz8gW10pIGFzIHN0cmluZ1tdO1xuXHRcdFx0dGhpcy5yZXNvbHZlTG9jYWxFbnRyaWVzKFxuXHRcdFx0XHRwcm9qZWN0RW50cmllcyxcblx0XHRcdFx0cmVzb3VyY2VUeXBlLFxuXHRcdFx0XHR0YXJnZXQsXG5cdFx0XHRcdHtcblx0XHRcdFx0XHRzb3VyY2U6IFwibG9jYWxcIixcblx0XHRcdFx0XHRzY29wZTogXCJwcm9qZWN0XCIsXG5cdFx0XHRcdFx0b3JpZ2luOiBcInRvcC1sZXZlbFwiLFxuXHRcdFx0XHR9LFxuXHRcdFx0XHRwcm9qZWN0QmFzZURpcixcblx0XHRcdCk7XG5cdFx0XHR0aGlzLnJlc29sdmVMb2NhbEVudHJpZXMoXG5cdFx0XHRcdGdsb2JhbEVudHJpZXMsXG5cdFx0XHRcdHJlc291cmNlVHlwZSxcblx0XHRcdFx0dGFyZ2V0LFxuXHRcdFx0XHR7XG5cdFx0XHRcdFx0c291cmNlOiBcImxvY2FsXCIsXG5cdFx0XHRcdFx0c2NvcGU6IFwidXNlclwiLFxuXHRcdFx0XHRcdG9yaWdpbjogXCJ0b3AtbGV2ZWxcIixcblx0XHRcdFx0fSxcblx0XHRcdFx0Z2xvYmFsQmFzZURpcixcblx0XHRcdCk7XG5cdFx0fVxuXG5cdFx0dGhpcy5hZGRBdXRvRGlzY292ZXJlZFJlc291cmNlcyhhY2N1bXVsYXRvciwgZ2xvYmFsU2V0dGluZ3MsIHByb2plY3RTZXR0aW5ncywgZ2xvYmFsQmFzZURpciwgcHJvamVjdEJhc2VEaXIpO1xuXG5cdFx0cmV0dXJuIHRoaXMudG9SZXNvbHZlZFBhdGhzKGFjY3VtdWxhdG9yKTtcblx0fVxuXG5cdGFzeW5jIHJlc29sdmVFeHRlbnNpb25Tb3VyY2VzKFxuXHRcdHNvdXJjZXM6IHN0cmluZ1tdLFxuXHRcdG9wdGlvbnM/OiB7IGxvY2FsPzogYm9vbGVhbjsgdGVtcG9yYXJ5PzogYm9vbGVhbiB9LFxuXHQpOiBQcm9taXNlPFJlc29sdmVkUGF0aHM+IHtcblx0XHRjb25zdCBhY2N1bXVsYXRvciA9IHRoaXMuY3JlYXRlQWNjdW11bGF0b3IoKTtcblx0XHRjb25zdCBzY29wZTogU291cmNlU2NvcGUgPSBvcHRpb25zPy50ZW1wb3JhcnkgPyBcInRlbXBvcmFyeVwiIDogb3B0aW9ucz8ubG9jYWwgPyBcInByb2plY3RcIiA6IFwidXNlclwiO1xuXHRcdGNvbnN0IHBhY2thZ2VTb3VyY2VzID0gc291cmNlcy5tYXAoKHNvdXJjZSkgPT4gKHsgcGtnOiBzb3VyY2UgYXMgUGFja2FnZVNvdXJjZSwgc2NvcGUgfSkpO1xuXHRcdGF3YWl0IHRoaXMucmVzb2x2ZVBhY2thZ2VTb3VyY2VzKHBhY2thZ2VTb3VyY2VzLCBhY2N1bXVsYXRvcik7XG5cdFx0cmV0dXJuIHRoaXMudG9SZXNvbHZlZFBhdGhzKGFjY3VtdWxhdG9yKTtcblx0fVxuXG5cdGxpc3RDb25maWd1cmVkUGFja2FnZXMoKTogQ29uZmlndXJlZFBhY2thZ2VbXSB7XG5cdFx0Y29uc3QgZ2xvYmFsU2V0dGluZ3MgPSB0aGlzLnNldHRpbmdzTWFuYWdlci5nZXRHbG9iYWxTZXR0aW5ncygpO1xuXHRcdGNvbnN0IHByb2plY3RTZXR0aW5ncyA9IHRoaXMuc2V0dGluZ3NNYW5hZ2VyLmdldFByb2plY3RTZXR0aW5ncygpO1xuXHRcdGNvbnN0IGNvbmZpZ3VyZWRQYWNrYWdlczogQ29uZmlndXJlZFBhY2thZ2VbXSA9IFtdO1xuXG5cdFx0Zm9yIChjb25zdCBwa2cgb2YgZ2xvYmFsU2V0dGluZ3MucGFja2FnZXMgPz8gW10pIHtcblx0XHRcdGNvbnN0IHNvdXJjZSA9IHR5cGVvZiBwa2cgPT09IFwic3RyaW5nXCIgPyBwa2cgOiBwa2cuc291cmNlO1xuXHRcdFx0Y29uZmlndXJlZFBhY2thZ2VzLnB1c2goe1xuXHRcdFx0XHRzb3VyY2UsXG5cdFx0XHRcdHNjb3BlOiBcInVzZXJcIixcblx0XHRcdFx0ZmlsdGVyZWQ6IHR5cGVvZiBwa2cgPT09IFwib2JqZWN0XCIsXG5cdFx0XHRcdGluc3RhbGxlZFBhdGg6IHRoaXMuZ2V0SW5zdGFsbGVkUGF0aChzb3VyY2UsIFwidXNlclwiKSxcblx0XHRcdH0pO1xuXHRcdH1cblxuXHRcdGZvciAoY29uc3QgcGtnIG9mIHByb2plY3RTZXR0aW5ncy5wYWNrYWdlcyA/PyBbXSkge1xuXHRcdFx0Y29uc3Qgc291cmNlID0gdHlwZW9mIHBrZyA9PT0gXCJzdHJpbmdcIiA/IHBrZyA6IHBrZy5zb3VyY2U7XG5cdFx0XHRjb25maWd1cmVkUGFja2FnZXMucHVzaCh7XG5cdFx0XHRcdHNvdXJjZSxcblx0XHRcdFx0c2NvcGU6IFwicHJvamVjdFwiLFxuXHRcdFx0XHRmaWx0ZXJlZDogdHlwZW9mIHBrZyA9PT0gXCJvYmplY3RcIixcblx0XHRcdFx0aW5zdGFsbGVkUGF0aDogdGhpcy5nZXRJbnN0YWxsZWRQYXRoKHNvdXJjZSwgXCJwcm9qZWN0XCIpLFxuXHRcdFx0fSk7XG5cdFx0fVxuXG5cdFx0cmV0dXJuIGNvbmZpZ3VyZWRQYWNrYWdlcztcblx0fVxuXG5cdGFzeW5jIGluc3RhbGwoc291cmNlOiBzdHJpbmcsIG9wdGlvbnM/OiB7IGxvY2FsPzogYm9vbGVhbiB9KTogUHJvbWlzZTx2b2lkPiB7XG5cdFx0Y29uc3QgcGFyc2VkID0gdGhpcy5wYXJzZVNvdXJjZShzb3VyY2UpO1xuXHRcdGNvbnN0IHNjb3BlOiBTb3VyY2VTY29wZSA9IG9wdGlvbnM/LmxvY2FsID8gXCJwcm9qZWN0XCIgOiBcInVzZXJcIjtcblx0XHRhd2FpdCB0aGlzLndpdGhQcm9ncmVzcyhcImluc3RhbGxcIiwgc291cmNlLCBgSW5zdGFsbGluZyAke3NvdXJjZX0uLi5gLCBhc3luYyAoKSA9PiB7XG5cdFx0XHRpZiAocGFyc2VkLnR5cGUgPT09IFwibnBtXCIpIHtcblx0XHRcdFx0YXdhaXQgdGhpcy5pbnN0YWxsTnBtKHBhcnNlZCwgc2NvcGUsIGZhbHNlKTtcblx0XHRcdFx0cmV0dXJuO1xuXHRcdFx0fVxuXHRcdFx0aWYgKHBhcnNlZC50eXBlID09PSBcImdpdFwiKSB7XG5cdFx0XHRcdGF3YWl0IHRoaXMuaW5zdGFsbEdpdChwYXJzZWQsIHNjb3BlKTtcblx0XHRcdFx0cmV0dXJuO1xuXHRcdFx0fVxuXHRcdFx0aWYgKHBhcnNlZC50eXBlID09PSBcImxvY2FsXCIpIHtcblx0XHRcdFx0Y29uc3QgcmVzb2x2ZWQgPSB0aGlzLnJlc29sdmVQYXRoKHBhcnNlZC5wYXRoKTtcblx0XHRcdFx0aWYgKCFleGlzdHNTeW5jKHJlc29sdmVkKSkge1xuXHRcdFx0XHRcdHRocm93IG5ldyBFcnJvcihgUGF0aCBkb2VzIG5vdCBleGlzdDogJHtyZXNvbHZlZH1gKTtcblx0XHRcdFx0fVxuXHRcdFx0XHRyZXR1cm47XG5cdFx0XHR9XG5cdFx0XHR0aHJvdyBuZXcgRXJyb3IoYFVuc3VwcG9ydGVkIGluc3RhbGwgc291cmNlOiAke3NvdXJjZX1gKTtcblx0XHR9KTtcblx0fVxuXG5cdGFzeW5jIGluc3RhbGxBbmRQZXJzaXN0KHNvdXJjZTogc3RyaW5nLCBvcHRpb25zPzogeyBsb2NhbD86IGJvb2xlYW4gfSk6IFByb21pc2U8dm9pZD4ge1xuXHRcdGF3YWl0IHRoaXMuaW5zdGFsbChzb3VyY2UsIG9wdGlvbnMpO1xuXHRcdHRoaXMuYWRkU291cmNlVG9TZXR0aW5ncyhzb3VyY2UsIG9wdGlvbnMpO1xuXHR9XG5cblx0YXN5bmMgcmVtb3ZlKHNvdXJjZTogc3RyaW5nLCBvcHRpb25zPzogeyBsb2NhbD86IGJvb2xlYW4gfSk6IFByb21pc2U8dm9pZD4ge1xuXHRcdGNvbnN0IHBhcnNlZCA9IHRoaXMucGFyc2VTb3VyY2Uoc291cmNlKTtcblx0XHRjb25zdCBzY29wZTogU291cmNlU2NvcGUgPSBvcHRpb25zPy5sb2NhbCA/IFwicHJvamVjdFwiIDogXCJ1c2VyXCI7XG5cdFx0YXdhaXQgdGhpcy53aXRoUHJvZ3Jlc3MoXCJyZW1vdmVcIiwgc291cmNlLCBgUmVtb3ZpbmcgJHtzb3VyY2V9Li4uYCwgYXN5bmMgKCkgPT4ge1xuXHRcdFx0aWYgKHBhcnNlZC50eXBlID09PSBcIm5wbVwiKSB7XG5cdFx0XHRcdGF3YWl0IHRoaXMudW5pbnN0YWxsTnBtKHBhcnNlZCwgc2NvcGUpO1xuXHRcdFx0XHRyZXR1cm47XG5cdFx0XHR9XG5cdFx0XHRpZiAocGFyc2VkLnR5cGUgPT09IFwiZ2l0XCIpIHtcblx0XHRcdFx0YXdhaXQgdGhpcy5yZW1vdmVHaXQocGFyc2VkLCBzY29wZSk7XG5cdFx0XHRcdHJldHVybjtcblx0XHRcdH1cblx0XHRcdGlmIChwYXJzZWQudHlwZSA9PT0gXCJsb2NhbFwiKSB7XG5cdFx0XHRcdHJldHVybjtcblx0XHRcdH1cblx0XHRcdHRocm93IG5ldyBFcnJvcihgVW5zdXBwb3J0ZWQgcmVtb3ZlIHNvdXJjZTogJHtzb3VyY2V9YCk7XG5cdFx0fSk7XG5cdH1cblxuXHRhc3luYyByZW1vdmVBbmRQZXJzaXN0KHNvdXJjZTogc3RyaW5nLCBvcHRpb25zPzogeyBsb2NhbD86IGJvb2xlYW4gfSk6IFByb21pc2U8Ym9vbGVhbj4ge1xuXHRcdGF3YWl0IHRoaXMucmVtb3ZlKHNvdXJjZSwgb3B0aW9ucyk7XG5cdFx0cmV0dXJuIHRoaXMucmVtb3ZlU291cmNlRnJvbVNldHRpbmdzKHNvdXJjZSwgb3B0aW9ucyk7XG5cdH1cblxuXHRhc3luYyB1cGRhdGUoc291cmNlPzogc3RyaW5nKTogUHJvbWlzZTx2b2lkPiB7XG5cdFx0Y29uc3QgZ2xvYmFsU2V0dGluZ3MgPSB0aGlzLnNldHRpbmdzTWFuYWdlci5nZXRHbG9iYWxTZXR0aW5ncygpO1xuXHRcdGNvbnN0IHByb2plY3RTZXR0aW5ncyA9IHRoaXMuc2V0dGluZ3NNYW5hZ2VyLmdldFByb2plY3RTZXR0aW5ncygpO1xuXHRcdGNvbnN0IGlkZW50aXR5ID0gc291cmNlID8gdGhpcy5nZXRQYWNrYWdlSWRlbnRpdHkoc291cmNlKSA6IHVuZGVmaW5lZDtcblx0XHRsZXQgbWF0Y2hlZCA9IGZhbHNlO1xuXHRcdGNvbnN0IHVwZGF0ZVNvdXJjZXM6IENvbmZpZ3VyZWRVcGRhdGVTb3VyY2VbXSA9IFtdO1xuXG5cdFx0Zm9yIChjb25zdCBwa2cgb2YgZ2xvYmFsU2V0dGluZ3MucGFja2FnZXMgPz8gW10pIHtcblx0XHRcdGNvbnN0IHNvdXJjZVN0ciA9IHR5cGVvZiBwa2cgPT09IFwic3RyaW5nXCIgPyBwa2cgOiBwa2cuc291cmNlO1xuXHRcdFx0aWYgKGlkZW50aXR5ICYmIHRoaXMuZ2V0UGFja2FnZUlkZW50aXR5KHNvdXJjZVN0ciwgXCJ1c2VyXCIpICE9PSBpZGVudGl0eSkgY29udGludWU7XG5cdFx0XHRtYXRjaGVkID0gdHJ1ZTtcblx0XHRcdHVwZGF0ZVNvdXJjZXMucHVzaCh7IHNvdXJjZTogc291cmNlU3RyLCBzY29wZTogXCJ1c2VyXCIgfSk7XG5cdFx0fVxuXHRcdGZvciAoY29uc3QgcGtnIG9mIHByb2plY3RTZXR0aW5ncy5wYWNrYWdlcyA/PyBbXSkge1xuXHRcdFx0Y29uc3Qgc291cmNlU3RyID0gdHlwZW9mIHBrZyA9PT0gXCJzdHJpbmdcIiA/IHBrZyA6IHBrZy5zb3VyY2U7XG5cdFx0XHRpZiAoaWRlbnRpdHkgJiYgdGhpcy5nZXRQYWNrYWdlSWRlbnRpdHkoc291cmNlU3RyLCBcInByb2plY3RcIikgIT09IGlkZW50aXR5KSBjb250aW51ZTtcblx0XHRcdG1hdGNoZWQgPSB0cnVlO1xuXHRcdFx0dXBkYXRlU291cmNlcy5wdXNoKHsgc291cmNlOiBzb3VyY2VTdHIsIHNjb3BlOiBcInByb2plY3RcIiB9KTtcblx0XHR9XG5cblx0XHRpZiAoc291cmNlICYmICFtYXRjaGVkKSB7XG5cdFx0XHR0aHJvdyBuZXcgRXJyb3IoXG5cdFx0XHRcdHRoaXMuYnVpbGROb01hdGNoaW5nUGFja2FnZU1lc3NhZ2Uoc291cmNlLCBbXG5cdFx0XHRcdFx0Li4uKGdsb2JhbFNldHRpbmdzLnBhY2thZ2VzID8/IFtdKSxcblx0XHRcdFx0XHQuLi4ocHJvamVjdFNldHRpbmdzLnBhY2thZ2VzID8/IFtdKSxcblx0XHRcdFx0XSksXG5cdFx0XHQpO1xuXHRcdH1cblxuXHRcdGF3YWl0IHRoaXMudXBkYXRlQ29uZmlndXJlZFNvdXJjZXModXBkYXRlU291cmNlcyk7XG5cdH1cblxuXHRwcml2YXRlIGFzeW5jIHVwZGF0ZUNvbmZpZ3VyZWRTb3VyY2VzKHNvdXJjZXM6IENvbmZpZ3VyZWRVcGRhdGVTb3VyY2VbXSk6IFByb21pc2U8dm9pZD4ge1xuXHRcdGlmIChpc09mZmxpbmVNb2RlRW5hYmxlZCgpIHx8IHNvdXJjZXMubGVuZ3RoID09PSAwKSB7XG5cdFx0XHRyZXR1cm47XG5cdFx0fVxuXG5cdFx0Y29uc3QgbnBtQ2FuZGlkYXRlczogTnBtVXBkYXRlVGFyZ2V0W10gPSBbXTtcblx0XHRjb25zdCBnaXRDYW5kaWRhdGVzOiBHaXRVcGRhdGVUYXJnZXRbXSA9IFtdO1xuXG5cdFx0Zm9yIChjb25zdCBlbnRyeSBvZiBzb3VyY2VzKSB7XG5cdFx0XHRjb25zdCBwYXJzZWQgPSB0aGlzLnBhcnNlU291cmNlKGVudHJ5LnNvdXJjZSk7XG5cdFx0XHRpZiAocGFyc2VkLnR5cGUgPT09IFwibG9jYWxcIiB8fCBwYXJzZWQucGlubmVkKSB7XG5cdFx0XHRcdGNvbnRpbnVlO1xuXHRcdFx0fVxuXHRcdFx0aWYgKHBhcnNlZC50eXBlID09PSBcIm5wbVwiKSB7XG5cdFx0XHRcdG5wbUNhbmRpZGF0ZXMucHVzaCh7IC4uLmVudHJ5LCBwYXJzZWQgfSk7XG5cdFx0XHRcdGNvbnRpbnVlO1xuXHRcdFx0fVxuXHRcdFx0Z2l0Q2FuZGlkYXRlcy5wdXNoKHsgLi4uZW50cnksIHBhcnNlZCB9KTtcblx0XHR9XG5cblx0XHRjb25zdCBucG1DaGVja1Rhc2tzID0gbnBtQ2FuZGlkYXRlcy5tYXAoKGVudHJ5KSA9PiBhc3luYyAoKSA9PiAoe1xuXHRcdFx0ZW50cnksXG5cdFx0XHRzaG91bGRVcGRhdGU6IGF3YWl0IHRoaXMuc2hvdWxkVXBkYXRlTnBtU291cmNlKGVudHJ5LnBhcnNlZCwgZW50cnkuc2NvcGUpLFxuXHRcdH0pKTtcblx0XHRjb25zdCBucG1DaGVja1Jlc3VsdHMgPSBhd2FpdCB0aGlzLnJ1bldpdGhDb25jdXJyZW5jeShucG1DaGVja1Rhc2tzLCBVUERBVEVfQ0hFQ0tfQ09OQ1VSUkVOQ1kpO1xuXHRcdGNvbnN0IHVzZXJOcG1VcGRhdGVzOiBOcG1VcGRhdGVUYXJnZXRbXSA9IFtdO1xuXHRcdGNvbnN0IHByb2plY3ROcG1VcGRhdGVzOiBOcG1VcGRhdGVUYXJnZXRbXSA9IFtdO1xuXHRcdGZvciAoY29uc3QgcmVzdWx0IG9mIG5wbUNoZWNrUmVzdWx0cykge1xuXHRcdFx0aWYgKCFyZXN1bHQuc2hvdWxkVXBkYXRlKSB7XG5cdFx0XHRcdGNvbnRpbnVlO1xuXHRcdFx0fVxuXHRcdFx0aWYgKHJlc3VsdC5lbnRyeS5zY29wZSA9PT0gXCJ1c2VyXCIpIHtcblx0XHRcdFx0dXNlck5wbVVwZGF0ZXMucHVzaChyZXN1bHQuZW50cnkpO1xuXHRcdFx0fSBlbHNlIHtcblx0XHRcdFx0cHJvamVjdE5wbVVwZGF0ZXMucHVzaChyZXN1bHQuZW50cnkpO1xuXHRcdFx0fVxuXHRcdH1cblxuXHRcdGNvbnN0IHRhc2tzOiBQcm9taXNlPHZvaWQ+W10gPSBbXTtcblx0XHRpZiAodXNlck5wbVVwZGF0ZXMubGVuZ3RoID4gMCkge1xuXHRcdFx0dGFza3MucHVzaCh0aGlzLnVwZGF0ZU5wbUJhdGNoKHVzZXJOcG1VcGRhdGVzLCBcInVzZXJcIikpO1xuXHRcdH1cblx0XHRpZiAocHJvamVjdE5wbVVwZGF0ZXMubGVuZ3RoID4gMCkge1xuXHRcdFx0dGFza3MucHVzaCh0aGlzLnVwZGF0ZU5wbUJhdGNoKHByb2plY3ROcG1VcGRhdGVzLCBcInByb2plY3RcIikpO1xuXHRcdH1cblx0XHRpZiAoZ2l0Q2FuZGlkYXRlcy5sZW5ndGggPiAwKSB7XG5cdFx0XHRjb25zdCBnaXRUYXNrcyA9IGdpdENhbmRpZGF0ZXMubWFwKFxuXHRcdFx0XHQoZW50cnkpID0+IGFzeW5jICgpID0+XG5cdFx0XHRcdFx0dGhpcy53aXRoUHJvZ3Jlc3MoXCJ1cGRhdGVcIiwgZW50cnkuc291cmNlLCBgVXBkYXRpbmcgJHtlbnRyeS5zb3VyY2V9Li4uYCwgYXN5bmMgKCkgPT4ge1xuXHRcdFx0XHRcdFx0YXdhaXQgdGhpcy51cGRhdGVHaXQoZW50cnkucGFyc2VkLCBlbnRyeS5zY29wZSk7XG5cdFx0XHRcdFx0fSksXG5cdFx0XHQpO1xuXHRcdFx0dGFza3MucHVzaCh0aGlzLnJ1bldpdGhDb25jdXJyZW5jeShnaXRUYXNrcywgR0lUX1VQREFURV9DT05DVVJSRU5DWSkudGhlbigoKSA9PiB7fSkpO1xuXHRcdH1cblxuXHRcdGF3YWl0IFByb21pc2UuYWxsKHRhc2tzKTtcblx0fVxuXG5cdHByaXZhdGUgYXN5bmMgc2hvdWxkVXBkYXRlTnBtU291cmNlKHNvdXJjZTogTnBtU291cmNlLCBzY29wZTogSW5zdGFsbGVkU291cmNlU2NvcGUpOiBQcm9taXNlPGJvb2xlYW4+IHtcblx0XHRjb25zdCBpbnN0YWxsZWRQYXRoID0gdGhpcy5nZXROcG1JbnN0YWxsUGF0aChzb3VyY2UsIHNjb3BlKTtcblx0XHRjb25zdCBpbnN0YWxsZWRWZXJzaW9uID0gZXhpc3RzU3luYyhpbnN0YWxsZWRQYXRoKSA/IHRoaXMuZ2V0SW5zdGFsbGVkTnBtVmVyc2lvbihpbnN0YWxsZWRQYXRoKSA6IHVuZGVmaW5lZDtcblx0XHRpZiAoIWluc3RhbGxlZFZlcnNpb24pIHtcblx0XHRcdHJldHVybiB0cnVlO1xuXHRcdH1cblxuXHRcdHRyeSB7XG5cdFx0XHRjb25zdCBsYXRlc3RWZXJzaW9uID0gYXdhaXQgdGhpcy5nZXRMYXRlc3ROcG1WZXJzaW9uKHNvdXJjZS5uYW1lKTtcblx0XHRcdHJldHVybiBsYXRlc3RWZXJzaW9uICE9PSBpbnN0YWxsZWRWZXJzaW9uO1xuXHRcdH0gY2F0Y2gge1xuXHRcdFx0Ly8gUHJlc2VydmUgZXhpc3RpbmcgdXBkYXRlIGJlaGF2aW9yIHdoZW4gdmVyc2lvbiBsb29rdXAgZmFpbHMuXG5cdFx0XHRyZXR1cm4gdHJ1ZTtcblx0XHR9XG5cdH1cblxuXHRwcml2YXRlIGFzeW5jIHVwZGF0ZU5wbUJhdGNoKHNvdXJjZXM6IE5wbVVwZGF0ZVRhcmdldFtdLCBzY29wZTogSW5zdGFsbGVkU291cmNlU2NvcGUpOiBQcm9taXNlPHZvaWQ+IHtcblx0XHRpZiAoc291cmNlcy5sZW5ndGggPT09IDApIHtcblx0XHRcdHJldHVybjtcblx0XHR9XG5cblx0XHRjb25zdCBzb3VyY2VMYWJlbCA9IHNvdXJjZXMubGVuZ3RoID09PSAxID8gc291cmNlc1swXS5zb3VyY2UgOiBgJHtzY29wZX0gbnBtIHBhY2thZ2VzYDtcblx0XHRjb25zdCBtZXNzYWdlID0gc291cmNlcy5sZW5ndGggPT09IDEgPyBgVXBkYXRpbmcgJHtzb3VyY2VzWzBdLnNvdXJjZX0uLi5gIDogYFVwZGF0aW5nICR7c2NvcGV9IG5wbSBwYWNrYWdlcy4uLmA7XG5cdFx0Y29uc3Qgc3BlY3MgPSBzb3VyY2VzLm1hcCgoZW50cnkpID0+IGAke2VudHJ5LnBhcnNlZC5uYW1lfUBsYXRlc3RgKTtcblxuXHRcdGF3YWl0IHRoaXMud2l0aFByb2dyZXNzKFwidXBkYXRlXCIsIHNvdXJjZUxhYmVsLCBtZXNzYWdlLCBhc3luYyAoKSA9PiB7XG5cdFx0XHRhd2FpdCB0aGlzLmluc3RhbGxOcG1CYXRjaChzcGVjcywgc2NvcGUpO1xuXHRcdH0pO1xuXHR9XG5cblx0cHJpdmF0ZSBhc3luYyBpbnN0YWxsTnBtQmF0Y2goc3BlY3M6IHN0cmluZ1tdLCBzY29wZTogSW5zdGFsbGVkU291cmNlU2NvcGUpOiBQcm9taXNlPHZvaWQ+IHtcblx0XHRpZiAoc2NvcGUgPT09IFwidXNlclwiKSB7XG5cdFx0XHRhd2FpdCB0aGlzLnJ1bk5wbUNvbW1hbmQoW1wiaW5zdGFsbFwiLCBcIi1nXCIsIC4uLnNwZWNzXSk7XG5cdFx0XHRyZXR1cm47XG5cdFx0fVxuXHRcdGNvbnN0IGluc3RhbGxSb290ID0gdGhpcy5nZXROcG1JbnN0YWxsUm9vdChzY29wZSwgZmFsc2UpO1xuXHRcdHRoaXMuZW5zdXJlTnBtUHJvamVjdChpbnN0YWxsUm9vdCk7XG5cdFx0YXdhaXQgdGhpcy5ydW5OcG1Db21tYW5kKFtcImluc3RhbGxcIiwgLi4uc3BlY3MsIFwiLS1wcmVmaXhcIiwgaW5zdGFsbFJvb3RdKTtcblx0fVxuXG5cdGFzeW5jIGNoZWNrRm9yQXZhaWxhYmxlVXBkYXRlcygpOiBQcm9taXNlPFBhY2thZ2VVcGRhdGVbXT4ge1xuXHRcdGlmIChpc09mZmxpbmVNb2RlRW5hYmxlZCgpKSB7XG5cdFx0XHRyZXR1cm4gW107XG5cdFx0fVxuXG5cdFx0Y29uc3QgZ2xvYmFsU2V0dGluZ3MgPSB0aGlzLnNldHRpbmdzTWFuYWdlci5nZXRHbG9iYWxTZXR0aW5ncygpO1xuXHRcdGNvbnN0IHByb2plY3RTZXR0aW5ncyA9IHRoaXMuc2V0dGluZ3NNYW5hZ2VyLmdldFByb2plY3RTZXR0aW5ncygpO1xuXHRcdGNvbnN0IGFsbFBhY2thZ2VzOiBBcnJheTx7IHBrZzogUGFja2FnZVNvdXJjZTsgc2NvcGU6IFNvdXJjZVNjb3BlIH0+ID0gW107XG5cdFx0Zm9yIChjb25zdCBwa2cgb2YgcHJvamVjdFNldHRpbmdzLnBhY2thZ2VzID8/IFtdKSB7XG5cdFx0XHRhbGxQYWNrYWdlcy5wdXNoKHsgcGtnLCBzY29wZTogXCJwcm9qZWN0XCIgfSk7XG5cdFx0fVxuXHRcdGZvciAoY29uc3QgcGtnIG9mIGdsb2JhbFNldHRpbmdzLnBhY2thZ2VzID8/IFtdKSB7XG5cdFx0XHRhbGxQYWNrYWdlcy5wdXNoKHsgcGtnLCBzY29wZTogXCJ1c2VyXCIgfSk7XG5cdFx0fVxuXG5cdFx0Y29uc3QgcGFja2FnZVNvdXJjZXMgPSB0aGlzLmRlZHVwZVBhY2thZ2VzKGFsbFBhY2thZ2VzKTtcblx0XHRjb25zdCBjaGVja3MgPSBwYWNrYWdlU291cmNlc1xuXHRcdFx0LmZpbHRlcihcblx0XHRcdFx0KGVudHJ5KTogZW50cnkgaXMgeyBwa2c6IFBhY2thZ2VTb3VyY2U7IHNjb3BlOiBFeGNsdWRlPFNvdXJjZVNjb3BlLCBcInRlbXBvcmFyeVwiPiB9ID0+XG5cdFx0XHRcdFx0ZW50cnkuc2NvcGUgIT09IFwidGVtcG9yYXJ5XCIsXG5cdFx0XHQpXG5cdFx0XHQubWFwKChlbnRyeSkgPT4gYXN5bmMgKCk6IFByb21pc2U8UGFja2FnZVVwZGF0ZSB8IHVuZGVmaW5lZD4gPT4ge1xuXHRcdFx0XHRjb25zdCBzb3VyY2UgPSB0eXBlb2YgZW50cnkucGtnID09PSBcInN0cmluZ1wiID8gZW50cnkucGtnIDogZW50cnkucGtnLnNvdXJjZTtcblx0XHRcdFx0Y29uc3QgcGFyc2VkID0gdGhpcy5wYXJzZVNvdXJjZShzb3VyY2UpO1xuXHRcdFx0XHRpZiAocGFyc2VkLnR5cGUgPT09IFwibG9jYWxcIiB8fCBwYXJzZWQucGlubmVkKSB7XG5cdFx0XHRcdFx0cmV0dXJuIHVuZGVmaW5lZDtcblx0XHRcdFx0fVxuXG5cdFx0XHRcdGlmIChwYXJzZWQudHlwZSA9PT0gXCJucG1cIikge1xuXHRcdFx0XHRcdGNvbnN0IGluc3RhbGxlZFBhdGggPSB0aGlzLmdldE5wbUluc3RhbGxQYXRoKHBhcnNlZCwgZW50cnkuc2NvcGUpO1xuXHRcdFx0XHRcdGlmICghZXhpc3RzU3luYyhpbnN0YWxsZWRQYXRoKSkge1xuXHRcdFx0XHRcdFx0cmV0dXJuIHVuZGVmaW5lZDtcblx0XHRcdFx0XHR9XG5cdFx0XHRcdFx0Y29uc3QgaGFzVXBkYXRlID0gYXdhaXQgdGhpcy5ucG1IYXNBdmFpbGFibGVVcGRhdGUocGFyc2VkLCBpbnN0YWxsZWRQYXRoKTtcblx0XHRcdFx0XHRpZiAoIWhhc1VwZGF0ZSkge1xuXHRcdFx0XHRcdFx0cmV0dXJuIHVuZGVmaW5lZDtcblx0XHRcdFx0XHR9XG5cdFx0XHRcdFx0cmV0dXJuIHtcblx0XHRcdFx0XHRcdHNvdXJjZSxcblx0XHRcdFx0XHRcdGRpc3BsYXlOYW1lOiBwYXJzZWQubmFtZSxcblx0XHRcdFx0XHRcdHR5cGU6IFwibnBtXCIsXG5cdFx0XHRcdFx0XHRzY29wZTogZW50cnkuc2NvcGUsXG5cdFx0XHRcdFx0fTtcblx0XHRcdFx0fVxuXG5cdFx0XHRcdGNvbnN0IGluc3RhbGxlZFBhdGggPSB0aGlzLmdldEdpdEluc3RhbGxQYXRoKHBhcnNlZCwgZW50cnkuc2NvcGUpO1xuXHRcdFx0XHRpZiAoIWV4aXN0c1N5bmMoaW5zdGFsbGVkUGF0aCkpIHtcblx0XHRcdFx0XHRyZXR1cm4gdW5kZWZpbmVkO1xuXHRcdFx0XHR9XG5cdFx0XHRcdGNvbnN0IGhhc1VwZGF0ZSA9IGF3YWl0IHRoaXMuZ2l0SGFzQXZhaWxhYmxlVXBkYXRlKGluc3RhbGxlZFBhdGgpO1xuXHRcdFx0XHRpZiAoIWhhc1VwZGF0ZSkge1xuXHRcdFx0XHRcdHJldHVybiB1bmRlZmluZWQ7XG5cdFx0XHRcdH1cblx0XHRcdFx0cmV0dXJuIHtcblx0XHRcdFx0XHRzb3VyY2UsXG5cdFx0XHRcdFx0ZGlzcGxheU5hbWU6IGAke3BhcnNlZC5ob3N0fS8ke3BhcnNlZC5wYXRofWAsXG5cdFx0XHRcdFx0dHlwZTogXCJnaXRcIixcblx0XHRcdFx0XHRzY29wZTogZW50cnkuc2NvcGUsXG5cdFx0XHRcdH07XG5cdFx0XHR9KTtcblxuXHRcdGNvbnN0IHJlc3VsdHMgPSBhd2FpdCB0aGlzLnJ1bldpdGhDb25jdXJyZW5jeShjaGVja3MsIFVQREFURV9DSEVDS19DT05DVVJSRU5DWSk7XG5cdFx0cmV0dXJuIHJlc3VsdHMuZmlsdGVyKChyZXN1bHQpOiByZXN1bHQgaXMgUGFja2FnZVVwZGF0ZSA9PiByZXN1bHQgIT09IHVuZGVmaW5lZCk7XG5cdH1cblxuXHRwcml2YXRlIGFzeW5jIHJlc29sdmVQYWNrYWdlU291cmNlcyhcblx0XHRzb3VyY2VzOiBBcnJheTx7IHBrZzogUGFja2FnZVNvdXJjZTsgc2NvcGU6IFNvdXJjZVNjb3BlIH0+LFxuXHRcdGFjY3VtdWxhdG9yOiBSZXNvdXJjZUFjY3VtdWxhdG9yLFxuXHRcdG9uTWlzc2luZz86IChzb3VyY2U6IHN0cmluZykgPT4gUHJvbWlzZTxNaXNzaW5nU291cmNlQWN0aW9uPixcblx0KTogUHJvbWlzZTx2b2lkPiB7XG5cdFx0Zm9yIChjb25zdCB7IHBrZywgc2NvcGUgfSBvZiBzb3VyY2VzKSB7XG5cdFx0XHRjb25zdCBzb3VyY2VTdHIgPSB0eXBlb2YgcGtnID09PSBcInN0cmluZ1wiID8gcGtnIDogcGtnLnNvdXJjZTtcblx0XHRcdGNvbnN0IGZpbHRlciA9IHR5cGVvZiBwa2cgPT09IFwib2JqZWN0XCIgPyBwa2cgOiB1bmRlZmluZWQ7XG5cdFx0XHRjb25zdCBwYXJzZWQgPSB0aGlzLnBhcnNlU291cmNlKHNvdXJjZVN0cik7XG5cdFx0XHRjb25zdCBtZXRhZGF0YTogUGF0aE1ldGFkYXRhID0geyBzb3VyY2U6IHNvdXJjZVN0ciwgc2NvcGUsIG9yaWdpbjogXCJwYWNrYWdlXCIgfTtcblxuXHRcdFx0aWYgKHBhcnNlZC50eXBlID09PSBcImxvY2FsXCIpIHtcblx0XHRcdFx0Y29uc3QgYmFzZURpciA9IHRoaXMuZ2V0QmFzZURpckZvclNjb3BlKHNjb3BlKTtcblx0XHRcdFx0dGhpcy5yZXNvbHZlTG9jYWxFeHRlbnNpb25Tb3VyY2UocGFyc2VkLCBhY2N1bXVsYXRvciwgZmlsdGVyLCBtZXRhZGF0YSwgYmFzZURpcik7XG5cdFx0XHRcdGNvbnRpbnVlO1xuXHRcdFx0fVxuXG5cdFx0XHRjb25zdCBpbnN0YWxsTWlzc2luZyA9IGFzeW5jICgpOiBQcm9taXNlPGJvb2xlYW4+ID0+IHtcblx0XHRcdFx0aWYgKGlzT2ZmbGluZU1vZGVFbmFibGVkKCkpIHtcblx0XHRcdFx0XHRyZXR1cm4gZmFsc2U7XG5cdFx0XHRcdH1cblx0XHRcdFx0aWYgKCFvbk1pc3NpbmcpIHtcblx0XHRcdFx0XHRhd2FpdCB0aGlzLmluc3RhbGxQYXJzZWRTb3VyY2UocGFyc2VkLCBzY29wZSk7XG5cdFx0XHRcdFx0cmV0dXJuIHRydWU7XG5cdFx0XHRcdH1cblx0XHRcdFx0Y29uc3QgYWN0aW9uID0gYXdhaXQgb25NaXNzaW5nKHNvdXJjZVN0cik7XG5cdFx0XHRcdGlmIChhY3Rpb24gPT09IFwic2tpcFwiKSByZXR1cm4gZmFsc2U7XG5cdFx0XHRcdGlmIChhY3Rpb24gPT09IFwiZXJyb3JcIikgdGhyb3cgbmV3IEVycm9yKGBNaXNzaW5nIHNvdXJjZTogJHtzb3VyY2VTdHJ9YCk7XG5cdFx0XHRcdGF3YWl0IHRoaXMuaW5zdGFsbFBhcnNlZFNvdXJjZShwYXJzZWQsIHNjb3BlKTtcblx0XHRcdFx0cmV0dXJuIHRydWU7XG5cdFx0XHR9O1xuXG5cdFx0XHRpZiAocGFyc2VkLnR5cGUgPT09IFwibnBtXCIpIHtcblx0XHRcdFx0Y29uc3QgaW5zdGFsbGVkUGF0aCA9IHRoaXMuZ2V0TnBtSW5zdGFsbFBhdGgocGFyc2VkLCBzY29wZSk7XG5cdFx0XHRcdGNvbnN0IG5lZWRzSW5zdGFsbCA9XG5cdFx0XHRcdFx0IWV4aXN0c1N5bmMoaW5zdGFsbGVkUGF0aCkgfHxcblx0XHRcdFx0XHQocGFyc2VkLnBpbm5lZCAmJiAhKGF3YWl0IHRoaXMuaW5zdGFsbGVkTnBtTWF0Y2hlc1Bpbm5lZFZlcnNpb24ocGFyc2VkLCBpbnN0YWxsZWRQYXRoKSkpO1xuXHRcdFx0XHRpZiAobmVlZHNJbnN0YWxsKSB7XG5cdFx0XHRcdFx0Y29uc3QgaW5zdGFsbGVkID0gYXdhaXQgaW5zdGFsbE1pc3NpbmcoKTtcblx0XHRcdFx0XHRpZiAoIWluc3RhbGxlZCkgY29udGludWU7XG5cdFx0XHRcdH1cblx0XHRcdFx0bWV0YWRhdGEuYmFzZURpciA9IGluc3RhbGxlZFBhdGg7XG5cdFx0XHRcdHRoaXMuY29sbGVjdFBhY2thZ2VSZXNvdXJjZXMoaW5zdGFsbGVkUGF0aCwgYWNjdW11bGF0b3IsIGZpbHRlciwgbWV0YWRhdGEpO1xuXHRcdFx0XHRjb250aW51ZTtcblx0XHRcdH1cblxuXHRcdFx0aWYgKHBhcnNlZC50eXBlID09PSBcImdpdFwiKSB7XG5cdFx0XHRcdGNvbnN0IGluc3RhbGxlZFBhdGggPSB0aGlzLmdldEdpdEluc3RhbGxQYXRoKHBhcnNlZCwgc2NvcGUpO1xuXHRcdFx0XHRpZiAoIWV4aXN0c1N5bmMoaW5zdGFsbGVkUGF0aCkpIHtcblx0XHRcdFx0XHRjb25zdCBpbnN0YWxsZWQgPSBhd2FpdCBpbnN0YWxsTWlzc2luZygpO1xuXHRcdFx0XHRcdGlmICghaW5zdGFsbGVkKSBjb250aW51ZTtcblx0XHRcdFx0fSBlbHNlIGlmIChzY29wZSA9PT0gXCJ0ZW1wb3JhcnlcIiAmJiAhcGFyc2VkLnBpbm5lZCAmJiAhaXNPZmZsaW5lTW9kZUVuYWJsZWQoKSkge1xuXHRcdFx0XHRcdGF3YWl0IHRoaXMucmVmcmVzaFRlbXBvcmFyeUdpdFNvdXJjZShwYXJzZWQsIHNvdXJjZVN0cik7XG5cdFx0XHRcdH1cblx0XHRcdFx0bWV0YWRhdGEuYmFzZURpciA9IGluc3RhbGxlZFBhdGg7XG5cdFx0XHRcdHRoaXMuY29sbGVjdFBhY2thZ2VSZXNvdXJjZXMoaW5zdGFsbGVkUGF0aCwgYWNjdW11bGF0b3IsIGZpbHRlciwgbWV0YWRhdGEpO1xuXHRcdFx0fVxuXHRcdH1cblx0fVxuXG5cdHByaXZhdGUgcmVzb2x2ZUxvY2FsRXh0ZW5zaW9uU291cmNlKFxuXHRcdHNvdXJjZTogTG9jYWxTb3VyY2UsXG5cdFx0YWNjdW11bGF0b3I6IFJlc291cmNlQWNjdW11bGF0b3IsXG5cdFx0ZmlsdGVyOiBQYWNrYWdlRmlsdGVyIHwgdW5kZWZpbmVkLFxuXHRcdG1ldGFkYXRhOiBQYXRoTWV0YWRhdGEsXG5cdFx0YmFzZURpcjogc3RyaW5nLFxuXHQpOiB2b2lkIHtcblx0XHRjb25zdCByZXNvbHZlZCA9IHRoaXMucmVzb2x2ZVBhdGhGcm9tQmFzZShzb3VyY2UucGF0aCwgYmFzZURpcik7XG5cdFx0aWYgKCFleGlzdHNTeW5jKHJlc29sdmVkKSkge1xuXHRcdFx0cmV0dXJuO1xuXHRcdH1cblxuXHRcdHRyeSB7XG5cdFx0XHRjb25zdCBzdGF0cyA9IHN0YXRTeW5jKHJlc29sdmVkKTtcblx0XHRcdGlmIChzdGF0cy5pc0ZpbGUoKSkge1xuXHRcdFx0XHRtZXRhZGF0YS5iYXNlRGlyID0gZGlybmFtZShyZXNvbHZlZCk7XG5cdFx0XHRcdHRoaXMuYWRkUmVzb3VyY2UoYWNjdW11bGF0b3IuZXh0ZW5zaW9ucywgcmVzb2x2ZWQsIG1ldGFkYXRhLCB0cnVlKTtcblx0XHRcdFx0cmV0dXJuO1xuXHRcdFx0fVxuXHRcdFx0aWYgKHN0YXRzLmlzRGlyZWN0b3J5KCkpIHtcblx0XHRcdFx0bWV0YWRhdGEuYmFzZURpciA9IHJlc29sdmVkO1xuXHRcdFx0XHRjb25zdCByZXNvdXJjZXMgPSB0aGlzLmNvbGxlY3RQYWNrYWdlUmVzb3VyY2VzKHJlc29sdmVkLCBhY2N1bXVsYXRvciwgZmlsdGVyLCBtZXRhZGF0YSk7XG5cdFx0XHRcdGlmICghcmVzb3VyY2VzKSB7XG5cdFx0XHRcdFx0dGhpcy5hZGRSZXNvdXJjZShhY2N1bXVsYXRvci5leHRlbnNpb25zLCByZXNvbHZlZCwgbWV0YWRhdGEsIHRydWUpO1xuXHRcdFx0XHR9XG5cdFx0XHR9XG5cdFx0fSBjYXRjaCB7XG5cdFx0XHRyZXR1cm47XG5cdFx0fVxuXHR9XG5cblx0cHJpdmF0ZSBhc3luYyBpbnN0YWxsUGFyc2VkU291cmNlKHBhcnNlZDogUGFyc2VkU291cmNlLCBzY29wZTogU291cmNlU2NvcGUpOiBQcm9taXNlPHZvaWQ+IHtcblx0XHRpZiAocGFyc2VkLnR5cGUgPT09IFwibnBtXCIpIHtcblx0XHRcdGF3YWl0IHRoaXMuaW5zdGFsbE5wbShwYXJzZWQsIHNjb3BlLCBzY29wZSA9PT0gXCJ0ZW1wb3JhcnlcIik7XG5cdFx0XHRyZXR1cm47XG5cdFx0fVxuXHRcdGlmIChwYXJzZWQudHlwZSA9PT0gXCJnaXRcIikge1xuXHRcdFx0YXdhaXQgdGhpcy5pbnN0YWxsR2l0KHBhcnNlZCwgc2NvcGUpO1xuXHRcdFx0cmV0dXJuO1xuXHRcdH1cblx0fVxuXG5cdHByaXZhdGUgZ2V0UGFja2FnZVNvdXJjZVN0cmluZyhwa2c6IFBhY2thZ2VTb3VyY2UpOiBzdHJpbmcge1xuXHRcdHJldHVybiB0eXBlb2YgcGtnID09PSBcInN0cmluZ1wiID8gcGtnIDogcGtnLnNvdXJjZTtcblx0fVxuXG5cdHByaXZhdGUgZ2V0U291cmNlTWF0Y2hLZXlGb3JJbnB1dChzb3VyY2U6IHN0cmluZyk6IHN0cmluZyB7XG5cdFx0Y29uc3QgcGFyc2VkID0gdGhpcy5wYXJzZVNvdXJjZShzb3VyY2UpO1xuXHRcdGlmIChwYXJzZWQudHlwZSA9PT0gXCJucG1cIikge1xuXHRcdFx0cmV0dXJuIGBucG06JHtwYXJzZWQubmFtZX1gO1xuXHRcdH1cblx0XHRpZiAocGFyc2VkLnR5cGUgPT09IFwiZ2l0XCIpIHtcblx0XHRcdHJldHVybiBgZ2l0OiR7cGFyc2VkLmhvc3R9LyR7cGFyc2VkLnBhdGh9YDtcblx0XHR9XG5cdFx0cmV0dXJuIGBsb2NhbDoke3RoaXMucmVzb2x2ZVBhdGgocGFyc2VkLnBhdGgpfWA7XG5cdH1cblxuXHRwcml2YXRlIGdldFNvdXJjZU1hdGNoS2V5Rm9yU2V0dGluZ3Moc291cmNlOiBzdHJpbmcsIHNjb3BlOiBTb3VyY2VTY29wZSk6IHN0cmluZyB7XG5cdFx0Y29uc3QgcGFyc2VkID0gdGhpcy5wYXJzZVNvdXJjZShzb3VyY2UpO1xuXHRcdGlmIChwYXJzZWQudHlwZSA9PT0gXCJucG1cIikge1xuXHRcdFx0cmV0dXJuIGBucG06JHtwYXJzZWQubmFtZX1gO1xuXHRcdH1cblx0XHRpZiAocGFyc2VkLnR5cGUgPT09IFwiZ2l0XCIpIHtcblx0XHRcdHJldHVybiBgZ2l0OiR7cGFyc2VkLmhvc3R9LyR7cGFyc2VkLnBhdGh9YDtcblx0XHR9XG5cdFx0Y29uc3QgYmFzZURpciA9IHRoaXMuZ2V0QmFzZURpckZvclNjb3BlKHNjb3BlKTtcblx0XHRyZXR1cm4gYGxvY2FsOiR7dGhpcy5yZXNvbHZlUGF0aEZyb21CYXNlKHBhcnNlZC5wYXRoLCBiYXNlRGlyKX1gO1xuXHR9XG5cblx0cHJpdmF0ZSBidWlsZE5vTWF0Y2hpbmdQYWNrYWdlTWVzc2FnZShzb3VyY2U6IHN0cmluZywgY29uZmlndXJlZFBhY2thZ2VzOiBQYWNrYWdlU291cmNlW10pOiBzdHJpbmcge1xuXHRcdGNvbnN0IHN1Z2dlc3Rpb24gPSB0aGlzLmZpbmRTdWdnZXN0ZWRDb25maWd1cmVkU291cmNlKHNvdXJjZSwgY29uZmlndXJlZFBhY2thZ2VzKTtcblx0XHRpZiAoIXN1Z2dlc3Rpb24pIHtcblx0XHRcdHJldHVybiBgTm8gbWF0Y2hpbmcgcGFja2FnZSBmb3VuZCBmb3IgJHtzb3VyY2V9YDtcblx0XHR9XG5cdFx0cmV0dXJuIGBObyBtYXRjaGluZyBwYWNrYWdlIGZvdW5kIGZvciAke3NvdXJjZX0uIERpZCB5b3UgbWVhbiAke3N1Z2dlc3Rpb259P2A7XG5cdH1cblxuXHRwcml2YXRlIGZpbmRTdWdnZXN0ZWRDb25maWd1cmVkU291cmNlKHNvdXJjZTogc3RyaW5nLCBjb25maWd1cmVkUGFja2FnZXM6IFBhY2thZ2VTb3VyY2VbXSk6IHN0cmluZyB8IHVuZGVmaW5lZCB7XG5cdFx0Y29uc3QgdHJpbW1lZFNvdXJjZSA9IHNvdXJjZS50cmltKCk7XG5cdFx0Y29uc3Qgc3VnZ2VzdGlvbnMgPSBuZXcgU2V0PHN0cmluZz4oKTtcblxuXHRcdGZvciAoY29uc3QgcGtnIG9mIGNvbmZpZ3VyZWRQYWNrYWdlcykge1xuXHRcdFx0Y29uc3Qgc291cmNlU3RyID0gdGhpcy5nZXRQYWNrYWdlU291cmNlU3RyaW5nKHBrZyk7XG5cdFx0XHRjb25zdCBwYXJzZWQgPSB0aGlzLnBhcnNlU291cmNlKHNvdXJjZVN0cik7XG5cdFx0XHRpZiAocGFyc2VkLnR5cGUgPT09IFwibnBtXCIpIHtcblx0XHRcdFx0aWYgKHRyaW1tZWRTb3VyY2UgPT09IHBhcnNlZC5uYW1lIHx8IHRyaW1tZWRTb3VyY2UgPT09IHBhcnNlZC5zcGVjKSB7XG5cdFx0XHRcdFx0c3VnZ2VzdGlvbnMuYWRkKHNvdXJjZVN0cik7XG5cdFx0XHRcdH1cblx0XHRcdFx0Y29udGludWU7XG5cdFx0XHR9XG5cdFx0XHRpZiAocGFyc2VkLnR5cGUgPT09IFwiZ2l0XCIpIHtcblx0XHRcdFx0Y29uc3Qgc2hvcnRoYW5kID0gYCR7cGFyc2VkLmhvc3R9LyR7cGFyc2VkLnBhdGh9YDtcblx0XHRcdFx0Y29uc3Qgc2hvcnRoYW5kV2l0aFJlZiA9IHBhcnNlZC5yZWYgPyBgJHtzaG9ydGhhbmR9QCR7cGFyc2VkLnJlZn1gIDogdW5kZWZpbmVkO1xuXHRcdFx0XHRpZiAodHJpbW1lZFNvdXJjZSA9PT0gc2hvcnRoYW5kIHx8IChzaG9ydGhhbmRXaXRoUmVmICYmIHRyaW1tZWRTb3VyY2UgPT09IHNob3J0aGFuZFdpdGhSZWYpKSB7XG5cdFx0XHRcdFx0c3VnZ2VzdGlvbnMuYWRkKHNvdXJjZVN0cik7XG5cdFx0XHRcdH1cblx0XHRcdH1cblx0XHR9XG5cblx0XHRyZXR1cm4gc3VnZ2VzdGlvbnMudmFsdWVzKCkubmV4dCgpLnZhbHVlO1xuXHR9XG5cblx0cHJpdmF0ZSBwYWNrYWdlU291cmNlc01hdGNoKGV4aXN0aW5nOiBQYWNrYWdlU291cmNlLCBpbnB1dFNvdXJjZTogc3RyaW5nLCBzY29wZTogU291cmNlU2NvcGUpOiBib29sZWFuIHtcblx0XHRjb25zdCBsZWZ0ID0gdGhpcy5nZXRTb3VyY2VNYXRjaEtleUZvclNldHRpbmdzKHRoaXMuZ2V0UGFja2FnZVNvdXJjZVN0cmluZyhleGlzdGluZyksIHNjb3BlKTtcblx0XHRjb25zdCByaWdodCA9IHRoaXMuZ2V0U291cmNlTWF0Y2hLZXlGb3JJbnB1dChpbnB1dFNvdXJjZSk7XG5cdFx0cmV0dXJuIGxlZnQgPT09IHJpZ2h0O1xuXHR9XG5cblx0cHJpdmF0ZSBub3JtYWxpemVQYWNrYWdlU291cmNlRm9yU2V0dGluZ3Moc291cmNlOiBzdHJpbmcsIHNjb3BlOiBTb3VyY2VTY29wZSk6IHN0cmluZyB7XG5cdFx0Y29uc3QgcGFyc2VkID0gdGhpcy5wYXJzZVNvdXJjZShzb3VyY2UpO1xuXHRcdGlmIChwYXJzZWQudHlwZSAhPT0gXCJsb2NhbFwiKSB7XG5cdFx0XHRyZXR1cm4gc291cmNlO1xuXHRcdH1cblx0XHRjb25zdCBiYXNlRGlyID0gdGhpcy5nZXRCYXNlRGlyRm9yU2NvcGUoc2NvcGUpO1xuXHRcdGNvbnN0IHJlc29sdmVkID0gdGhpcy5yZXNvbHZlUGF0aChwYXJzZWQucGF0aCk7XG5cdFx0Y29uc3QgcmVsID0gcmVsYXRpdmUoYmFzZURpciwgcmVzb2x2ZWQpO1xuXHRcdHJldHVybiByZWwgfHwgXCIuXCI7XG5cdH1cblxuXHRwcml2YXRlIHBhcnNlU291cmNlKHNvdXJjZTogc3RyaW5nKTogUGFyc2VkU291cmNlIHtcblx0XHRpZiAoc291cmNlLnN0YXJ0c1dpdGgoXCJucG06XCIpKSB7XG5cdFx0XHRjb25zdCBzcGVjID0gc291cmNlLnNsaWNlKFwibnBtOlwiLmxlbmd0aCkudHJpbSgpO1xuXHRcdFx0Y29uc3QgeyBuYW1lLCB2ZXJzaW9uIH0gPSB0aGlzLnBhcnNlTnBtU3BlYyhzcGVjKTtcblx0XHRcdHJldHVybiB7XG5cdFx0XHRcdHR5cGU6IFwibnBtXCIsXG5cdFx0XHRcdHNwZWMsXG5cdFx0XHRcdG5hbWUsXG5cdFx0XHRcdHBpbm5lZDogQm9vbGVhbih2ZXJzaW9uKSxcblx0XHRcdH07XG5cdFx0fVxuXG5cdFx0aWYgKGlzTG9jYWxQYXRoKHNvdXJjZSkpIHtcblx0XHRcdHJldHVybiB7IHR5cGU6IFwibG9jYWxcIiwgcGF0aDogc291cmNlIH07XG5cdFx0fVxuXG5cdFx0Ly8gVHJ5IHBhcnNpbmcgYXMgZ2l0IFVSTFxuXHRcdGNvbnN0IGdpdFBhcnNlZCA9IHBhcnNlR2l0VXJsKHNvdXJjZSk7XG5cdFx0aWYgKGdpdFBhcnNlZCkge1xuXHRcdFx0cmV0dXJuIGdpdFBhcnNlZDtcblx0XHR9XG5cblx0XHRyZXR1cm4geyB0eXBlOiBcImxvY2FsXCIsIHBhdGg6IHNvdXJjZSB9O1xuXHR9XG5cblx0cHJpdmF0ZSBhc3luYyBpbnN0YWxsZWROcG1NYXRjaGVzUGlubmVkVmVyc2lvbihzb3VyY2U6IE5wbVNvdXJjZSwgaW5zdGFsbGVkUGF0aDogc3RyaW5nKTogUHJvbWlzZTxib29sZWFuPiB7XG5cdFx0Y29uc3QgaW5zdGFsbGVkVmVyc2lvbiA9IHRoaXMuZ2V0SW5zdGFsbGVkTnBtVmVyc2lvbihpbnN0YWxsZWRQYXRoKTtcblx0XHRpZiAoIWluc3RhbGxlZFZlcnNpb24pIHtcblx0XHRcdHJldHVybiBmYWxzZTtcblx0XHR9XG5cblx0XHRjb25zdCB7IHZlcnNpb246IHBpbm5lZFZlcnNpb24gfSA9IHRoaXMucGFyc2VOcG1TcGVjKHNvdXJjZS5zcGVjKTtcblx0XHRpZiAoIXBpbm5lZFZlcnNpb24pIHtcblx0XHRcdHJldHVybiB0cnVlO1xuXHRcdH1cblxuXHRcdHJldHVybiBpbnN0YWxsZWRWZXJzaW9uID09PSBwaW5uZWRWZXJzaW9uO1xuXHR9XG5cblx0cHJpdmF0ZSBhc3luYyBucG1IYXNBdmFpbGFibGVVcGRhdGUoc291cmNlOiBOcG1Tb3VyY2UsIGluc3RhbGxlZFBhdGg6IHN0cmluZyk6IFByb21pc2U8Ym9vbGVhbj4ge1xuXHRcdGlmIChpc09mZmxpbmVNb2RlRW5hYmxlZCgpKSB7XG5cdFx0XHRyZXR1cm4gZmFsc2U7XG5cdFx0fVxuXG5cdFx0Y29uc3QgaW5zdGFsbGVkVmVyc2lvbiA9IHRoaXMuZ2V0SW5zdGFsbGVkTnBtVmVyc2lvbihpbnN0YWxsZWRQYXRoKTtcblx0XHRpZiAoIWluc3RhbGxlZFZlcnNpb24pIHtcblx0XHRcdHJldHVybiBmYWxzZTtcblx0XHR9XG5cblx0XHR0cnkge1xuXHRcdFx0Y29uc3QgbGF0ZXN0VmVyc2lvbiA9IGF3YWl0IHRoaXMuZ2V0TGF0ZXN0TnBtVmVyc2lvbihzb3VyY2UubmFtZSk7XG5cdFx0XHRyZXR1cm4gbGF0ZXN0VmVyc2lvbiAhPT0gaW5zdGFsbGVkVmVyc2lvbjtcblx0XHR9IGNhdGNoIHtcblx0XHRcdHJldHVybiBmYWxzZTtcblx0XHR9XG5cdH1cblxuXHRwcml2YXRlIGdldEluc3RhbGxlZE5wbVZlcnNpb24oaW5zdGFsbGVkUGF0aDogc3RyaW5nKTogc3RyaW5nIHwgdW5kZWZpbmVkIHtcblx0XHRjb25zdCBwYWNrYWdlSnNvblBhdGggPSBqb2luKGluc3RhbGxlZFBhdGgsIFwicGFja2FnZS5qc29uXCIpO1xuXHRcdGlmICghZXhpc3RzU3luYyhwYWNrYWdlSnNvblBhdGgpKSByZXR1cm4gdW5kZWZpbmVkO1xuXHRcdHRyeSB7XG5cdFx0XHRjb25zdCBjb250ZW50ID0gcmVhZEZpbGVTeW5jKHBhY2thZ2VKc29uUGF0aCwgXCJ1dGYtOFwiKTtcblx0XHRcdGNvbnN0IHBrZyA9IEpTT04ucGFyc2UoY29udGVudCkgYXMgeyB2ZXJzaW9uPzogc3RyaW5nIH07XG5cdFx0XHRyZXR1cm4gcGtnLnZlcnNpb247XG5cdFx0fSBjYXRjaCB7XG5cdFx0XHRyZXR1cm4gdW5kZWZpbmVkO1xuXHRcdH1cblx0fVxuXG5cdHByaXZhdGUgYXN5bmMgZ2V0TGF0ZXN0TnBtVmVyc2lvbihwYWNrYWdlTmFtZTogc3RyaW5nKTogUHJvbWlzZTxzdHJpbmc+IHtcblx0XHRjb25zdCBucG1Db21tYW5kID0gdGhpcy5nZXROcG1Db21tYW5kKCk7XG5cdFx0Y29uc3Qgc3Rkb3V0ID0gYXdhaXQgdGhpcy5ydW5Db21tYW5kQ2FwdHVyZShcblx0XHRcdG5wbUNvbW1hbmQuY29tbWFuZCxcblx0XHRcdFsuLi5ucG1Db21tYW5kLmFyZ3MsIFwidmlld1wiLCBwYWNrYWdlTmFtZSwgXCJ2ZXJzaW9uXCIsIFwiLS1qc29uXCJdLFxuXHRcdFx0eyBjd2Q6IHRoaXMuY3dkLCB0aW1lb3V0TXM6IE5FVFdPUktfVElNRU9VVF9NUyB9LFxuXHRcdCk7XG5cdFx0Y29uc3QgcmF3ID0gc3Rkb3V0LnRyaW0oKTtcblx0XHRpZiAoIXJhdykgdGhyb3cgbmV3IEVycm9yKFwiRW1wdHkgcmVzcG9uc2UgZnJvbSBucG0gdmlld1wiKTtcblx0XHRyZXR1cm4gSlNPTi5wYXJzZShyYXcpO1xuXHR9XG5cblx0cHJpdmF0ZSBhc3luYyBnaXRIYXNBdmFpbGFibGVVcGRhdGUoaW5zdGFsbGVkUGF0aDogc3RyaW5nKTogUHJvbWlzZTxib29sZWFuPiB7XG5cdFx0aWYgKGlzT2ZmbGluZU1vZGVFbmFibGVkKCkpIHtcblx0XHRcdHJldHVybiBmYWxzZTtcblx0XHR9XG5cblx0XHR0cnkge1xuXHRcdFx0Y29uc3QgbG9jYWxIZWFkID0gYXdhaXQgdGhpcy5ydW5Db21tYW5kQ2FwdHVyZShcImdpdFwiLCBbXCJyZXYtcGFyc2VcIiwgXCJIRUFEXCJdLCB7XG5cdFx0XHRcdGN3ZDogaW5zdGFsbGVkUGF0aCxcblx0XHRcdFx0dGltZW91dE1zOiBORVRXT1JLX1RJTUVPVVRfTVMsXG5cdFx0XHR9KTtcblx0XHRcdGNvbnN0IHJlbW90ZUhlYWQgPSBhd2FpdCB0aGlzLmdldFJlbW90ZUdpdEhlYWQoaW5zdGFsbGVkUGF0aCk7XG5cdFx0XHRyZXR1cm4gbG9jYWxIZWFkLnRyaW0oKSAhPT0gcmVtb3RlSGVhZC50cmltKCk7XG5cdFx0fSBjYXRjaCB7XG5cdFx0XHRyZXR1cm4gZmFsc2U7XG5cdFx0fVxuXHR9XG5cblx0cHJpdmF0ZSBhc3luYyBnZXRSZW1vdGVHaXRIZWFkKGluc3RhbGxlZFBhdGg6IHN0cmluZyk6IFByb21pc2U8c3RyaW5nPiB7XG5cdFx0Y29uc3QgdXBzdHJlYW1SZWYgPSBhd2FpdCB0aGlzLmdldEdpdFVwc3RyZWFtUmVmKGluc3RhbGxlZFBhdGgpO1xuXHRcdGlmICh1cHN0cmVhbVJlZikge1xuXHRcdFx0Y29uc3QgcmVtb3RlSGVhZCA9IGF3YWl0IHRoaXMucnVuR2l0UmVtb3RlQ29tbWFuZChpbnN0YWxsZWRQYXRoLCBbXCJscy1yZW1vdGVcIiwgXCJvcmlnaW5cIiwgdXBzdHJlYW1SZWZdKTtcblx0XHRcdGNvbnN0IG1hdGNoID0gcmVtb3RlSGVhZC5tYXRjaCgvXihbMC05YS1mXXs0MH0pXFxzKy9tKTtcblx0XHRcdGlmIChtYXRjaD8uWzFdKSB7XG5cdFx0XHRcdHJldHVybiBtYXRjaFsxXTtcblx0XHRcdH1cblx0XHR9XG5cblx0XHRjb25zdCByZW1vdGVIZWFkID0gYXdhaXQgdGhpcy5ydW5HaXRSZW1vdGVDb21tYW5kKGluc3RhbGxlZFBhdGgsIFtcImxzLXJlbW90ZVwiLCBcIm9yaWdpblwiLCBcIkhFQURcIl0pO1xuXHRcdGNvbnN0IG1hdGNoID0gcmVtb3RlSGVhZC5tYXRjaCgvXihbMC05YS1mXXs0MH0pXFxzK0hFQUQkL20pO1xuXHRcdGlmICghbWF0Y2g/LlsxXSkge1xuXHRcdFx0dGhyb3cgbmV3IEVycm9yKFwiRmFpbGVkIHRvIGRldGVybWluZSByZW1vdGUgSEVBRFwiKTtcblx0XHR9XG5cdFx0cmV0dXJuIG1hdGNoWzFdO1xuXHR9XG5cblx0cHJpdmF0ZSBhc3luYyBnZXRMb2NhbEdpdFVwZGF0ZVRhcmdldChcblx0XHRpbnN0YWxsZWRQYXRoOiBzdHJpbmcsXG5cdCk6IFByb21pc2U8eyByZWY6IHN0cmluZzsgaGVhZDogc3RyaW5nOyBmZXRjaEFyZ3M6IHN0cmluZ1tdIH0+IHtcblx0XHR0cnkge1xuXHRcdFx0Y29uc3QgdXBzdHJlYW0gPSBhd2FpdCB0aGlzLnJ1bkNvbW1hbmRDYXB0dXJlKFwiZ2l0XCIsIFtcInJldi1wYXJzZVwiLCBcIi0tYWJicmV2LXJlZlwiLCBcIkB7dXBzdHJlYW19XCJdLCB7XG5cdFx0XHRcdGN3ZDogaW5zdGFsbGVkUGF0aCxcblx0XHRcdFx0dGltZW91dE1zOiBORVRXT1JLX1RJTUVPVVRfTVMsXG5cdFx0XHR9KTtcblx0XHRcdGNvbnN0IHRyaW1tZWRVcHN0cmVhbSA9IHVwc3RyZWFtLnRyaW0oKTtcblx0XHRcdGlmICghdHJpbW1lZFVwc3RyZWFtLnN0YXJ0c1dpdGgoXCJvcmlnaW4vXCIpKSB7XG5cdFx0XHRcdHRocm93IG5ldyBFcnJvcihgVW5zdXBwb3J0ZWQgdXBzdHJlYW0gcmVtb3RlOiAke3RyaW1tZWRVcHN0cmVhbX1gKTtcblx0XHRcdH1cblx0XHRcdGNvbnN0IGJyYW5jaCA9IHRyaW1tZWRVcHN0cmVhbS5zbGljZShcIm9yaWdpbi9cIi5sZW5ndGgpO1xuXHRcdFx0aWYgKCFicmFuY2gpIHtcblx0XHRcdFx0dGhyb3cgbmV3IEVycm9yKFwiTWlzc2luZyB1cHN0cmVhbSBicmFuY2ggbmFtZVwiKTtcblx0XHRcdH1cblx0XHRcdGNvbnN0IGhlYWQgPSBhd2FpdCB0aGlzLnJ1bkNvbW1hbmRDYXB0dXJlKFwiZ2l0XCIsIFtcInJldi1wYXJzZVwiLCBcIkB7dXBzdHJlYW19XCJdLCB7XG5cdFx0XHRcdGN3ZDogaW5zdGFsbGVkUGF0aCxcblx0XHRcdFx0dGltZW91dE1zOiBORVRXT1JLX1RJTUVPVVRfTVMsXG5cdFx0XHR9KTtcblx0XHRcdHJldHVybiB7XG5cdFx0XHRcdHJlZjogXCJAe3Vwc3RyZWFtfVwiLFxuXHRcdFx0XHRoZWFkLFxuXHRcdFx0XHRmZXRjaEFyZ3M6IFtcblx0XHRcdFx0XHRcImZldGNoXCIsXG5cdFx0XHRcdFx0XCItLXBydW5lXCIsXG5cdFx0XHRcdFx0XCItLW5vLXRhZ3NcIixcblx0XHRcdFx0XHRcIm9yaWdpblwiLFxuXHRcdFx0XHRcdGArcmVmcy9oZWFkcy8ke2JyYW5jaH06cmVmcy9yZW1vdGVzL29yaWdpbi8ke2JyYW5jaH1gLFxuXHRcdFx0XHRdLFxuXHRcdFx0fTtcblx0XHR9IGNhdGNoIHtcblx0XHRcdGF3YWl0IHRoaXMucnVuQ29tbWFuZChcImdpdFwiLCBbXCJyZW1vdGVcIiwgXCJzZXQtaGVhZFwiLCBcIm9yaWdpblwiLCBcIi1hXCJdLCB7IGN3ZDogaW5zdGFsbGVkUGF0aCB9KS5jYXRjaCgoKSA9PiB7fSk7XG5cdFx0XHRjb25zdCBoZWFkID0gYXdhaXQgdGhpcy5ydW5Db21tYW5kQ2FwdHVyZShcImdpdFwiLCBbXCJyZXYtcGFyc2VcIiwgXCJvcmlnaW4vSEVBRFwiXSwge1xuXHRcdFx0XHRjd2Q6IGluc3RhbGxlZFBhdGgsXG5cdFx0XHRcdHRpbWVvdXRNczogTkVUV09SS19USU1FT1VUX01TLFxuXHRcdFx0fSk7XG5cdFx0XHRjb25zdCBvcmlnaW5IZWFkUmVmID0gYXdhaXQgdGhpcy5ydW5Db21tYW5kQ2FwdHVyZShcImdpdFwiLCBbXCJzeW1ib2xpYy1yZWZcIiwgXCJyZWZzL3JlbW90ZXMvb3JpZ2luL0hFQURcIl0sIHtcblx0XHRcdFx0Y3dkOiBpbnN0YWxsZWRQYXRoLFxuXHRcdFx0XHR0aW1lb3V0TXM6IE5FVFdPUktfVElNRU9VVF9NUyxcblx0XHRcdH0pLmNhdGNoKCgpID0+IFwiXCIpO1xuXHRcdFx0Y29uc3QgYnJhbmNoID0gb3JpZ2luSGVhZFJlZi50cmltKCkucmVwbGFjZSgvXnJlZnNcXC9yZW1vdGVzXFwvb3JpZ2luXFwvLywgXCJcIik7XG5cdFx0XHRpZiAoYnJhbmNoKSB7XG5cdFx0XHRcdHJldHVybiB7XG5cdFx0XHRcdFx0cmVmOiBcIm9yaWdpbi9IRUFEXCIsXG5cdFx0XHRcdFx0aGVhZCxcblx0XHRcdFx0XHRmZXRjaEFyZ3M6IFtcblx0XHRcdFx0XHRcdFwiZmV0Y2hcIixcblx0XHRcdFx0XHRcdFwiLS1wcnVuZVwiLFxuXHRcdFx0XHRcdFx0XCItLW5vLXRhZ3NcIixcblx0XHRcdFx0XHRcdFwib3JpZ2luXCIsXG5cdFx0XHRcdFx0XHRgK3JlZnMvaGVhZHMvJHticmFuY2h9OnJlZnMvcmVtb3Rlcy9vcmlnaW4vJHticmFuY2h9YCxcblx0XHRcdFx0XHRdLFxuXHRcdFx0XHR9O1xuXHRcdFx0fVxuXHRcdFx0cmV0dXJuIHtcblx0XHRcdFx0cmVmOiBcIm9yaWdpbi9IRUFEXCIsXG5cdFx0XHRcdGhlYWQsXG5cdFx0XHRcdGZldGNoQXJnczogW1wiZmV0Y2hcIiwgXCItLXBydW5lXCIsIFwiLS1uby10YWdzXCIsIFwib3JpZ2luXCIsIFwiK0hFQUQ6cmVmcy9yZW1vdGVzL29yaWdpbi9IRUFEXCJdLFxuXHRcdFx0fTtcblx0XHR9XG5cdH1cblxuXHRwcml2YXRlIGFzeW5jIGdldEdpdFVwc3RyZWFtUmVmKGluc3RhbGxlZFBhdGg6IHN0cmluZyk6IFByb21pc2U8c3RyaW5nIHwgdW5kZWZpbmVkPiB7XG5cdFx0dHJ5IHtcblx0XHRcdGNvbnN0IHVwc3RyZWFtID0gYXdhaXQgdGhpcy5ydW5Db21tYW5kQ2FwdHVyZShcImdpdFwiLCBbXCJyZXYtcGFyc2VcIiwgXCItLWFiYnJldi1yZWZcIiwgXCJAe3Vwc3RyZWFtfVwiXSwge1xuXHRcdFx0XHRjd2Q6IGluc3RhbGxlZFBhdGgsXG5cdFx0XHRcdHRpbWVvdXRNczogTkVUV09SS19USU1FT1VUX01TLFxuXHRcdFx0fSk7XG5cdFx0XHRjb25zdCB0cmltbWVkID0gdXBzdHJlYW0udHJpbSgpO1xuXHRcdFx0aWYgKCF0cmltbWVkLnN0YXJ0c1dpdGgoXCJvcmlnaW4vXCIpKSB7XG5cdFx0XHRcdHJldHVybiB1bmRlZmluZWQ7XG5cdFx0XHR9XG5cdFx0XHRjb25zdCBicmFuY2ggPSB0cmltbWVkLnNsaWNlKFwib3JpZ2luL1wiLmxlbmd0aCk7XG5cdFx0XHRyZXR1cm4gYnJhbmNoID8gYHJlZnMvaGVhZHMvJHticmFuY2h9YCA6IHVuZGVmaW5lZDtcblx0XHR9IGNhdGNoIHtcblx0XHRcdHJldHVybiB1bmRlZmluZWQ7XG5cdFx0fVxuXHR9XG5cblx0cHJpdmF0ZSBydW5HaXRSZW1vdGVDb21tYW5kKGluc3RhbGxlZFBhdGg6IHN0cmluZywgYXJnczogc3RyaW5nW10pOiBQcm9taXNlPHN0cmluZz4ge1xuXHRcdHJldHVybiB0aGlzLnJ1bkNvbW1hbmRDYXB0dXJlKFwiZ2l0XCIsIGFyZ3MsIHtcblx0XHRcdGN3ZDogaW5zdGFsbGVkUGF0aCxcblx0XHRcdHRpbWVvdXRNczogTkVUV09SS19USU1FT1VUX01TLFxuXHRcdFx0ZW52OiB7XG5cdFx0XHRcdEdJVF9URVJNSU5BTF9QUk9NUFQ6IFwiMFwiLFxuXHRcdFx0fSxcblx0XHR9KTtcblx0fVxuXG5cdHByaXZhdGUgYXN5bmMgcnVuV2l0aENvbmN1cnJlbmN5PFQ+KHRhc2tzOiBBcnJheTwoKSA9PiBQcm9taXNlPFQ+PiwgbGltaXQ6IG51bWJlcik6IFByb21pc2U8VFtdPiB7XG5cdFx0aWYgKHRhc2tzLmxlbmd0aCA9PT0gMCkge1xuXHRcdFx0cmV0dXJuIFtdO1xuXHRcdH1cblxuXHRcdGNvbnN0IHJlc3VsdHM6IFRbXSA9IG5ldyBBcnJheSh0YXNrcy5sZW5ndGgpO1xuXHRcdGxldCBuZXh0SW5kZXggPSAwO1xuXHRcdGNvbnN0IHdvcmtlckNvdW50ID0gTWF0aC5tYXgoMSwgTWF0aC5taW4obGltaXQsIHRhc2tzLmxlbmd0aCkpO1xuXG5cdFx0Y29uc3Qgd29ya2VyID0gYXN5bmMgKCkgPT4ge1xuXHRcdFx0d2hpbGUgKHRydWUpIHtcblx0XHRcdFx0Y29uc3QgaW5kZXggPSBuZXh0SW5kZXg7XG5cdFx0XHRcdG5leHRJbmRleCArPSAxO1xuXHRcdFx0XHRpZiAoaW5kZXggPj0gdGFza3MubGVuZ3RoKSB7XG5cdFx0XHRcdFx0cmV0dXJuO1xuXHRcdFx0XHR9XG5cdFx0XHRcdHJlc3VsdHNbaW5kZXhdID0gYXdhaXQgdGFza3NbaW5kZXhdKCk7XG5cdFx0XHR9XG5cdFx0fTtcblxuXHRcdGF3YWl0IFByb21pc2UuYWxsKEFycmF5LmZyb20oeyBsZW5ndGg6IHdvcmtlckNvdW50IH0sICgpID0+IHdvcmtlcigpKSk7XG5cdFx0cmV0dXJuIHJlc3VsdHM7XG5cdH1cblxuXHQvKipcblx0ICogR2V0IGEgdW5pcXVlIGlkZW50aXR5IGZvciBhIHBhY2thZ2UsIGlnbm9yaW5nIHZlcnNpb24vcmVmLlxuXHQgKiBVc2VkIHRvIGRldGVjdCB3aGVuIHRoZSBzYW1lIHBhY2thZ2UgaXMgaW4gYm90aCBnbG9iYWwgYW5kIHByb2plY3Qgc2V0dGluZ3MuXG5cdCAqIEZvciBnaXQgcGFja2FnZXMsIHVzZXMgbm9ybWFsaXplZCBob3N0L3BhdGggdG8gZW5zdXJlIFNTSCBhbmQgSFRUUFMgVVJMc1xuXHQgKiBmb3IgdGhlIHNhbWUgcmVwb3NpdG9yeSBhcmUgdHJlYXRlZCBhcyBpZGVudGljYWwuXG5cdCAqL1xuXHRwcml2YXRlIGdldFBhY2thZ2VJZGVudGl0eShzb3VyY2U6IHN0cmluZywgc2NvcGU/OiBTb3VyY2VTY29wZSk6IHN0cmluZyB7XG5cdFx0Y29uc3QgcGFyc2VkID0gdGhpcy5wYXJzZVNvdXJjZShzb3VyY2UpO1xuXHRcdGlmIChwYXJzZWQudHlwZSA9PT0gXCJucG1cIikge1xuXHRcdFx0cmV0dXJuIGBucG06JHtwYXJzZWQubmFtZX1gO1xuXHRcdH1cblx0XHRpZiAocGFyc2VkLnR5cGUgPT09IFwiZ2l0XCIpIHtcblx0XHRcdC8vIFVzZSBob3N0L3BhdGggZm9yIGlkZW50aXR5IHRvIG5vcm1hbGl6ZSBTU0ggYW5kIEhUVFBTXG5cdFx0XHRyZXR1cm4gYGdpdDoke3BhcnNlZC5ob3N0fS8ke3BhcnNlZC5wYXRofWA7XG5cdFx0fVxuXHRcdGlmIChzY29wZSkge1xuXHRcdFx0Y29uc3QgYmFzZURpciA9IHRoaXMuZ2V0QmFzZURpckZvclNjb3BlKHNjb3BlKTtcblx0XHRcdHJldHVybiBgbG9jYWw6JHt0aGlzLnJlc29sdmVQYXRoRnJvbUJhc2UocGFyc2VkLnBhdGgsIGJhc2VEaXIpfWA7XG5cdFx0fVxuXHRcdHJldHVybiBgbG9jYWw6JHt0aGlzLnJlc29sdmVQYXRoKHBhcnNlZC5wYXRoKX1gO1xuXHR9XG5cblx0LyoqXG5cdCAqIERlZHVwZSBwYWNrYWdlczogaWYgc2FtZSBwYWNrYWdlIGlkZW50aXR5IGFwcGVhcnMgaW4gYm90aCBnbG9iYWwgYW5kIHByb2plY3QsXG5cdCAqIGtlZXAgb25seSB0aGUgcHJvamVjdCBvbmUgKHByb2plY3Qgd2lucykuXG5cdCAqL1xuXHRwcml2YXRlIGRlZHVwZVBhY2thZ2VzKFxuXHRcdHBhY2thZ2VzOiBBcnJheTx7IHBrZzogUGFja2FnZVNvdXJjZTsgc2NvcGU6IFNvdXJjZVNjb3BlIH0+LFxuXHQpOiBBcnJheTx7IHBrZzogUGFja2FnZVNvdXJjZTsgc2NvcGU6IFNvdXJjZVNjb3BlIH0+IHtcblx0XHRjb25zdCBzZWVuID0gbmV3IE1hcDxzdHJpbmcsIHsgcGtnOiBQYWNrYWdlU291cmNlOyBzY29wZTogU291cmNlU2NvcGUgfT4oKTtcblxuXHRcdGZvciAoY29uc3QgZW50cnkgb2YgcGFja2FnZXMpIHtcblx0XHRcdGNvbnN0IHNvdXJjZVN0ciA9IHR5cGVvZiBlbnRyeS5wa2cgPT09IFwic3RyaW5nXCIgPyBlbnRyeS5wa2cgOiBlbnRyeS5wa2cuc291cmNlO1xuXHRcdFx0Y29uc3QgaWRlbnRpdHkgPSB0aGlzLmdldFBhY2thZ2VJZGVudGl0eShzb3VyY2VTdHIsIGVudHJ5LnNjb3BlKTtcblxuXHRcdFx0Y29uc3QgZXhpc3RpbmcgPSBzZWVuLmdldChpZGVudGl0eSk7XG5cdFx0XHRpZiAoIWV4aXN0aW5nKSB7XG5cdFx0XHRcdHNlZW4uc2V0KGlkZW50aXR5LCBlbnRyeSk7XG5cdFx0XHR9IGVsc2UgaWYgKGVudHJ5LnNjb3BlID09PSBcInByb2plY3RcIiAmJiBleGlzdGluZy5zY29wZSA9PT0gXCJ1c2VyXCIpIHtcblx0XHRcdFx0Ly8gUHJvamVjdCB3aW5zIG92ZXIgdXNlclxuXHRcdFx0XHRzZWVuLnNldChpZGVudGl0eSwgZW50cnkpO1xuXHRcdFx0fVxuXHRcdFx0Ly8gSWYgZXhpc3RpbmcgaXMgcHJvamVjdCBhbmQgbmV3IGlzIGdsb2JhbCwga2VlcCBleGlzdGluZyAocHJvamVjdClcblx0XHRcdC8vIElmIGJvdGggYXJlIHNhbWUgc2NvcGUsIGtlZXAgZmlyc3Qgb25lXG5cdFx0fVxuXG5cdFx0cmV0dXJuIEFycmF5LmZyb20oc2Vlbi52YWx1ZXMoKSk7XG5cdH1cblxuXHRwcml2YXRlIHBhcnNlTnBtU3BlYyhzcGVjOiBzdHJpbmcpOiB7IG5hbWU6IHN0cmluZzsgdmVyc2lvbj86IHN0cmluZyB9IHtcblx0XHRjb25zdCBtYXRjaCA9IHNwZWMubWF0Y2goL14oQD9bXkBdKyg/OlxcL1teQF0rKT8pKD86QCguKykpPyQvKTtcblx0XHRpZiAoIW1hdGNoKSB7XG5cdFx0XHRyZXR1cm4geyBuYW1lOiBzcGVjIH07XG5cdFx0fVxuXHRcdGNvbnN0IG5hbWUgPSBtYXRjaFsxXSA/PyBzcGVjO1xuXHRcdGNvbnN0IHZlcnNpb24gPSBtYXRjaFsyXTtcblx0XHRyZXR1cm4geyBuYW1lLCB2ZXJzaW9uIH07XG5cdH1cblxuXHRwcml2YXRlIGdldE5wbUNvbW1hbmQoKTogeyBjb21tYW5kOiBzdHJpbmc7IGFyZ3M6IHN0cmluZ1tdIH0ge1xuXHRcdGNvbnN0IGNvbmZpZ3VyZWRDb21tYW5kID0gdGhpcy5zZXR0aW5nc01hbmFnZXIuZ2V0TnBtQ29tbWFuZCgpO1xuXHRcdGlmICghY29uZmlndXJlZENvbW1hbmQgfHwgY29uZmlndXJlZENvbW1hbmQubGVuZ3RoID09PSAwKSB7XG5cdFx0XHRyZXR1cm4geyBjb21tYW5kOiBcIm5wbVwiLCBhcmdzOiBbXSB9O1xuXHRcdH1cblx0XHRjb25zdCBbY29tbWFuZCwgLi4uYXJnc10gPSBjb25maWd1cmVkQ29tbWFuZDtcblx0XHRpZiAoIWNvbW1hbmQpIHtcblx0XHRcdHRocm93IG5ldyBFcnJvcihcIkludmFsaWQgbnBtQ29tbWFuZDogZmlyc3QgYXJyYXkgZW50cnkgbXVzdCBiZSBhIG5vbi1lbXB0eSBjb21tYW5kXCIpO1xuXHRcdH1cblx0XHRyZXR1cm4geyBjb21tYW5kLCBhcmdzIH07XG5cdH1cblxuXHRwcml2YXRlIGFzeW5jIHJ1bk5wbUNvbW1hbmQoYXJnczogc3RyaW5nW10sIG9wdGlvbnM/OiB7IGN3ZD86IHN0cmluZyB9KTogUHJvbWlzZTx2b2lkPiB7XG5cdFx0Y29uc3QgbnBtQ29tbWFuZCA9IHRoaXMuZ2V0TnBtQ29tbWFuZCgpO1xuXHRcdGF3YWl0IHRoaXMucnVuQ29tbWFuZChucG1Db21tYW5kLmNvbW1hbmQsIFsuLi5ucG1Db21tYW5kLmFyZ3MsIC4uLmFyZ3NdLCBvcHRpb25zKTtcblx0fVxuXG5cdHByaXZhdGUgZ2V0R2l0RGVwZW5kZW5jeUluc3RhbGxBcmdzKCk6IHN0cmluZ1tdIHtcblx0XHRjb25zdCBjb25maWd1cmVkQ29tbWFuZCA9IHRoaXMuc2V0dGluZ3NNYW5hZ2VyLmdldE5wbUNvbW1hbmQoKTtcblx0XHRpZiAoY29uZmlndXJlZENvbW1hbmQgJiYgY29uZmlndXJlZENvbW1hbmQubGVuZ3RoID4gMCkge1xuXHRcdFx0cmV0dXJuIFtcImluc3RhbGxcIl07XG5cdFx0fVxuXHRcdHJldHVybiBbXCJpbnN0YWxsXCIsIFwiLS1vbWl0PWRldlwiXTtcblx0fVxuXG5cdHByaXZhdGUgcnVuTnBtQ29tbWFuZFN5bmMoYXJnczogc3RyaW5nW10pOiBzdHJpbmcge1xuXHRcdGNvbnN0IG5wbUNvbW1hbmQgPSB0aGlzLmdldE5wbUNvbW1hbmQoKTtcblx0XHRyZXR1cm4gdGhpcy5ydW5Db21tYW5kU3luYyhucG1Db21tYW5kLmNvbW1hbmQsIFsuLi5ucG1Db21tYW5kLmFyZ3MsIC4uLmFyZ3NdKTtcblx0fVxuXG5cbltTaG93aW5nIGxpbmVzIDEtMTY4NyBvZiAyNDQ1ICg1MC4wS0IgbGltaXQpLiBVc2Ugb2Zmc2V0PTE2ODggdG8gY29udGludWUuXSJ9XSwiZGV0YWlscyI6eyJ0cnVuY2F0aW9uIjp7ImNvbnRlbnQiOiJpbXBvcnQgeyB0eXBlIENoaWxkUHJvY2VzcywgdHlwZSBDaGlsZFByb2Nlc3NCeVN0ZGlvLCBzcGF3biwgc3Bhd25TeW5jIH0gZnJvbSBcIm5vZGU6Y2hpbGRfcHJvY2Vzc1wiO1xuaW1wb3J0IHsgY3JlYXRlSGFzaCB9IGZyb20gXCJub2RlOmNyeXB0b1wiO1xuaW1wb3J0IHsgZXhpc3RzU3luYywgbWtkaXJTeW5jLCByZWFkZGlyU3luYywgcmVhZEZpbGVTeW5jLCBybVN5bmMsIHN0YXRTeW5jLCB3cml0ZUZpbGVTeW5jIH0gZnJvbSBcIm5vZGU6ZnNcIjtcbmltcG9ydCB7IGhvbWVkaXIsIHRtcGRpciB9IGZyb20gXCJub2RlOm9zXCI7XG5cbmZ1bmN0aW9uIGdldEVudigpOiBOb2RlSlMuUHJvY2Vzc0VudiB7XG5cdGlmIChwcm9jZXNzLnBsYXRmb3JtICE9PSBcImxpbnV4XCIgfHwgT2JqZWN0LmtleXMocHJvY2Vzcy5lbnYpLmxlbmd0aCA+IDApIHtcblx0XHRyZXR1cm4gcHJvY2Vzcy5lbnY7XG5cdH1cblx0dHJ5IHtcblx0XHRjb25zdCBkYXRhID0gcmVhZEZpbGVTeW5jKFwiL3Byb2Mvc2VsZi9lbnZpcm9uXCIsIFwidXRmLThcIik7XG5cdFx0Y29uc3QgZW52OiBOb2RlSlMuUHJvY2Vzc0VudiA9IHt9O1xuXHRcdGZvciAoY29uc3QgZW50cnkgb2YgZGF0YS5zcGxpdChcIlxcMFwiKSkge1xuXHRcdFx0Y29uc3QgaWR4ID0gZW50cnkuaW5kZXhPZihcIj1cIik7XG5cdFx0XHRpZiAoaWR4ID4gMCkge1xuXHRcdFx0XHRlbnZbZW50cnkuc2xpY2UoMCwgaWR4KV0gPSBlbnRyeS5zbGljZShpZHggKyAxKTtcblx0XHRcdH1cblx0XHR9XG5cdFx0cmV0dXJuIGVudjtcblx0fSBjYXRjaCB7XG5cdFx0cmV0dXJuIHByb2Nlc3MuZW52O1xuXHR9XG59XG5cbmltcG9ydCB7IGJhc2VuYW1lLCBkaXJuYW1lLCBqb2luLCByZWxhdGl2ZSwgcmVzb2x2ZSwgc2VwIH0gZnJvbSBcIm5vZGU6cGF0aFwiO1xuaW1wb3J0IHR5cGUgeyBSZWFkYWJsZSB9IGZyb20gXCJub2RlOnN0cmVhbVwiO1xuaW1wb3J0IHsgZ2xvYlN5bmMgfSBmcm9tIFwiZ2xvYlwiO1xuaW1wb3J0IGlnbm9yZSBmcm9tIFwiaWdub3JlXCI7XG5pbXBvcnQgeyBtaW5pbWF0Y2ggfSBmcm9tIFwibWluaW1hdGNoXCI7XG5pbXBvcnQgeyBDT05GSUdfRElSX05BTUUgfSBmcm9tIFwiLi4vY29uZmlnLmpzXCI7XG5pbXBvcnQgeyB0eXBlIEdpdFNvdXJjZSwgcGFyc2VHaXRVcmwgfSBmcm9tIFwiLi4vdXRpbHMvZ2l0LmpzXCI7XG5pbXBvcnQgeyBjYW5vbmljYWxpemVQYXRoLCBpc0xvY2FsUGF0aCB9IGZyb20gXCIuLi91dGlscy9wYXRocy5qc1wiO1xuaW1wb3J0IHsgaXNTdGRvdXRUYWtlbk92ZXIgfSBmcm9tIFwiLi9vdXRwdXQtZ3VhcmQuanNcIjtcbmltcG9ydCB0eXBlIHsgUGFja2FnZVNvdXJjZSwgU2V0dGluZ3NNYW5hZ2VyIH0gZnJvbSBcIi4vc2V0dGluZ3MtbWFuYWdlci5qc1wiO1xuXG5jb25zdCBORVRXT1JLX1RJTUVPVVRfTVMgPSAxMDAwMDtcbmNvbnN0IFVQREFURV9DSEVDS19DT05DVVJSRU5DWSA9IDQ7XG5jb25zdCBHSVRfVVBEQVRFX0NPTkNVUlJFTkNZID0gNDtcblxuZnVuY3Rpb24gaXNPZmZsaW5lTW9kZUVuYWJsZWQoKTogYm9vbGVhbiB7XG5cdGNvbnN0IHZhbHVlID0gcHJvY2Vzcy5lbnYuUElfT0ZGTElORTtcblx0aWYgKCF2YWx1ZSkgcmV0dXJuIGZhbHNlO1xuXHRyZXR1cm4gdmFsdWUgPT09IFwiMVwiIHx8IHZhbHVlLnRvTG93ZXJDYXNlKCkgPT09IFwidHJ1ZVwiIHx8IHZhbHVlLnRvTG93ZXJDYXNlKCkgPT09IFwieWVzXCI7XG59XG5cbmV4cG9ydCBpbnRlcmZhY2UgUGF0aE1ldGFkYXRhIHtcblx0c291cmNlOiBzdHJpbmc7XG5cdHNjb3BlOiBTb3VyY2VTY29wZTtcblx0b3JpZ2luOiBcInBhY2thZ2VcIiB8IFwidG9wLWxldmVsXCI7XG5cdGJhc2VEaXI/OiBzdHJpbmc7XG59XG5cbmV4cG9ydCBpbnRlcmZhY2UgUmVzb2x2ZWRSZXNvdXJjZSB7XG5cdHBhdGg6IHN0cmluZztcblx0ZW5hYmxlZDogYm9vbGVhbjtcblx0bWV0YWRhdGE6IFBhdGhNZXRhZGF0YTtcbn1cblxuZXhwb3J0IGludGVyZmFjZSBSZXNvbHZlZFBhdGhzIHtcblx0ZXh0ZW5zaW9uczogUmVzb2x2ZWRSZXNvdXJjZVtdO1xuXHRza2lsbHM6IFJlc29sdmVkUmVzb3VyY2VbXTtcblx0cHJvbXB0czogUmVzb2x2ZWRSZXNvdXJjZVtdO1xuXHR0aGVtZXM6IFJlc29sdmVkUmVzb3VyY2VbXTtcbn1cblxuZXhwb3J0IHR5cGUgTWlzc2luZ1NvdXJjZUFjdGlvbiA9IFwiaW5zdGFsbFwiIHwgXCJza2lwXCIgfCBcImVycm9yXCI7XG5cbmV4cG9ydCBpbnRlcmZhY2UgUHJvZ3Jlc3NFdmVudCB7XG5cdHR5cGU6IFwic3RhcnRcIiB8IFwicHJvZ3Jlc3NcIiB8IFwiY29tcGxldGVcIiB8IFwiZXJyb3JcIjtcblx0YWN0aW9uOiBcImluc3RhbGxcIiB8IFwicmVtb3ZlXCIgfCBcInVwZGF0ZVwiIHwgXCJjbG9uZVwiIHwgXCJwdWxsXCI7XG5cdHNvdXJjZTogc3RyaW5nO1xuXHRtZXNzYWdlPzogc3RyaW5nO1xufVxuXG5leHBvcnQgdHlwZSBQcm9ncmVzc0NhbGxiYWNrID0gKGV2ZW50OiBQcm9ncmVzc0V2ZW50KSA9PiB2b2lkO1xuXG5leHBvcnQgaW50ZXJmYWNlIFBhY2thZ2VVcGRhdGUge1xuXHRzb3VyY2U6IHN0cmluZztcblx0ZGlzcGxheU5hbWU6IHN0cmluZztcblx0dHlwZTogXCJucG1cIiB8IFwiZ2l0XCI7XG5cdHNjb3BlOiBFeGNsdWRlPFNvdXJjZVNjb3BlLCBcInRlbXBvcmFyeVwiPjtcbn1cblxuZXhwb3J0IGludGVyZmFjZSBDb25maWd1cmVkUGFja2FnZSB7XG5cdHNvdXJjZTogc3RyaW5nO1xuXHRzY29wZTogXCJ1c2VyXCIgfCBcInByb2plY3RcIjtcblx0ZmlsdGVyZWQ6IGJvb2xlYW47XG5cdGluc3RhbGxlZFBhdGg/OiBzdHJpbmc7XG59XG5cbmV4cG9ydCBpbnRlcmZhY2UgUGFja2FnZU1hbmFnZXIge1xuXHRyZXNvbHZlKG9uTWlzc2luZz86IChzb3VyY2U6IHN0cmluZykgPT4gUHJvbWlzZTxNaXNzaW5nU291cmNlQWN0aW9uPik6IFByb21pc2U8UmVzb2x2ZWRQYXRocz47XG5cdGluc3RhbGwoc291cmNlOiBzdHJpbmcsIG9wdGlvbnM/OiB7IGxvY2FsPzogYm9vbGVhbiB9KTogUHJvbWlzZTx2b2lkPjtcblx0aW5zdGFsbEFuZFBlcnNpc3Qoc291cmNlOiBzdHJpbmcsIG9wdGlvbnM/OiB7IGxvY2FsPzogYm9vbGVhbiB9KTogUHJvbWlzZTx2b2lkPjtcblx0cmVtb3ZlKHNvdXJjZTogc3RyaW5nLCBvcHRpb25zPzogeyBsb2NhbD86IGJvb2xlYW4gfSk6IFByb21pc2U8dm9pZD47XG5cdHJlbW92ZUFuZFBlcnNpc3Qoc291cmNlOiBzdHJpbmcsIG9wdGlvbnM/OiB7IGxvY2FsPzogYm9vbGVhbiB9KTogUHJvbWlzZTxib29sZWFuPjtcblx0dXBkYXRlKHNvdXJjZT86IHN0cmluZyk6IFByb21pc2U8dm9pZD47XG5cdGxpc3RDb25maWd1cmVkUGFja2FnZXMoKTogQ29uZmlndXJlZFBhY2thZ2VbXTtcblx0cmVzb2x2ZUV4dGVuc2lvblNvdXJjZXMoXG5cdFx0c291cmNlczogc3RyaW5nW10sXG5cdFx0b3B0aW9ucz86IHsgbG9jYWw/OiBib29sZWFuOyB0ZW1wb3Jhcnk/OiBib29sZWFuIH0sXG5cdCk6IFByb21pc2U8UmVzb2x2ZWRQYXRocz47XG5cdGFkZFNvdXJjZVRvU2V0dGluZ3Moc291cmNlOiBzdHJpbmcsIG9wdGlvbnM/OiB7IGxvY2FsPzogYm9vbGVhbiB9KTogYm9vbGVhbjtcblx0cmVtb3ZlU291cmNlRnJvbVNldHRpbmdzKHNvdXJjZTogc3RyaW5nLCBvcHRpb25zPzogeyBsb2NhbD86IGJvb2xlYW4gfSk6IGJvb2xlYW47XG5cdHNldFByb2dyZXNzQ2FsbGJhY2soY2FsbGJhY2s6IFByb2dyZXNzQ2FsbGJhY2sgfCB1bmRlZmluZWQpOiB2b2lkO1xuXHRnZXRJbnN0YWxsZWRQYXRoKHNvdXJjZTogc3RyaW5nLCBzY29wZTogXCJ1c2VyXCIgfCBcInByb2plY3RcIik6IHN0cmluZyB8IHVuZGVmaW5lZDtcbn1cblxuaW50ZXJmYWNlIFBhY2thZ2VNYW5hZ2VyT3B0aW9ucyB7XG5cdGN3ZDogc3RyaW5nO1xuXHRhZ2VudERpcjogc3RyaW5nO1xuXHRzZXR0aW5nc01hbmFnZXI6IFNldHRpbmdzTWFuYWdlcjtcbn1cblxudHlwZSBTb3VyY2VTY29wZSA9IFwidXNlclwiIHwgXCJwcm9qZWN0XCIgfCBcInRlbXBvcmFyeVwiO1xuXG50eXBlIE5wbVNvdXJjZSA9IHtcblx0dHlwZTogXCJucG1cIjtcblx0c3BlYzogc3RyaW5nO1xuXHRuYW1lOiBzdHJpbmc7XG5cdHBpbm5lZDogYm9vbGVhbjtcbn07XG5cbnR5cGUgTG9jYWxTb3VyY2UgPSB7XG5cdHR5cGU6IFwibG9jYWxcIjtcblx0cGF0aDogc3RyaW5nO1xufTtcblxudHlwZSBQYXJzZWRTb3VyY2UgPSBOcG1Tb3VyY2UgfCBHaXRTb3VyY2UgfCBMb2NhbFNvdXJjZTtcblxudHlwZSBJbnN0YWxsZWRTb3VyY2VTY29wZSA9IEV4Y2x1ZGU8U291cmNlU2NvcGUsIFwidGVtcG9yYXJ5XCI+O1xuXG5pbnRlcmZhY2UgQ29uZmlndXJlZFVwZGF0ZVNvdXJjZSB7XG5cdHNvdXJjZTogc3RyaW5nO1xuXHRzY29wZTogSW5zdGFsbGVkU291cmNlU2NvcGU7XG59XG5cbmludGVyZmFjZSBOcG1VcGRhdGVUYXJnZXQgZXh0ZW5kcyBDb25maWd1cmVkVXBkYXRlU291cmNlIHtcblx0cGFyc2VkOiBOcG1Tb3VyY2U7XG59XG5cbmludGVyZmFjZSBHaXRVcGRhdGVUYXJnZXQgZXh0ZW5kcyBDb25maWd1cmVkVXBkYXRlU291cmNlIHtcblx0cGFyc2VkOiBHaXRTb3VyY2U7XG59XG5cbmludGVyZmFjZSBQaU1hbmlmZXN0IHtcblx0ZXh0ZW5zaW9ucz86IHN0cmluZ1tdO1xuXHRza2lsbHM/OiBzdHJpbmdbXTtcblx0cHJvbXB0cz86IHN0cmluZ1tdO1xuXHR0aGVtZXM/OiBzdHJpbmdbXTtcbn1cblxuaW50ZXJmYWNlIFJlc291cmNlQWNjdW11bGF0b3Ige1xuXHRleHRlbnNpb25zOiBNYXA8c3RyaW5nLCB7IG1ldGFkYXRhOiBQYXRoTWV0YWRhdGE7IGVuYWJsZWQ6IGJvb2xlYW4gfT47XG5cdHNraWxsczogTWFwPHN0cmluZywgeyBtZXRhZGF0YTogUGF0aE1ldGFkYXRhOyBlbmFibGVkOiBib29sZWFuIH0+O1xuXHRwcm9tcHRzOiBNYXA8c3RyaW5nLCB7IG1ldGFkYXRhOiBQYXRoTWV0YWRhdGE7IGVuYWJsZWQ6IGJvb2xlYW4gfT47XG5cdHRoZW1lczogTWFwPHN0cmluZywgeyBtZXRhZGF0YTogUGF0aE1ldGFkYXRhOyBlbmFibGVkOiBib29sZWFuIH0+O1xufVxuXG4vKipcbiAqIENvbXB1dGUgYSBudW1lcmljIHByZWNlZGVuY2UgcmFuayBmb3IgYSByZXNvdXJjZSBiYXNlZCBvbiBpdHMgbWV0YWRhdGEuXG4gKiBMb3dlciByYW5rID0gaGlnaGVyIHByZWNlZGVuY2UuIFVzZWQgdG8gc29ydCByZXNvbHZlZCByZXNvdXJjZXMgc28gdGhhdFxuICogbmFtZS1jb2xsaXNpb24gcmVzb2x1dGlvbiAoXCJmaXJzdCB3aW5zXCIpIHByb2R1Y2VzIHRoZSBjb3JyZWN0IG91dGNvbWUuXG4gKlxuICogUHJlY2VkZW5jZSAoaGlnaGVzdCB0byBsb3dlc3QpOlxuICogICAwICBwcm9qZWN0ICsgc2V0dGluZ3MgZW50cnkgKHNvdXJjZTogXCJsb2NhbFwiLCBzY29wZTogXCJwcm9qZWN0XCIpXG4gKiAgIDEgIHByb2plY3QgKyBhdXRvLWRpc2NvdmVyZWQgKHNvdXJjZTogXCJhdXRvXCIsIHNjb3BlOiBcInByb2plY3RcIilcbiAqICAgMiAgdXNlciArIHNldHRpbmdzIGVudHJ5IChzb3VyY2U6IFwibG9jYWxcIiwgc2NvcGU6IFwidXNlclwiKVxuICogICAzICB1c2VyICsgYXV0by1kaXNjb3ZlcmVkIChzb3VyY2U6IFwiYXV0b1wiLCBzY29wZTogXCJ1c2VyXCIpXG4gKiAgIDQgIHBhY2thZ2UgcmVzb3VyY2UgKG9yaWdpbjogXCJwYWNrYWdlXCIpXG4gKi9cbmZ1bmN0aW9uIHJlc291cmNlUHJlY2VkZW5jZVJhbmsobTogUGF0aE1ldGFkYXRhKTogbnVtYmVyIHtcblx0aWYgKG0ub3JpZ2luID09PSBcInBhY2thZ2VcIikgcmV0dXJuIDQ7XG5cdGNvbnN0IHNjb3BlQmFzZSA9IG0uc2NvcGUgPT09IFwicHJvamVjdFwiID8gMCA6IDI7XG5cdHJldHVybiBzY29wZUJhc2UgKyAobS5zb3VyY2UgPT09IFwibG9jYWxcIiA/IDAgOiAxKTtcbn1cblxuaW50ZXJmYWNlIFBhY2thZ2VGaWx0ZXIge1xuXHRleHRlbnNpb25zPzogc3RyaW5nW107XG5cdHNraWxscz86IHN0cmluZ1tdO1xuXHRwcm9tcHRzPzogc3RyaW5nW107XG5cdHRoZW1lcz86IHN0cmluZ1tdO1xufVxuXG50eXBlIFJlc291cmNlVHlwZSA9IFwiZXh0ZW5zaW9uc1wiIHwgXCJza2lsbHNcIiB8IFwicHJvbXB0c1wiIHwgXCJ0aGVtZXNcIjtcblxuY29uc3QgUkVTT1VSQ0VfVFlQRVM6IFJlc291cmNlVHlwZVtdID0gW1wiZXh0ZW5zaW9uc1wiLCBcInNraWxsc1wiLCBcInByb21wdHNcIiwgXCJ0aGVtZXNcIl07XG5cbmNvbnN0IEZJTEVfUEFUVEVSTlM6IFJlY29yZDxSZXNvdXJjZVR5cGUsIFJlZ0V4cD4gPSB7XG5cdGV4dGVuc2lvbnM6IC9cXC4odHN8anMpJC8sXG5cdHNraWxsczogL1xcLm1kJC8sXG5cdHByb21wdHM6IC9cXC5tZCQvLFxuXHR0aGVtZXM6IC9cXC5qc29uJC8sXG59O1xuXG5jb25zdCBJR05PUkVfRklMRV9OQU1FUyA9IFtcIi5naXRpZ25vcmVcIiwgXCIuaWdub3JlXCIsIFwiLmZkaWdub3JlXCJdO1xuXG50eXBlIElnbm9yZU1hdGNoZXIgPSBSZXR1cm5UeXBlPHR5cGVvZiBpZ25vcmU+O1xuXG5mdW5jdGlvbiB0b1Bvc2l4UGF0aChwOiBzdHJpbmcpOiBzdHJpbmcge1xuXHRyZXR1cm4gcC5zcGxpdChzZXApLmpvaW4oXCIvXCIpO1xufVxuXG5mdW5jdGlvbiBnZXRIb21lRGlyKCk6IHN0cmluZyB7XG5cdHJldHVybiBwcm9jZXNzLmVudi5IT01FIHx8IGhvbWVkaXIoKTtcbn1cblxuZnVuY3Rpb24gcHJlZml4SWdub3JlUGF0dGVybihsaW5lOiBzdHJpbmcsIHByZWZpeDogc3RyaW5nKTogc3RyaW5nIHwgbnVsbCB7XG5cdGNvbnN0IHRyaW1tZWQgPSBsaW5lLnRyaW0oKTtcblx0aWYgKCF0cmltbWVkKSByZXR1cm4gbnVsbDtcblx0aWYgKHRyaW1tZWQuc3RhcnRzV2l0aChcIiNcIikgJiYgIXRyaW1tZWQuc3RhcnRzV2l0aChcIlxcXFwjXCIpKSByZXR1cm4gbnVsbDtcblxuXHRsZXQgcGF0dGVybiA9IGxpbmU7XG5cdGxldCBuZWdhdGVkID0gZmFsc2U7XG5cblx0aWYgKHBhdHRlcm4uc3RhcnRzV2l0aChcIiFcIikpIHtcblx0XHRuZWdhdGVkID0gdHJ1ZTtcblx0XHRwYXR0ZXJuID0gcGF0dGVybi5zbGljZSgxKTtcblx0fSBlbHNlIGlmIChwYXR0ZXJuLnN0YXJ0c1dpdGgoXCJcXFxcIVwiKSkge1xuXHRcdHBhdHRlcm4gPSBwYXR0ZXJuLnNsaWNlKDEpO1xuXHR9XG5cblx0aWYgKHBhdHRlcm4uc3RhcnRzV2l0aChcIi9cIikpIHtcblx0XHRwYXR0ZXJuID0gcGF0dGVybi5zbGljZSgxKTtcblx0fVxuXG5cdGNvbnN0IHByZWZpeGVkID0gcHJlZml4ID8gYCR7cHJlZml4fSR7cGF0dGVybn1gIDogcGF0dGVybjtcblx0cmV0dXJuIG5lZ2F0ZWQgPyBgISR7cHJlZml4ZWR9YCA6IHByZWZpeGVkO1xufVxuXG5mdW5jdGlvbiBhZGRJZ25vcmVSdWxlcyhpZzogSWdub3JlTWF0Y2hlciwgZGlyOiBzdHJpbmcsIHJvb3REaXI6IHN0cmluZyk6IHZvaWQge1xuXHRjb25zdCByZWxhdGl2ZURpciA9IHJlbGF0aXZlKHJvb3REaXIsIGRpcik7XG5cdGNvbnN0IHByZWZpeCA9IHJlbGF0aXZlRGlyID8gYCR7dG9Qb3NpeFBhdGgocmVsYXRpdmVEaXIpfS9gIDogXCJcIjtcblxuXHRmb3IgKGNvbnN0IGZpbGVuYW1lIG9mIElHTk9SRV9GSUxFX05BTUVTKSB7XG5cdFx0Y29uc3QgaWdub3JlUGF0aCA9IGpvaW4oZGlyLCBmaWxlbmFtZSk7XG5cdFx0aWYgKCFleGlzdHNTeW5jKGlnbm9yZVBhdGgpKSBjb250aW51ZTtcblx0XHR0cnkge1xuXHRcdFx0Y29uc3QgY29udGVudCA9IHJlYWRGaWxlU3luYyhpZ25vcmVQYXRoLCBcInV0Zi04XCIpO1xuXHRcdFx0Y29uc3QgcGF0dGVybnMgPSBjb250ZW50XG5cdFx0XHRcdC5zcGxpdCgvXFxyP1xcbi8pXG5cdFx0XHRcdC5tYXAoKGxpbmUpID0+IHByZWZpeElnbm9yZVBhdHRlcm4obGluZSwgcHJlZml4KSlcblx0XHRcdFx0LmZpbHRlcigobGluZSk6IGxpbmUgaXMgc3RyaW5nID0+IEJvb2xlYW4obGluZSkpO1xuXHRcdFx0aWYgKHBhdHRlcm5zLmxlbmd0aCA+IDApIHtcblx0XHRcdFx0aWcuYWRkKHBhdHRlcm5zKTtcblx0XHRcdH1cblx0XHR9IGNhdGNoIHt9XG5cdH1cbn1cblxuZnVuY3Rpb24gaXNQYXR0ZXJuKHM6IHN0cmluZyk6IGJvb2xlYW4ge1xuXHRyZXR1cm4gcy5zdGFydHNXaXRoKFwiIVwiKSB8fCBzLnN0YXJ0c1dpdGgoXCIrXCIpIHx8IHMuc3RhcnRzV2l0aChcIi1cIikgfHwgcy5pbmNsdWRlcyhcIipcIikgfHwgcy5pbmNsdWRlcyhcIj9cIik7XG59XG5cbmZ1bmN0aW9uIGlzT3ZlcnJpZGVQYXR0ZXJuKHM6IHN0cmluZyk6IGJvb2xlYW4ge1xuXHRyZXR1cm4gcy5zdGFydHNXaXRoKFwiIVwiKSB8fCBzLnN0YXJ0c1dpdGgoXCIrXCIpIHx8IHMuc3RhcnRzV2l0aChcIi1cIik7XG59XG5cbmZ1bmN0aW9uIGhhc0dsb2JQYXR0ZXJuKHM6IHN0cmluZyk6IGJvb2xlYW4ge1xuXHRyZXR1cm4gcy5pbmNsdWRlcyhcIipcIikgfHwgcy5pbmNsdWRlcyhcIj9cIik7XG59XG5cbmZ1bmN0aW9uIHNwbGl0UGF0dGVybnMoZW50cmllczogc3RyaW5nW10pOiB7IHBsYWluOiBzdHJpbmdbXTsgcGF0dGVybnM6IHN0cmluZ1tdIH0ge1xuXHRjb25zdCBwbGFpbjogc3RyaW5nW10gPSBbXTtcblx0Y29uc3QgcGF0dGVybnM6IHN0cmluZ1tdID0gW107XG5cdGZvciAoY29uc3QgZW50cnkgb2YgZW50cmllcykge1xuXHRcdGlmIChpc1BhdHRlcm4oZW50cnkpKSB7XG5cdFx0XHRwYXR0ZXJucy5wdXNoKGVudHJ5KTtcblx0XHR9IGVsc2Uge1xuXHRcdFx0cGxhaW4ucHVzaChlbnRyeSk7XG5cdFx0fVxuXHR9XG5cdHJldHVybiB7IHBsYWluLCBwYXR0ZXJucyB9O1xufVxuXG5mdW5jdGlvbiBjb2xsZWN0RmlsZXMoXG5cdGRpcjogc3RyaW5nLFxuXHRmaWxlUGF0dGVybjogUmVnRXhwLFxuXHRza2lwTm9kZU1vZHVsZXMgPSB0cnVlLFxuXHRpZ25vcmVNYXRjaGVyPzogSWdub3JlTWF0Y2hlcixcblx0cm9vdERpcj86IHN0cmluZyxcbik6IHN0cmluZ1tdIHtcblx0Y29uc3QgZmlsZXM6IHN0cmluZ1tdID0gW107XG5cdGlmICghZXhpc3RzU3luYyhkaXIpKSByZXR1cm4gZmlsZXM7XG5cblx0Y29uc3Qgcm9vdCA9IHJvb3REaXIgPz8gZGlyO1xuXHRjb25zdCBpZyA9IGlnbm9yZU1hdGNoZXIgPz8gaWdub3JlKCk7XG5cdGFkZElnbm9yZVJ1bGVzKGlnLCBkaXIsIHJvb3QpO1xuXG5cdHRyeSB7XG5cdFx0Y29uc3QgZW50cmllcyA9IHJlYWRkaXJTeW5jKGRpciwgeyB3aXRoRmlsZVR5cGVzOiB0cnVlIH0pO1xuXHRcdGZvciAoY29uc3QgZW50cnkgb2YgZW50cmllcykge1xuXHRcdFx0aWYgKGVudHJ5Lm5hbWUuc3RhcnRzV2l0aChcIi5cIikpIGNvbnRpbnVlO1xuXHRcdFx0aWYgKHNraXBOb2RlTW9kdWxlcyAmJiBlbnRyeS5uYW1lID09PSBcIm5vZGVfbW9kdWxlc1wiKSBjb250aW51ZTtcblxuXHRcdFx0Y29uc3QgZnVsbFBhdGggPSBqb2luKGRpciwgZW50cnkubmFtZSk7XG5cdFx0XHRsZXQgaXNEaXIgPSBlbnRyeS5pc0RpcmVjdG9yeSgpO1xuXHRcdFx0bGV0IGlzRmlsZSA9IGVudHJ5LmlzRmlsZSgpO1xuXG5cdFx0XHRpZiAoZW50cnkuaXNTeW1ib2xpY0xpbmsoKSkge1xuXHRcdFx0XHR0cnkge1xuXHRcdFx0XHRcdGNvbnN0IHN0YXRzID0gc3RhdFN5bmMoZnVsbFBhdGgpO1xuXHRcdFx0XHRcdGlzRGlyID0gc3RhdHMuaXNEaXJlY3RvcnkoKTtcblx0XHRcdFx0XHRpc0ZpbGUgPSBzdGF0cy5pc0ZpbGUoKTtcblx0XHRcdFx0fSBjYXRjaCB7XG5cdFx0XHRcdFx0Y29udGludWU7XG5cdFx0XHRcdH1cblx0XHRcdH1cblxuXHRcdFx0Y29uc3QgcmVsUGF0aCA9IHRvUG9zaXhQYXRoKHJlbGF0aXZlKHJvb3QsIGZ1bGxQYXRoKSk7XG5cdFx0XHRjb25zdCBpZ25vcmVQYXRoID0gaXNEaXIgPyBgJHtyZWxQYXRofS9gIDogcmVsUGF0aDtcblx0XHRcdGlmIChpZy5pZ25vcmVzKGlnbm9yZVBhdGgpKSBjb250aW51ZTtcblxuXHRcdFx0aWYgKGlzRGlyKSB7XG5cdFx0XHRcdGZpbGVzLnB1c2goLi4uY29sbGVjdEZpbGVzKGZ1bGxQYXRoLCBmaWxlUGF0dGVybiwgc2tpcE5vZGVNb2R1bGVzLCBpZywgcm9vdCkpO1xuXHRcdFx0fSBlbHNlIGlmIChpc0ZpbGUgJiYgZmlsZVBhdHRlcm4udGVzdChlbnRyeS5uYW1lKSkge1xuXHRcdFx0XHRmaWxlcy5wdXNoKGZ1bGxQYXRoKTtcblx0XHRcdH1cblx0XHR9XG5cdH0gY2F0Y2gge1xuXHRcdC8vIElnbm9yZSBlcnJvcnNcblx0fVxuXG5cdHJldHVybiBmaWxlcztcbn1cblxudHlwZSBTa2lsbERpc2NvdmVyeU1vZGUgPSBcInBpXCIgfCBcImFnZW50c1wiO1xuXG5mdW5jdGlvbiBjb2xsZWN0U2tpbGxFbnRyaWVzKFxuXHRkaXI6IHN0cmluZyxcblx0bW9kZTogU2tpbGxEaXNjb3ZlcnlNb2RlLFxuXHRpZ25vcmVNYXRjaGVyPzogSWdub3JlTWF0Y2hlcixcblx0cm9vdERpcj86IHN0cmluZyxcbik6IHN0cmluZ1tdIHtcblx0Y29uc3QgZW50cmllczogc3RyaW5nW10gPSBbXTtcblx0aWYgKCFleGlzdHNTeW5jKGRpcikpIHJldHVybiBlbnRyaWVzO1xuXG5cdGNvbnN0IHJvb3QgPSByb290RGlyID8/IGRpcjtcblx0Y29uc3QgaWcgPSBpZ25vcmVNYXRjaGVyID8/IGlnbm9yZSgpO1xuXHRhZGRJZ25vcmVSdWxlcyhpZywgZGlyLCByb290KTtcblxuXHR0cnkge1xuXHRcdGNvbnN0IGRpckVudHJpZXMgPSByZWFkZGlyU3luYyhkaXIsIHsgd2l0aEZpbGVUeXBlczogdHJ1ZSB9KTtcblxuXHRcdGZvciAoY29uc3QgZW50cnkgb2YgZGlyRW50cmllcykge1xuXHRcdFx0aWYgKGVudHJ5Lm5hbWUgIT09IFwiU0tJTEwubWRcIikge1xuXHRcdFx0XHRjb250aW51ZTtcblx0XHRcdH1cblxuXHRcdFx0Y29uc3QgZnVsbFBhdGggPSBqb2luKGRpciwgZW50cnkubmFtZSk7XG5cdFx0XHRsZXQgaXNGaWxlID0gZW50cnkuaXNGaWxlKCk7XG5cdFx0XHRpZiAoZW50cnkuaXNTeW1ib2xpY0xpbmsoKSkge1xuXHRcdFx0XHR0cnkge1xuXHRcdFx0XHRcdGlzRmlsZSA9IHN0YXRTeW5jKGZ1bGxQYXRoKS5pc0ZpbGUoKTtcblx0XHRcdFx0fSBjYXRjaCB7XG5cdFx0XHRcdFx0Y29udGludWU7XG5cdFx0XHRcdH1cblx0XHRcdH1cblxuXHRcdFx0Y29uc3QgcmVsUGF0aCA9IHRvUG9zaXhQYXRoKHJlbGF0aXZlKHJvb3QsIGZ1bGxQYXRoKSk7XG5cdFx0XHRpZiAoaXNGaWxlICYmICFpZy5pZ25vcmVzKHJlbFBhdGgpKSB7XG5cdFx0XHRcdGVudHJpZXMucHVzaChmdWxsUGF0aCk7XG5cdFx0XHRcdHJldHVybiBlbnRyaWVzO1xuXHRcdFx0fVxuXHRcdH1cblxuXHRcdGZvciAoY29uc3QgZW50cnkgb2YgZGlyRW50cmllcykge1xuXHRcdFx0aWYgKGVudHJ5Lm5hbWUuc3RhcnRzV2l0aChcIi5cIikpIGNvbnRpbnVlO1xuXHRcdFx0aWYgKGVudHJ5Lm5hbWUgPT09IFwibm9kZV9tb2R1bGVzXCIpIGNvbnRpbnVlO1xuXG5cdFx0XHRjb25zdCBmdWxsUGF0aCA9IGpvaW4oZGlyLCBlbnRyeS5uYW1lKTtcblx0XHRcdGxldCBpc0RpciA9IGVudHJ5LmlzRGlyZWN0b3J5KCk7XG5cdFx0XHRsZXQgaXNGaWxlID0gZW50cnkuaXNGaWxlKCk7XG5cblx0XHRcdGlmIChlbnRyeS5pc1N5bWJvbGljTGluaygpKSB7XG5cdFx0XHRcdHRyeSB7XG5cdFx0XHRcdFx0Y29uc3Qgc3RhdHMgPSBzdGF0U3luYyhmdWxsUGF0aCk7XG5cdFx0XHRcdFx0aXNEaXIgPSBzdGF0cy5pc0RpcmVjdG9yeSgpO1xuXHRcdFx0XHRcdGlzRmlsZSA9IHN0YXRzLmlzRmlsZSgpO1xuXHRcdFx0XHR9IGNhdGNoIHtcblx0XHRcdFx0XHRjb250aW51ZTtcblx0XHRcdFx0fVxuXHRcdFx0fVxuXG5cdFx0XHRjb25zdCByZWxQYXRoID0gdG9Qb3NpeFBhdGgocmVsYXRpdmUocm9vdCwgZnVsbFBhdGgpKTtcblx0XHRcdGlmIChtb2RlID09PSBcInBpXCIgJiYgZGlyID09PSByb290ICYmIGlzRmlsZSAmJiBlbnRyeS5uYW1lLmVuZHNXaXRoKFwiLm1kXCIpICYmICFpZy5pZ25vcmVzKHJlbFBhdGgpKSB7XG5cdFx0XHRcdGVudHJpZXMucHVzaChmdWxsUGF0aCk7XG5cdFx0XHRcdGNvbnRpbnVlO1xuXHRcdFx0fVxuXG5cdFx0XHRpZiAoIWlzRGlyKSBjb250aW51ZTtcblx0XHRcdGlmIChpZy5pZ25vcmVzKGAke3JlbFBhdGh9L2ApKSBjb250aW51ZTtcblxuXHRcdFx0ZW50cmllcy5wdXNoKC4uLmNvbGxlY3RTa2lsbEVudHJpZXMoZnVsbFBhdGgsIG1vZGUsIGlnLCByb290KSk7XG5cdFx0fVxuXHR9IGNhdGNoIHtcblx0XHQvLyBJZ25vcmUgZXJyb3JzXG5cdH1cblxuXHRyZXR1cm4gZW50cmllcztcbn1cblxuZnVuY3Rpb24gY29sbGVjdEF1dG9Ta2lsbEVudHJpZXMoZGlyOiBzdHJpbmcsIG1vZGU6IFNraWxsRGlzY292ZXJ5TW9kZSk6IHN0cmluZ1tdIHtcblx0cmV0dXJuIGNvbGxlY3RTa2lsbEVudHJpZXMoZGlyLCBtb2RlKTtcbn1cblxuZnVuY3Rpb24gZmluZEdpdFJlcG9Sb290KHN0YXJ0RGlyOiBzdHJpbmcpOiBzdHJpbmcgfCBudWxsIHtcblx0bGV0IGRpciA9IHJlc29sdmUoc3RhcnREaXIpO1xuXHR3aGlsZSAodHJ1ZSkge1xuXHRcdGlmIChleGlzdHNTeW5jKGpvaW4oZGlyLCBcIi5naXRcIikpKSB7XG5cdFx0XHRyZXR1cm4gZGlyO1xuXHRcdH1cblx0XHRjb25zdCBwYXJlbnQgPSBkaXJuYW1lKGRpcik7XG5cdFx0aWYgKHBhcmVudCA9PT0gZGlyKSB7XG5cdFx0XHRyZXR1cm4gbnVsbDtcblx0XHR9XG5cdFx0ZGlyID0gcGFyZW50O1xuXHR9XG59XG5cbmZ1bmN0aW9uIGNvbGxlY3RBbmNlc3RvckFnZW50c1NraWxsRGlycyhzdGFydERpcjogc3RyaW5nKTogc3RyaW5nW10ge1xuXHRjb25zdCBza2lsbERpcnM6IHN0cmluZ1tdID0gW107XG5cdGNvbnN0IHJlc29sdmVkU3RhcnREaXIgPSByZXNvbHZlKHN0YXJ0RGlyKTtcblx0Y29uc3QgZ2l0UmVwb1Jvb3QgPSBmaW5kR2l0UmVwb1Jvb3QocmVzb2x2ZWRTdGFydERpcik7XG5cblx0bGV0IGRpciA9IHJlc29sdmVkU3RhcnREaXI7XG5cdHdoaWxlICh0cnVlKSB7XG5cdFx0c2tpbGxEaXJzLnB1c2goam9pbihkaXIsIFwiLmFnZW50c1wiLCBcInNraWxsc1wiKSk7XG5cdFx0aWYgKGdpdFJlcG9Sb290ICYmIGRpciA9PT0gZ2l0UmVwb1Jvb3QpIHtcblx0XHRcdGJyZWFrO1xuXHRcdH1cblx0XHRjb25zdCBwYXJlbnQgPSBkaXJuYW1lKGRpcik7XG5cdFx0aWYgKHBhcmVudCA9PT0gZGlyKSB7XG5cdFx0XHRicmVhaztcblx0XHR9XG5cdFx0ZGlyID0gcGFyZW50O1xuXHR9XG5cblx0cmV0dXJuIHNraWxsRGlycztcbn1cblxuZnVuY3Rpb24gY29sbGVjdEF1dG9Qcm9tcHRFbnRyaWVzKGRpcjogc3RyaW5nKTogc3RyaW5nW10ge1xuXHRjb25zdCBlbnRyaWVzOiBzdHJpbmdbXSA9IFtdO1xuXHRpZiAoIWV4aXN0c1N5bmMoZGlyKSkgcmV0dXJuIGVudHJpZXM7XG5cblx0Y29uc3QgaWcgPSBpZ25vcmUoKTtcblx0YWRkSWdub3JlUnVsZXMoaWcsIGRpciwgZGlyKTtcblxuXHR0cnkge1xuXHRcdGNvbnN0IGRpckVudHJpZXMgPSByZWFkZGlyU3luYyhkaXIsIHsgd2l0aEZpbGVUeXBlczogdHJ1ZSB9KTtcblx0XHRmb3IgKGNvbnN0IGVudHJ5IG9mIGRpckVudHJpZXMpIHtcblx0XHRcdGlmIChlbnRyeS5uYW1lLnN0YXJ0c1dpdGgoXCIuXCIpKSBjb250aW51ZTtcblx0XHRcdGlmIChlbnRyeS5uYW1lID09PSBcIm5vZGVfbW9kdWxlc1wiKSBjb250aW51ZTtcblxuXHRcdFx0Y29uc3QgZnVsbFBhdGggPSBqb2luKGRpciwgZW50cnkubmFtZSk7XG5cdFx0XHRsZXQgaXNGaWxlID0gZW50cnkuaXNGaWxlKCk7XG5cdFx0XHRpZiAoZW50cnkuaXNTeW1ib2xpY0xpbmsoKSkge1xuXHRcdFx0XHR0cnkge1xuXHRcdFx0XHRcdGlzRmlsZSA9IHN0YXRTeW5jKGZ1bGxQYXRoKS5pc0ZpbGUoKTtcblx0XHRcdFx0fSBjYXRjaCB7XG5cdFx0XHRcdFx0Y29udGludWU7XG5cdFx0XHRcdH1cblx0XHRcdH1cblxuXHRcdFx0Y29uc3QgcmVsUGF0aCA9IHRvUG9zaXhQYXRoKHJlbGF0aXZlKGRpciwgZnVsbFBhdGgpKTtcblx0XHRcdGlmIChpZy5pZ25vcmVzKHJlbFBhdGgpKSBjb250aW51ZTtcblxuXHRcdFx0aWYgKGlzRmlsZSAmJiBlbnRyeS5uYW1lLmVuZHNXaXRoKFwiLm1kXCIpKSB7XG5cdFx0XHRcdGVudHJpZXMucHVzaChmdWxsUGF0aCk7XG5cdFx0XHR9XG5cdFx0fVxuXHR9IGNhdGNoIHtcblx0XHQvLyBJZ25vcmUgZXJyb3JzXG5cdH1cblxuXHRyZXR1cm4gZW50cmllcztcbn1cblxuZnVuY3Rpb24gY29sbGVjdEF1dG9UaGVtZUVudHJpZXMoZGlyOiBzdHJpbmcpOiBzdHJpbmdbXSB7XG5cdGNvbnN0IGVudHJpZXM6IHN0cmluZ1tdID0gW107XG5cdGlmICghZXhpc3RzU3luYyhkaXIpKSByZXR1cm4gZW50cmllcztcblxuXHRjb25zdCBpZyA9IGlnbm9yZSgpO1xuXHRhZGRJZ25vcmVSdWxlcyhpZywgZGlyLCBkaXIpO1xuXG5cdHRyeSB7XG5cdFx0Y29uc3QgZGlyRW50cmllcyA9IHJlYWRkaXJTeW5jKGRpciwgeyB3aXRoRmlsZVR5cGVzOiB0cnVlIH0pO1xuXHRcdGZvciAoY29uc3QgZW50cnkgb2YgZGlyRW50cmllcykge1xuXHRcdFx0aWYgKGVudHJ5Lm5hbWUuc3RhcnRzV2l0aChcIi5cIikpIGNvbnRpbnVlO1xuXHRcdFx0aWYgKGVudHJ5Lm5hbWUgPT09IFwibm9kZV9tb2R1bGVzXCIpIGNvbnRpbnVlO1xuXG5cdFx0XHRjb25zdCBmdWxsUGF0aCA9IGpvaW4oZGlyLCBlbnRyeS5uYW1lKTtcblx0XHRcdGxldCBpc0ZpbGUgPSBlbnRyeS5pc0ZpbGUoKTtcblx0XHRcdGlmIChlbnRyeS5pc1N5bWJvbGljTGluaygpKSB7XG5cdFx0XHRcdHRyeSB7XG5cdFx0XHRcdFx0aXNGaWxlID0gc3RhdFN5bmMoZnVsbFBhdGgpLmlzRmlsZSgpO1xuXHRcdFx0XHR9IGNhdGNoIHtcblx0XHRcdFx0XHRjb250aW51ZTtcblx0XHRcdFx0fVxuXHRcdFx0fVxuXG5cdFx0XHRjb25zdCByZWxQYXRoID0gdG9Qb3NpeFBhdGgocmVsYXRpdmUoZGlyLCBmdWxsUGF0aCkpO1xuXHRcdFx0aWYgKGlnLmlnbm9yZXMocmVsUGF0aCkpIGNvbnRpbnVlO1xuXG5cdFx0XHRpZiAoaXNGaWxlICYmIGVudHJ5Lm5hbWUuZW5kc1dpdGgoXCIuanNvblwiKSkge1xuXHRcdFx0XHRlbnRyaWVzLnB1c2goZnVsbFBhdGgpO1xuXHRcdFx0fVxuXHRcdH1cblx0fSBjYXRjaCB7XG5cdFx0Ly8gSWdub3JlIGVycm9yc1xuXHR9XG5cblx0cmV0dXJuIGVudHJpZXM7XG59XG5cbmZ1bmN0aW9uIHJlYWRQaU1hbmlmZXN0RmlsZShwYWNrYWdlSnNvblBhdGg6IHN0cmluZyk6IFBpTWFuaWZlc3QgfCBudWxsIHtcblx0dHJ5IHtcblx0XHRjb25zdCBjb250ZW50ID0gcmVhZEZpbGVTeW5jKHBhY2thZ2VKc29uUGF0aCwgXCJ1dGYtOFwiKTtcblx0XHRjb25zdCBwa2cgPSBKU09OLnBhcnNlKGNvbnRlbnQpIGFzIHsgcGk/OiBQaU1hbmlmZXN0IH07XG5cdFx0cmV0dXJuIHBrZy5waSA/PyBudWxsO1xuXHR9IGNhdGNoIHtcblx0XHRyZXR1cm4gbnVsbDtcblx0fVxufVxuXG5mdW5jdGlvbiByZXNvbHZlRXh0ZW5zaW9uRW50cmllcyhkaXI6IHN0cmluZyk6IHN0cmluZ1tdIHwgbnVsbCB7XG5cdGNvbnN0IHBhY2thZ2VKc29uUGF0aCA9IGpvaW4oZGlyLCBcInBhY2thZ2UuanNvblwiKTtcblx0aWYgKGV4aXN0c1N5bmMocGFja2FnZUpzb25QYXRoKSkge1xuXHRcdGNvbnN0IG1hbmlmZXN0ID0gcmVhZFBpTWFuaWZlc3RGaWxlKHBhY2thZ2VKc29uUGF0aCk7XG5cdFx0aWYgKG1hbmlmZXN0Py5leHRlbnNpb25zPy5sZW5ndGgpIHtcblx0XHRcdGNvbnN0IGVudHJpZXM6IHN0cmluZ1tdID0gW107XG5cdFx0XHRmb3IgKGNvbnN0IGV4dFBhdGggb2YgbWFuaWZlc3QuZXh0ZW5zaW9ucykge1xuXHRcdFx0XHRjb25zdCByZXNvbHZlZEV4dFBhdGggPSByZXNvbHZlKGRpciwgZXh0UGF0aCk7XG5cdFx0XHRcdGlmIChleGlzdHNTeW5jKHJlc29sdmVkRXh0UGF0aCkpIHtcblx0XHRcdFx0XHRlbnRyaWVzLnB1c2gocmVzb2x2ZWRFeHRQYXRoKTtcblx0XHRcdFx0fVxuXHRcdFx0fVxuXHRcdFx0aWYgKGVudHJpZXMubGVuZ3RoID4gMCkge1xuXHRcdFx0XHRyZXR1cm4gZW50cmllcztcblx0XHRcdH1cblx0XHR9XG5cdH1cblxuXHRjb25zdCBpbmRleFRzID0gam9pbihkaXIsIFwiaW5kZXgudHNcIik7XG5cdGNvbnN0IGluZGV4SnMgPSBqb2luKGRpciwgXCJpbmRleC5qc1wiKTtcblx0aWYgKGV4aXN0c1N5bmMoaW5kZXhUcykpIHtcblx0XHRyZXR1cm4gW2luZGV4VHNdO1xuXHR9XG5cdGlmIChleGlzdHNTeW5jKGluZGV4SnMpKSB7XG5cdFx0cmV0dXJuIFtpbmRleEpzXTtcblx0fVxuXG5cdHJldHVybiBudWxsO1xufVxuXG5mdW5jdGlvbiBjb2xsZWN0QXV0b0V4dGVuc2lvbkVudHJpZXMoZGlyOiBzdHJpbmcpOiBzdHJpbmdbXSB7XG5cdGNvbnN0IGVudHJpZXM6IHN0cmluZ1tdID0gW107XG5cdGlmICghZXhpc3RzU3luYyhkaXIpKSByZXR1cm4gZW50cmllcztcblxuXHQvLyBGaXJzdCBjaGVjayBpZiB0aGlzIGRpcmVjdG9yeSBpdHNlbGYgaGFzIGV4cGxpY2l0IGV4dGVuc2lvbiBlbnRyaWVzIChwYWNrYWdlLmpzb24gb3IgaW5kZXgpXG5cdGNvbnN0IHJvb3RFbnRyaWVzID0gcmVzb2x2ZUV4dGVuc2lvbkVudHJpZXMoZGlyKTtcblx0aWYgKHJvb3RFbnRyaWVzKSB7XG5cdFx0cmV0dXJuIHJvb3RFbnRyaWVzO1xuXHR9XG5cblx0Ly8gT3RoZXJ3aXNlLCBkaXNjb3ZlciBleHRlbnNpb25zIGZyb20gZGlyZWN0b3J5IGNvbnRlbnRzXG5cdGNvbnN0IGlnID0gaWdub3JlKCk7XG5cdGFkZElnbm9yZVJ1bGVzKGlnLCBkaXIsIGRpcik7XG5cblx0dHJ5IHtcblx0XHRjb25zdCBkaXJFbnRyaWVzID0gcmVhZGRpclN5bmMoZGlyLCB7IHdpdGhGaWxlVHlwZXM6IHRydWUgfSk7XG5cdFx0Zm9yIChjb25zdCBlbnRyeSBvZiBkaXJFbnRyaWVzKSB7XG5cdFx0XHRpZiAoZW50cnkubmFtZS5zdGFydHNXaXRoKFwiLlwiKSkgY29udGludWU7XG5cdFx0XHRpZiAoZW50cnkubmFtZSA9PT0gXCJub2RlX21vZHVsZXNcIikgY29udGludWU7XG5cblx0XHRcdGNvbnN0IGZ1bGxQYXRoID0gam9pbihkaXIsIGVudHJ5Lm5hbWUpO1xuXHRcdFx0bGV0IGlzRGlyID0gZW50cnkuaXNEaXJlY3RvcnkoKTtcblx0XHRcdGxldCBpc0ZpbGUgPSBlbnRyeS5pc0ZpbGUoKTtcblxuXHRcdFx0aWYgKGVudHJ5LmlzU3ltYm9saWNMaW5rKCkpIHtcblx0XHRcdFx0dHJ5IHtcblx0XHRcdFx0XHRjb25zdCBzdGF0cyA9IHN0YXRTeW5jKGZ1bGxQYXRoKTtcblx0XHRcdFx0XHRpc0RpciA9IHN0YXRzLmlzRGlyZWN0b3J5KCk7XG5cdFx0XHRcdFx0aXNGaWxlID0gc3RhdHMuaXNGaWxlKCk7XG5cdFx0XHRcdH0gY2F0Y2gge1xuXHRcdFx0XHRcdGNvbnRpbnVlO1xuXHRcdFx0XHR9XG5cdFx0XHR9XG5cblx0XHRcdGNvbnN0IHJlbFBhdGggPSB0b1Bvc2l4UGF0aChyZWxhdGl2ZShkaXIsIGZ1bGxQYXRoKSk7XG5cdFx0XHRjb25zdCBpZ25vcmVQYXRoID0gaXNEaXIgPyBgJHtyZWxQYXRofS9gIDogcmVsUGF0aDtcblx0XHRcdGlmIChpZy5pZ25vcmVzKGlnbm9yZVBhdGgpKSBjb250aW51ZTtcblxuXHRcdFx0aWYgKGlzRmlsZSAmJiAoZW50cnkubmFtZS5lbmRzV2l0aChcIi50c1wiKSB8fCBlbnRyeS5uYW1lLmVuZHNXaXRoKFwiLmpzXCIpKSkge1xuXHRcdFx0XHRlbnRyaWVzLnB1c2goZnVsbFBhdGgpO1xuXHRcdFx0fSBlbHNlIGlmIChpc0Rpcikge1xuXHRcdFx0XHRjb25zdCByZXNvbHZlZEVudHJpZXMgPSByZXNvbHZlRXh0ZW5zaW9uRW50cmllcyhmdWxsUGF0aCk7XG5cdFx0XHRcdGlmIChyZXNvbHZlZEVudHJpZXMpIHtcblx0XHRcdFx0XHRlbnRyaWVzLnB1c2goLi4ucmVzb2x2ZWRFbnRyaWVzKTtcblx0XHRcdFx0fVxuXHRcdFx0fVxuXHRcdH1cblx0fSBjYXRjaCB7XG5cdFx0Ly8gSWdub3JlIGVycm9yc1xuXHR9XG5cblx0cmV0dXJuIGVudHJpZXM7XG59XG5cbi8qKlxuICogQ29sbGVjdCByZXNvdXJjZSBmaWxlcyBmcm9tIGEgZGlyZWN0b3J5IGJhc2VkIG9uIHJlc291cmNlIHR5cGUuXG4gKiBFeHRlbnNpb25zIHVzZSBzbWFydCBkaXNjb3ZlcnkgKGluZGV4LnRzIGluIHN1YmRpcnMpLCBvdGhlcnMgdXNlIHJlY3Vyc2l2ZSBjb2xsZWN0aW9uLlxuICovXG5mdW5jdGlvbiBjb2xsZWN0UmVzb3VyY2VGaWxlcyhkaXI6IHN0cmluZywgcmVzb3VyY2VUeXBlOiBSZXNvdXJjZVR5cGUpOiBzdHJpbmdbXSB7XG5cdGlmIChyZXNvdXJjZVR5cGUgPT09IFwic2tpbGxzXCIpIHtcblx0XHRyZXR1cm4gY29sbGVjdFNraWxsRW50cmllcyhkaXIsIFwicGlcIik7XG5cdH1cblx0aWYgKHJlc291cmNlVHlwZSA9PT0gXCJleHRlbnNpb25zXCIpIHtcblx0XHRyZXR1cm4gY29sbGVjdEF1dG9FeHRlbnNpb25FbnRyaWVzKGRpcik7XG5cdH1cblx0cmV0dXJuIGNvbGxlY3RGaWxlcyhkaXIsIEZJTEVfUEFUVEVSTlNbcmVzb3VyY2VUeXBlXSk7XG59XG5cbmZ1bmN0aW9uIG1hdGNoZXNBbnlQYXR0ZXJuKGZpbGVQYXRoOiBzdHJpbmcsIHBhdHRlcm5zOiBzdHJpbmdbXSwgYmFzZURpcjogc3RyaW5nKTogYm9vbGVhbiB7XG5cdGNvbnN0IHJlbCA9IHRvUG9zaXhQYXRoKHJlbGF0aXZlKGJhc2VEaXIsIGZpbGVQYXRoKSk7XG5cdGNvbnN0IG5hbWUgPSBiYXNlbmFtZShmaWxlUGF0aCk7XG5cdGNvbnN0IGZpbGVQYXRoUG9zaXggPSB0b1Bvc2l4UGF0aChmaWxlUGF0aCk7XG5cdGNvbnN0IGlzU2tpbGxGaWxlID0gbmFtZSA9PT0gXCJTS0lMTC5tZFwiO1xuXHRjb25zdCBwYXJlbnREaXIgPSBpc1NraWxsRmlsZSA/IGRpcm5hbWUoZmlsZVBhdGgpIDogdW5kZWZpbmVkO1xuXHRjb25zdCBwYXJlbnRSZWwgPSBpc1NraWxsRmlsZSA/IHRvUG9zaXhQYXRoKHJlbGF0aXZlKGJhc2VEaXIsIHBhcmVudERpciEpKSA6IHVuZGVmaW5lZDtcblx0Y29uc3QgcGFyZW50TmFtZSA9IGlzU2tpbGxGaWxlID8gYmFzZW5hbWUocGFyZW50RGlyISkgOiB1bmRlZmluZWQ7XG5cdGNvbnN0IHBhcmVudERpclBvc2l4ID0gaXNTa2lsbEZpbGUgPyB0b1Bvc2l4UGF0aChwYXJlbnREaXIhKSA6IHVuZGVmaW5lZDtcblxuXHRyZXR1cm4gcGF0dGVybnMuc29tZSgocGF0dGVybikgPT4ge1xuXHRcdGNvbnN0IG5vcm1hbGl6ZWRQYXR0ZXJuID0gdG9Qb3NpeFBhdGgocGF0dGVybik7XG5cdFx0aWYgKFxuXHRcdFx0bWluaW1hdGNoKHJlbCwgbm9ybWFsaXplZFBhdHRlcm4pIHx8XG5cdFx0XHRtaW5pbWF0Y2gobmFtZSwgbm9ybWFsaXplZFBhdHRlcm4pIHx8XG5cdFx0XHRtaW5pbWF0Y2goZmlsZVBhdGhQb3NpeCwgbm9ybWFsaXplZFBhdHRlcm4pXG5cdFx0KSB7XG5cdFx0XHRyZXR1cm4gdHJ1ZTtcblx0XHR9XG5cdFx0aWYgKCFpc1NraWxsRmlsZSkgcmV0dXJuIGZhbHNlO1xuXHRcdHJldHVybiAoXG5cdFx0XHRtaW5pbWF0Y2gocGFyZW50UmVsISwgbm9ybWFsaXplZFBhdHRlcm4pIHx8XG5cdFx0XHRtaW5pbWF0Y2gocGFyZW50TmFtZSEsIG5vcm1hbGl6ZWRQYXR0ZXJuKSB8fFxuXHRcdFx0bWluaW1hdGNoKHBhcmVudERpclBvc2l4ISwgbm9ybWFsaXplZFBhdHRlcm4pXG5cdFx0KTtcblx0fSk7XG59XG5cbmZ1bmN0aW9uIG5vcm1hbGl6ZUV4YWN0UGF0dGVybihwYXR0ZXJuOiBzdHJpbmcpOiBzdHJpbmcge1xuXHRjb25zdCBub3JtYWxpemVkID0gcGF0dGVybi5zdGFydHNXaXRoKFwiLi9cIikgfHwgcGF0dGVybi5zdGFydHNXaXRoKFwiLlxcXFxcIikgPyBwYXR0ZXJuLnNsaWNlKDIpIDogcGF0dGVybjtcblx0cmV0dXJuIHRvUG9zaXhQYXRoKG5vcm1hbGl6ZWQpO1xufVxuXG5mdW5jdGlvbiBtYXRjaGVzQW55RXhhY3RQYXR0ZXJuKGZpbGVQYXRoOiBzdHJpbmcsIHBhdHRlcm5zOiBzdHJpbmdbXSwgYmFzZURpcjogc3RyaW5nKTogYm9vbGVhbiB7XG5cdGlmIChwYXR0ZXJucy5sZW5ndGggPT09IDApIHJldHVybiBmYWxzZTtcblx0Y29uc3QgcmVsID0gdG9Qb3NpeFBhdGgocmVsYXRpdmUoYmFzZURpciwgZmlsZVBhdGgpKTtcblx0Y29uc3QgbmFtZSA9IGJhc2VuYW1lKGZpbGVQYXRoKTtcblx0Y29uc3QgZmlsZVBhdGhQb3NpeCA9IHRvUG9zaXhQYXRoKGZpbGVQYXRoKTtcblx0Y29uc3QgaXNTa2lsbEZpbGUgPSBuYW1lID09PSBcIlNLSUxMLm1kXCI7XG5cdGNvbnN0IHBhcmVudERpciA9IGlzU2tpbGxGaWxlID8gZGlybmFtZShmaWxlUGF0aCkgOiB1bmRlZmluZWQ7XG5cdGNvbnN0IHBhcmVudFJlbCA9IGlzU2tpbGxGaWxlID8gdG9Qb3NpeFBhdGgocmVsYXRpdmUoYmFzZURpciwgcGFyZW50RGlyISkpIDogdW5kZWZpbmVkO1xuXHRjb25zdCBwYXJlbnREaXJQb3NpeCA9IGlzU2tpbGxGaWxlID8gdG9Qb3NpeFBhdGgocGFyZW50RGlyISkgOiB1bmRlZmluZWQ7XG5cblx0cmV0dXJuIHBhdHRlcm5zLnNvbWUoKHBhdHRlcm4pID0+IHtcblx0XHRjb25zdCBub3JtYWxpemVkID0gbm9ybWFsaXplRXhhY3RQYXR0ZXJuKHBhdHRlcm4pO1xuXHRcdGlmIChub3JtYWxpemVkID09PSByZWwgfHwgbm9ybWFsaXplZCA9PT0gZmlsZVBhdGhQb3NpeCkge1xuXHRcdFx0cmV0dXJuIHRydWU7XG5cdFx0fVxuXHRcdGlmICghaXNTa2lsbEZpbGUpIHJldHVybiBmYWxzZTtcblx0XHRyZXR1cm4gbm9ybWFsaXplZCA9PT0gcGFyZW50UmVsIHx8IG5vcm1hbGl6ZWQgPT09IHBhcmVudERpclBvc2l4O1xuXHR9KTtcbn1cblxuZnVuY3Rpb24gZ2V0T3ZlcnJpZGVQYXR0ZXJucyhlbnRyaWVzOiBzdHJpbmdbXSk6IHN0cmluZ1tdIHtcblx0cmV0dXJuIGVudHJpZXMuZmlsdGVyKChwYXR0ZXJuKSA9PiBwYXR0ZXJuLnN0YXJ0c1dpdGgoXCIhXCIpIHx8IHBhdHRlcm4uc3RhcnRzV2l0aChcIitcIikgfHwgcGF0dGVybi5zdGFydHNXaXRoKFwiLVwiKSk7XG59XG5cbmZ1bmN0aW9uIGlzRW5hYmxlZEJ5T3ZlcnJpZGVzKGZpbGVQYXRoOiBzdHJpbmcsIHBhdHRlcm5zOiBzdHJpbmdbXSwgYmFzZURpcjogc3RyaW5nKTogYm9vbGVhbiB7XG5cdGNvbnN0IG92ZXJyaWRlcyA9IGdldE92ZXJyaWRlUGF0dGVybnMocGF0dGVybnMpO1xuXHRjb25zdCBleGNsdWRlcyA9IG92ZXJyaWRlcy5maWx0ZXIoKHBhdHRlcm4pID0+IHBhdHRlcm4uc3RhcnRzV2l0aChcIiFcIikpLm1hcCgocGF0dGVybikgPT4gcGF0dGVybi5zbGljZSgxKSk7XG5cdGNvbnN0IGZvcmNlSW5jbHVkZXMgPSBvdmVycmlkZXMuZmlsdGVyKChwYXR0ZXJuKSA9PiBwYXR0ZXJuLnN0YXJ0c1dpdGgoXCIrXCIpKS5tYXAoKHBhdHRlcm4pID0+IHBhdHRlcm4uc2xpY2UoMSkpO1xuXHRjb25zdCBmb3JjZUV4Y2x1ZGVzID0gb3ZlcnJpZGVzLmZpbHRlcigocGF0dGVybikgPT4gcGF0dGVybi5zdGFydHNXaXRoKFwiLVwiKSkubWFwKChwYXR0ZXJuKSA9PiBwYXR0ZXJuLnNsaWNlKDEpKTtcblxuXHRsZXQgZW5hYmxlZCA9IHRydWU7XG5cdGlmIChleGNsdWRlcy5sZW5ndGggPiAwICYmIG1hdGNoZXNBbnlQYXR0ZXJuKGZpbGVQYXRoLCBleGNsdWRlcywgYmFzZURpcikpIHtcblx0XHRlbmFibGVkID0gZmFsc2U7XG5cdH1cblx0aWYgKGZvcmNlSW5jbHVkZXMubGVuZ3RoID4gMCAmJiBtYXRjaGVzQW55RXhhY3RQYXR0ZXJuKGZpbGVQYXRoLCBmb3JjZUluY2x1ZGVzLCBiYXNlRGlyKSkge1xuXHRcdGVuYWJsZWQgPSB0cnVlO1xuXHR9XG5cdGlmIChmb3JjZUV4Y2x1ZGVzLmxlbmd0aCA+IDAgJiYgbWF0Y2hlc0FueUV4YWN0UGF0dGVybihmaWxlUGF0aCwgZm9yY2VFeGNsdWRlcywgYmFzZURpcikpIHtcblx0XHRlbmFibGVkID0gZmFsc2U7XG5cdH1cblx0cmV0dXJuIGVuYWJsZWQ7XG59XG5cbi8qKlxuICogQXBwbHkgcGF0dGVybnMgdG8gcGF0aHMgYW5kIHJldHVybiBhIFNldCBvZiBlbmFibGVkIHBhdGhzLlxuICogUGF0dGVybiB0eXBlczpcbiAqIC0gUGxhaW4gcGF0dGVybnM6IGluY2x1ZGUgbWF0Y2hpbmcgcGF0aHNcbiAqIC0gYCFwYXR0ZXJuYDogZXhjbHVkZSBtYXRjaGluZyBwYXRoc1xuICogLSBgK3BhdGhgOiBmb3JjZS1pbmNsdWRlIGV4YWN0IHBhdGggKG92ZXJyaWRlcyBleGNsdXNpb25zKVxuICogLSBgLXBhdGhgOiBmb3JjZS1leGNsdWRlIGV4YWN0IHBhdGggKG92ZXJyaWRlcyBmb3JjZS1pbmNsdWRlcylcbiAqL1xuZnVuY3Rpb24gYXBwbHlQYXR0ZXJucyhhbGxQYXRoczogc3RyaW5nW10sIHBhdHRlcm5zOiBzdHJpbmdbXSwgYmFzZURpcjogc3RyaW5nKTogU2V0PHN0cmluZz4ge1xuXHRjb25zdCBpbmNsdWRlczogc3RyaW5nW10gPSBbXTtcblx0Y29uc3QgZXhjbHVkZXM6IHN0cmluZ1tdID0gW107XG5cdGNvbnN0IGZvcmNlSW5jbHVkZXM6IHN0cmluZ1tdID0gW107XG5cdGNvbnN0IGZvcmNlRXhjbHVkZXM6IHN0cmluZ1tdID0gW107XG5cblx0Zm9yIChjb25zdCBwIG9mIHBhdHRlcm5zKSB7XG5cdFx0aWYgKHAuc3RhcnRzV2l0aChcIitcIikpIHtcblx0XHRcdGZvcmNlSW5jbHVkZXMucHVzaChwLnNsaWNlKDEpKTtcblx0XHR9IGVsc2UgaWYgKHAuc3RhcnRzV2l0aChcIi1cIikpIHtcblx0XHRcdGZvcmNlRXhjbHVkZXMucHVzaChwLnNsaWNlKDEpKTtcblx0XHR9IGVsc2UgaWYgKHAuc3RhcnRzV2l0aChcIiFcIikpIHtcblx0XHRcdGV4Y2x1ZGVzLnB1c2gocC5zbGljZSgxKSk7XG5cdFx0fSBlbHNlIHtcblx0XHRcdGluY2x1ZGVzLnB1c2gocCk7XG5cdFx0fVxuXHR9XG5cblx0Ly8gU3RlcCAxOiBBcHBseSBpbmNsdWRlcyAob3IgYWxsIGlmIG5vIGluY2x1ZGVzKVxuXHRsZXQgcmVzdWx0OiBzdHJpbmdbXTtcblx0aWYgKGluY2x1ZGVzLmxlbmd0aCA9PT0gMCkge1xuXHRcdHJlc3VsdCA9IFsuLi5hbGxQYXRoc107XG5cdH0gZWxzZSB7XG5cdFx0cmVzdWx0ID0gYWxsUGF0aHMuZmlsdGVyKChmaWxlUGF0aCkgPT4gbWF0Y2hlc0FueVBhdHRlcm4oZmlsZVBhdGgsIGluY2x1ZGVzLCBiYXNlRGlyKSk7XG5cdH1cblxuXHQvLyBTdGVwIDI6IEFwcGx5IGV4Y2x1ZGVzXG5cdGlmIChleGNsdWRlcy5sZW5ndGggPiAwKSB7XG5cdFx0cmVzdWx0ID0gcmVzdWx0LmZpbHRlcigoZmlsZVBhdGgpID0+ICFtYXRjaGVzQW55UGF0dGVybihmaWxlUGF0aCwgZXhjbHVkZXMsIGJhc2VEaXIpKTtcblx0fVxuXG5cdC8vIFN0ZXAgMzogRm9yY2UtaW5jbHVkZSAoYWRkIGJhY2sgZnJvbSBhbGxQYXRocywgb3ZlcnJpZGluZyBleGNsdXNpb25zKVxuXHRpZiAoZm9yY2VJbmNsdWRlcy5sZW5ndGggPiAwKSB7XG5cdFx0Zm9yIChjb25zdCBmaWxlUGF0aCBvZiBhbGxQYXRocykge1xuXHRcdFx0aWYgKCFyZXN1bHQuaW5jbHVkZXMoZmlsZVBhdGgpICYmIG1hdGNoZXNBbnlFeGFjdFBhdHRlcm4oZmlsZVBhdGgsIGZvcmNlSW5jbHVkZXMsIGJhc2VEaXIpKSB7XG5cdFx0XHRcdHJlc3VsdC5wdXNoKGZpbGVQYXRoKTtcblx0XHRcdH1cblx0XHR9XG5cdH1cblxuXHQvLyBTdGVwIDQ6IEZvcmNlLWV4Y2x1ZGUgKHJlbW92ZSBldmVuIGlmIGluY2x1ZGVkIG9yIGZvcmNlLWluY2x1ZGVkKVxuXHRpZiAoZm9yY2VFeGNsdWRlcy5sZW5ndGggPiAwKSB7XG5cdFx0cmVzdWx0ID0gcmVzdWx0LmZpbHRlcigoZmlsZVBhdGgpID0+ICFtYXRjaGVzQW55RXhhY3RQYXR0ZXJuKGZpbGVQYXRoLCBmb3JjZUV4Y2x1ZGVzLCBiYXNlRGlyKSk7XG5cdH1cblxuXHRyZXR1cm4gbmV3IFNldChyZXN1bHQpO1xufVxuXG5leHBvcnQgY2xhc3MgRGVmYXVsdFBhY2thZ2VNYW5hZ2VyIGltcGxlbWVudHMgUGFja2FnZU1hbmFnZXIge1xuXHRwcml2YXRlIGN3ZDogc3RyaW5nO1xuXHRwcml2YXRlIGFnZW50RGlyOiBzdHJpbmc7XG5cdHByaXZhdGUgc2V0dGluZ3NNYW5hZ2VyOiBTZXR0aW5nc01hbmFnZXI7XG5cdHByaXZhdGUgZ2xvYmFsTnBtUm9vdDogc3RyaW5nIHwgdW5kZWZpbmVkO1xuXHRwcml2YXRlIGdsb2JhbE5wbVJvb3RDb21tYW5kS2V5OiBzdHJpbmcgfCB1bmRlZmluZWQ7XG5cdHByaXZhdGUgcHJvZ3Jlc3NDYWxsYmFjazogUHJvZ3Jlc3NDYWxsYmFjayB8IHVuZGVmaW5lZDtcblxuXHRjb25zdHJ1Y3RvcihvcHRpb25zOiBQYWNrYWdlTWFuYWdlck9wdGlvbnMpIHtcblx0XHR0aGlzLmN3ZCA9IG9wdGlvbnMuY3dkO1xuXHRcdHRoaXMuYWdlbnREaXIgPSBvcHRpb25zLmFnZW50RGlyO1xuXHRcdHRoaXMuc2V0dGluZ3NNYW5hZ2VyID0gb3B0aW9ucy5zZXR0aW5nc01hbmFnZXI7XG5cdH1cblxuXHRzZXRQcm9ncmVzc0NhbGxiYWNrKGNhbGxiYWNrOiBQcm9ncmVzc0NhbGxiYWNrIHwgdW5kZWZpbmVkKTogdm9pZCB7XG5cdFx0dGhpcy5wcm9ncmVzc0NhbGxiYWNrID0gY2FsbGJhY2s7XG5cdH1cblxuXHRhZGRTb3VyY2VUb1NldHRpbmdzKHNvdXJjZTogc3RyaW5nLCBvcHRpb25zPzogeyBsb2NhbD86IGJvb2xlYW4gfSk6IGJvb2xlYW4ge1xuXHRcdGNvbnN0IHNjb3BlOiBTb3VyY2VTY29wZSA9IG9wdGlvbnM/LmxvY2FsID8gXCJwcm9qZWN0XCIgOiBcInVzZXJcIjtcblx0XHRjb25zdCBjdXJyZW50U2V0dGluZ3MgPVxuXHRcdFx0c2NvcGUgPT09IFwicHJvamVjdFwiID8gdGhpcy5zZXR0aW5nc01hbmFnZXIuZ2V0UHJvamVjdFNldHRpbmdzKCkgOiB0aGlzLnNldHRpbmdzTWFuYWdlci5nZXRHbG9iYWxTZXR0aW5ncygpO1xuXHRcdGNvbnN0IGN1cnJlbnRQYWNrYWdlcyA9IGN1cnJlbnRTZXR0aW5ncy5wYWNrYWdlcyA/PyBbXTtcblx0XHRjb25zdCBub3JtYWxpemVkU291cmNlID0gdGhpcy5ub3JtYWxpemVQYWNrYWdlU291cmNlRm9yU2V0dGluZ3Moc291cmNlLCBzY29wZSk7XG5cdFx0Y29uc3QgZXhpc3RzID0gY3VycmVudFBhY2thZ2VzLnNvbWUoKGV4aXN0aW5nKSA9PiB0aGlzLnBhY2thZ2VTb3VyY2VzTWF0Y2goZXhpc3RpbmcsIHNvdXJjZSwgc2NvcGUpKTtcblx0XHRpZiAoZXhpc3RzKSB7XG5cdFx0XHRyZXR1cm4gZmFsc2U7XG5cdFx0fVxuXHRcdGNvbnN0IG5leHRQYWNrYWdlcyA9IFsuLi5jdXJyZW50UGFja2FnZXMsIG5vcm1hbGl6ZWRTb3VyY2VdO1xuXHRcdGlmIChzY29wZSA9PT0gXCJwcm9qZWN0XCIpIHtcblx0XHRcdHRoaXMuc2V0dGluZ3NNYW5hZ2VyLnNldFByb2plY3RQYWNrYWdlcyhuZXh0UGFja2FnZXMpO1xuXHRcdH0gZWxzZSB7XG5cdFx0XHR0aGlzLnNldHRpbmdzTWFuYWdlci5zZXRQYWNrYWdlcyhuZXh0UGFja2FnZXMpO1xuXHRcdH1cblx0XHRyZXR1cm4gdHJ1ZTtcblx0fVxuXG5cdHJlbW92ZVNvdXJjZUZyb21TZXR0aW5ncyhzb3VyY2U6IHN0cmluZywgb3B0aW9ucz86IHsgbG9jYWw/OiBib29sZWFuIH0pOiBib29sZWFuIHtcblx0XHRjb25zdCBzY29wZTogU291cmNlU2NvcGUgPSBvcHRpb25zPy5sb2NhbCA/IFwicHJvamVjdFwiIDogXCJ1c2VyXCI7XG5cdFx0Y29uc3QgY3VycmVudFNldHRpbmdzID1cblx0XHRcdHNjb3BlID09PSBcInByb2plY3RcIiA/IHRoaXMuc2V0dGluZ3NNYW5hZ2VyLmdldFByb2plY3RTZXR0aW5ncygpIDogdGhpcy5zZXR0aW5nc01hbmFnZXIuZ2V0R2xvYmFsU2V0dGluZ3MoKTtcblx0XHRjb25zdCBjdXJyZW50UGFja2FnZXMgPSBjdXJyZW50U2V0dGluZ3MucGFja2FnZXMgPz8gW107XG5cdFx0Y29uc3QgbmV4dFBhY2thZ2VzID0gY3VycmVudFBhY2thZ2VzLmZpbHRlcigoZXhpc3RpbmcpID0+ICF0aGlzLnBhY2thZ2VTb3VyY2VzTWF0Y2goZXhpc3RpbmcsIHNvdXJjZSwgc2NvcGUpKTtcblx0XHRjb25zdCBjaGFuZ2VkID0gbmV4dFBhY2thZ2VzLmxlbmd0aCAhPT0gY3VycmVudFBhY2thZ2VzLmxlbmd0aDtcblx0XHRpZiAoIWNoYW5nZWQpIHtcblx0XHRcdHJldHVybiBmYWxzZTtcblx0XHR9XG5cdFx0aWYgKHNjb3BlID09PSBcInByb2plY3RcIikge1xuXHRcdFx0dGhpcy5zZXR0aW5nc01hbmFnZXIuc2V0UHJvamVjdFBhY2thZ2VzKG5leHRQYWNrYWdlcyk7XG5cdFx0fSBlbHNlIHtcblx0XHRcdHRoaXMuc2V0dGluZ3NNYW5hZ2VyLnNldFBhY2thZ2VzKG5leHRQYWNrYWdlcyk7XG5cdFx0fVxuXHRcdHJldHVybiB0cnVlO1xuXHR9XG5cblx0Z2V0SW5zdGFsbGVkUGF0aChzb3VyY2U6IHN0cmluZywgc2NvcGU6IFwidXNlclwiIHwgXCJwcm9qZWN0XCIpOiBzdHJpbmcgfCB1bmRlZmluZWQge1xuXHRcdGNvbnN0IHBhcnNlZCA9IHRoaXMucGFyc2VTb3VyY2Uoc291cmNlKTtcblx0XHRpZiAocGFyc2VkLnR5cGUgPT09IFwibnBtXCIpIHtcblx0XHRcdGNvbnN0IHBhdGggPSB0aGlzLmdldE5wbUluc3RhbGxQYXRoKHBhcnNlZCwgc2NvcGUpO1xuXHRcdFx0cmV0dXJuIGV4aXN0c1N5bmMocGF0aCkgPyBwYXRoIDogdW5kZWZpbmVkO1xuXHRcdH1cblx0XHRpZiAocGFyc2VkLnR5cGUgPT09IFwiZ2l0XCIpIHtcblx0XHRcdGNvbnN0IHBhdGggPSB0aGlzLmdldEdpdEluc3RhbGxQYXRoKHBhcnNlZCwgc2NvcGUpO1xuXHRcdFx0cmV0dXJuIGV4aXN0c1N5bmMocGF0aCkgPyBwYXRoIDogdW5kZWZpbmVkO1xuXHRcdH1cblx0XHRpZiAocGFyc2VkLnR5cGUgPT09IFwibG9jYWxcIikge1xuXHRcdFx0Y29uc3QgYmFzZURpciA9IHRoaXMuZ2V0QmFzZURpckZvclNjb3BlKHNjb3BlKTtcblx0XHRcdGNvbnN0IHBhdGggPSB0aGlzLnJlc29sdmVQYXRoRnJvbUJhc2UocGFyc2VkLnBhdGgsIGJhc2VEaXIpO1xuXHRcdFx0cmV0dXJuIGV4aXN0c1N5bmMocGF0aCkgPyBwYXRoIDogdW5kZWZpbmVkO1xuXHRcdH1cblx0XHRyZXR1cm4gdW5kZWZpbmVkO1xuXHR9XG5cblx0cHJpdmF0ZSBlbWl0UHJvZ3Jlc3MoZXZlbnQ6IFByb2dyZXNzRXZlbnQpOiB2b2lkIHtcblx0XHR0aGlzLnByb2dyZXNzQ2FsbGJhY2s/LihldmVudCk7XG5cdH1cblxuXHRwcml2YXRlIGFzeW5jIHdpdGhQcm9ncmVzcyhcblx0XHRhY3Rpb246IFByb2dyZXNzRXZlbnRbXCJhY3Rpb25cIl0sXG5cdFx0c291cmNlOiBzdHJpbmcsXG5cdFx0bWVzc2FnZTogc3RyaW5nLFxuXHRcdG9wZXJhdGlvbjogKCkgPT4gUHJvbWlzZTx2b2lkPixcblx0KTogUHJvbWlzZTx2b2lkPiB7XG5cdFx0dGhpcy5lbWl0UHJvZ3Jlc3MoeyB0eXBlOiBcInN0YXJ0XCIsIGFjdGlvbiwgc291cmNlLCBtZXNzYWdlIH0pO1xuXHRcdHRyeSB7XG5cdFx0XHRhd2FpdCBvcGVyYXRpb24oKTtcblx0XHRcdHRoaXMuZW1pdFByb2dyZXNzKHsgdHlwZTogXCJjb21wbGV0ZVwiLCBhY3Rpb24sIHNvdXJjZSB9KTtcblx0XHR9IGNhdGNoIChlcnJvcikge1xuXHRcdFx0Y29uc3QgZXJyb3JNZXNzYWdlID0gZXJyb3IgaW5zdGFuY2VvZiBFcnJvciA/IGVycm9yLm1lc3NhZ2UgOiBTdHJpbmcoZXJyb3IpO1xuXHRcdFx0dGhpcy5lbWl0UHJvZ3Jlc3MoeyB0eXBlOiBcImVycm9yXCIsIGFjdGlvbiwgc291cmNlLCBtZXNzYWdlOiBlcnJvck1lc3NhZ2UgfSk7XG5cdFx0XHR0aHJvdyBlcnJvcjtcblx0XHR9XG5cdH1cblxuXHRhc3luYyByZXNvbHZlKG9uTWlzc2luZz86IChzb3VyY2U6IHN0cmluZykgPT4gUHJvbWlzZTxNaXNzaW5nU291cmNlQWN0aW9uPik6IFByb21pc2U8UmVzb2x2ZWRQYXRocz4ge1xuXHRcdGNvbnN0IGFjY3VtdWxhdG9yID0gdGhpcy5jcmVhdGVBY2N1bXVsYXRvcigpO1xuXHRcdGNvbnN0IGdsb2JhbFNldHRpbmdzID0gdGhpcy5zZXR0aW5nc01hbmFnZXIuZ2V0R2xvYmFsU2V0dGluZ3MoKTtcblx0XHRjb25zdCBwcm9qZWN0U2V0dGluZ3MgPSB0aGlzLnNldHRpbmdzTWFuYWdlci5nZXRQcm9qZWN0U2V0dGluZ3MoKTtcblxuXHRcdC8vIENvbGxlY3QgYWxsIHBhY2thZ2VzIHdpdGggc2NvcGUgKHByb2plY3QgZmlyc3Qgc28gY3dkIHJlc291cmNlcyB3aW4gY29sbGlzaW9ucylcblx0XHRjb25zdCBhbGxQYWNrYWdlczogQXJyYXk8eyBwa2c6IFBhY2thZ2VTb3VyY2U7IHNjb3BlOiBTb3VyY2VTY29wZSB9PiA9IFtdO1xuXHRcdGZvciAoY29uc3QgcGtnIG9mIHByb2plY3RTZXR0aW5ncy5wYWNrYWdlcyA/PyBbXSkge1xuXHRcdFx0YWxsUGFja2FnZXMucHVzaCh7IHBrZywgc2NvcGU6IFwicHJvamVjdFwiIH0pO1xuXHRcdH1cblx0XHRmb3IgKGNvbnN0IHBrZyBvZiBnbG9iYWxTZXR0aW5ncy5wYWNrYWdlcyA/PyBbXSkge1xuXHRcdFx0YWxsUGFja2FnZXMucHVzaCh7IHBrZywgc2NvcGU6IFwidXNlclwiIH0pO1xuXHRcdH1cblxuXHRcdC8vIERlZHVwZTogcHJvamVjdCBzY29wZSB3aW5zIG92ZXIgZ2xvYmFsIGZvciBzYW1lIHBhY2thZ2UgaWRlbnRpdHlcblx0XHRjb25zdCBwYWNrYWdlU291cmNlcyA9IHRoaXMuZGVkdXBlUGFja2FnZXMoYWxsUGFja2FnZXMpO1xuXHRcdGF3YWl0IHRoaXMucmVzb2x2ZVBhY2thZ2VTb3VyY2VzKHBhY2thZ2VTb3VyY2VzLCBhY2N1bXVsYXRvciwgb25NaXNzaW5nKTtcblxuXHRcdGNvbnN0IGdsb2JhbEJhc2VEaXIgPSB0aGlzLmFnZW50RGlyO1xuXHRcdGNvbnN0IHByb2plY3RCYXNlRGlyID0gam9pbih0aGlzLmN3ZCwgQ09ORklHX0RJUl9OQU1FKTtcblxuXHRcdGZvciAoY29uc3QgcmVzb3VyY2VUeXBlIG9mIFJFU09VUkNFX1RZUEVTKSB7XG5cdFx0XHRjb25zdCB0YXJnZXQgPSB0aGlzLmdldFRhcmdldE1hcChhY2N1bXVsYXRvciwgcmVzb3VyY2VUeXBlKTtcblx0XHRcdGNvbnN0IGdsb2JhbEVudHJpZXMgPSAoZ2xvYmFsU2V0dGluZ3NbcmVzb3VyY2VUeXBlXSA/PyBbXSkgYXMgc3RyaW5nW107XG5cdFx0XHRjb25zdCBwcm9qZWN0RW50cmllcyA9IChwcm9qZWN0U2V0dGluZ3NbcmVzb3VyY2VUeXBlXSA/PyBbXSkgYXMgc3RyaW5nW107XG5cdFx0XHR0aGlzLnJlc29sdmVMb2NhbEVudHJpZXMoXG5cdFx0XHRcdHByb2plY3RFbnRyaWVzLFxuXHRcdFx0XHRyZXNvdXJjZVR5cGUsXG5cdFx0XHRcdHRhcmdldCxcblx0XHRcdFx0e1xuXHRcdFx0XHRcdHNvdXJjZTogXCJsb2NhbFwiLFxuXHRcdFx0XHRcdHNjb3BlOiBcInByb2plY3RcIixcblx0XHRcdFx0XHRvcmlnaW46IFwidG9wLWxldmVsXCIsXG5cdFx0XHRcdH0sXG5cdFx0XHRcdHByb2plY3RCYXNlRGlyLFxuXHRcdFx0KTtcblx0XHRcdHRoaXMucmVzb2x2ZUxvY2FsRW50cmllcyhcblx0XHRcdFx0Z2xvYmFsRW50cmllcyxcblx0XHRcdFx0cmVzb3VyY2VUeXBlLFxuXHRcdFx0XHR0YXJnZXQsXG5cdFx0XHRcdHtcblx0XHRcdFx0XHRzb3VyY2U6IFwibG9jYWxcIixcblx0XHRcdFx0XHRzY29wZTogXCJ1c2VyXCIsXG5cdFx0XHRcdFx0b3JpZ2luOiBcInRvcC1sZXZlbFwiLFxuXHRcdFx0XHR9LFxuXHRcdFx0XHRnbG9iYWxCYXNlRGlyLFxuXHRcdFx0KTtcblx0XHR9XG5cblx0XHR0aGlzLmFkZEF1dG9EaXNjb3ZlcmVkUmVzb3VyY2VzKGFjY3VtdWxhdG9yLCBnbG9iYWxTZXR0aW5ncywgcHJvamVjdFNldHRpbmdzLCBnbG9iYWxCYXNlRGlyLCBwcm9qZWN0QmFzZURpcik7XG5cblx0XHRyZXR1cm4gdGhpcy50b1Jlc29sdmVkUGF0aHMoYWNjdW11bGF0b3IpO1xuXHR9XG5cblx0YXN5bmMgcmVzb2x2ZUV4dGVuc2lvblNvdXJjZXMoXG5cdFx0c291cmNlczogc3RyaW5nW10sXG5cdFx0b3B0aW9ucz86IHsgbG9jYWw/OiBib29sZWFuOyB0ZW1wb3Jhcnk/OiBib29sZWFuIH0sXG5cdCk6IFByb21pc2U8UmVzb2x2ZWRQYXRocz4ge1xuXHRcdGNvbnN0IGFjY3VtdWxhdG9yID0gdGhpcy5jcmVhdGVBY2N1bXVsYXRvcigpO1xuXHRcdGNvbnN0IHNjb3BlOiBTb3VyY2VTY29wZSA9IG9wdGlvbnM/LnRlbXBvcmFyeSA/IFwidGVtcG9yYXJ5XCIgOiBvcHRpb25zPy5sb2NhbCA/IFwicHJvamVjdFwiIDogXCJ1c2VyXCI7XG5cdFx0Y29uc3QgcGFja2FnZVNvdXJjZXMgPSBzb3VyY2VzLm1hcCgoc291cmNlKSA9PiAoeyBwa2c6IHNvdXJjZSBhcyBQYWNrYWdlU291cmNlLCBzY29wZSB9KSk7XG5cdFx0YXdhaXQgdGhpcy5yZXNvbHZlUGFja2FnZVNvdXJjZXMocGFja2FnZVNvdXJjZXMsIGFjY3VtdWxhdG9yKTtcblx0XHRyZXR1cm4gdGhpcy50b1Jlc29sdmVkUGF0aHMoYWNjdW11bGF0b3IpO1xuXHR9XG5cblx0bGlzdENvbmZpZ3VyZWRQYWNrYWdlcygpOiBDb25maWd1cmVkUGFja2FnZVtdIHtcblx0XHRjb25zdCBnbG9iYWxTZXR0aW5ncyA9IHRoaXMuc2V0dGluZ3NNYW5hZ2VyLmdldEdsb2JhbFNldHRpbmdzKCk7XG5cdFx0Y29uc3QgcHJvamVjdFNldHRpbmdzID0gdGhpcy5zZXR0aW5nc01hbmFnZXIuZ2V0UHJvamVjdFNldHRpbmdzKCk7XG5cdFx0Y29uc3QgY29uZmlndXJlZFBhY2thZ2VzOiBDb25maWd1cmVkUGFja2FnZVtdID0gW107XG5cblx0XHRmb3IgKGNvbnN0IHBrZyBvZiBnbG9iYWxTZXR0aW5ncy5wYWNrYWdlcyA/PyBbXSkge1xuXHRcdFx0Y29uc3Qgc291cmNlID0gdHlwZW9mIHBrZyA9PT0gXCJzdHJpbmdcIiA/IHBrZyA6IHBrZy5zb3VyY2U7XG5cdFx0XHRjb25maWd1cmVkUGFja2FnZXMucHVzaCh7XG5cdFx0XHRcdHNvdXJjZSxcblx0XHRcdFx0c2NvcGU6IFwidXNlclwiLFxuXHRcdFx0XHRmaWx0ZXJlZDogdHlwZW9mIHBrZyA9PT0gXCJvYmplY3RcIixcblx0XHRcdFx0aW5zdGFsbGVkUGF0aDogdGhpcy5nZXRJbnN0YWxsZWRQYXRoKHNvdXJjZSwgXCJ1c2VyXCIpLFxuXHRcdFx0fSk7XG5cdFx0fVxuXG5cdFx0Zm9yIChjb25zdCBwa2cgb2YgcHJvamVjdFNldHRpbmdzLnBhY2thZ2VzID8/IFtdKSB7XG5cdFx0XHRjb25zdCBzb3VyY2UgPSB0eXBlb2YgcGtnID09PSBcInN0cmluZ1wiID8gcGtnIDogcGtnLnNvdXJjZTtcblx0XHRcdGNvbmZpZ3VyZWRQYWNrYWdlcy5wdXNoKHtcblx0XHRcdFx0c291cmNlLFxuXHRcdFx0XHRzY29wZTogXCJwcm9qZWN0XCIsXG5cdFx0XHRcdGZpbHRlcmVkOiB0eXBlb2YgcGtnID09PSBcIm9iamVjdFwiLFxuXHRcdFx0XHRpbnN0YWxsZWRQYXRoOiB0aGlzLmdldEluc3RhbGxlZFBhdGgoc291cmNlLCBcInByb2plY3RcIiksXG5cdFx0XHR9KTtcblx0XHR9XG5cblx0XHRyZXR1cm4gY29uZmlndXJlZFBhY2thZ2VzO1xuXHR9XG5cblx0YXN5bmMgaW5zdGFsbChzb3VyY2U6IHN0cmluZywgb3B0aW9ucz86IHsgbG9jYWw/OiBib29sZWFuIH0pOiBQcm9taXNlPHZvaWQ+IHtcblx0XHRjb25zdCBwYXJzZWQgPSB0aGlzLnBhcnNlU291cmNlKHNvdXJjZSk7XG5cdFx0Y29uc3Qgc2NvcGU6IFNvdXJjZVNjb3BlID0gb3B0aW9ucz8ubG9jYWwgPyBcInByb2plY3RcIiA6IFwidXNlclwiO1xuXHRcdGF3YWl0IHRoaXMud2l0aFByb2dyZXNzKFwiaW5zdGFsbFwiLCBzb3VyY2UsIGBJbnN0YWxsaW5nICR7c291cmNlfS4uLmAsIGFzeW5jICgpID0+IHtcblx0XHRcdGlmIChwYXJzZWQudHlwZSA9PT0gXCJucG1cIikge1xuXHRcdFx0XHRhd2FpdCB0aGlzLmluc3RhbGxOcG0ocGFyc2VkLCBzY29wZSwgZmFsc2UpO1xuXHRcdFx0XHRyZXR1cm47XG5cdFx0XHR9XG5cdFx0XHRpZiAocGFyc2VkLnR5cGUgPT09IFwiZ2l0XCIpIHtcblx0XHRcdFx0YXdhaXQgdGhpcy5pbnN0YWxsR2l0KHBhcnNlZCwgc2NvcGUpO1xuXHRcdFx0XHRyZXR1cm47XG5cdFx0XHR9XG5cdFx0XHRpZiAocGFyc2VkLnR5cGUgPT09IFwibG9jYWxcIikge1xuXHRcdFx0XHRjb25zdCByZXNvbHZlZCA9IHRoaXMucmVzb2x2ZVBhdGgocGFyc2VkLnBhdGgpO1xuXHRcdFx0XHRpZiAoIWV4aXN0c1N5bmMocmVzb2x2ZWQpKSB7XG5cdFx0XHRcdFx0dGhyb3cgbmV3IEVycm9yKGBQYXRoIGRvZXMgbm90IGV4aXN0OiAke3Jlc29sdmVkfWApO1xuXHRcdFx0XHR9XG5cdFx0XHRcdHJldHVybjtcblx0XHRcdH1cblx0XHRcdHRocm93IG5ldyBFcnJvcihgVW5zdXBwb3J0ZWQgaW5zdGFsbCBzb3VyY2U6ICR7c291cmNlfWApO1xuXHRcdH0pO1xuXHR9XG5cblx0YXN5bmMgaW5zdGFsbEFuZFBlcnNpc3Qoc291cmNlOiBzdHJpbmcsIG9wdGlvbnM/OiB7IGxvY2FsPzogYm9vbGVhbiB9KTogUHJvbWlzZTx2b2lkPiB7XG5cdFx0YXdhaXQgdGhpcy5pbnN0YWxsKHNvdXJjZSwgb3B0aW9ucyk7XG5cdFx0dGhpcy5hZGRTb3VyY2VUb1NldHRpbmdzKHNvdXJjZSwgb3B0aW9ucyk7XG5cdH1cblxuXHRhc3luYyByZW1vdmUoc291cmNlOiBzdHJpbmcsIG9wdGlvbnM/OiB7IGxvY2FsPzogYm9vbGVhbiB9KTogUHJvbWlzZTx2b2lkPiB7XG5cdFx0Y29uc3QgcGFyc2VkID0gdGhpcy5wYXJzZVNvdXJjZShzb3VyY2UpO1xuXHRcdGNvbnN0IHNjb3BlOiBTb3VyY2VTY29wZSA9IG9wdGlvbnM/LmxvY2FsID8gXCJwcm9qZWN0XCIgOiBcInVzZXJcIjtcblx0XHRhd2FpdCB0aGlzLndpdGhQcm9ncmVzcyhcInJlbW92ZVwiLCBzb3VyY2UsIGBSZW1vdmluZyAke3NvdXJjZX0uLi5gLCBhc3luYyAoKSA9PiB7XG5cdFx0XHRpZiAocGFyc2VkLnR5cGUgPT09IFwibnBtXCIpIHtcblx0XHRcdFx0YXdhaXQgdGhpcy51bmluc3RhbGxOcG0ocGFyc2VkLCBzY29wZSk7XG5cdFx0XHRcdHJldHVybjtcblx0XHRcdH1cblx0XHRcdGlmIChwYXJzZWQudHlwZSA9PT0gXCJnaXRcIikge1xuXHRcdFx0XHRhd2FpdCB0aGlzLnJlbW92ZUdpdChwYXJzZWQsIHNjb3BlKTtcblx0XHRcdFx0cmV0dXJuO1xuXHRcdFx0fVxuXHRcdFx0aWYgKHBhcnNlZC50eXBlID09PSBcImxvY2FsXCIpIHtcblx0XHRcdFx0cmV0dXJuO1xuXHRcdFx0fVxuXHRcdFx0dGhyb3cgbmV3IEVycm9yKGBVbnN1cHBvcnRlZCByZW1vdmUgc291cmNlOiAke3NvdXJjZX1gKTtcblx0XHR9KTtcblx0fVxuXG5cdGFzeW5jIHJlbW92ZUFuZFBlcnNpc3Qoc291cmNlOiBzdHJpbmcsIG9wdGlvbnM/OiB7IGxvY2FsPzogYm9vbGVhbiB9KTogUHJvbWlzZTxib29sZWFuPiB7XG5cdFx0YXdhaXQgdGhpcy5yZW1vdmUoc291cmNlLCBvcHRpb25zKTtcblx0XHRyZXR1cm4gdGhpcy5yZW1vdmVTb3VyY2VGcm9tU2V0dGluZ3Moc291cmNlLCBvcHRpb25zKTtcblx0fVxuXG5cdGFzeW5jIHVwZGF0ZShzb3VyY2U/OiBzdHJpbmcpOiBQcm9taXNlPHZvaWQ+IHtcblx0XHRjb25zdCBnbG9iYWxTZXR0aW5ncyA9IHRoaXMuc2V0dGluZ3NNYW5hZ2VyLmdldEdsb2JhbFNldHRpbmdzKCk7XG5cdFx0Y29uc3QgcHJvamVjdFNldHRpbmdzID0gdGhpcy5zZXR0aW5nc01hbmFnZXIuZ2V0UHJvamVjdFNldHRpbmdzKCk7XG5cdFx0Y29uc3QgaWRlbnRpdHkgPSBzb3VyY2UgPyB0aGlzLmdldFBhY2thZ2VJZGVudGl0eShzb3VyY2UpIDogdW5kZWZpbmVkO1xuXHRcdGxldCBtYXRjaGVkID0gZmFsc2U7XG5cdFx0Y29uc3QgdXBkYXRlU291cmNlczogQ29uZmlndXJlZFVwZGF0ZVNvdXJjZVtdID0gW107XG5cblx0XHRmb3IgKGNvbnN0IHBrZyBvZiBnbG9iYWxTZXR0aW5ncy5wYWNrYWdlcyA/PyBbXSkge1xuXHRcdFx0Y29uc3Qgc291cmNlU3RyID0gdHlwZW9mIHBrZyA9PT0gXCJzdHJpbmdcIiA/IHBrZyA6IHBrZy5zb3VyY2U7XG5cdFx0XHRpZiAoaWRlbnRpdHkgJiYgdGhpcy5nZXRQYWNrYWdlSWRlbnRpdHkoc291cmNlU3RyLCBcInVzZXJcIikgIT09IGlkZW50aXR5KSBjb250aW51ZTtcblx0XHRcdG1hdGNoZWQgPSB0cnVlO1xuXHRcdFx0dXBkYXRlU291cmNlcy5wdXNoKHsgc291cmNlOiBzb3VyY2VTdHIsIHNjb3BlOiBcInVzZXJcIiB9KTtcblx0XHR9XG5cdFx0Zm9yIChjb25zdCBwa2cgb2YgcHJvamVjdFNldHRpbmdzLnBhY2thZ2VzID8/IFtdKSB7XG5cdFx0XHRjb25zdCBzb3VyY2VTdHIgPSB0eXBlb2YgcGtnID09PSBcInN0cmluZ1wiID8gcGtnIDogcGtnLnNvdXJjZTtcblx0XHRcdGlmIChpZGVudGl0eSAmJiB0aGlzLmdldFBhY2thZ2VJZGVudGl0eShzb3VyY2VTdHIsIFwicHJvamVjdFwiKSAhPT0gaWRlbnRpdHkpIGNvbnRpbnVlO1xuXHRcdFx0bWF0Y2hlZCA9IHRydWU7XG5cdFx0XHR1cGRhdGVTb3VyY2VzLnB1c2goeyBzb3VyY2U6IHNvdXJjZVN0ciwgc2NvcGU6IFwicHJvamVjdFwiIH0pO1xuXHRcdH1cblxuXHRcdGlmIChzb3VyY2UgJiYgIW1hdGNoZWQpIHtcblx0XHRcdHRocm93IG5ldyBFcnJvcihcblx0XHRcdFx0dGhpcy5idWlsZE5vTWF0Y2hpbmdQYWNrYWdlTWVzc2FnZShzb3VyY2UsIFtcblx0XHRcdFx0XHQuLi4oZ2xvYmFsU2V0dGluZ3MucGFja2FnZXMgPz8gW10pLFxuXHRcdFx0XHRcdC4uLihwcm9qZWN0U2V0dGluZ3MucGFja2FnZXMgPz8gW10pLFxuXHRcdFx0XHRdKSxcblx0XHRcdCk7XG5cdFx0fVxuXG5cdFx0YXdhaXQgdGhpcy51cGRhdGVDb25maWd1cmVkU291cmNlcyh1cGRhdGVTb3VyY2VzKTtcblx0fVxuXG5cdHByaXZhdGUgYXN5bmMgdXBkYXRlQ29uZmlndXJlZFNvdXJjZXMoc291cmNlczogQ29uZmlndXJlZFVwZGF0ZVNvdXJjZVtdKTogUHJvbWlzZTx2b2lkPiB7XG5cdFx0aWYgKGlzT2ZmbGluZU1vZGVFbmFibGVkKCkgfHwgc291cmNlcy5sZW5ndGggPT09IDApIHtcblx0XHRcdHJldHVybjtcblx0XHR9XG5cblx0XHRjb25zdCBucG1DYW5kaWRhdGVzOiBOcG1VcGRhdGVUYXJnZXRbXSA9IFtdO1xuXHRcdGNvbnN0IGdpdENhbmRpZGF0ZXM6IEdpdFVwZGF0ZVRhcmdldFtdID0gW107XG5cblx0XHRmb3IgKGNvbnN0IGVudHJ5IG9mIHNvdXJjZXMpIHtcblx0XHRcdGNvbnN0IHBhcnNlZCA9IHRoaXMucGFyc2VTb3VyY2UoZW50cnkuc291cmNlKTtcblx0XHRcdGlmIChwYXJzZWQudHlwZSA9PT0gXCJsb2NhbFwiIHx8IHBhcnNlZC5waW5uZWQpIHtcblx0XHRcdFx0Y29udGludWU7XG5cdFx0XHR9XG5cdFx0XHRpZiAocGFyc2VkLnR5cGUgPT09IFwibnBtXCIpIHtcblx0XHRcdFx0bnBtQ2FuZGlkYXRlcy5wdXNoKHsgLi4uZW50cnksIHBhcnNlZCB9KTtcblx0XHRcdFx0Y29udGludWU7XG5cdFx0XHR9XG5cdFx0XHRnaXRDYW5kaWRhdGVzLnB1c2goeyAuLi5lbnRyeSwgcGFyc2VkIH0pO1xuXHRcdH1cblxuXHRcdGNvbnN0IG5wbUNoZWNrVGFza3MgPSBucG1DYW5kaWRhdGVzLm1hcCgoZW50cnkpID0+IGFzeW5jICgpID0+ICh7XG5cdFx0XHRlbnRyeSxcblx0XHRcdHNob3VsZFVwZGF0ZTogYXdhaXQgdGhpcy5zaG91bGRVcGRhdGVOcG1Tb3VyY2UoZW50cnkucGFyc2VkLCBlbnRyeS5zY29wZSksXG5cdFx0fSkpO1xuXHRcdGNvbnN0IG5wbUNoZWNrUmVzdWx0cyA9IGF3YWl0IHRoaXMucnVuV2l0aENvbmN1cnJlbmN5KG5wbUNoZWNrVGFza3MsIFVQREFURV9DSEVDS19DT05DVVJSRU5DWSk7XG5cdFx0Y29uc3QgdXNlck5wbVVwZGF0ZXM6IE5wbVVwZGF0ZVRhcmdldFtdID0gW107XG5cdFx0Y29uc3QgcHJvamVjdE5wbVVwZGF0ZXM6IE5wbVVwZGF0ZVRhcmdldFtdID0gW107XG5cdFx0Zm9yIChjb25zdCByZXN1bHQgb2YgbnBtQ2hlY2tSZXN1bHRzKSB7XG5cdFx0XHRpZiAoIXJlc3VsdC5zaG91bGRVcGRhdGUpIHtcblx0XHRcdFx0Y29udGludWU7XG5cdFx0XHR9XG5cdFx0XHRpZiAocmVzdWx0LmVudHJ5LnNjb3BlID09PSBcInVzZXJcIikge1xuXHRcdFx0XHR1c2VyTnBtVXBkYXRlcy5wdXNoKHJlc3VsdC5lbnRyeSk7XG5cdFx0XHR9IGVsc2Uge1xuXHRcdFx0XHRwcm9qZWN0TnBtVXBkYXRlcy5wdXNoKHJlc3VsdC5lbnRyeSk7XG5cdFx0XHR9XG5cdFx0fVxuXG5cdFx0Y29uc3QgdGFza3M6IFByb21pc2U8dm9pZD5bXSA9IFtdO1xuXHRcdGlmICh1c2VyTnBtVXBkYXRlcy5sZW5ndGggPiAwKSB7XG5cdFx0XHR0YXNrcy5wdXNoKHRoaXMudXBkYXRlTnBtQmF0Y2godXNlck5wbVVwZGF0ZXMsIFwidXNlclwiKSk7XG5cdFx0fVxuXHRcdGlmIChwcm9qZWN0TnBtVXBkYXRlcy5sZW5ndGggPiAwKSB7XG5cdFx0XHR0YXNrcy5wdXNoKHRoaXMudXBkYXRlTnBtQmF0Y2gocHJvamVjdE5wbVVwZGF0ZXMsIFwicHJvamVjdFwiKSk7XG5cdFx0fVxuXHRcdGlmIChnaXRDYW5kaWRhdGVzLmxlbmd0aCA+IDApIHtcblx0XHRcdGNvbnN0IGdpdFRhc2tzID0gZ2l0Q2FuZGlkYXRlcy5tYXAoXG5cdFx0XHRcdChlbnRyeSkgPT4gYXN5bmMgKCkgPT5cblx0XHRcdFx0XHR0aGlzLndpdGhQcm9ncmVzcyhcInVwZGF0ZVwiLCBlbnRyeS5zb3VyY2UsIGBVcGRhdGluZyAke2VudHJ5LnNvdXJjZX0uLi5gLCBhc3luYyAoKSA9PiB7XG5cdFx0XHRcdFx0XHRhd2FpdCB0aGlzLnVwZGF0ZUdpdChlbnRyeS5wYXJzZWQsIGVudHJ5LnNjb3BlKTtcblx0XHRcdFx0XHR9KSxcblx0XHRcdCk7XG5cdFx0XHR0YXNrcy5wdXNoKHRoaXMucnVuV2l0aENvbmN1cnJlbmN5KGdpdFRhc2tzLCBHSVRfVVBEQVRFX0NPTkNVUlJFTkNZKS50aGVuKCgpID0+IHt9KSk7XG5cdFx0fVxuXG5cdFx0YXdhaXQgUHJvbWlzZS5hbGwodGFza3MpO1xuXHR9XG5cblx0cHJpdmF0ZSBhc3luYyBzaG91bGRVcGRhdGVOcG1Tb3VyY2Uoc291cmNlOiBOcG1Tb3VyY2UsIHNjb3BlOiBJbnN0YWxsZWRTb3VyY2VTY29wZSk6IFByb21pc2U8Ym9vbGVhbj4ge1xuXHRcdGNvbnN0IGluc3RhbGxlZFBhdGggPSB0aGlzLmdldE5wbUluc3RhbGxQYXRoKHNvdXJjZSwgc2NvcGUpO1xuXHRcdGNvbnN0IGluc3RhbGxlZFZlcnNpb24gPSBleGlzdHNTeW5jKGluc3RhbGxlZFBhdGgpID8gdGhpcy5nZXRJbnN0YWxsZWROcG1WZXJzaW9uKGluc3RhbGxlZFBhdGgpIDogdW5kZWZpbmVkO1xuXHRcdGlmICghaW5zdGFsbGVkVmVyc2lvbikge1xuXHRcdFx0cmV0dXJuIHRydWU7XG5cdFx0fVxuXG5cdFx0dHJ5IHtcblx0XHRcdGNvbnN0IGxhdGVzdFZlcnNpb24gPSBhd2FpdCB0aGlzLmdldExhdGVzdE5wbVZlcnNpb24oc291cmNlLm5hbWUpO1xuXHRcdFx0cmV0dXJuIGxhdGVzdFZlcnNpb24gIT09IGluc3RhbGxlZFZlcnNpb247XG5cdFx0fSBjYXRjaCB7XG5cdFx0XHQvLyBQcmVzZXJ2ZSBleGlzdGluZyB1cGRhdGUgYmVoYXZpb3Igd2hlbiB2ZXJzaW9uIGxvb2t1cCBmYWlscy5cblx0XHRcdHJldHVybiB0cnVlO1xuXHRcdH1cblx0fVxuXG5cdHByaXZhdGUgYXN5bmMgdXBkYXRlTnBtQmF0Y2goc291cmNlczogTnBtVXBkYXRlVGFyZ2V0W10sIHNjb3BlOiBJbnN0YWxsZWRTb3VyY2VTY29wZSk6IFByb21pc2U8dm9pZD4ge1xuXHRcdGlmIChzb3VyY2VzLmxlbmd0aCA9PT0gMCkge1xuXHRcdFx0cmV0dXJuO1xuXHRcdH1cblxuXHRcdGNvbnN0IHNvdXJjZUxhYmVsID0gc291cmNlcy5sZW5ndGggPT09IDEgPyBzb3VyY2VzWzBdLnNvdXJjZSA6IGAke3Njb3BlfSBucG0gcGFja2FnZXNgO1xuXHRcdGNvbnN0IG1lc3NhZ2UgPSBzb3VyY2VzLmxlbmd0aCA9PT0gMSA/IGBVcGRhdGluZyAke3NvdXJjZXNbMF0uc291cmNlfS4uLmAgOiBgVXBkYXRpbmcgJHtzY29wZX0gbnBtIHBhY2thZ2VzLi4uYDtcblx0XHRjb25zdCBzcGVjcyA9IHNvdXJjZXMubWFwKChlbnRyeSkgPT4gYCR7ZW50cnkucGFyc2VkLm5hbWV9QGxhdGVzdGApO1xuXG5cdFx0YXdhaXQgdGhpcy53aXRoUHJvZ3Jlc3MoXCJ1cGRhdGVcIiwgc291cmNlTGFiZWwsIG1lc3NhZ2UsIGFzeW5jICgpID0+IHtcblx0XHRcdGF3YWl0IHRoaXMuaW5zdGFsbE5wbUJhdGNoKHNwZWNzLCBzY29wZSk7XG5cdFx0fSk7XG5cdH1cblxuXHRwcml2YXRlIGFzeW5jIGluc3RhbGxOcG1CYXRjaChzcGVjczogc3RyaW5nW10sIHNjb3BlOiBJbnN0YWxsZWRTb3VyY2VTY29wZSk6IFByb21pc2U8dm9pZD4ge1xuXHRcdGlmIChzY29wZSA9PT0gXCJ1c2VyXCIpIHtcblx0XHRcdGF3YWl0IHRoaXMucnVuTnBtQ29tbWFuZChbXCJpbnN0YWxsXCIsIFwiLWdcIiwgLi4uc3BlY3NdKTtcblx0XHRcdHJldHVybjtcblx0XHR9XG5cdFx0Y29uc3QgaW5zdGFsbFJvb3QgPSB0aGlzLmdldE5wbUluc3RhbGxSb290KHNjb3BlLCBmYWxzZSk7XG5cdFx0dGhpcy5lbnN1cmVOcG1Qcm9qZWN0KGluc3RhbGxSb290KTtcblx0XHRhd2FpdCB0aGlzLnJ1bk5wbUNvbW1hbmQoW1wiaW5zdGFsbFwiLCAuLi5zcGVjcywgXCItLXByZWZpeFwiLCBpbnN0YWxsUm9vdF0pO1xuXHR9XG5cblx0YXN5bmMgY2hlY2tGb3JBdmFpbGFibGVVcGRhdGVzKCk6IFByb21pc2U8UGFja2FnZVVwZGF0ZVtdPiB7XG5cdFx0aWYgKGlzT2ZmbGluZU1vZGVFbmFibGVkKCkpIHtcblx0XHRcdHJldHVybiBbXTtcblx0XHR9XG5cblx0XHRjb25zdCBnbG9iYWxTZXR0aW5ncyA9IHRoaXMuc2V0dGluZ3NNYW5hZ2VyLmdldEdsb2JhbFNldHRpbmdzKCk7XG5cdFx0Y29uc3QgcHJvamVjdFNldHRpbmdzID0gdGhpcy5zZXR0aW5nc01hbmFnZXIuZ2V0UHJvamVjdFNldHRpbmdzKCk7XG5cdFx0Y29uc3QgYWxsUGFja2FnZXM6IEFycmF5PHsgcGtnOiBQYWNrYWdlU291cmNlOyBzY29wZTogU291cmNlU2NvcGUgfT4gPSBbXTtcblx0XHRmb3IgKGNvbnN0IHBrZyBvZiBwcm9qZWN0U2V0dGluZ3MucGFja2FnZXMgPz8gW10pIHtcblx0XHRcdGFsbFBhY2thZ2VzLnB1c2goeyBwa2csIHNjb3BlOiBcInByb2plY3RcIiB9KTtcblx0XHR9XG5cdFx0Zm9yIChjb25zdCBwa2cgb2YgZ2xvYmFsU2V0dGluZ3MucGFja2FnZXMgPz8gW10pIHtcblx0XHRcdGFsbFBhY2thZ2VzLnB1c2goeyBwa2csIHNjb3BlOiBcInVzZXJcIiB9KTtcblx0XHR9XG5cblx0XHRjb25zdCBwYWNrYWdlU291cmNlcyA9IHRoaXMuZGVkdXBlUGFja2FnZXMoYWxsUGFja2FnZXMpO1xuXHRcdGNvbnN0IGNoZWNrcyA9IHBhY2thZ2VTb3VyY2VzXG5cdFx0XHQuZmlsdGVyKFxuXHRcdFx0XHQoZW50cnkpOiBlbnRyeSBpcyB7IHBrZzogUGFja2FnZVNvdXJjZTsgc2NvcGU6IEV4Y2x1ZGU8U291cmNlU2NvcGUsIFwidGVtcG9yYXJ5XCI+IH0gPT5cblx0XHRcdFx0XHRlbnRyeS5zY29wZSAhPT0gXCJ0ZW1wb3JhcnlcIixcblx0XHRcdClcblx0XHRcdC5tYXAoKGVudHJ5KSA9PiBhc3luYyAoKTogUHJvbWlzZTxQYWNrYWdlVXBkYXRlIHwgdW5kZWZpbmVkPiA9PiB7XG5cdFx0XHRcdGNvbnN0IHNvdXJjZSA9IHR5cGVvZiBlbnRyeS5wa2cgPT09IFwic3RyaW5nXCIgPyBlbnRyeS5wa2cgOiBlbnRyeS5wa2cuc291cmNlO1xuXHRcdFx0XHRjb25zdCBwYXJzZWQgPSB0aGlzLnBhcnNlU291cmNlKHNvdXJjZSk7XG5cdFx0XHRcdGlmIChwYXJzZWQudHlwZSA9PT0gXCJsb2NhbFwiIHx8IHBhcnNlZC5waW5uZWQpIHtcblx0XHRcdFx0XHRyZXR1cm4gdW5kZWZpbmVkO1xuXHRcdFx0XHR9XG5cblx0XHRcdFx0aWYgKHBhcnNlZC50eXBlID09PSBcIm5wbVwiKSB7XG5cdFx0XHRcdFx0Y29uc3QgaW5zdGFsbGVkUGF0aCA9IHRoaXMuZ2V0TnBtSW5zdGFsbFBhdGgocGFyc2VkLCBlbnRyeS5zY29wZSk7XG5cdFx0XHRcdFx0aWYgKCFleGlzdHNTeW5jKGluc3RhbGxlZFBhdGgpKSB7XG5cdFx0XHRcdFx0XHRyZXR1cm4gdW5kZWZpbmVkO1xuXHRcdFx0XHRcdH1cblx0XHRcdFx0XHRjb25zdCBoYXNVcGRhdGUgPSBhd2FpdCB0aGlzLm5wbUhhc0F2YWlsYWJsZVVwZGF0ZShwYXJzZWQsIGluc3RhbGxlZFBhdGgpO1xuXHRcdFx0XHRcdGlmICghaGFzVXBkYXRlKSB7XG5cdFx0XHRcdFx0XHRyZXR1cm4gdW5kZWZpbmVkO1xuXHRcdFx0XHRcdH1cblx0XHRcdFx0XHRyZXR1cm4ge1xuXHRcdFx0XHRcdFx0c291cmNlLFxuXHRcdFx0XHRcdFx0ZGlzcGxheU5hbWU6IHBhcnNlZC5uYW1lLFxuXHRcdFx0XHRcdFx0dHlwZTogXCJucG1cIixcblx0XHRcdFx0XHRcdHNjb3BlOiBlbnRyeS5zY29wZSxcblx0XHRcdFx0XHR9O1xuXHRcdFx0XHR9XG5cblx0XHRcdFx0Y29uc3QgaW5zdGFsbGVkUGF0aCA9IHRoaXMuZ2V0R2l0SW5zdGFsbFBhdGgocGFyc2VkLCBlbnRyeS5zY29wZSk7XG5cdFx0XHRcdGlmICghZXhpc3RzU3luYyhpbnN0YWxsZWRQYXRoKSkge1xuXHRcdFx0XHRcdHJldHVybiB1bmRlZmluZWQ7XG5cdFx0XHRcdH1cblx0XHRcdFx0Y29uc3QgaGFzVXBkYXRlID0gYXdhaXQgdGhpcy5naXRIYXNBdmFpbGFibGVVcGRhdGUoaW5zdGFsbGVkUGF0aCk7XG5cdFx0XHRcdGlmICghaGFzVXBkYXRlKSB7XG5cdFx0XHRcdFx0cmV0dXJuIHVuZGVmaW5lZDtcblx0XHRcdFx0fVxuXHRcdFx0XHRyZXR1cm4ge1xuXHRcdFx0XHRcdHNvdXJjZSxcblx0XHRcdFx0XHRkaXNwbGF5TmFtZTogYCR7cGFyc2VkLmhvc3R9LyR7cGFyc2VkLnBhdGh9YCxcblx0XHRcdFx0XHR0eXBlOiBcImdpdFwiLFxuXHRcdFx0XHRcdHNjb3BlOiBlbnRyeS5zY29wZSxcblx0XHRcdFx0fTtcblx0XHRcdH0pO1xuXG5cdFx0Y29uc3QgcmVzdWx0cyA9IGF3YWl0IHRoaXMucnVuV2l0aENvbmN1cnJlbmN5KGNoZWNrcywgVVBEQVRFX0NIRUNLX0NPTkNVUlJFTkNZKTtcblx0XHRyZXR1cm4gcmVzdWx0cy5maWx0ZXIoKHJlc3VsdCk6IHJlc3VsdCBpcyBQYWNrYWdlVXBkYXRlID0+IHJlc3VsdCAhPT0gdW5kZWZpbmVkKTtcblx0fVxuXG5cdHByaXZhdGUgYXN5bmMgcmVzb2x2ZVBhY2thZ2VTb3VyY2VzKFxuXHRcdHNvdXJjZXM6IEFycmF5PHsgcGtnOiBQYWNrYWdlU291cmNlOyBzY29wZTogU291cmNlU2NvcGUgfT4sXG5cdFx0YWNjdW11bGF0b3I6IFJlc291cmNlQWNjdW11bGF0b3IsXG5cdFx0b25NaXNzaW5nPzogKHNvdXJjZTogc3RyaW5nKSA9PiBQcm9taXNlPE1pc3NpbmdTb3VyY2VBY3Rpb24+LFxuXHQpOiBQcm9taXNlPHZvaWQ+IHtcblx0XHRmb3IgKGNvbnN0IHsgcGtnLCBzY29wZSB9IG9mIHNvdXJjZXMpIHtcblx0XHRcdGNvbnN0IHNvdXJjZVN0ciA9IHR5cGVvZiBwa2cgPT09IFwic3RyaW5nXCIgPyBwa2cgOiBwa2cuc291cmNlO1xuXHRcdFx0Y29uc3QgZmlsdGVyID0gdHlwZW9mIHBrZyA9PT0gXCJvYmplY3RcIiA/IHBrZyA6IHVuZGVmaW5lZDtcblx0XHRcdGNvbnN0IHBhcnNlZCA9IHRoaXMucGFyc2VTb3VyY2Uoc291cmNlU3RyKTtcblx0XHRcdGNvbnN0IG1ldGFkYXRhOiBQYXRoTWV0YWRhdGEgPSB7IHNvdXJjZTogc291cmNlU3RyLCBzY29wZSwgb3JpZ2luOiBcInBhY2thZ2VcIiB9O1xuXG5cdFx0XHRpZiAocGFyc2VkLnR5cGUgPT09IFwibG9jYWxcIikge1xuXHRcdFx0XHRjb25zdCBiYXNlRGlyID0gdGhpcy5nZXRCYXNlRGlyRm9yU2NvcGUoc2NvcGUpO1xuXHRcdFx0XHR0aGlzLnJlc29sdmVMb2NhbEV4dGVuc2lvblNvdXJjZShwYXJzZWQsIGFjY3VtdWxhdG9yLCBmaWx0ZXIsIG1ldGFkYXRhLCBiYXNlRGlyKTtcblx0XHRcdFx0Y29udGludWU7XG5cdFx0XHR9XG5cblx0XHRcdGNvbnN0IGluc3RhbGxNaXNzaW5nID0gYXN5bmMgKCk6IFByb21pc2U8Ym9vbGVhbj4gPT4ge1xuXHRcdFx0XHRpZiAoaXNPZmZsaW5lTW9kZUVuYWJsZWQoKSkge1xuXHRcdFx0XHRcdHJldHVybiBmYWxzZTtcblx0XHRcdFx0fVxuXHRcdFx0XHRpZiAoIW9uTWlzc2luZykge1xuXHRcdFx0XHRcdGF3YWl0IHRoaXMuaW5zdGFsbFBhcnNlZFNvdXJjZShwYXJzZWQsIHNjb3BlKTtcblx0XHRcdFx0XHRyZXR1cm4gdHJ1ZTtcblx0XHRcdFx0fVxuXHRcdFx0XHRjb25zdCBhY3Rpb24gPSBhd2FpdCBvbk1pc3Npbmcoc291cmNlU3RyKTtcblx0XHRcdFx0aWYgKGFjdGlvbiA9PT0gXCJza2lwXCIpIHJldHVybiBmYWxzZTtcblx0XHRcdFx0aWYgKGFjdGlvbiA9PT0gXCJlcnJvclwiKSB0aHJvdyBuZXcgRXJyb3IoYE1pc3Npbmcgc291cmNlOiAke3NvdXJjZVN0cn1gKTtcblx0XHRcdFx0YXdhaXQgdGhpcy5pbnN0YWxsUGFyc2VkU291cmNlKHBhcnNlZCwgc2NvcGUpO1xuXHRcdFx0XHRyZXR1cm4gdHJ1ZTtcblx0XHRcdH07XG5cblx0XHRcdGlmIChwYXJzZWQudHlwZSA9PT0gXCJucG1cIikge1xuXHRcdFx0XHRjb25zdCBpbnN0YWxsZWRQYXRoID0gdGhpcy5nZXROcG1JbnN0YWxsUGF0aChwYXJzZWQsIHNjb3BlKTtcblx0XHRcdFx0Y29uc3QgbmVlZHNJbnN0YWxsID1cblx0XHRcdFx0XHQhZXhpc3RzU3luYyhpbnN0YWxsZWRQYXRoKSB8fFxuXHRcdFx0XHRcdChwYXJzZWQucGlubmVkICYmICEoYXdhaXQgdGhpcy5pbnN0YWxsZWROcG1NYXRjaGVzUGlubmVkVmVyc2lvbihwYXJzZWQsIGluc3RhbGxlZFBhdGgpKSk7XG5cdFx0XHRcdGlmIChuZWVkc0luc3RhbGwpIHtcblx0XHRcdFx0XHRjb25zdCBpbnN0YWxsZWQgPSBhd2FpdCBpbnN0YWxsTWlzc2luZygpO1xuXHRcdFx0XHRcdGlmICghaW5zdGFsbGVkKSBjb250aW51ZTtcblx0XHRcdFx0fVxuXHRcdFx0XHRtZXRhZGF0YS5iYXNlRGlyID0gaW5zdGFsbGVkUGF0aDtcblx0XHRcdFx0dGhpcy5jb2xsZWN0UGFja2FnZVJlc291cmNlcyhpbnN0YWxsZWRQYXRoLCBhY2N1bXVsYXRvciwgZmlsdGVyLCBtZXRhZGF0YSk7XG5cdFx0XHRcdGNvbnRpbnVlO1xuXHRcdFx0fVxuXG5cdFx0XHRpZiAocGFyc2VkLnR5cGUgPT09IFwiZ2l0XCIpIHtcblx0XHRcdFx0Y29uc3QgaW5zdGFsbGVkUGF0aCA9IHRoaXMuZ2V0R2l0SW5zdGFsbFBhdGgocGFyc2VkLCBzY29wZSk7XG5cdFx0XHRcdGlmICghZXhpc3RzU3luYyhpbnN0YWxsZWRQYXRoKSkge1xuXHRcdFx0XHRcdGNvbnN0IGluc3RhbGxlZCA9IGF3YWl0IGluc3RhbGxNaXNzaW5nKCk7XG5cdFx0XHRcdFx0aWYgKCFpbnN0YWxsZWQpIGNvbnRpbnVlO1xuXHRcdFx0XHR9IGVsc2UgaWYgKHNjb3BlID09PSBcInRlbXBvcmFyeVwiICYmICFwYXJzZWQucGlubmVkICYmICFpc09mZmxpbmVNb2RlRW5hYmxlZCgpKSB7XG5cdFx0XHRcdFx0YXdhaXQgdGhpcy5yZWZyZXNoVGVtcG9yYXJ5R2l0U291cmNlKHBhcnNlZCwgc291cmNlU3RyKTtcblx0XHRcdFx0fVxuXHRcdFx0XHRtZXRhZGF0YS5iYXNlRGlyID0gaW5zdGFsbGVkUGF0aDtcblx0XHRcdFx0dGhpcy5jb2xsZWN0UGFja2FnZVJlc291cmNlcyhpbnN0YWxsZWRQYXRoLCBhY2N1bXVsYXRvciwgZmlsdGVyLCBtZXRhZGF0YSk7XG5cdFx0XHR9XG5cdFx0fVxuXHR9XG5cblx0cHJpdmF0ZSByZXNvbHZlTG9jYWxFeHRlbnNpb25Tb3VyY2UoXG5cdFx0c291cmNlOiBMb2NhbFNvdXJjZSxcblx0XHRhY2N1bXVsYXRvcjogUmVzb3VyY2VBY2N1bXVsYXRvcixcblx0XHRmaWx0ZXI6IFBhY2thZ2VGaWx0ZXIgfCB1bmRlZmluZWQsXG5cdFx0bWV0YWRhdGE6IFBhdGhNZXRhZGF0YSxcblx0XHRiYXNlRGlyOiBzdHJpbmcsXG5cdCk6IHZvaWQge1xuXHRcdGNvbnN0IHJlc29sdmVkID0gdGhpcy5yZXNvbHZlUGF0aEZyb21CYXNlKHNvdXJjZS5wYXRoLCBiYXNlRGlyKTtcblx0XHRpZiAoIWV4aXN0c1N5bmMocmVzb2x2ZWQpKSB7XG5cdFx0XHRyZXR1cm47XG5cdFx0fVxuXG5cdFx0dHJ5IHtcblx0XHRcdGNvbnN0IHN0YXRzID0gc3RhdFN5bmMocmVzb2x2ZWQpO1xuXHRcdFx0aWYgKHN0YXRzLmlzRmlsZSgpKSB7XG5cdFx0XHRcdG1ldGFkYXRhLmJhc2VEaXIgPSBkaXJuYW1lKHJlc29sdmVkKTtcblx0XHRcdFx0dGhpcy5hZGRSZXNvdXJjZShhY2N1bXVsYXRvci5leHRlbnNpb25zLCByZXNvbHZlZCwgbWV0YWRhdGEsIHRydWUpO1xuXHRcdFx0XHRyZXR1cm47XG5cdFx0XHR9XG5cdFx0XHRpZiAoc3RhdHMuaXNEaXJlY3RvcnkoKSkge1xuXHRcdFx0XHRtZXRhZGF0YS5iYXNlRGlyID0gcmVzb2x2ZWQ7XG5cdFx0XHRcdGNvbnN0IHJlc291cmNlcyA9IHRoaXMuY29sbGVjdFBhY2thZ2VSZXNvdXJjZXMocmVzb2x2ZWQsIGFjY3VtdWxhdG9yLCBmaWx0ZXIsIG1ldGFkYXRhKTtcblx0XHRcdFx0aWYgKCFyZXNvdXJjZXMpIHtcblx0XHRcdFx0XHR0aGlzLmFkZFJlc291cmNlKGFjY3VtdWxhdG9yLmV4dGVuc2lvbnMsIHJlc29sdmVkLCBtZXRhZGF0YSwgdHJ1ZSk7XG5cdFx0XHRcdH1cblx0XHRcdH1cblx0XHR9IGNhdGNoIHtcblx0XHRcdHJldHVybjtcblx0XHR9XG5cdH1cblxuXHRwcml2YXRlIGFzeW5jIGluc3RhbGxQYXJzZWRTb3VyY2UocGFyc2VkOiBQYXJzZWRTb3VyY2UsIHNjb3BlOiBTb3VyY2VTY29wZSk6IFByb21pc2U8dm9pZD4ge1xuXHRcdGlmIChwYXJzZWQudHlwZSA9PT0gXCJucG1cIikge1xuXHRcdFx0YXdhaXQgdGhpcy5pbnN0YWxsTnBtKHBhcnNlZCwgc2NvcGUsIHNjb3BlID09PSBcInRlbXBvcmFyeVwiKTtcblx0XHRcdHJldHVybjtcblx0XHR9XG5cdFx0aWYgKHBhcnNlZC50eXBlID09PSBcImdpdFwiKSB7XG5cdFx0XHRhd2FpdCB0aGlzLmluc3RhbGxHaXQocGFyc2VkLCBzY29wZSk7XG5cdFx0XHRyZXR1cm47XG5cdFx0fVxuXHR9XG5cblx0cHJpdmF0ZSBnZXRQYWNrYWdlU291cmNlU3RyaW5nKHBrZzogUGFja2FnZVNvdXJjZSk6IHN0cmluZyB7XG5cdFx0cmV0dXJuIHR5cGVvZiBwa2cgPT09IFwic3RyaW5nXCIgPyBwa2cgOiBwa2cuc291cmNlO1xuXHR9XG5cblx0cHJpdmF0ZSBnZXRTb3VyY2VNYXRjaEtleUZvcklucHV0KHNvdXJjZTogc3RyaW5nKTogc3RyaW5nIHtcblx0XHRjb25zdCBwYXJzZWQgPSB0aGlzLnBhcnNlU291cmNlKHNvdXJjZSk7XG5cdFx0aWYgKHBhcnNlZC50eXBlID09PSBcIm5wbVwiKSB7XG5cdFx0XHRyZXR1cm4gYG5wbToke3BhcnNlZC5uYW1lfWA7XG5cdFx0fVxuXHRcdGlmIChwYXJzZWQudHlwZSA9PT0gXCJnaXRcIikge1xuXHRcdFx0cmV0dXJuIGBnaXQ6JHtwYXJzZWQuaG9zdH0vJHtwYXJzZWQucGF0aH1gO1xuXHRcdH1cblx0XHRyZXR1cm4gYGxvY2FsOiR7dGhpcy5yZXNvbHZlUGF0aChwYXJzZWQucGF0aCl9YDtcblx0fVxuXG5cdHByaXZhdGUgZ2V0U291cmNlTWF0Y2hLZXlGb3JTZXR0aW5ncyhzb3VyY2U6IHN0cmluZywgc2NvcGU6IFNvdXJjZVNjb3BlKTogc3RyaW5nIHtcblx0XHRjb25zdCBwYXJzZWQgPSB0aGlzLnBhcnNlU291cmNlKHNvdXJjZSk7XG5cdFx0aWYgKHBhcnNlZC50eXBlID09PSBcIm5wbVwiKSB7XG5cdFx0XHRyZXR1cm4gYG5wbToke3BhcnNlZC5uYW1lfWA7XG5cdFx0fVxuXHRcdGlmIChwYXJzZWQudHlwZSA9PT0gXCJnaXRcIikge1xuXHRcdFx0cmV0dXJuIGBnaXQ6JHtwYXJzZWQuaG9zdH0vJHtwYXJzZWQucGF0aH1gO1xuXHRcdH1cblx0XHRjb25zdCBiYXNlRGlyID0gdGhpcy5nZXRCYXNlRGlyRm9yU2NvcGUoc2NvcGUpO1xuXHRcdHJldHVybiBgbG9jYWw6JHt0aGlzLnJlc29sdmVQYXRoRnJvbUJhc2UocGFyc2VkLnBhdGgsIGJhc2VEaXIpfWA7XG5cdH1cblxuXHRwcml2YXRlIGJ1aWxkTm9NYXRjaGluZ1BhY2thZ2VNZXNzYWdlKHNvdXJjZTogc3RyaW5nLCBjb25maWd1cmVkUGFja2FnZXM6IFBhY2thZ2VTb3VyY2VbXSk6IHN0cmluZyB7XG5cdFx0Y29uc3Qgc3VnZ2VzdGlvbiA9IHRoaXMuZmluZFN1Z2dlc3RlZENvbmZpZ3VyZWRTb3VyY2Uoc291cmNlLCBjb25maWd1cmVkUGFja2FnZXMpO1xuXHRcdGlmICghc3VnZ2VzdGlvbikge1xuXHRcdFx0cmV0dXJuIGBObyBtYXRjaGluZyBwYWNrYWdlIGZvdW5kIGZvciAke3NvdXJjZX1gO1xuXHRcdH1cblx0XHRyZXR1cm4gYE5vIG1hdGNoaW5nIHBhY2thZ2UgZm91bmQgZm9yICR7c291cmNlfS4gRGlkIHlvdSBtZWFuICR7c3VnZ2VzdGlvbn0/YDtcblx0fVxuXG5cdHByaXZhdGUgZmluZFN1Z2dlc3RlZENvbmZpZ3VyZWRTb3VyY2Uoc291cmNlOiBzdHJpbmcsIGNvbmZpZ3VyZWRQYWNrYWdlczogUGFja2FnZVNvdXJjZVtdKTogc3RyaW5nIHwgdW5kZWZpbmVkIHtcblx0XHRjb25zdCB0cmltbWVkU291cmNlID0gc291cmNlLnRyaW0oKTtcblx0XHRjb25zdCBzdWdnZXN0aW9ucyA9IG5ldyBTZXQ8c3RyaW5nPigpO1xuXG5cdFx0Zm9yIChjb25zdCBwa2cgb2YgY29uZmlndXJlZFBhY2thZ2VzKSB7XG5cdFx0XHRjb25zdCBzb3VyY2VTdHIgPSB0aGlzLmdldFBhY2thZ2VTb3VyY2VTdHJpbmcocGtnKTtcblx0XHRcdGNvbnN0IHBhcnNlZCA9IHRoaXMucGFyc2VTb3VyY2Uoc291cmNlU3RyKTtcblx0XHRcdGlmIChwYXJzZWQudHlwZSA9PT0gXCJucG1cIikge1xuXHRcdFx0XHRpZiAodHJpbW1lZFNvdXJjZSA9PT0gcGFyc2VkLm5hbWUgfHwgdHJpbW1lZFNvdXJjZSA9PT0gcGFyc2VkLnNwZWMpIHtcblx0XHRcdFx0XHRzdWdnZXN0aW9ucy5hZGQoc291cmNlU3RyKTtcblx0XHRcdFx0fVxuXHRcdFx0XHRjb250aW51ZTtcblx0XHRcdH1cblx0XHRcdGlmIChwYXJzZWQudHlwZSA9PT0gXCJnaXRcIikge1xuXHRcdFx0XHRjb25zdCBzaG9ydGhhbmQgPSBgJHtwYXJzZWQuaG9zdH0vJHtwYXJzZWQucGF0aH1gO1xuXHRcdFx0XHRjb25zdCBzaG9ydGhhbmRXaXRoUmVmID0gcGFyc2VkLnJlZiA/IGAke3Nob3J0aGFuZH1AJHtwYXJzZWQucmVmfWAgOiB1bmRlZmluZWQ7XG5cdFx0XHRcdGlmICh0cmltbWVkU291cmNlID09PSBzaG9ydGhhbmQgfHwgKHNob3J0aGFuZFdpdGhSZWYgJiYgdHJpbW1lZFNvdXJjZSA9PT0gc2hvcnRoYW5kV2l0aFJlZikpIHtcblx0XHRcdFx0XHRzdWdnZXN0aW9ucy5hZGQoc291cmNlU3RyKTtcblx0XHRcdFx0fVxuXHRcdFx0fVxuXHRcdH1cblxuXHRcdHJldHVybiBzdWdnZXN0aW9ucy52YWx1ZXMoKS5uZXh0KCkudmFsdWU7XG5cdH1cblxuXHRwcml2YXRlIHBhY2thZ2VTb3VyY2VzTWF0Y2goZXhpc3Rpbmc6IFBhY2thZ2VTb3VyY2UsIGlucHV0U291cmNlOiBzdHJpbmcsIHNjb3BlOiBTb3VyY2VTY29wZSk6IGJvb2xlYW4ge1xuXHRcdGNvbnN0IGxlZnQgPSB0aGlzLmdldFNvdXJjZU1hdGNoS2V5Rm9yU2V0dGluZ3ModGhpcy5nZXRQYWNrYWdlU291cmNlU3RyaW5nKGV4aXN0aW5nKSwgc2NvcGUpO1xuXHRcdGNvbnN0IHJpZ2h0ID0gdGhpcy5nZXRTb3VyY2VNYXRjaEtleUZvcklucHV0KGlucHV0U291cmNlKTtcblx0XHRyZXR1cm4gbGVmdCA9PT0gcmlnaHQ7XG5cdH1cblxuXHRwcml2YXRlIG5vcm1hbGl6ZVBhY2thZ2VTb3VyY2VGb3JTZXR0aW5ncyhzb3VyY2U6IHN0cmluZywgc2NvcGU6IFNvdXJjZVNjb3BlKTogc3RyaW5nIHtcblx0XHRjb25zdCBwYXJzZWQgPSB0aGlzLnBhcnNlU291cmNlKHNvdXJjZSk7XG5cdFx0aWYgKHBhcnNlZC50eXBlICE9PSBcImxvY2FsXCIpIHtcblx0XHRcdHJldHVybiBzb3VyY2U7XG5cdFx0fVxuXHRcdGNvbnN0IGJhc2VEaXIgPSB0aGlzLmdldEJhc2VEaXJGb3JTY29wZShzY29wZSk7XG5cdFx0Y29uc3QgcmVzb2x2ZWQgPSB0aGlzLnJlc29sdmVQYXRoKHBhcnNlZC5wYXRoKTtcblx0XHRjb25zdCByZWwgPSByZWxhdGl2ZShiYXNlRGlyLCByZXNvbHZlZCk7XG5cdFx0cmV0dXJuIHJlbCB8fCBcIi5cIjtcblx0fVxuXG5cdHByaXZhdGUgcGFyc2VTb3VyY2Uoc291cmNlOiBzdHJpbmcpOiBQYXJzZWRTb3VyY2Uge1xuXHRcdGlmIChzb3VyY2Uuc3RhcnRzV2l0aChcIm5wbTpcIikpIHtcblx0XHRcdGNvbnN0IHNwZWMgPSBzb3VyY2Uuc2xpY2UoXCJucG06XCIubGVuZ3RoKS50cmltKCk7XG5cdFx0XHRjb25zdCB7IG5hbWUsIHZlcnNpb24gfSA9IHRoaXMucGFyc2VOcG1TcGVjKHNwZWMpO1xuXHRcdFx0cmV0dXJuIHtcblx0XHRcdFx0dHlwZTogXCJucG1cIixcblx0XHRcdFx0c3BlYyxcblx0XHRcdFx0bmFtZSxcblx0XHRcdFx0cGlubmVkOiBCb29sZWFuKHZlcnNpb24pLFxuXHRcdFx0fTtcblx0XHR9XG5cblx0XHRpZiAoaXNMb2NhbFBhdGgoc291cmNlKSkge1xuXHRcdFx0cmV0dXJuIHsgdHlwZTogXCJsb2NhbFwiLCBwYXRoOiBzb3VyY2UgfTtcblx0XHR9XG5cblx0XHQvLyBUcnkgcGFyc2luZyBhcyBnaXQgVVJMXG5cdFx0Y29uc3QgZ2l0UGFyc2VkID0gcGFyc2VHaXRVcmwoc291cmNlKTtcblx0XHRpZiAoZ2l0UGFyc2VkKSB7XG5cdFx0XHRyZXR1cm4gZ2l0UGFyc2VkO1xuXHRcdH1cblxuXHRcdHJldHVybiB7IHR5cGU6IFwibG9jYWxcIiwgcGF0aDogc291cmNlIH07XG5cdH1cblxuXHRwcml2YXRlIGFzeW5jIGluc3RhbGxlZE5wbU1hdGNoZXNQaW5uZWRWZXJzaW9uKHNvdXJjZTogTnBtU291cmNlLCBpbnN0YWxsZWRQYXRoOiBzdHJpbmcpOiBQcm9taXNlPGJvb2xlYW4+IHtcblx0XHRjb25zdCBpbnN0YWxsZWRWZXJzaW9uID0gdGhpcy5nZXRJbnN0YWxsZWROcG1WZXJzaW9uKGluc3RhbGxlZFBhdGgpO1xuXHRcdGlmICghaW5zdGFsbGVkVmVyc2lvbikge1xuXHRcdFx0cmV0dXJuIGZhbHNlO1xuXHRcdH1cblxuXHRcdGNvbnN0IHsgdmVyc2lvbjogcGlubmVkVmVyc2lvbiB9ID0gdGhpcy5wYXJzZU5wbVNwZWMoc291cmNlLnNwZWMpO1xuXHRcdGlmICghcGlubmVkVmVyc2lvbikge1xuXHRcdFx0cmV0dXJuIHRydWU7XG5cdFx0fVxuXG5cdFx0cmV0dXJuIGluc3RhbGxlZFZlcnNpb24gPT09IHBpbm5lZFZlcnNpb247XG5cdH1cblxuXHRwcml2YXRlIGFzeW5jIG5wbUhhc0F2YWlsYWJsZVVwZGF0ZShzb3VyY2U6IE5wbVNvdXJjZSwgaW5zdGFsbGVkUGF0aDogc3RyaW5nKTogUHJvbWlzZTxib29sZWFuPiB7XG5cdFx0aWYgKGlzT2ZmbGluZU1vZGVFbmFibGVkKCkpIHtcblx0XHRcdHJldHVybiBmYWxzZTtcblx0XHR9XG5cblx0XHRjb25zdCBpbnN0YWxsZWRWZXJzaW9uID0gdGhpcy5nZXRJbnN0YWxsZWROcG1WZXJzaW9uKGluc3RhbGxlZFBhdGgpO1xuXHRcdGlmICghaW5zdGFsbGVkVmVyc2lvbikge1xuXHRcdFx0cmV0dXJuIGZhbHNlO1xuXHRcdH1cblxuXHRcdHRyeSB7XG5cdFx0XHRjb25zdCBsYXRlc3RWZXJzaW9uID0gYXdhaXQgdGhpcy5nZXRMYXRlc3ROcG1WZXJzaW9uKHNvdXJjZS5uYW1lKTtcblx0XHRcdHJldHVybiBsYXRlc3RWZXJzaW9uICE9PSBpbnN0YWxsZWRWZXJzaW9uO1xuXHRcdH0gY2F0Y2gge1xuXHRcdFx0cmV0dXJuIGZhbHNlO1xuXHRcdH1cblx0fVxuXG5cdHByaXZhdGUgZ2V0SW5zdGFsbGVkTnBtVmVyc2lvbihpbnN0YWxsZWRQYXRoOiBzdHJpbmcpOiBzdHJpbmcgfCB1bmRlZmluZWQge1xuXHRcdGNvbnN0IHBhY2thZ2VKc29uUGF0aCA9IGpvaW4oaW5zdGFsbGVkUGF0aCwgXCJwYWNrYWdlLmpzb25cIik7XG5cdFx0aWYgKCFleGlzdHNTeW5jKHBhY2thZ2VKc29uUGF0aCkpIHJldHVybiB1bmRlZmluZWQ7XG5cdFx0dHJ5IHtcblx0XHRcdGNvbnN0IGNvbnRlbnQgPSByZWFkRmlsZVN5bmMocGFja2FnZUpzb25QYXRoLCBcInV0Zi04XCIpO1xuXHRcdFx0Y29uc3QgcGtnID0gSlNPTi5wYXJzZShjb250ZW50KSBhcyB7IHZlcnNpb24/OiBzdHJpbmcgfTtcblx0XHRcdHJldHVybiBwa2cudmVyc2lvbjtcblx0XHR9IGNhdGNoIHtcblx0XHRcdHJldHVybiB1bmRlZmluZWQ7XG5cdFx0fVxuXHR9XG5cblx0cHJpdmF0ZSBhc3luYyBnZXRMYXRlc3ROcG1WZXJzaW9uKHBhY2thZ2VOYW1lOiBzdHJpbmcpOiBQcm9taXNlPHN0cmluZz4ge1xuXHRcdGNvbnN0IG5wbUNvbW1hbmQgPSB0aGlzLmdldE5wbUNvbW1hbmQoKTtcblx0XHRjb25zdCBzdGRvdXQgPSBhd2FpdCB0aGlzLnJ1bkNvbW1hbmRDYXB0dXJlKFxuXHRcdFx0bnBtQ29tbWFuZC5jb21tYW5kLFxuXHRcdFx0Wy4uLm5wbUNvbW1hbmQuYXJncywgXCJ2aWV3XCIsIHBhY2thZ2VOYW1lLCBcInZlcnNpb25cIiwgXCItLWpzb25cIl0sXG5cdFx0XHR7IGN3ZDogdGhpcy5jd2QsIHRpbWVvdXRNczogTkVUV09SS19USU1FT1VUX01TIH0sXG5cdFx0KTtcblx0XHRjb25zdCByYXcgPSBzdGRvdXQudHJpbSgpO1xuXHRcdGlmICghcmF3KSB0aHJvdyBuZXcgRXJyb3IoXCJFbXB0eSByZXNwb25zZSBmcm9tIG5wbSB2aWV3XCIpO1xuXHRcdHJldHVybiBKU09OLnBhcnNlKHJhdyk7XG5cdH1cblxuXHRwcml2YXRlIGFzeW5jIGdpdEhhc0F2YWlsYWJsZVVwZGF0ZShpbnN0YWxsZWRQYXRoOiBzdHJpbmcpOiBQcm9taXNlPGJvb2xlYW4+IHtcblx0XHRpZiAoaXNPZmZsaW5lTW9kZUVuYWJsZWQoKSkge1xuXHRcdFx0cmV0dXJuIGZhbHNlO1xuXHRcdH1cblxuXHRcdHRyeSB7XG5cdFx0XHRjb25zdCBsb2NhbEhlYWQgPSBhd2FpdCB0aGlzLnJ1bkNvbW1hbmRDYXB0dXJlKFwiZ2l0XCIsIFtcInJldi1wYXJzZVwiLCBcIkhFQURcIl0sIHtcblx0XHRcdFx0Y3dkOiBpbnN0YWxsZWRQYXRoLFxuXHRcdFx0XHR0aW1lb3V0TXM6IE5FVFdPUktfVElNRU9VVF9NUyxcblx0XHRcdH0pO1xuXHRcdFx0Y29uc3QgcmVtb3RlSGVhZCA9IGF3YWl0IHRoaXMuZ2V0UmVtb3RlR2l0SGVhZChpbnN0YWxsZWRQYXRoKTtcblx0XHRcdHJldHVybiBsb2NhbEhlYWQudHJpbSgpICE9PSByZW1vdGVIZWFkLnRyaW0oKTtcblx0XHR9IGNhdGNoIHtcblx0XHRcdHJldHVybiBmYWxzZTtcblx0XHR9XG5cdH1cblxuXHRwcml2YXRlIGFzeW5jIGdldFJlbW90ZUdpdEhlYWQoaW5zdGFsbGVkUGF0aDogc3RyaW5nKTogUHJvbWlzZTxzdHJpbmc+IHtcblx0XHRjb25zdCB1cHN0cmVhbVJlZiA9IGF3YWl0IHRoaXMuZ2V0R2l0VXBzdHJlYW1SZWYoaW5zdGFsbGVkUGF0aCk7XG5cdFx0aWYgKHVwc3RyZWFtUmVmKSB7XG5cdFx0XHRjb25zdCByZW1vdGVIZWFkID0gYXdhaXQgdGhpcy5ydW5HaXRSZW1vdGVDb21tYW5kKGluc3RhbGxlZFBhdGgsIFtcImxzLXJlbW90ZVwiLCBcIm9yaWdpblwiLCB1cHN0cmVhbVJlZl0pO1xuXHRcdFx0Y29uc3QgbWF0Y2ggPSByZW1vdGVIZWFkLm1hdGNoKC9eKFswLTlhLWZdezQwfSlcXHMrL20pO1xuXHRcdFx0aWYgKG1hdGNoPy5bMV0pIHtcblx0XHRcdFx0cmV0dXJuIG1hdGNoWzFdO1xuXHRcdFx0fVxuXHRcdH1cblxuXHRcdGNvbnN0IHJlbW90ZUhlYWQgPSBhd2FpdCB0aGlzLnJ1bkdpdFJlbW90ZUNvbW1hbmQoaW5zdGFsbGVkUGF0aCwgW1wibHMtcmVtb3RlXCIsIFwib3JpZ2luXCIsIFwiSEVBRFwiXSk7XG5cdFx0Y29uc3QgbWF0Y2ggPSByZW1vdGVIZWFkLm1hdGNoKC9eKFswLTlhLWZdezQwfSlcXHMrSEVBRCQvbSk7XG5cdFx0aWYgKCFtYXRjaD8uWzFdKSB7XG5cdFx0XHR0aHJvdyBuZXcgRXJyb3IoXCJGYWlsZWQgdG8gZGV0ZXJtaW5lIHJlbW90ZSBIRUFEXCIpO1xuXHRcdH1cblx0XHRyZXR1cm4gbWF0Y2hbMV07XG5cdH1cblxuXHRwcml2YXRlIGFzeW5jIGdldExvY2FsR2l0VXBkYXRlVGFyZ2V0KFxuXHRcdGluc3RhbGxlZFBhdGg6IHN0cmluZyxcblx0KTogUHJvbWlzZTx7IHJlZjogc3RyaW5nOyBoZWFkOiBzdHJpbmc7IGZldGNoQXJnczogc3RyaW5nW10gfT4ge1xuXHRcdHRyeSB7XG5cdFx0XHRjb25zdCB1cHN0cmVhbSA9IGF3YWl0IHRoaXMucnVuQ29tbWFuZENhcHR1cmUoXCJnaXRcIiwgW1wicmV2LXBhcnNlXCIsIFwiLS1hYmJyZXYtcmVmXCIsIFwiQHt1cHN0cmVhbX1cIl0sIHtcblx0XHRcdFx0Y3dkOiBpbnN0YWxsZWRQYXRoLFxuXHRcdFx0XHR0aW1lb3V0TXM6IE5FVFdPUktfVElNRU9VVF9NUyxcblx0XHRcdH0pO1xuXHRcdFx0Y29uc3QgdHJpbW1lZFVwc3RyZWFtID0gdXBzdHJlYW0udHJpbSgpO1xuXHRcdFx0aWYgKCF0cmltbWVkVXBzdHJlYW0uc3RhcnRzV2l0aChcIm9yaWdpbi9cIikpIHtcblx0XHRcdFx0dGhyb3cgbmV3IEVycm9yKGBVbnN1cHBvcnRlZCB1cHN0cmVhbSByZW1vdGU6ICR7dHJpbW1lZFVwc3RyZWFtfWApO1xuXHRcdFx0fVxuXHRcdFx0Y29uc3QgYnJhbmNoID0gdHJpbW1lZFVwc3RyZWFtLnNsaWNlKFwib3JpZ2luL1wiLmxlbmd0aCk7XG5cdFx0XHRpZiAoIWJyYW5jaCkge1xuXHRcdFx0XHR0aHJvdyBuZXcgRXJyb3IoXCJNaXNzaW5nIHVwc3RyZWFtIGJyYW5jaCBuYW1lXCIpO1xuXHRcdFx0fVxuXHRcdFx0Y29uc3QgaGVhZCA9IGF3YWl0IHRoaXMucnVuQ29tbWFuZENhcHR1cmUoXCJnaXRcIiwgW1wicmV2LXBhcnNlXCIsIFwiQHt1cHN0cmVhbX1cIl0sIHtcblx0XHRcdFx0Y3dkOiBpbnN0YWxsZWRQYXRoLFxuXHRcdFx0XHR0aW1lb3V0TXM6IE5FVFdPUktfVElNRU9VVF9NUyxcblx0XHRcdH0pO1xuXHRcdFx0cmV0dXJuIHtcblx0XHRcdFx0cmVmOiBcIkB7dXBzdHJlYW19XCIsXG5cdFx0XHRcdGhlYWQsXG5cdFx0XHRcdGZldGNoQXJnczogW1xuXHRcdFx0XHRcdFwiZmV0Y2hcIixcblx0XHRcdFx0XHRcIi0tcHJ1bmVcIixcblx0XHRcdFx0XHRcIi0tbm8tdGFnc1wiLFxuXHRcdFx0XHRcdFwib3JpZ2luXCIsXG5cdFx0XHRcdFx0YCtyZWZzL2hlYWRzLyR7YnJhbmNofTpyZWZzL3JlbW90ZXMvb3JpZ2luLyR7YnJhbmNofWAsXG5cdFx0XHRcdF0sXG5cdFx0XHR9O1xuXHRcdH0gY2F0Y2gge1xuXHRcdFx0YXdhaXQgdGhpcy5ydW5Db21tYW5kKFwiZ2l0XCIsIFtcInJlbW90ZVwiLCBcInNldC1oZWFkXCIsIFwib3JpZ2luXCIsIFwiLWFcIl0sIHsgY3dkOiBpbnN0YWxsZWRQYXRoIH0pLmNhdGNoKCgpID0+IHt9KTtcblx0XHRcdGNvbnN0IGhlYWQgPSBhd2FpdCB0aGlzLnJ1bkNvbW1hbmRDYXB0dXJlKFwiZ2l0XCIsIFtcInJldi1wYXJzZVwiLCBcIm9yaWdpbi9IRUFEXCJdLCB7XG5cdFx0XHRcdGN3ZDogaW5zdGFsbGVkUGF0aCxcblx0XHRcdFx0dGltZW91dE1zOiBORVRXT1JLX1RJTUVPVVRfTVMsXG5cdFx0XHR9KTtcblx0XHRcdGNvbnN0IG9yaWdpbkhlYWRSZWYgPSBhd2FpdCB0aGlzLnJ1bkNvbW1hbmRDYXB0dXJlKFwiZ2l0XCIsIFtcInN5bWJvbGljLXJlZlwiLCBcInJlZnMvcmVtb3Rlcy9vcmlnaW4vSEVBRFwiXSwge1xuXHRcdFx0XHRjd2Q6IGluc3RhbGxlZFBhdGgsXG5cdFx0XHRcdHRpbWVvdXRNczogTkVUV09SS19USU1FT1VUX01TLFxuXHRcdFx0fSkuY2F0Y2goKCkgPT4gXCJcIik7XG5cdFx0XHRjb25zdCBicmFuY2ggPSBvcmlnaW5IZWFkUmVmLnRyaW0oKS5yZXBsYWNlKC9ecmVmc1xcL3JlbW90ZXNcXC9vcmlnaW5cXC8vLCBcIlwiKTtcblx0XHRcdGlmIChicmFuY2gpIHtcblx0XHRcdFx0cmV0dXJuIHtcblx0XHRcdFx0XHRyZWY6IFwib3JpZ2luL0hFQURcIixcblx0XHRcdFx0XHRoZWFkLFxuXHRcdFx0XHRcdGZldGNoQXJnczogW1xuXHRcdFx0XHRcdFx0XCJmZXRjaFwiLFxuXHRcdFx0XHRcdFx0XCItLXBydW5lXCIsXG5cdFx0XHRcdFx0XHRcIi0tbm8tdGFnc1wiLFxuXHRcdFx0XHRcdFx0XCJvcmlnaW5cIixcblx0XHRcdFx0XHRcdGArcmVmcy9oZWFkcy8ke2JyYW5jaH06cmVmcy9yZW1vdGVzL29yaWdpbi8ke2JyYW5jaH1gLFxuXHRcdFx0XHRcdF0sXG5cdFx0XHRcdH07XG5cdFx0XHR9XG5cdFx0XHRyZXR1cm4ge1xuXHRcdFx0XHRyZWY6IFwib3JpZ2luL0hFQURcIixcblx0XHRcdFx0aGVhZCxcblx0XHRcdFx0ZmV0Y2hBcmdzOiBbXCJmZXRjaFwiLCBcIi0tcHJ1bmVcIiwgXCItLW5vLXRhZ3NcIiwgXCJvcmlnaW5cIiwgXCIrSEVBRDpyZWZzL3JlbW90ZXMvb3JpZ2luL0hFQURcIl0sXG5cdFx0XHR9O1xuXHRcdH1cblx0fVxuXG5cdHByaXZhdGUgYXN5bmMgZ2V0R2l0VXBzdHJlYW1SZWYoaW5zdGFsbGVkUGF0aDogc3RyaW5nKTogUHJvbWlzZTxzdHJpbmcgfCB1bmRlZmluZWQ+IHtcblx0XHR0cnkge1xuXHRcdFx0Y29uc3QgdXBzdHJlYW0gPSBhd2FpdCB0aGlzLnJ1bkNvbW1hbmRDYXB0dXJlKFwiZ2l0XCIsIFtcInJldi1wYXJzZVwiLCBcIi0tYWJicmV2LXJlZlwiLCBcIkB7dXBzdHJlYW19XCJdLCB7XG5cdFx0XHRcdGN3ZDogaW5zdGFsbGVkUGF0aCxcblx0XHRcdFx0dGltZW91dE1zOiBORVRXT1JLX1RJTUVPVVRfTVMsXG5cdFx0XHR9KTtcblx0XHRcdGNvbnN0IHRyaW1tZWQgPSB1cHN0cmVhbS50cmltKCk7XG5cdFx0XHRpZiAoIXRyaW1tZWQuc3RhcnRzV2l0aChcIm9yaWdpbi9cIikpIHtcblx0XHRcdFx0cmV0dXJuIHVuZGVmaW5lZDtcblx0XHRcdH1cblx0XHRcdGNvbnN0IGJyYW5jaCA9IHRyaW1tZWQuc2xpY2UoXCJvcmlnaW4vXCIubGVuZ3RoKTtcblx0XHRcdHJldHVybiBicmFuY2ggPyBgcmVmcy9oZWFkcy8ke2JyYW5jaH1gIDogdW5kZWZpbmVkO1xuXHRcdH0gY2F0Y2gge1xuXHRcdFx0cmV0dXJuIHVuZGVmaW5lZDtcblx0XHR9XG5cdH1cblxuXHRwcml2YXRlIHJ1bkdpdFJlbW90ZUNvbW1hbmQoaW5zdGFsbGVkUGF0aDogc3RyaW5nLCBhcmdzOiBzdHJpbmdbXSk6IFByb21pc2U8c3RyaW5nPiB7XG5cdFx0cmV0dXJuIHRoaXMucnVuQ29tbWFuZENhcHR1cmUoXCJnaXRcIiwgYXJncywge1xuXHRcdFx0Y3dkOiBpbnN0YWxsZWRQYXRoLFxuXHRcdFx0dGltZW91dE1zOiBORVRXT1JLX1RJTUVPVVRfTVMsXG5cdFx0XHRlbnY6IHtcblx0XHRcdFx0R0lUX1RFUk1JTkFMX1BST01QVDogXCIwXCIsXG5cdFx0XHR9LFxuXHRcdH0pO1xuXHR9XG5cblx0cHJpdmF0ZSBhc3luYyBydW5XaXRoQ29uY3VycmVuY3k8VD4odGFza3M6IEFycmF5PCgpID0+IFByb21pc2U8VD4+LCBsaW1pdDogbnVtYmVyKTogUHJvbWlzZTxUW10+IHtcblx0XHRpZiAodGFza3MubGVuZ3RoID09PSAwKSB7XG5cdFx0XHRyZXR1cm4gW107XG5cdFx0fVxuXG5cdFx0Y29uc3QgcmVzdWx0czogVFtdID0gbmV3IEFycmF5KHRhc2tzLmxlbmd0aCk7XG5cdFx0bGV0IG5leHRJbmRleCA9IDA7XG5cdFx0Y29uc3Qgd29ya2VyQ291bnQgPSBNYXRoLm1heCgxLCBNYXRoLm1pbihsaW1pdCwgdGFza3MubGVuZ3RoKSk7XG5cblx0XHRjb25zdCB3b3JrZXIgPSBhc3luYyAoKSA9PiB7XG5cdFx0XHR3aGlsZSAodHJ1ZSkge1xuXHRcdFx0XHRjb25zdCBpbmRleCA9IG5leHRJbmRleDtcblx0XHRcdFx0bmV4dEluZGV4ICs9IDE7XG5cdFx0XHRcdGlmIChpbmRleCA+PSB0YXNrcy5sZW5ndGgpIHtcblx0XHRcdFx0XHRyZXR1cm47XG5cdFx0XHRcdH1cblx0XHRcdFx0cmVzdWx0c1tpbmRleF0gPSBhd2FpdCB0YXNrc1tpbmRleF0oKTtcblx0XHRcdH1cblx0XHR9O1xuXG5cdFx0YXdhaXQgUHJvbWlzZS5hbGwoQXJyYXkuZnJvbSh7IGxlbmd0aDogd29ya2VyQ291bnQgfSwgKCkgPT4gd29ya2VyKCkpKTtcblx0XHRyZXR1cm4gcmVzdWx0cztcblx0fVxuXG5cdC8qKlxuXHQgKiBHZXQgYSB1bmlxdWUgaWRlbnRpdHkgZm9yIGEgcGFja2FnZSwgaWdub3JpbmcgdmVyc2lvbi9yZWYuXG5cdCAqIFVzZWQgdG8gZGV0ZWN0IHdoZW4gdGhlIHNhbWUgcGFja2FnZSBpcyBpbiBib3RoIGdsb2JhbCBhbmQgcHJvamVjdCBzZXR0aW5ncy5cblx0ICogRm9yIGdpdCBwYWNrYWdlcywgdXNlcyBub3JtYWxpemVkIGhvc3QvcGF0aCB0byBlbnN1cmUgU1NIIGFuZCBIVFRQUyBVUkxzXG5cdCAqIGZvciB0aGUgc2FtZSByZXBvc2l0b3J5IGFyZSB0cmVhdGVkIGFzIGlkZW50aWNhbC5cblx0ICovXG5cdHByaXZhdGUgZ2V0UGFja2FnZUlkZW50aXR5KHNvdXJjZTogc3RyaW5nLCBzY29wZT86IFNvdXJjZVNjb3BlKTogc3RyaW5nIHtcblx0XHRjb25zdCBwYXJzZWQgPSB0aGlzLnBhcnNlU291cmNlKHNvdXJjZSk7XG5cdFx0aWYgKHBhcnNlZC50eXBlID09PSBcIm5wbVwiKSB7XG5cdFx0XHRyZXR1cm4gYG5wbToke3BhcnNlZC5uYW1lfWA7XG5cdFx0fVxuXHRcdGlmIChwYXJzZWQudHlwZSA9PT0gXCJnaXRcIikge1xuXHRcdFx0Ly8gVXNlIGhvc3QvcGF0aCBmb3IgaWRlbnRpdHkgdG8gbm9ybWFsaXplIFNTSCBhbmQgSFRUUFNcblx0XHRcdHJldHVybiBgZ2l0OiR7cGFyc2VkLmhvc3R9LyR7cGFyc2VkLnBhdGh9YDtcblx0XHR9XG5cdFx0aWYgKHNjb3BlKSB7XG5cdFx0XHRjb25zdCBiYXNlRGlyID0gdGhpcy5nZXRCYXNlRGlyRm9yU2NvcGUoc2NvcGUpO1xuXHRcdFx0cmV0dXJuIGBsb2NhbDoke3RoaXMucmVzb2x2ZVBhdGhGcm9tQmFzZShwYXJzZWQucGF0aCwgYmFzZURpcil9YDtcblx0XHR9XG5cdFx0cmV0dXJuIGBsb2NhbDoke3RoaXMucmVzb2x2ZVBhdGgocGFyc2VkLnBhdGgpfWA7XG5cdH1cblxuXHQvKipcblx0ICogRGVkdXBlIHBhY2thZ2VzOiBpZiBzYW1lIHBhY2thZ2UgaWRlbnRpdHkgYXBwZWFycyBpbiBib3RoIGdsb2JhbCBhbmQgcHJvamVjdCxcblx0ICoga2VlcCBvbmx5IHRoZSBwcm9qZWN0IG9uZSAocHJvamVjdCB3aW5zKS5cblx0ICovXG5cdHByaXZhdGUgZGVkdXBlUGFja2FnZXMoXG5cdFx0cGFja2FnZXM6IEFycmF5PHsgcGtnOiBQYWNrYWdlU291cmNlOyBzY29wZTogU291cmNlU2NvcGUgfT4sXG5cdCk6IEFycmF5PHsgcGtnOiBQYWNrYWdlU291cmNlOyBzY29wZTogU291cmNlU2NvcGUgfT4ge1xuXHRcdGNvbnN0IHNlZW4gPSBuZXcgTWFwPHN0cmluZywgeyBwa2c6IFBhY2thZ2VTb3VyY2U7IHNjb3BlOiBTb3VyY2VTY29wZSB9PigpO1xuXG5cdFx0Zm9yIChjb25zdCBlbnRyeSBvZiBwYWNrYWdlcykge1xuXHRcdFx0Y29uc3Qgc291cmNlU3RyID0gdHlwZW9mIGVudHJ5LnBrZyA9PT0gXCJzdHJpbmdcIiA/IGVudHJ5LnBrZyA6IGVudHJ5LnBrZy5zb3VyY2U7XG5cdFx0XHRjb25zdCBpZGVudGl0eSA9IHRoaXMuZ2V0UGFja2FnZUlkZW50aXR5KHNvdXJjZVN0ciwgZW50cnkuc2NvcGUpO1xuXG5cdFx0XHRjb25zdCBleGlzdGluZyA9IHNlZW4uZ2V0KGlkZW50aXR5KTtcblx0XHRcdGlmICghZXhpc3RpbmcpIHtcblx0XHRcdFx0c2Vlbi5zZXQoaWRlbnRpdHksIGVudHJ5KTtcblx0XHRcdH0gZWxzZSBpZiAoZW50cnkuc2NvcGUgPT09IFwicHJvamVjdFwiICYmIGV4aXN0aW5nLnNjb3BlID09PSBcInVzZXJcIikge1xuXHRcdFx0XHQvLyBQcm9qZWN0IHdpbnMgb3ZlciB1c2VyXG5cdFx0XHRcdHNlZW4uc2V0KGlkZW50aXR5LCBlbnRyeSk7XG5cdFx0XHR9XG5cdFx0XHQvLyBJZiBleGlzdGluZyBpcyBwcm9qZWN0IGFuZCBuZXcgaXMgZ2xvYmFsLCBrZWVwIGV4aXN0aW5nIChwcm9qZWN0KVxuXHRcdFx0Ly8gSWYgYm90aCBhcmUgc2FtZSBzY29wZSwga2VlcCBmaXJzdCBvbmVcblx0XHR9XG5cblx0XHRyZXR1cm4gQXJyYXkuZnJvbShzZWVuLnZhbHVlcygpKTtcblx0fVxuXG5cdHByaXZhdGUgcGFyc2VOcG1TcGVjKHNwZWM6IHN0cmluZyk6IHsgbmFtZTogc3RyaW5nOyB2ZXJzaW9uPzogc3RyaW5nIH0ge1xuXHRcdGNvbnN0IG1hdGNoID0gc3BlYy5tYXRjaCgvXihAP1teQF0rKD86XFwvW15AXSspPykoPzpAKC4rKSk/JC8pO1xuXHRcdGlmICghbWF0Y2gpIHtcblx0XHRcdHJldHVybiB7IG5hbWU6IHNwZWMgfTtcblx0XHR9XG5cdFx0Y29uc3QgbmFtZSA9IG1hdGNoWzFdID8/IHNwZWM7XG5cdFx0Y29uc3QgdmVyc2lvbiA9IG1hdGNoWzJdO1xuXHRcdHJldHVybiB7IG5hbWUsIHZlcnNpb24gfTtcblx0fVxuXG5cdHByaXZhdGUgZ2V0TnBtQ29tbWFuZCgpOiB7IGNvbW1hbmQ6IHN0cmluZzsgYXJnczogc3RyaW5nW10gfSB7XG5cdFx0Y29uc3QgY29uZmlndXJlZENvbW1hbmQgPSB0aGlzLnNldHRpbmdzTWFuYWdlci5nZXROcG1Db21tYW5kKCk7XG5cdFx0aWYgKCFjb25maWd1cmVkQ29tbWFuZCB8fCBjb25maWd1cmVkQ29tbWFuZC5sZW5ndGggPT09IDApIHtcblx0XHRcdHJldHVybiB7IGNvbW1hbmQ6IFwibnBtXCIsIGFyZ3M6IFtdIH07XG5cdFx0fVxuXHRcdGNvbnN0IFtjb21tYW5kLCAuLi5hcmdzXSA9IGNvbmZpZ3VyZWRDb21tYW5kO1xuXHRcdGlmICghY29tbWFuZCkge1xuXHRcdFx0dGhyb3cgbmV3IEVycm9yKFwiSW52YWxpZCBucG1Db21tYW5kOiBmaXJzdCBhcnJheSBlbnRyeSBtdXN0IGJlIGEgbm9uLWVtcHR5IGNvbW1hbmRcIik7XG5cdFx0fVxuXHRcdHJldHVybiB7IGNvbW1hbmQsIGFyZ3MgfTtcblx0fVxuXG5cdHByaXZhdGUgYXN5bmMgcnVuTnBtQ29tbWFuZChhcmdzOiBzdHJpbmdbXSwgb3B0aW9ucz86IHsgY3dkPzogc3RyaW5nIH0pOiBQcm9taXNlPHZvaWQ+IHtcblx0XHRjb25zdCBucG1Db21tYW5kID0gdGhpcy5nZXROcG1Db21tYW5kKCk7XG5cdFx0YXdhaXQgdGhpcy5ydW5Db21tYW5kKG5wbUNvbW1hbmQuY29tbWFuZCwgWy4uLm5wbUNvbW1hbmQuYXJncywgLi4uYXJnc10sIG9wdGlvbnMpO1xuXHR9XG5cblx0cHJpdmF0ZSBnZXRHaXREZXBlbmRlbmN5SW5zdGFsbEFyZ3MoKTogc3RyaW5nW10ge1xuXHRcdGNvbnN0IGNvbmZpZ3VyZWRDb21tYW5kID0gdGhpcy5zZXR0aW5nc01hbmFnZXIuZ2V0TnBtQ29tbWFuZCgpO1xuXHRcdGlmIChjb25maWd1cmVkQ29tbWFuZCAmJiBjb25maWd1cmVkQ29tbWFuZC5sZW5ndGggPiAwKSB7XG5cdFx0XHRyZXR1cm4gW1wiaW5zdGFsbFwiXTtcblx0XHR9XG5cdFx0cmV0dXJuIFtcImluc3RhbGxcIiwgXCItLW9taXQ9ZGV2XCJdO1xuXHR9XG5cblx0cHJpdmF0ZSBydW5OcG1Db21tYW5kU3luYyhhcmdzOiBzdHJpbmdbXSk6IHN0cmluZyB7XG5cdFx0Y29uc3QgbnBtQ29tbWFuZCA9IHRoaXMuZ2V0TnBtQ29tbWFuZCgpO1xuXHRcdHJldHVybiB0aGlzLnJ1bkNvbW1hbmRTeW5jKG5wbUNvbW1hbmQuY29tbWFuZCwgWy4uLm5wbUNvbW1hbmQuYXJncywgLi4uYXJnc10pO1xuXHR9XG4iLCJ0cnVuY2F0ZWQiOnRydWUsInRydW5jYXRlZEJ5IjoiYnl0ZXMiLCJ0b3RhbExpbmVzIjoyNDQ1LCJ0b3RhbEJ5dGVzIjo3NDE2NCwib3V0cHV0TGluZXMiOjE2ODcsIm91dHB1dEJ5dGVzIjo1MTE1OCwibGFzdExpbmVQYXJ0aWFsIjpmYWxzZSwiZmlyc3RMaW5lRXhjZWVkc0xpbWl0IjpmYWxzZSwibWF4TGluZXMiOjIwMDAsIm1heEJ5dGVzIjo1MTIwMH19LCJpc0Vycm9yIjpmYWxzZSwidGltZXN0YW1wIjoxNzc3NTY0MjMyMTgwfX0seyJ0eXBlIjoibWVzc2FnZSIsImlkIjoiNTNiNjc2NWQiLCJwYXJlbnRJZCI6IjI2NTcyZGI5IiwidGltZXN0YW1wIjoiMjAyNi0wNC0zMFQxNTo1MDozMi4xODFaIiwibWVzc2FnZSI6eyJyb2xlIjoidG9vbFJlc3VsdCIsInRvb2xDYWxsSWQiOiJmdW5jdGlvbnMucmVhZDoxIiwidG9vbE5hbWUiOiJyZWFkIiwiY29udGVudCI6W3sidHlwZSI6InRleHQiLCJ0ZXh0IjoiLyoqXG4gKiBUVUkgY29tcG9uZW50IGZvciBtYW5hZ2luZyBwYWNrYWdlIHJlc291cmNlcyAoZW5hYmxlL2Rpc2FibGUpXG4gKi9cblxuaW1wb3J0IHsgYmFzZW5hbWUsIGRpcm5hbWUsIGpvaW4sIHJlbGF0aXZlIH0gZnJvbSBcIm5vZGU6cGF0aFwiO1xuaW1wb3J0IHtcblx0dHlwZSBDb21wb25lbnQsXG5cdENvbnRhaW5lcixcblx0dHlwZSBGb2N1c2FibGUsXG5cdGdldEtleWJpbmRpbmdzLFxuXHRJbnB1dCxcblx0bWF0Y2hlc0tleSxcblx0U3BhY2VyLFxuXHR0cnVuY2F0ZVRvV2lkdGgsXG5cdHZpc2libGVXaWR0aCxcbn0gZnJvbSBcIkBtYXJpb3plY2huZXIvcGktdHVpXCI7XG5pbXBvcnQgeyBDT05GSUdfRElSX05BTUUgfSBmcm9tIFwiLi4vLi4vLi4vY29uZmlnLmpzXCI7XG5pbXBvcnQgdHlwZSB7IFBhdGhNZXRhZGF0YSwgUmVzb2x2ZWRQYXRocywgUmVzb2x2ZWRSZXNvdXJjZSB9IGZyb20gXCIuLi8uLi8uLi9jb3JlL3BhY2thZ2UtbWFuYWdlci5qc1wiO1xuaW1wb3J0IHR5cGUgeyBQYWNrYWdlU291cmNlLCBTZXR0aW5nc01hbmFnZXIgfSBmcm9tIFwiLi4vLi4vLi4vY29yZS9zZXR0aW5ncy1tYW5hZ2VyLmpzXCI7XG5pbXBvcnQgeyB0aGVtZSB9IGZyb20gXCIuLi90aGVtZS90aGVtZS5qc1wiO1xuaW1wb3J0IHsgRHluYW1pY0JvcmRlciB9IGZyb20gXCIuL2R5bmFtaWMtYm9yZGVyLmpzXCI7XG5pbXBvcnQgeyByYXdLZXlIaW50IH0gZnJvbSBcIi4va2V5YmluZGluZy1oaW50cy5qc1wiO1xuXG50eXBlIFJlc291cmNlVHlwZSA9IFwiZXh0ZW5zaW9uc1wiIHwgXCJza2lsbHNcIiB8IFwicHJvbXB0c1wiIHwgXCJ0aGVtZXNcIjtcblxuY29uc3QgUkVTT1VSQ0VfVFlQRV9MQUJFTFM6IFJlY29yZDxSZXNvdXJjZVR5cGUsIHN0cmluZz4gPSB7XG5cdGV4dGVuc2lvbnM6IFwiRXh0ZW5zaW9uc1wiLFxuXHRza2lsbHM6IFwiU2tpbGxzXCIsXG5cdHByb21wdHM6IFwiUHJvbXB0c1wiLFxuXHR0aGVtZXM6IFwiVGhlbWVzXCIsXG59O1xuXG5pbnRlcmZhY2UgUmVzb3VyY2VJdGVtIHtcblx0cGF0aDogc3RyaW5nO1xuXHRlbmFibGVkOiBib29sZWFuO1xuXHRtZXRhZGF0YTogUGF0aE1ldGFkYXRhO1xuXHRyZXNvdXJjZVR5cGU6IFJlc291cmNlVHlwZTtcblx0ZGlzcGxheU5hbWU6IHN0cmluZztcblx0Z3JvdXBLZXk6IHN0cmluZztcblx0c3ViZ3JvdXBLZXk6IHN0cmluZztcbn1cblxuaW50ZXJmYWNlIFJlc291cmNlU3ViZ3JvdXAge1xuXHR0eXBlOiBSZXNvdXJjZVR5cGU7XG5cdGxhYmVsOiBzdHJpbmc7XG5cdGl0ZW1zOiBSZXNvdXJjZUl0ZW1bXTtcbn1cblxuaW50ZXJmYWNlIFJlc291cmNlR3JvdXAge1xuXHRrZXk6IHN0cmluZztcblx0bGFiZWw6IHN0cmluZztcblx0c2NvcGU6IFwidXNlclwiIHwgXCJwcm9qZWN0XCIgfCBcInRlbXBvcmFyeVwiO1xuXHRvcmlnaW46IFwicGFja2FnZVwiIHwgXCJ0b3AtbGV2ZWxcIjtcblx0c291cmNlOiBzdHJpbmc7XG5cdHN1Ymdyb3VwczogUmVzb3VyY2VTdWJncm91cFtdO1xufVxuXG5mdW5jdGlvbiBnZXRHcm91cExhYmVsKG1ldGFkYXRhOiBQYXRoTWV0YWRhdGEpOiBzdHJpbmcge1xuXHRpZiAobWV0YWRhdGEub3JpZ2luID09PSBcInBhY2thZ2VcIikge1xuXHRcdHJldHVybiBgJHttZXRhZGF0YS5zb3VyY2V9ICgke21ldGFkYXRhLnNjb3BlfSlgO1xuXHR9XG5cdC8vIFRvcC1sZXZlbCByZXNvdXJjZXNcblx0aWYgKG1ldGFkYXRhLnNvdXJjZSA9PT0gXCJhdXRvXCIpIHtcblx0XHRyZXR1cm4gbWV0YWRhdGEuc2NvcGUgPT09IFwidXNlclwiID8gXCJVc2VyICh+Ly5waS9hZ2VudC8pXCIgOiBcIlByb2plY3QgKC5waS8pXCI7XG5cdH1cblx0cmV0dXJuIG1ldGFkYXRhLnNjb3BlID09PSBcInVzZXJcIiA/IFwiVXNlciBzZXR0aW5nc1wiIDogXCJQcm9qZWN0IHNldHRpbmdzXCI7XG59XG5cbmZ1bmN0aW9uIGJ1aWxkR3JvdXBzKHJlc29sdmVkOiBSZXNvbHZlZFBhdGhzKTogUmVzb3VyY2VHcm91cFtdIHtcblx0Y29uc3QgZ3JvdXBNYXAgPSBuZXcgTWFwPHN0cmluZywgUmVzb3VyY2VHcm91cD4oKTtcblxuXHRjb25zdCBhZGRUb0dyb3VwID0gKHJlc291cmNlczogUmVzb2x2ZWRSZXNvdXJjZVtdLCByZXNvdXJjZVR5cGU6IFJlc291cmNlVHlwZSkgPT4ge1xuXHRcdGZvciAoY29uc3QgcmVzIG9mIHJlc291cmNlcykge1xuXHRcdFx0Y29uc3QgeyBwYXRoLCBlbmFibGVkLCBtZXRhZGF0YSB9ID0gcmVzO1xuXHRcdFx0Y29uc3QgZ3JvdXBLZXkgPSBgJHttZXRhZGF0YS5vcmlnaW59OiR7bWV0YWRhdGEuc2NvcGV9OiR7bWV0YWRhdGEuc291cmNlfWA7XG5cblx0XHRcdGlmICghZ3JvdXBNYXAuaGFzKGdyb3VwS2V5KSkge1xuXHRcdFx0XHRncm91cE1hcC5zZXQoZ3JvdXBLZXksIHtcblx0XHRcdFx0XHRrZXk6IGdyb3VwS2V5LFxuXHRcdFx0XHRcdGxhYmVsOiBnZXRHcm91cExhYmVsKG1ldGFkYXRhKSxcblx0XHRcdFx0XHRzY29wZTogbWV0YWRhdGEuc2NvcGUsXG5cdFx0XHRcdFx0b3JpZ2luOiBtZXRhZGF0YS5vcmlnaW4sXG5cdFx0XHRcdFx0c291cmNlOiBtZXRhZGF0YS5zb3VyY2UsXG5cdFx0XHRcdFx0c3ViZ3JvdXBzOiBbXSxcblx0XHRcdFx0fSk7XG5cdFx0XHR9XG5cblx0XHRcdGNvbnN0IGdyb3VwID0gZ3JvdXBNYXAuZ2V0KGdyb3VwS2V5KSE7XG5cdFx0XHRjb25zdCBzdWJncm91cEtleSA9IGAke2dyb3VwS2V5fToke3Jlc291cmNlVHlwZX1gO1xuXG5cdFx0XHRsZXQgc3ViZ3JvdXAgPSBncm91cC5zdWJncm91cHMuZmluZCgoc2cpID0+IHNnLnR5cGUgPT09IHJlc291cmNlVHlwZSk7XG5cdFx0XHRpZiAoIXN1Ymdyb3VwKSB7XG5cdFx0XHRcdHN1Ymdyb3VwID0ge1xuXHRcdFx0XHRcdHR5cGU6IHJlc291cmNlVHlwZSxcblx0XHRcdFx0XHRsYWJlbDogUkVTT1VSQ0VfVFlQRV9MQUJFTFNbcmVzb3VyY2VUeXBlXSxcblx0XHRcdFx0XHRpdGVtczogW10sXG5cdFx0XHRcdH07XG5cdFx0XHRcdGdyb3VwLnN1Ymdyb3Vwcy5wdXNoKHN1Ymdyb3VwKTtcblx0XHRcdH1cblxuXHRcdFx0Y29uc3QgZmlsZU5hbWUgPSBiYXNlbmFtZShwYXRoKTtcblx0XHRcdGNvbnN0IHBhcmVudEZvbGRlciA9IGJhc2VuYW1lKGRpcm5hbWUocGF0aCkpO1xuXHRcdFx0bGV0IGRpc3BsYXlOYW1lOiBzdHJpbmc7XG5cdFx0XHRpZiAocmVzb3VyY2VUeXBlID09PSBcImV4dGVuc2lvbnNcIiAmJiBwYXJlbnRGb2xkZXIgIT09IFwiZXh0ZW5zaW9uc1wiKSB7XG5cdFx0XHRcdGRpc3BsYXlOYW1lID0gYCR7cGFyZW50Rm9sZGVyfS8ke2ZpbGVOYW1lfWA7XG5cdFx0XHR9IGVsc2UgaWYgKHJlc291cmNlVHlwZSA9PT0gXCJza2lsbHNcIiAmJiBmaWxlTmFtZSA9PT0gXCJTS0lMTC5tZFwiKSB7XG5cdFx0XHRcdGRpc3BsYXlOYW1lID0gcGFyZW50Rm9sZGVyO1xuXHRcdFx0fSBlbHNlIHtcblx0XHRcdFx0ZGlzcGxheU5hbWUgPSBmaWxlTmFtZTtcblx0XHRcdH1cblx0XHRcdHN1Ymdyb3VwLml0ZW1zLnB1c2goe1xuXHRcdFx0XHRwYXRoLFxuXHRcdFx0XHRlbmFibGVkLFxuXHRcdFx0XHRtZXRhZGF0YSxcblx0XHRcdFx0cmVzb3VyY2VUeXBlLFxuXHRcdFx0XHRkaXNwbGF5TmFtZSxcblx0XHRcdFx0Z3JvdXBLZXksXG5cdFx0XHRcdHN1Ymdyb3VwS2V5LFxuXHRcdFx0fSk7XG5cdFx0fVxuXHR9O1xuXG5cdGFkZFRvR3JvdXAocmVzb2x2ZWQuZXh0ZW5zaW9ucywgXCJleHRlbnNpb25zXCIpO1xuXHRhZGRUb0dyb3VwKHJlc29sdmVkLnNraWxscywgXCJza2lsbHNcIik7XG5cdGFkZFRvR3JvdXAocmVzb2x2ZWQucHJvbXB0cywgXCJwcm9tcHRzXCIpO1xuXHRhZGRUb0dyb3VwKHJlc29sdmVkLnRoZW1lcywgXCJ0aGVtZXNcIik7XG5cblx0Ly8gU29ydCBncm91cHM6IHBhY2thZ2VzIGZpcnN0LCB0aGVuIHRvcC1sZXZlbDsgdXNlciBiZWZvcmUgcHJvamVjdFxuXHRjb25zdCBncm91cHMgPSBBcnJheS5mcm9tKGdyb3VwTWFwLnZhbHVlcygpKTtcblx0Z3JvdXBzLnNvcnQoKGEsIGIpID0+IHtcblx0XHRpZiAoYS5vcmlnaW4gIT09IGIub3JpZ2luKSB7XG5cdFx0XHRyZXR1cm4gYS5vcmlnaW4gPT09IFwicGFja2FnZVwiID8gLTEgOiAxO1xuXHRcdH1cblx0XHRpZiAoYS5zY29wZSAhPT0gYi5zY29wZSkge1xuXHRcdFx0cmV0dXJuIGEuc2NvcGUgPT09IFwidXNlclwiID8gLTEgOiAxO1xuXHRcdH1cblx0XHRyZXR1cm4gYS5zb3VyY2UubG9jYWxlQ29tcGFyZShiLnNvdXJjZSk7XG5cdH0pO1xuXG5cdC8vIFNvcnQgc3ViZ3JvdXBzIHdpdGhpbiBlYWNoIGdyb3VwIGJ5IHR5cGUgb3JkZXIsIGFuZCBpdGVtcyBieSBuYW1lXG5cdGNvbnN0IHR5cGVPcmRlcjogUmVjb3JkPFJlc291cmNlVHlwZSwgbnVtYmVyPiA9IHsgZXh0ZW5zaW9uczogMCwgc2tpbGxzOiAxLCBwcm9tcHRzOiAyLCB0aGVtZXM6IDMgfTtcblx0Zm9yIChjb25zdCBncm91cCBvZiBncm91cHMpIHtcblx0XHRncm91cC5zdWJncm91cHMuc29ydCgoYSwgYikgPT4gdHlwZU9yZGVyW2EudHlwZV0gLSB0eXBlT3JkZXJbYi50eXBlXSk7XG5cdFx0Zm9yIChjb25zdCBzdWJncm91cCBvZiBncm91cC5zdWJncm91cHMpIHtcblx0XHRcdHN1Ymdyb3VwLml0ZW1zLnNvcnQoKGEsIGIpID0+IGEuZGlzcGxheU5hbWUubG9jYWxlQ29tcGFyZShiLmRpc3BsYXlOYW1lKSk7XG5cdFx0fVxuXHR9XG5cblx0cmV0dXJuIGdyb3Vwcztcbn1cblxudHlwZSBGbGF0RW50cnkgPVxuXHR8IHsgdHlwZTogXCJncm91cFwiOyBncm91cDogUmVzb3VyY2VHcm91cCB9XG5cdHwgeyB0eXBlOiBcInN1Ymdyb3VwXCI7IHN1Ymdyb3VwOiBSZXNvdXJjZVN1Ymdyb3VwOyBncm91cDogUmVzb3VyY2VHcm91cCB9XG5cdHwgeyB0eXBlOiBcIml0ZW1cIjsgaXRlbTogUmVzb3VyY2VJdGVtIH07XG5cbmNsYXNzIENvbmZpZ1NlbGVjdG9ySGVhZGVyIGltcGxlbWVudHMgQ29tcG9uZW50IHtcblx0aW52YWxpZGF0ZSgpOiB2b2lkIHt9XG5cblx0cmVuZGVyKHdpZHRoOiBudW1iZXIpOiBzdHJpbmdbXSB7XG5cdFx0Y29uc3QgdGl0bGUgPSB0aGVtZS5ib2xkKFwiUmVzb3VyY2UgQ29uZmlndXJhdGlvblwiKTtcblx0XHRjb25zdCBzZXAgPSB0aGVtZS5mZyhcIm11dGVkXCIsIFwiIMK3IFwiKTtcblx0XHRjb25zdCBoaW50ID0gcmF3S2V5SGludChcInNwYWNlXCIsIFwidG9nZ2xlXCIpICsgc2VwICsgcmF3S2V5SGludChcImVzY1wiLCBcImNsb3NlXCIpO1xuXHRcdGNvbnN0IGhpbnRXaWR0aCA9IHZpc2libGVXaWR0aChoaW50KTtcblx0XHRjb25zdCB0aXRsZVdpZHRoID0gdmlzaWJsZVdpZHRoKHRpdGxlKTtcblx0XHRjb25zdCBzcGFjaW5nID0gTWF0aC5tYXgoMSwgd2lkdGggLSB0aXRsZVdpZHRoIC0gaGludFdpZHRoKTtcblxuXHRcdHJldHVybiBbXG5cdFx0XHR0cnVuY2F0ZVRvV2lkdGgoYCR7dGl0bGV9JHtcIiBcIi5yZXBlYXQoc3BhY2luZyl9JHtoaW50fWAsIHdpZHRoLCBcIlwiKSxcblx0XHRcdHRoZW1lLmZnKFwibXV0ZWRcIiwgXCJUeXBlIHRvIGZpbHRlciByZXNvdXJjZXNcIiksXG5cdFx0XTtcblx0fVxufVxuXG5jbGFzcyBSZXNvdXJjZUxpc3QgaW1wbGVtZW50cyBDb21wb25lbnQsIEZvY3VzYWJsZSB7XG5cdHByaXZhdGUgZ3JvdXBzOiBSZXNvdXJjZUdyb3VwW107XG5cdHByaXZhdGUgZmxhdEl0ZW1zOiBGbGF0RW50cnlbXSA9IFtdO1xuXHRwcml2YXRlIGZpbHRlcmVkSXRlbXM6IEZsYXRFbnRyeVtdID0gW107XG5cdHByaXZhdGUgc2VsZWN0ZWRJbmRleCA9IDA7XG5cdHByaXZhdGUgc2VhcmNoSW5wdXQ6IElucHV0O1xuXHRwcml2YXRlIG1heFZpc2libGUgPSAxNTtcblx0cHJpdmF0ZSBzZXR0aW5nc01hbmFnZXI6IFNldHRpbmdzTWFuYWdlcjtcblx0cHJpdmF0ZSBjd2Q6IHN0cmluZztcblx0cHJpdmF0ZSBhZ2VudERpcjogc3RyaW5nO1xuXG5cdHB1YmxpYyBvbkNhbmNlbD86ICgpID0+IHZvaWQ7XG5cdHB1YmxpYyBvbkV4aXQ/OiAoKSA9PiB2b2lkO1xuXHRwdWJsaWMgb25Ub2dnbGU/OiAoaXRlbTogUmVzb3VyY2VJdGVtLCBuZXdFbmFibGVkOiBib29sZWFuKSA9PiB2b2lkO1xuXG5cdHByaXZhdGUgX2ZvY3VzZWQgPSBmYWxzZTtcblx0Z2V0IGZvY3VzZWQoKTogYm9vbGVhbiB7XG5cdFx0cmV0dXJuIHRoaXMuX2ZvY3VzZWQ7XG5cdH1cblx0c2V0IGZvY3VzZWQodmFsdWU6IGJvb2xlYW4pIHtcblx0XHR0aGlzLl9mb2N1c2VkID0gdmFsdWU7XG5cdFx0dGhpcy5zZWFyY2hJbnB1dC5mb2N1c2VkID0gdmFsdWU7XG5cdH1cblxuXHRjb25zdHJ1Y3Rvcihncm91cHM6IFJlc291cmNlR3JvdXBbXSwgc2V0dGluZ3NNYW5hZ2VyOiBTZXR0aW5nc01hbmFnZXIsIGN3ZDogc3RyaW5nLCBhZ2VudERpcjogc3RyaW5nKSB7XG5cdFx0dGhpcy5ncm91cHMgPSBncm91cHM7XG5cdFx0dGhpcy5zZXR0aW5nc01hbmFnZXIgPSBzZXR0aW5nc01hbmFnZXI7XG5cdFx0dGhpcy5jd2QgPSBjd2Q7XG5cdFx0dGhpcy5hZ2VudERpciA9IGFnZW50RGlyO1xuXHRcdHRoaXMuc2VhcmNoSW5wdXQgPSBuZXcgSW5wdXQoKTtcblx0XHR0aGlzLmJ1aWxkRmxhdExpc3QoKTtcblx0XHR0aGlzLmZpbHRlcmVkSXRlbXMgPSBbLi4udGhpcy5mbGF0SXRlbXNdO1xuXHR9XG5cblx0cHJpdmF0ZSBidWlsZEZsYXRMaXN0KCk6IHZvaWQge1xuXHRcdHRoaXMuZmxhdEl0ZW1zID0gW107XG5cdFx0Zm9yIChjb25zdCBncm91cCBvZiB0aGlzLmdyb3Vwcykge1xuXHRcdFx0dGhpcy5mbGF0SXRlbXMucHVzaCh7IHR5cGU6IFwiZ3JvdXBcIiwgZ3JvdXAgfSk7XG5cdFx0XHRmb3IgKGNvbnN0IHN1Ymdyb3VwIG9mIGdyb3VwLnN1Ymdyb3Vwcykge1xuXHRcdFx0XHR0aGlzLmZsYXRJdGVtcy5wdXNoKHsgdHlwZTogXCJzdWJncm91cFwiLCBzdWJncm91cCwgZ3JvdXAgfSk7XG5cdFx0XHRcdGZvciAoY29uc3QgaXRlbSBvZiBzdWJncm91cC5pdGVtcykge1xuXHRcdFx0XHRcdHRoaXMuZmxhdEl0ZW1zLnB1c2goeyB0eXBlOiBcIml0ZW1cIiwgaXRlbSB9KTtcblx0XHRcdFx0fVxuXHRcdFx0fVxuXHRcdH1cblx0XHQvLyBTdGFydCBzZWxlY3Rpb24gb24gZmlyc3QgaXRlbSAobm90IGhlYWRlcilcblx0XHR0aGlzLnNlbGVjdGVkSW5kZXggPSB0aGlzLmZsYXRJdGVtcy5maW5kSW5kZXgoKGUpID0+IGUudHlwZSA9PT0gXCJpdGVtXCIpO1xuXHRcdGlmICh0aGlzLnNlbGVjdGVkSW5kZXggPCAwKSB0aGlzLnNlbGVjdGVkSW5kZXggPSAwO1xuXHR9XG5cblx0cHJpdmF0ZSBmaW5kTmV4dEl0ZW0oZnJvbUluZGV4OiBudW1iZXIsIGRpcmVjdGlvbjogMSB8IC0xKTogbnVtYmVyIHtcblx0XHRsZXQgaWR4ID0gZnJvbUluZGV4ICsgZGlyZWN0aW9uO1xuXHRcdHdoaWxlIChpZHggPj0gMCAmJiBpZHggPCB0aGlzLmZpbHRlcmVkSXRlbXMubGVuZ3RoKSB7XG5cdFx0XHRpZiAodGhpcy5maWx0ZXJlZEl0ZW1zW2lkeF0udHlwZSA9PT0gXCJpdGVtXCIpIHtcblx0XHRcdFx0cmV0dXJuIGlkeDtcblx0XHRcdH1cblx0XHRcdGlkeCArPSBkaXJlY3Rpb247XG5cdFx0fVxuXHRcdHJldHVybiBmcm9tSW5kZXg7IC8vIFN0YXkgYXQgY3VycmVudCBpZiBubyBpdGVtIGZvdW5kXG5cdH1cblxuXHRwcml2YXRlIGZpbHRlckl0ZW1zKHF1ZXJ5OiBzdHJpbmcpOiB2b2lkIHtcblx0XHRpZiAoIXF1ZXJ5LnRyaW0oKSkge1xuXHRcdFx0dGhpcy5maWx0ZXJlZEl0ZW1zID0gWy4uLnRoaXMuZmxhdEl0ZW1zXTtcblx0XHRcdHRoaXMuc2VsZWN0Rmlyc3RJdGVtKCk7XG5cdFx0XHRyZXR1cm47XG5cdFx0fVxuXG5cdFx0Y29uc3QgbG93ZXJRdWVyeSA9IHF1ZXJ5LnRvTG93ZXJDYXNlKCk7XG5cdFx0Y29uc3QgbWF0Y2hpbmdJdGVtcyA9IG5ldyBTZXQ8UmVzb3VyY2VJdGVtPigpO1xuXHRcdGNvbnN0IG1hdGNoaW5nU3ViZ3JvdXBzID0gbmV3IFNldDxSZXNvdXJjZVN1Ymdyb3VwPigpO1xuXHRcdGNvbnN0IG1hdGNoaW5nR3JvdXBzID0gbmV3IFNldDxSZXNvdXJjZUdyb3VwPigpO1xuXG5cdFx0Zm9yIChjb25zdCBlbnRyeSBvZiB0aGlzLmZsYXRJdGVtcykge1xuXHRcdFx0aWYgKGVudHJ5LnR5cGUgPT09IFwiaXRlbVwiKSB7XG5cdFx0XHRcdGNvbnN0IGl0ZW0gPSBlbnRyeS5pdGVtO1xuXHRcdFx0XHRpZiAoXG5cdFx0XHRcdFx0aXRlbS5kaXNwbGF5TmFtZS50b0xvd2VyQ2FzZSgpLmluY2x1ZGVzKGxvd2VyUXVlcnkpIHx8XG5cdFx0XHRcdFx0aXRlbS5yZXNvdXJjZVR5cGUudG9Mb3dlckNhc2UoKS5pbmNsdWRlcyhsb3dlclF1ZXJ5KSB8fFxuXHRcdFx0XHRcdGl0ZW0ucGF0aC50b0xvd2VyQ2FzZSgpLmluY2x1ZGVzKGxvd2VyUXVlcnkpXG5cdFx0XHRcdCkge1xuXHRcdFx0XHRcdG1hdGNoaW5nSXRlbXMuYWRkKGl0ZW0pO1xuXHRcdFx0XHR9XG5cdFx0XHR9XG5cdFx0fVxuXG5cdFx0Ly8gRmluZCB3aGljaCBzdWJncm91cHMgYW5kIGdyb3VwcyBjb250YWluIG1hdGNoaW5nIGl0ZW1zXG5cdFx0Zm9yIChjb25zdCBncm91cCBvZiB0aGlzLmdyb3Vwcykge1xuXHRcdFx0Zm9yIChjb25zdCBzdWJncm91cCBvZiBncm91cC5zdWJncm91cHMpIHtcblx0XHRcdFx0Zm9yIChjb25zdCBpdGVtIG9mIHN1Ymdyb3VwLml0ZW1zKSB7XG5cdFx0XHRcdFx0aWYgKG1hdGNoaW5nSXRlbXMuaGFzKGl0ZW0pKSB7XG5cdFx0XHRcdFx0XHRtYXRjaGluZ1N1Ymdyb3Vwcy5hZGQoc3ViZ3JvdXApO1xuXHRcdFx0XHRcdFx0bWF0Y2hpbmdHcm91cHMuYWRkKGdyb3VwKTtcblx0XHRcdFx0XHR9XG5cdFx0XHRcdH1cblx0XHRcdH1cblx0XHR9XG5cblx0XHR0aGlzLmZpbHRlcmVkSXRlbXMgPSBbXTtcblx0XHRmb3IgKGNvbnN0IGVudHJ5IG9mIHRoaXMuZmxhdEl0ZW1zKSB7XG5cdFx0XHRpZiAoZW50cnkudHlwZSA9PT0gXCJncm91cFwiICYmIG1hdGNoaW5nR3JvdXBzLmhhcyhlbnRyeS5ncm91cCkpIHtcblx0XHRcdFx0dGhpcy5maWx0ZXJlZEl0ZW1zLnB1c2goZW50cnkpO1xuXHRcdFx0fSBlbHNlIGlmIChlbnRyeS50eXBlID09PSBcInN1Ymdyb3VwXCIgJiYgbWF0Y2hpbmdTdWJncm91cHMuaGFzKGVudHJ5LnN1Ymdyb3VwKSkge1xuXHRcdFx0XHR0aGlzLmZpbHRlcmVkSXRlbXMucHVzaChlbnRyeSk7XG5cdFx0XHR9IGVsc2UgaWYgKGVudHJ5LnR5cGUgPT09IFwiaXRlbVwiICYmIG1hdGNoaW5nSXRlbXMuaGFzKGVudHJ5Lml0ZW0pKSB7XG5cdFx0XHRcdHRoaXMuZmlsdGVyZWRJdGVtcy5wdXNoKGVudHJ5KTtcblx0XHRcdH1cblx0XHR9XG5cblx0XHR0aGlzLnNlbGVjdEZpcnN0SXRlbSgpO1xuXHR9XG5cblx0cHJpdmF0ZSBzZWxlY3RGaXJzdEl0ZW0oKTogdm9pZCB7XG5cdFx0Y29uc3QgZmlyc3RJdGVtSW5kZXggPSB0aGlzLmZpbHRlcmVkSXRlbXMuZmluZEluZGV4KChlKSA9PiBlLnR5cGUgPT09IFwiaXRlbVwiKTtcblx0XHR0aGlzLnNlbGVjdGVkSW5kZXggPSBmaXJzdEl0ZW1JbmRleCA+PSAwID8gZmlyc3RJdGVtSW5kZXggOiAwO1xuXHR9XG5cblx0dXBkYXRlSXRlbShpdGVtOiBSZXNvdXJjZUl0ZW0sIGVuYWJsZWQ6IGJvb2xlYW4pOiB2b2lkIHtcblx0XHRpdGVtLmVuYWJsZWQgPSBlbmFibGVkO1xuXHRcdC8vIFVwZGF0ZSBpbiBncm91cHMgdG9vXG5cdFx0Zm9yIChjb25zdCBncm91cCBvZiB0aGlzLmdyb3Vwcykge1xuXHRcdFx0Zm9yIChjb25zdCBzdWJncm91cCBvZiBncm91cC5zdWJncm91cHMpIHtcblx0XHRcdFx0Y29uc3QgZm91bmQgPSBzdWJncm91cC5pdGVtcy5maW5kKChpKSA9PiBpLnBhdGggPT09IGl0ZW0ucGF0aCAmJiBpLnJlc291cmNlVHlwZSA9PT0gaXRlbS5yZXNvdXJjZVR5cGUpO1xuXHRcdFx0XHRpZiAoZm91bmQpIHtcblx0XHRcdFx0XHRmb3VuZC5lbmFibGVkID0gZW5hYmxlZDtcblx0XHRcdFx0XHRyZXR1cm47XG5cdFx0XHRcdH1cblx0XHRcdH1cblx0XHR9XG5cdH1cblxuXHRpbnZhbGlkYXRlKCk6IHZvaWQge31cblxuXHRyZW5kZXIod2lkdGg6IG51bWJlcik6IHN0cmluZ1tdIHtcblx0XHRjb25zdCBsaW5lczogc3RyaW5nW10gPSBbXTtcblxuXHRcdC8vIFNlYXJjaCBpbnB1dFxuXHRcdGxpbmVzLnB1c2goLi4udGhpcy5zZWFyY2hJbnB1dC5yZW5kZXIod2lkdGgpKTtcblx0XHRsaW5lcy5wdXNoKFwiXCIpO1xuXG5cdFx0aWYgKHRoaXMuZmlsdGVyZWRJdGVtcy5sZW5ndGggPT09IDApIHtcblx0XHRcdGxpbmVzLnB1c2godGhlbWUuZmcoXCJtdXRlZFwiLCBcIiAgTm8gcmVzb3VyY2VzIGZvdW5kXCIpKTtcblx0XHRcdHJldHVybiBsaW5lcztcblx0XHR9XG5cblx0XHQvLyBDYWxjdWxhdGUgdmlzaWJsZSByYW5nZVxuXHRcdGNvbnN0IHN0YXJ0SW5kZXggPSBNYXRoLm1heChcblx0XHRcdDAsXG5cdFx0XHRNYXRoLm1pbih0aGlzLnNlbGVjdGVkSW5kZXggLSBNYXRoLmZsb29yKHRoaXMubWF4VmlzaWJsZSAvIDIpLCB0aGlzLmZpbHRlcmVkSXRlbXMubGVuZ3RoIC0gdGhpcy5tYXhWaXNpYmxlKSxcblx0XHQpO1xuXHRcdGNvbnN0IGVuZEluZGV4ID0gTWF0aC5taW4oc3RhcnRJbmRleCArIHRoaXMubWF4VmlzaWJsZSwgdGhpcy5maWx0ZXJlZEl0ZW1zLmxlbmd0aCk7XG5cblx0XHRmb3IgKGxldCBpID0gc3RhcnRJbmRleDsgaSA8IGVuZEluZGV4OyBpKyspIHtcblx0XHRcdGNvbnN0IGVudHJ5ID0gdGhpcy5maWx0ZXJlZEl0ZW1zW2ldO1xuXHRcdFx0Y29uc3QgaXNTZWxlY3RlZCA9IGkgPT09IHRoaXMuc2VsZWN0ZWRJbmRleDtcblxuXHRcdFx0aWYgKGVudHJ5LnR5cGUgPT09IFwiZ3JvdXBcIikge1xuXHRcdFx0XHQvLyBNYWluIGdyb3VwIGhlYWRlciAobm8gY3Vyc29yKVxuXHRcdFx0XHRjb25zdCBncm91cExpbmUgPSB0aGVtZS5mZyhcImFjY2VudFwiLCB0aGVtZS5ib2xkKGVudHJ5Lmdyb3VwLmxhYmVsKSk7XG5cdFx0XHRcdGxpbmVzLnB1c2godHJ1bmNhdGVUb1dpZHRoKGAgICR7Z3JvdXBMaW5lfWAsIHdpZHRoLCBcIlwiKSk7XG5cdFx0XHR9IGVsc2UgaWYgKGVudHJ5LnR5cGUgPT09IFwic3ViZ3JvdXBcIikge1xuXHRcdFx0XHQvLyBTdWJncm91cCBoZWFkZXIgKGluZGVudGVkLCBubyBjdXJzb3IpXG5cdFx0XHRcdGNvbnN0IHN1Ymdyb3VwTGluZSA9IHRoZW1lLmZnKFwibXV0ZWRcIiwgZW50cnkuc3ViZ3JvdXAubGFiZWwpO1xuXHRcdFx0XHRsaW5lcy5wdXNoKHRydW5jYXRlVG9XaWR0aChgICAgICR7c3ViZ3JvdXBMaW5lfWAsIHdpZHRoLCBcIlwiKSk7XG5cdFx0XHR9IGVsc2Uge1xuXHRcdFx0XHQvLyBSZXNvdXJjZSBpdGVtIChjdXJzb3Igb25seSBvbiBpdGVtcylcblx0XHRcdFx0Y29uc3QgaXRlbSA9IGVudHJ5Lml0ZW07XG5cdFx0XHRcdGNvbnN0IGN1cnNvciA9IGlzU2VsZWN0ZWQgPyBcIj4gXCIgOiBcIiAgXCI7XG5cdFx0XHRcdGNvbnN0IGNoZWNrYm94ID0gaXRlbS5lbmFibGVkID8gdGhlbWUuZmcoXCJzdWNjZXNzXCIsIFwiW3hdXCIpIDogdGhlbWUuZmcoXCJkaW1cIiwgXCJbIF1cIik7XG5cdFx0XHRcdGNvbnN0IG5hbWUgPSBpc1NlbGVjdGVkID8gdGhlbWUuYm9sZChpdGVtLmRpc3BsYXlOYW1lKSA6IGl0ZW0uZGlzcGxheU5hbWU7XG5cdFx0XHRcdGxpbmVzLnB1c2godHJ1bmNhdGVUb1dpZHRoKGAke2N1cnNvcn0gICAgJHtjaGVja2JveH0gJHtuYW1lfWAsIHdpZHRoLCBcIi4uLlwiKSk7XG5cdFx0XHR9XG5cdFx0fVxuXG5cdFx0Ly8gU2Nyb2xsIGluZGljYXRvclxuXHRcdGlmIChzdGFydEluZGV4ID4gMCB8fCBlbmRJbmRleCA8IHRoaXMuZmlsdGVyZWRJdGVtcy5sZW5ndGgpIHtcblx0XHRcdGNvbnN0IGl0ZW1Db3VudCA9IHRoaXMuZmlsdGVyZWRJdGVtcy5maWx0ZXIoKGUpID0+IGUudHlwZSA9PT0gXCJpdGVtXCIpLmxlbmd0aDtcblx0XHRcdGNvbnN0IGN1cnJlbnRJdGVtSW5kZXggPVxuXHRcdFx0XHR0aGlzLmZpbHRlcmVkSXRlbXMuc2xpY2UoMCwgdGhpcy5zZWxlY3RlZEluZGV4KS5maWx0ZXIoKGUpID0+IGUudHlwZSA9PT0gXCJpdGVtXCIpLmxlbmd0aCArIDE7XG5cdFx0XHRsaW5lcy5wdXNoKHRoZW1lLmZnKFwiZGltXCIsIGAgICgke2N1cnJlbnRJdGVtSW5kZXh9LyR7aXRlbUNvdW50fSlgKSk7XG5cdFx0fVxuXG5cdFx0cmV0dXJuIGxpbmVzO1xuXHR9XG5cblx0aGFuZGxlSW5wdXQoZGF0YTogc3RyaW5nKTogdm9pZCB7XG5cdFx0Y29uc3Qga2IgPSBnZXRLZXliaW5kaW5ncygpO1xuXG5cdFx0aWYgKGtiLm1hdGNoZXMoZGF0YSwgXCJ0dWkuc2VsZWN0LnVwXCIpKSB7XG5cdFx0XHR0aGlzLnNlbGVjdGVkSW5kZXggPSB0aGlzLmZpbmROZXh0SXRlbSh0aGlzLnNlbGVjdGVkSW5kZXgsIC0xKTtcblx0XHRcdHJldHVybjtcblx0XHR9XG5cdFx0aWYgKGtiLm1hdGNoZXMoZGF0YSwgXCJ0dWkuc2VsZWN0LmRvd25cIikpIHtcblx0XHRcdHRoaXMuc2VsZWN0ZWRJbmRleCA9IHRoaXMuZmluZE5leHRJdGVtKHRoaXMuc2VsZWN0ZWRJbmRleCwgMSk7XG5cdFx0XHRyZXR1cm47XG5cdFx0fVxuXHRcdGlmIChrYi5tYXRjaGVzKGRhdGEsIFwidHVpLnNlbGVjdC5wYWdlVXBcIikpIHtcblx0XHRcdC8vIEp1bXAgdXAgYnkgbWF4VmlzaWJsZSwgdGhlbiBmaW5kIG5lYXJlc3QgaXRlbVxuXHRcdFx0bGV0IHRhcmdldCA9IE1hdGgubWF4KDAsIHRoaXMuc2VsZWN0ZWRJbmRleCAtIHRoaXMubWF4VmlzaWJsZSk7XG5cdFx0XHR3aGlsZSAodGFyZ2V0IDwgdGhpcy5maWx0ZXJlZEl0ZW1zLmxlbmd0aCAmJiB0aGlzLmZpbHRlcmVkSXRlbXNbdGFyZ2V0XS50eXBlICE9PSBcIml0ZW1cIikge1xuXHRcdFx0XHR0YXJnZXQrKztcblx0XHRcdH1cblx0XHRcdGlmICh0YXJnZXQgPCB0aGlzLmZpbHRlcmVkSXRlbXMubGVuZ3RoKSB7XG5cdFx0XHRcdHRoaXMuc2VsZWN0ZWRJbmRleCA9IHRhcmdldDtcblx0XHRcdH1cblx0XHRcdHJldHVybjtcblx0XHR9XG5cdFx0aWYgKGtiLm1hdGNoZXMoZGF0YSwgXCJ0dWkuc2VsZWN0LnBhZ2VEb3duXCIpKSB7XG5cdFx0XHQvLyBKdW1wIGRvd24gYnkgbWF4VmlzaWJsZSwgdGhlbiBmaW5kIG5lYXJlc3QgaXRlbVxuXHRcdFx0bGV0IHRhcmdldCA9IE1hdGgubWluKHRoaXMuZmlsdGVyZWRJdGVtcy5sZW5ndGggLSAxLCB0aGlzLnNlbGVjdGVkSW5kZXggKyB0aGlzLm1heFZpc2libGUpO1xuXHRcdFx0d2hpbGUgKHRhcmdldCA+PSAwICYmIHRoaXMuZmlsdGVyZWRJdGVtc1t0YXJnZXRdLnR5cGUgIT09IFwiaXRlbVwiKSB7XG5cdFx0XHRcdHRhcmdldC0tO1xuXHRcdFx0fVxuXHRcdFx0aWYgKHRhcmdldCA+PSAwKSB7XG5cdFx0XHRcdHRoaXMuc2VsZWN0ZWRJbmRleCA9IHRhcmdldDtcblx0XHRcdH1cblx0XHRcdHJldHVybjtcblx0XHR9XG5cdFx0aWYgKGtiLm1hdGNoZXMoZGF0YSwgXCJ0dWkuc2VsZWN0LmNhbmNlbFwiKSkge1xuXHRcdFx0dGhpcy5vbkNhbmNlbD8uKCk7XG5cdFx0XHRyZXR1cm47XG5cdFx0fVxuXHRcdGlmIChtYXRjaGVzS2V5KGRhdGEsIFwiY3RybCtjXCIpKSB7XG5cdFx0XHR0aGlzLm9uRXhpdD8uKCk7XG5cdFx0XHRyZXR1cm47XG5cdFx0fVxuXHRcdGlmIChkYXRhID09PSBcIiBcIiB8fCBrYi5tYXRjaGVzKGRhdGEsIFwidHVpLnNlbGVjdC5jb25maXJtXCIpKSB7XG5cdFx0XHRjb25zdCBlbnRyeSA9IHRoaXMuZmlsdGVyZWRJdGVtc1t0aGlzLnNlbGVjdGVkSW5kZXhdO1xuXHRcdFx0aWYgKGVudHJ5Py50eXBlID09PSBcIml0ZW1cIikge1xuXHRcdFx0XHRjb25zdCBuZXdFbmFibGVkID0gIWVudHJ5Lml0ZW0uZW5hYmxlZDtcblx0XHRcdFx0dGhpcy50b2dnbGVSZXNvdXJjZShlbnRyeS5pdGVtLCBuZXdFbmFibGVkKTtcblx0XHRcdFx0dGhpcy51cGRhdGVJdGVtKGVudHJ5Lml0ZW0sIG5ld0VuYWJsZWQpO1xuXHRcdFx0XHR0aGlzLm9uVG9nZ2xlPy4oZW50cnkuaXRlbSwgbmV3RW5hYmxlZCk7XG5cdFx0XHR9XG5cdFx0XHRyZXR1cm47XG5cdFx0fVxuXG5cdFx0Ly8gUGFzcyB0byBzZWFyY2ggaW5wdXRcblx0XHR0aGlzLnNlYXJjaElucHV0LmhhbmRsZUlucHV0KGRhdGEpO1xuXHRcdHRoaXMuZmlsdGVySXRlbXModGhpcy5zZWFyY2hJbnB1dC5nZXRWYWx1ZSgpKTtcblx0fVxuXG5cdHByaXZhdGUgdG9nZ2xlUmVzb3VyY2UoaXRlbTogUmVzb3VyY2VJdGVtLCBlbmFibGVkOiBib29sZWFuKTogdm9pZCB7XG5cdFx0aWYgKGl0ZW0ubWV0YWRhdGEub3JpZ2luID09PSBcInRvcC1sZXZlbFwiKSB7XG5cdFx0XHR0aGlzLnRvZ2dsZVRvcExldmVsUmVzb3VyY2UoaXRlbSwgZW5hYmxlZCk7XG5cdFx0fSBlbHNlIHtcblx0XHRcdHRoaXMudG9nZ2xlUGFja2FnZVJlc291cmNlKGl0ZW0sIGVuYWJsZWQpO1xuXHRcdH1cblx0fVxuXG5cdHByaXZhdGUgdG9nZ2xlVG9wTGV2ZWxSZXNvdXJjZShpdGVtOiBSZXNvdXJjZUl0ZW0sIGVuYWJsZWQ6IGJvb2xlYW4pOiB2b2lkIHtcblx0XHRjb25zdCBzY29wZSA9IGl0ZW0ubWV0YWRhdGEuc2NvcGUgYXMgXCJ1c2VyXCIgfCBcInByb2plY3RcIjtcblx0XHRjb25zdCBzZXR0aW5ncyA9XG5cdFx0XHRzY29wZSA9PT0gXCJwcm9qZWN0XCIgPyB0aGlzLnNldHRpbmdzTWFuYWdlci5nZXRQcm9qZWN0U2V0dGluZ3MoKSA6IHRoaXMuc2V0dGluZ3NNYW5hZ2VyLmdldEdsb2JhbFNldHRpbmdzKCk7XG5cblx0XHRjb25zdCBhcnJheUtleSA9IGl0ZW0ucmVzb3VyY2VUeXBlIGFzIFwiZXh0ZW5zaW9uc1wiIHwgXCJza2lsbHNcIiB8IFwicHJvbXB0c1wiIHwgXCJ0aGVtZXNcIjtcblx0XHRjb25zdCBjdXJyZW50ID0gKHNldHRpbmdzW2FycmF5S2V5XSA/PyBbXSkgYXMgc3RyaW5nW107XG5cblx0XHQvLyBHZW5lcmF0ZSBwYXR0ZXJuIGZvciB0aGlzIHJlc291cmNlXG5cdFx0Y29uc3QgcGF0dGVybiA9IHRoaXMuZ2V0UmVzb3VyY2VQYXR0ZXJuKGl0ZW0pO1xuXHRcdGNvbnN0IGRpc2FibGVQYXR0ZXJuID0gYC0ke3BhdHRlcm59YDtcblx0XHRjb25zdCBlbmFibGVQYXR0ZXJuID0gYCske3BhdHRlcm59YDtcblxuXHRcdC8vIEZpbHRlciBvdXQgZXhpc3RpbmcgcGF0dGVybnMgZm9yIHRoaXMgcmVzb3VyY2Vcblx0XHRjb25zdCB1cGRhdGVkID0gY3VycmVudC5maWx0ZXIoKHApID0+IHtcblx0XHRcdGNvbnN0IHN0cmlwcGVkID0gcC5zdGFydHNXaXRoKFwiIVwiKSB8fCBwLnN0YXJ0c1dpdGgoXCIrXCIpIHx8IHAuc3RhcnRzV2l0aChcIi1cIikgPyBwLnNsaWNlKDEpIDogcDtcblx0XHRcdHJldHVybiBzdHJpcHBlZCAhPT0gcGF0dGVybjtcblx0XHR9KTtcblxuXHRcdGlmIChlbmFibGVkKSB7XG5cdFx0XHR1cGRhdGVkLnB1c2goZW5hYmxlUGF0dGVybik7XG5cdFx0fSBlbHNlIHtcblx0XHRcdHVwZGF0ZWQucHVzaChkaXNhYmxlUGF0dGVybik7XG5cdFx0fVxuXG5cdFx0aWYgKHNjb3BlID09PSBcInByb2plY3RcIikge1xuXHRcdFx0aWYgKGFycmF5S2V5ID09PSBcImV4dGVuc2lvbnNcIikge1xuXHRcdFx0XHR0aGlzLnNldHRpbmdzTWFuYWdlci5zZXRQcm9qZWN0RXh0ZW5zaW9uUGF0aHModXBkYXRlZCk7XG5cdFx0XHR9IGVsc2UgaWYgKGFycmF5S2V5ID09PSBcInNraWxsc1wiKSB7XG5cdFx0XHRcdHRoaXMuc2V0dGluZ3NNYW5hZ2VyLnNldFByb2plY3RTa2lsbFBhdGhzKHVwZGF0ZWQpO1xuXHRcdFx0fSBlbHNlIGlmIChhcnJheUtleSA9PT0gXCJwcm9tcHRzXCIpIHtcblx0XHRcdFx0dGhpcy5zZXR0aW5nc01hbmFnZXIuc2V0UHJvamVjdFByb21wdFRlbXBsYXRlUGF0aHModXBkYXRlZCk7XG5cdFx0XHR9IGVsc2UgaWYgKGFycmF5S2V5ID09PSBcInRoZW1lc1wiKSB7XG5cdFx0XHRcdHRoaXMuc2V0dGluZ3NNYW5hZ2VyLnNldFByb2plY3RUaGVtZVBhdGhzKHVwZGF0ZWQpO1xuXHRcdFx0fVxuXHRcdH0gZWxzZSB7XG5cdFx0XHRpZiAoYXJyYXlLZXkgPT09IFwiZXh0ZW5zaW9uc1wiKSB7XG5cdFx0XHRcdHRoaXMuc2V0dGluZ3NNYW5hZ2VyLnNldEV4dGVuc2lvblBhdGhzKHVwZGF0ZWQpO1xuXHRcdFx0fSBlbHNlIGlmIChhcnJheUtleSA9PT0gXCJza2lsbHNcIikge1xuXHRcdFx0XHR0aGlzLnNldHRpbmdzTWFuYWdlci5zZXRTa2lsbFBhdGhzKHVwZGF0ZWQpO1xuXHRcdFx0fSBlbHNlIGlmIChhcnJheUtleSA9PT0gXCJwcm9tcHRzXCIpIHtcblx0XHRcdFx0dGhpcy5zZXR0aW5nc01hbmFnZXIuc2V0UHJvbXB0VGVtcGxhdGVQYXRocyh1cGRhdGVkKTtcblx0XHRcdH0gZWxzZSBpZiAoYXJyYXlLZXkgPT09IFwidGhlbWVzXCIpIHtcblx0XHRcdFx0dGhpcy5zZXR0aW5nc01hbmFnZXIuc2V0VGhlbWVQYXRocyh1cGRhdGVkKTtcblx0XHRcdH1cblx0XHR9XG5cdH1cblxuXHRwcml2YXRlIHRvZ2dsZVBhY2thZ2VSZXNvdXJjZShpdGVtOiBSZXNvdXJjZUl0ZW0sIGVuYWJsZWQ6IGJvb2xlYW4pOiB2b2lkIHtcblx0XHRjb25zdCBzY29wZSA9IGl0ZW0ubWV0YWRhdGEuc2NvcGUgYXMgXCJ1c2VyXCIgfCBcInByb2plY3RcIjtcblx0XHRjb25zdCBzZXR0aW5ncyA9XG5cdFx0XHRzY29wZSA9PT0gXCJwcm9qZWN0XCIgPyB0aGlzLnNldHRpbmdzTWFuYWdlci5nZXRQcm9qZWN0U2V0dGluZ3MoKSA6IHRoaXMuc2V0dGluZ3NNYW5hZ2VyLmdldEdsb2JhbFNldHRpbmdzKCk7XG5cblx0XHRjb25zdCBwYWNrYWdlcyA9IFsuLi4oc2V0dGluZ3MucGFja2FnZXMgPz8gW10pXSBhcyBQYWNrYWdlU291cmNlW107XG5cdFx0Y29uc3QgcGtnSW5kZXggPSBwYWNrYWdlcy5maW5kSW5kZXgoKHBrZykgPT4ge1xuXHRcdFx0Y29uc3Qgc291cmNlID0gdHlwZW9mIHBrZyA9PT0gXCJzdHJpbmdcIiA/IHBrZyA6IHBrZy5zb3VyY2U7XG5cdFx0XHRyZXR1cm4gc291cmNlID09PSBpdGVtLm1ldGFkYXRhLnNvdXJjZTtcblx0XHR9KTtcblxuXHRcdGlmIChwa2dJbmRleCA9PT0gLTEpIHJldHVybjtcblxuXHRcdGxldCBwa2cgPSBwYWNrYWdlc1twa2dJbmRleF07XG5cblx0XHQvLyBDb252ZXJ0IHN0cmluZyB0byBvYmplY3QgZm9ybSBpZiBuZWVkZWRcblx0XHRpZiAodHlwZW9mIHBrZyA9PT0gXCJzdHJpbmdcIikge1xuXHRcdFx0cGtnID0geyBzb3VyY2U6IHBrZyB9O1xuXHRcdFx0cGFja2FnZXNbcGtnSW5kZXhdID0gcGtnO1xuXHRcdH1cblxuXHRcdC8vIEdldCB0aGUgcmVzb3VyY2UgYXJyYXkgZm9yIHRoaXMgdHlwZVxuXHRcdGNvbnN0IGFycmF5S2V5ID0gaXRlbS5yZXNvdXJjZVR5cGUgYXMgXCJleHRlbnNpb25zXCIgfCBcInNraWxsc1wiIHwgXCJwcm9tcHRzXCIgfCBcInRoZW1lc1wiO1xuXHRcdGNvbnN0IGN1cnJlbnQgPSAocGtnW2FycmF5S2V5XSA/PyBbXSkgYXMgc3RyaW5nW107XG5cblx0XHQvLyBHZW5lcmF0ZSBwYXR0ZXJuIHJlbGF0aXZlIHRvIHBhY2thZ2Ugcm9vdFxuXHRcdGNvbnN0IHBhdHRlcm4gPSB0aGlzLmdldFBhY2thZ2VSZXNvdXJjZVBhdHRlcm4oaXRlbSk7XG5cdFx0Y29uc3QgZGlzYWJsZVBhdHRlcm4gPSBgLSR7cGF0dGVybn1gO1xuXHRcdGNvbnN0IGVuYWJsZVBhdHRlcm4gPSBgKyR7cGF0dGVybn1gO1xuXG5cdFx0Ly8gRmlsdGVyIG91dCBleGlzdGluZyBwYXR0ZXJucyBmb3IgdGhpcyByZXNvdXJjZVxuXHRcdGNvbnN0IHVwZGF0ZWQgPSBjdXJyZW50LmZpbHRlcigocCkgPT4ge1xuXHRcdFx0Y29uc3Qgc3RyaXBwZWQgPSBwLnN0YXJ0c1dpdGgoXCIhXCIpIHx8IHAuc3RhcnRzV2l0aChcIitcIikgfHwgcC5zdGFydHNXaXRoKFwiLVwiKSA/IHAuc2xpY2UoMSkgOiBwO1xuXHRcdFx0cmV0dXJuIHN0cmlwcGVkICE9PSBwYXR0ZXJuO1xuXHRcdH0pO1xuXG5cdFx0aWYgKGVuYWJsZWQpIHtcblx0XHRcdHVwZGF0ZWQucHVzaChlbmFibGVQYXR0ZXJuKTtcblx0XHR9IGVsc2Uge1xuXHRcdFx0dXBkYXRlZC5wdXNoKGRpc2FibGVQYXR0ZXJuKTtcblx0XHR9XG5cblx0XHQocGtnIGFzIFJlY29yZDxzdHJpbmcsIHVua25vd24+KVthcnJheUtleV0gPSB1cGRhdGVkLmxlbmd0aCA+IDAgPyB1cGRhdGVkIDogdW5kZWZpbmVkO1xuXG5cdFx0Ly8gQ2xlYW4gdXAgZW1wdHkgZmlsdGVyIG9iamVjdFxuXHRcdGNvbnN0IGhhc0ZpbHRlcnMgPSBbXCJleHRlbnNpb25zXCIsIFwic2tpbGxzXCIsIFwicHJvbXB0c1wiLCBcInRoZW1lc1wiXS5zb21lKFxuXHRcdFx0KGspID0+IChwa2cgYXMgUmVjb3JkPHN0cmluZywgdW5rbm93bj4pW2tdICE9PSB1bmRlZmluZWQsXG5cdFx0KTtcblx0XHRpZiAoIWhhc0ZpbHRlcnMpIHtcblx0XHRcdHBhY2thZ2VzW3BrZ0luZGV4XSA9IChwa2cgYXMgeyBzb3VyY2U6IHN0cmluZyB9KS5zb3VyY2U7XG5cdFx0fVxuXG5cdFx0aWYgKHNjb3BlID09PSBcInByb2plY3RcIikge1xuXHRcdFx0dGhpcy5zZXR0aW5nc01hbmFnZXIuc2V0UHJvamVjdFBhY2thZ2VzKHBhY2thZ2VzKTtcblx0XHR9IGVsc2Uge1xuXHRcdFx0dGhpcy5zZXR0aW5nc01hbmFnZXIuc2V0UGFja2FnZXMocGFja2FnZXMpO1xuXHRcdH1cblx0fVxuXG5cdHByaXZhdGUgZ2V0VG9wTGV2ZWxCYXNlRGlyKHNjb3BlOiBcInVzZXJcIiB8IFwicHJvamVjdFwiKTogc3RyaW5nIHtcblx0XHRyZXR1cm4gc2NvcGUgPT09IFwicHJvamVjdFwiID8gam9pbih0aGlzLmN3ZCwgQ09ORklHX0RJUl9OQU1FKSA6IHRoaXMuYWdlbnREaXI7XG5cdH1cblxuXHRwcml2YXRlIGdldFJlc291cmNlUGF0dGVybihpdGVtOiBSZXNvdXJjZUl0ZW0pOiBzdHJpbmcge1xuXHRcdGNvbnN0IHNjb3BlID0gaXRlbS5tZXRhZGF0YS5zY29wZSBhcyBcInVzZXJcIiB8IFwicHJvamVjdFwiO1xuXHRcdGNvbnN0IGJhc2VEaXIgPSB0aGlzLmdldFRvcExldmVsQmFzZURpcihzY29wZSk7XG5cdFx0cmV0dXJuIHJlbGF0aXZlKGJhc2VEaXIsIGl0ZW0ucGF0aCk7XG5cdH1cblxuXHRwcml2YXRlIGdldFBhY2thZ2VSZXNvdXJjZVBhdHRlcm4oaXRlbTogUmVzb3VyY2VJdGVtKTogc3RyaW5nIHtcblx0XHRjb25zdCBiYXNlRGlyID0gaXRlbS5tZXRhZGF0YS5iYXNlRGlyID8/IGRpcm5hbWUoaXRlbS5wYXRoKTtcblx0XHRyZXR1cm4gcmVsYXRpdmUoYmFzZURpciwgaXRlbS5wYXRoKTtcblx0fVxufVxuXG5leHBvcnQgY2xhc3MgQ29uZmlnU2VsZWN0b3JDb21wb25lbnQgZXh0ZW5kcyBDb250YWluZXIgaW1wbGVtZW50cyBGb2N1c2FibGUge1xuXHRwcml2YXRlIHJlc291cmNlTGlzdDogUmVzb3VyY2VMaXN0O1xuXG5cdHByaXZhdGUgX2ZvY3VzZWQgPSBmYWxzZTtcblx0Z2V0IGZvY3VzZWQoKTogYm9vbGVhbiB7XG5cdFx0cmV0dXJuIHRoaXMuX2ZvY3VzZWQ7XG5cdH1cblx0c2V0IGZvY3VzZWQodmFsdWU6IGJvb2xlYW4pIHtcblx0XHR0aGlzLl9mb2N1c2VkID0gdmFsdWU7XG5cdFx0dGhpcy5yZXNvdXJjZUxpc3QuZm9jdXNlZCA9IHZhbHVlO1xuXHR9XG5cblx0Y29uc3RydWN0b3IoXG5cdFx0cmVzb2x2ZWRQYXRoczogUmVzb2x2ZWRQYXRocyxcblx0XHRzZXR0aW5nc01hbmFnZXI6IFNldHRpbmdzTWFuYWdlcixcblx0XHRjd2Q6IHN0cmluZyxcblx0XHRhZ2VudERpcjogc3RyaW5nLFxuXHRcdG9uQ2xvc2U6ICgpID0+IHZvaWQsXG5cdFx0b25FeGl0OiAoKSA9PiB2b2lkLFxuXHRcdHJlcXVlc3RSZW5kZXI6ICgpID0+IHZvaWQsXG5cdCkge1xuXHRcdHN1cGVyKCk7XG5cblx0XHRjb25zdCBncm91cHMgPSBidWlsZEdyb3VwcyhyZXNvbHZlZFBhdGhzKTtcblxuXHRcdC8vIEFkZCBoZWFkZXJcblx0XHR0aGlzLmFkZENoaWxkKG5ldyBTcGFjZXIoMSkpO1xuXHRcdHRoaXMuYWRkQ2hpbGQobmV3IER5bmFtaWNCb3JkZXIoKSk7XG5cdFx0dGhpcy5hZGRDaGlsZChuZXcgU3BhY2VyKDEpKTtcblx0XHR0aGlzLmFkZENoaWxkKG5ldyBDb25maWdTZWxlY3RvckhlYWRlcigpKTtcblx0XHR0aGlzLmFkZENoaWxkKG5ldyBTcGFjZXIoMSkpO1xuXG5cdFx0Ly8gUmVzb3VyY2UgbGlzdFxuXHRcdHRoaXMucmVzb3VyY2VMaXN0ID0gbmV3IFJlc291cmNlTGlzdChncm91cHMsIHNldHRpbmdzTWFuYWdlciwgY3dkLCBhZ2VudERpcik7XG5cdFx0dGhpcy5yZXNvdXJjZUxpc3Qub25DYW5jZWwgPSBvbkNsb3NlO1xuXHRcdHRoaXMucmVzb3VyY2VMaXN0Lm9uRXhpdCA9IG9uRXhpdDtcblx0XHR0aGlzLnJlc291cmNlTGlzdC5vblRvZ2dsZSA9ICgpID0+IHJlcXVlc3RSZW5kZXIoKTtcblx0XHR0aGlzLmFkZENoaWxkKHRoaXMucmVzb3VyY2VMaXN0KTtcblxuXHRcdC8vIEJvdHRvbSBib3JkZXJcblx0XHR0aGlzLmFkZENoaWxkKG5ldyBTcGFjZXIoMSkpO1xuXHRcdHRoaXMuYWRkQ2hpbGQobmV3IER5bmFtaWNCb3JkZXIoKSk7XG5cdH1cblxuXHRnZXRSZXNvdXJjZUxpc3QoKTogUmVzb3VyY2VMaXN0IHtcblx0XHRyZXR1cm4gdGhpcy5yZXNvdXJjZUxpc3Q7XG5cdH1cbn1cbiJ9XSwiaXNFcnJvciI6ZmFsc2UsInRpbWVzdGFtcCI6MTc3NzU2NDIzMjE4MH19LHsidHlwZSI6Im1lc3NhZ2UiLCJpZCI6IjdjZjFkY2UzIiwicGFyZW50SWQiOiI1M2I2NzY1ZCIsInRpbWVzdGFtcCI6IjIwMjYtMDQtMzBUMTU6NTA6MzUuMzczWiIsIm1lc3NhZ2UiOnsicm9sZSI6ImFzc2lzdGFudCIsImNvbnRlbnQiOlt7InR5cGUiOiJ0aGlua2luZyIsInRoaW5raW5nIjoiIExldCBtZSBjb250aW51ZSByZWFkaW5nIHRoZSBwYWNrYWdlLW1hbmFnZXIudHMgZmlsZSB0byBzZWUgdGhlIGBhZGRBdXRvRGlzY292ZXJlZFJlc291cmNlc2AgbWV0aG9kOiIsInRoaW5raW5nU2lnbmF0dXJlIjoicmVhc29uaW5nIn0seyJ0eXBlIjoidG9vbENhbGwiLCJpZCI6ImZ1bmN0aW9ucy5yZWFkOjMiLCJuYW1lIjoicmVhZCIsImFyZ3VtZW50cyI6eyJwYXRoIjoicGFja2FnZXMvY29kaW5nLWFnZW50L3NyYy9jb3JlL3BhY2thZ2UtbWFuYWdlci50cyIsIm9mZnNldCI6MTY4OH19XSwiYXBpIjoib3BlbmFpLWNvbXBsZXRpb25zIiwicHJvdmlkZXIiOiJzeW50aGV0aWMiLCJtb2RlbCI6ImhmOm1vb25zaG90YWkvS2ltaS1LMi41IiwidXNhZ2UiOnsiaW5wdXQiOjE3NjczLCJvdXRwdXQiOjUzLCJjYWNoZVJlYWQiOjExODQwLCJjYWNoZVdyaXRlIjowLCJ0b3RhbFRva2VucyI6Mjk1NjYsImNvc3QiOnsiaW5wdXQiOjAuMDA3OTUyODUwMDAwMDAwMDAxLCJvdXRwdXQiOjAuMDAwMTgwMjAwMDAwMDAwMDAwMDIsImNhY2hlUmVhZCI6MC4wMDUzMjgsImNhY2hlV3JpdGUiOjAsInRvdGFsIjowLjAxMzQ2MTA1MDAwMDAwMDAwMn19LCJzdG9wUmVhc29uIjoidG9vbFVzZSIsInRpbWVzdGFtcCI6MTc3NzU2NDIzMjE4MSwicmVzcG9uc2VJZCI6ImNoYXRjbXBsLWI0N2VmYTU2OTE3YTM5MjAifX0seyJ0eXBlIjoibWVzc2FnZSIsImlkIjoiYjkxMjI2MmEiLCJwYXJlbnRJZCI6IjdjZjFkY2UzIiwidGltZXN0YW1wIjoiMjAyNi0wNC0zMFQxNTo1MDozNS4zODNaIiwibWVzc2FnZSI6eyJyb2xlIjoidG9vbFJlc3VsdCIsInRvb2xDYWxsSWQiOiJmdW5jdGlvbnMucmVhZDozIiwidG9vbE5hbWUiOiJyZWFkIiwiY29udGVudCI6W3sidHlwZSI6InRleHQiLCJ0ZXh0IjoiXHRwcml2YXRlIGFzeW5jIGluc3RhbGxOcG0oc291cmNlOiBOcG1Tb3VyY2UsIHNjb3BlOiBTb3VyY2VTY29wZSwgdGVtcG9yYXJ5OiBib29sZWFuKTogUHJvbWlzZTx2b2lkPiB7XG5cdFx0aWYgKHNjb3BlID09PSBcInVzZXJcIiAmJiAhdGVtcG9yYXJ5KSB7XG5cdFx0XHRhd2FpdCB0aGlzLnJ1bk5wbUNvbW1hbmQoW1wiaW5zdGFsbFwiLCBcIi1nXCIsIHNvdXJjZS5zcGVjXSk7XG5cdFx0XHRyZXR1cm47XG5cdFx0fVxuXHRcdGNvbnN0IGluc3RhbGxSb290ID0gdGhpcy5nZXROcG1JbnN0YWxsUm9vdChzY29wZSwgdGVtcG9yYXJ5KTtcblx0XHR0aGlzLmVuc3VyZU5wbVByb2plY3QoaW5zdGFsbFJvb3QpO1xuXHRcdGF3YWl0IHRoaXMucnVuTnBtQ29tbWFuZChbXCJpbnN0YWxsXCIsIHNvdXJjZS5zcGVjLCBcIi0tcHJlZml4XCIsIGluc3RhbGxSb290XSk7XG5cdH1cblxuXHRwcml2YXRlIGFzeW5jIHVuaW5zdGFsbE5wbShzb3VyY2U6IE5wbVNvdXJjZSwgc2NvcGU6IFNvdXJjZVNjb3BlKTogUHJvbWlzZTx2b2lkPiB7XG5cdFx0aWYgKHNjb3BlID09PSBcInVzZXJcIikge1xuXHRcdFx0YXdhaXQgdGhpcy5ydW5OcG1Db21tYW5kKFtcInVuaW5zdGFsbFwiLCBcIi1nXCIsIHNvdXJjZS5uYW1lXSk7XG5cdFx0XHRyZXR1cm47XG5cdFx0fVxuXHRcdGNvbnN0IGluc3RhbGxSb290ID0gdGhpcy5nZXROcG1JbnN0YWxsUm9vdChzY29wZSwgZmFsc2UpO1xuXHRcdGlmICghZXhpc3RzU3luYyhpbnN0YWxsUm9vdCkpIHtcblx0XHRcdHJldHVybjtcblx0XHR9XG5cdFx0YXdhaXQgdGhpcy5ydW5OcG1Db21tYW5kKFtcInVuaW5zdGFsbFwiLCBzb3VyY2UubmFtZSwgXCItLXByZWZpeFwiLCBpbnN0YWxsUm9vdF0pO1xuXHR9XG5cblx0cHJpdmF0ZSBhc3luYyBpbnN0YWxsR2l0KHNvdXJjZTogR2l0U291cmNlLCBzY29wZTogU291cmNlU2NvcGUpOiBQcm9taXNlPHZvaWQ+IHtcblx0XHRjb25zdCB0YXJnZXREaXIgPSB0aGlzLmdldEdpdEluc3RhbGxQYXRoKHNvdXJjZSwgc2NvcGUpO1xuXHRcdGlmIChleGlzdHNTeW5jKHRhcmdldERpcikpIHtcblx0XHRcdHJldHVybjtcblx0XHR9XG5cdFx0Y29uc3QgZ2l0Um9vdCA9IHRoaXMuZ2V0R2l0SW5zdGFsbFJvb3Qoc2NvcGUpO1xuXHRcdGlmIChnaXRSb290KSB7XG5cdFx0XHR0aGlzLmVuc3VyZUdpdElnbm9yZShnaXRSb290KTtcblx0XHR9XG5cdFx0bWtkaXJTeW5jKGRpcm5hbWUodGFyZ2V0RGlyKSwgeyByZWN1cnNpdmU6IHRydWUgfSk7XG5cblx0XHRhd2FpdCB0aGlzLnJ1bkNvbW1hbmQoXCJnaXRcIiwgW1wiY2xvbmVcIiwgc291cmNlLnJlcG8sIHRhcmdldERpcl0pO1xuXHRcdGlmIChzb3VyY2UucmVmKSB7XG5cdFx0XHRhd2FpdCB0aGlzLnJ1bkNvbW1hbmQoXCJnaXRcIiwgW1wiY2hlY2tvdXRcIiwgc291cmNlLnJlZl0sIHsgY3dkOiB0YXJnZXREaXIgfSk7XG5cdFx0fVxuXHRcdGNvbnN0IHBhY2thZ2VKc29uUGF0aCA9IGpvaW4odGFyZ2V0RGlyLCBcInBhY2thZ2UuanNvblwiKTtcblx0XHRpZiAoZXhpc3RzU3luYyhwYWNrYWdlSnNvblBhdGgpKSB7XG5cdFx0XHRhd2FpdCB0aGlzLnJ1bk5wbUNvbW1hbmQodGhpcy5nZXRHaXREZXBlbmRlbmN5SW5zdGFsbEFyZ3MoKSwgeyBjd2Q6IHRhcmdldERpciB9KTtcblx0XHR9XG5cdH1cblxuXHRwcml2YXRlIGFzeW5jIHVwZGF0ZUdpdChzb3VyY2U6IEdpdFNvdXJjZSwgc2NvcGU6IFNvdXJjZVNjb3BlKTogUHJvbWlzZTx2b2lkPiB7XG5cdFx0Y29uc3QgdGFyZ2V0RGlyID0gdGhpcy5nZXRHaXRJbnN0YWxsUGF0aChzb3VyY2UsIHNjb3BlKTtcblx0XHRpZiAoIWV4aXN0c1N5bmModGFyZ2V0RGlyKSkge1xuXHRcdFx0YXdhaXQgdGhpcy5pbnN0YWxsR2l0KHNvdXJjZSwgc2NvcGUpO1xuXHRcdFx0cmV0dXJuO1xuXHRcdH1cblxuXHRcdGNvbnN0IHRhcmdldCA9IGF3YWl0IHRoaXMuZ2V0TG9jYWxHaXRVcGRhdGVUYXJnZXQodGFyZ2V0RGlyKTtcblxuXHRcdC8vIEZldGNoIG9ubHkgdGhlIHJlZiB3ZSB3aWxsIHJlc2V0IHRvLCBhdm9pZGluZyB1bnJlbGF0ZWQgYnJhbmNoL3RhZyBub2lzZS5cblx0XHRhd2FpdCB0aGlzLnJ1bkNvbW1hbmQoXCJnaXRcIiwgdGFyZ2V0LmZldGNoQXJncywgeyBjd2Q6IHRhcmdldERpciB9KTtcblxuXHRcdGNvbnN0IGxvY2FsSGVhZCA9IGF3YWl0IHRoaXMucnVuQ29tbWFuZENhcHR1cmUoXCJnaXRcIiwgW1wicmV2LXBhcnNlXCIsIFwiSEVBRFwiXSwge1xuXHRcdFx0Y3dkOiB0YXJnZXREaXIsXG5cdFx0XHR0aW1lb3V0TXM6IE5FVFdPUktfVElNRU9VVF9NUyxcblx0XHR9KTtcblx0XHRjb25zdCByZWZyZXNoZWRUYXJnZXRIZWFkID0gYXdhaXQgdGhpcy5ydW5Db21tYW5kQ2FwdHVyZShcImdpdFwiLCBbXCJyZXYtcGFyc2VcIiwgdGFyZ2V0LnJlZl0sIHtcblx0XHRcdGN3ZDogdGFyZ2V0RGlyLFxuXHRcdFx0dGltZW91dE1zOiBORVRXT1JLX1RJTUVPVVRfTVMsXG5cdFx0fSk7XG5cdFx0aWYgKGxvY2FsSGVhZC50cmltKCkgPT09IHJlZnJlc2hlZFRhcmdldEhlYWQudHJpbSgpKSB7XG5cdFx0XHRyZXR1cm47XG5cdFx0fVxuXG5cdFx0YXdhaXQgdGhpcy5ydW5Db21tYW5kKFwiZ2l0XCIsIFtcInJlc2V0XCIsIFwiLS1oYXJkXCIsIHRhcmdldC5yZWZdLCB7IGN3ZDogdGFyZ2V0RGlyIH0pO1xuXG5cdFx0Ly8gQ2xlYW4gdW50cmFja2VkIGZpbGVzIChleHRlbnNpb25zIHNob3VsZCBiZSBwcmlzdGluZSlcblx0XHRhd2FpdCB0aGlzLnJ1bkNvbW1hbmQoXCJnaXRcIiwgW1wiY2xlYW5cIiwgXCItZmR4XCJdLCB7IGN3ZDogdGFyZ2V0RGlyIH0pO1xuXG5cdFx0Y29uc3QgcGFja2FnZUpzb25QYXRoID0gam9pbih0YXJnZXREaXIsIFwicGFja2FnZS5qc29uXCIpO1xuXHRcdGlmIChleGlzdHNTeW5jKHBhY2thZ2VKc29uUGF0aCkpIHtcblx0XHRcdGF3YWl0IHRoaXMucnVuTnBtQ29tbWFuZCh0aGlzLmdldEdpdERlcGVuZGVuY3lJbnN0YWxsQXJncygpLCB7IGN3ZDogdGFyZ2V0RGlyIH0pO1xuXHRcdH1cblx0fVxuXG5cdHByaXZhdGUgYXN5bmMgcmVmcmVzaFRlbXBvcmFyeUdpdFNvdXJjZShzb3VyY2U6IEdpdFNvdXJjZSwgc291cmNlU3RyOiBzdHJpbmcpOiBQcm9taXNlPHZvaWQ+IHtcblx0XHRpZiAoaXNPZmZsaW5lTW9kZUVuYWJsZWQoKSkge1xuXHRcdFx0cmV0dXJuO1xuXHRcdH1cblx0XHR0cnkge1xuXHRcdFx0YXdhaXQgdGhpcy53aXRoUHJvZ3Jlc3MoXCJwdWxsXCIsIHNvdXJjZVN0ciwgYFJlZnJlc2hpbmcgJHtzb3VyY2VTdHJ9Li4uYCwgYXN5bmMgKCkgPT4ge1xuXHRcdFx0XHRhd2FpdCB0aGlzLnVwZGF0ZUdpdChzb3VyY2UsIFwidGVtcG9yYXJ5XCIpO1xuXHRcdFx0fSk7XG5cdFx0fSBjYXRjaCB7XG5cdFx0XHQvLyBLZWVwIGNhY2hlZCB0ZW1wb3JhcnkgY2hlY2tvdXQgaWYgcmVmcmVzaCBmYWlscy5cblx0XHR9XG5cdH1cblxuXHRwcml2YXRlIGFzeW5jIHJlbW92ZUdpdChzb3VyY2U6IEdpdFNvdXJjZSwgc2NvcGU6IFNvdXJjZVNjb3BlKTogUHJvbWlzZTx2b2lkPiB7XG5cdFx0Y29uc3QgdGFyZ2V0RGlyID0gdGhpcy5nZXRHaXRJbnN0YWxsUGF0aChzb3VyY2UsIHNjb3BlKTtcblx0XHRpZiAoIWV4aXN0c1N5bmModGFyZ2V0RGlyKSkgcmV0dXJuO1xuXHRcdHJtU3luYyh0YXJnZXREaXIsIHsgcmVjdXJzaXZlOiB0cnVlLCBmb3JjZTogdHJ1ZSB9KTtcblx0XHR0aGlzLnBydW5lRW1wdHlHaXRQYXJlbnRzKHRhcmdldERpciwgdGhpcy5nZXRHaXRJbnN0YWxsUm9vdChzY29wZSkpO1xuXHR9XG5cblx0cHJpdmF0ZSBwcnVuZUVtcHR5R2l0UGFyZW50cyh0YXJnZXREaXI6IHN0cmluZywgaW5zdGFsbFJvb3Q6IHN0cmluZyB8IHVuZGVmaW5lZCk6IHZvaWQge1xuXHRcdGlmICghaW5zdGFsbFJvb3QpIHJldHVybjtcblx0XHRjb25zdCByZXNvbHZlZFJvb3QgPSByZXNvbHZlKGluc3RhbGxSb290KTtcblx0XHRsZXQgY3VycmVudCA9IGRpcm5hbWUodGFyZ2V0RGlyKTtcblx0XHR3aGlsZSAoY3VycmVudC5zdGFydHNXaXRoKHJlc29sdmVkUm9vdCkgJiYgY3VycmVudCAhPT0gcmVzb2x2ZWRSb290KSB7XG5cdFx0XHRpZiAoIWV4aXN0c1N5bmMoY3VycmVudCkpIHtcblx0XHRcdFx0Y3VycmVudCA9IGRpcm5hbWUoY3VycmVudCk7XG5cdFx0XHRcdGNvbnRpbnVlO1xuXHRcdFx0fVxuXHRcdFx0Y29uc3QgZW50cmllcyA9IHJlYWRkaXJTeW5jKGN1cnJlbnQpO1xuXHRcdFx0aWYgKGVudHJpZXMubGVuZ3RoID4gMCkge1xuXHRcdFx0XHRicmVhaztcblx0XHRcdH1cblx0XHRcdHRyeSB7XG5cdFx0XHRcdHJtU3luYyhjdXJyZW50LCB7IHJlY3Vyc2l2ZTogdHJ1ZSwgZm9yY2U6IHRydWUgfSk7XG5cdFx0XHR9IGNhdGNoIHtcblx0XHRcdFx0YnJlYWs7XG5cdFx0XHR9XG5cdFx0XHRjdXJyZW50ID0gZGlybmFtZShjdXJyZW50KTtcblx0XHR9XG5cdH1cblxuXHRwcml2YXRlIGVuc3VyZU5wbVByb2plY3QoaW5zdGFsbFJvb3Q6IHN0cmluZyk6IHZvaWQge1xuXHRcdGlmICghZXhpc3RzU3luYyhpbnN0YWxsUm9vdCkpIHtcblx0XHRcdG1rZGlyU3luYyhpbnN0YWxsUm9vdCwgeyByZWN1cnNpdmU6IHRydWUgfSk7XG5cdFx0fVxuXHRcdHRoaXMuZW5zdXJlR2l0SWdub3JlKGluc3RhbGxSb290KTtcblx0XHRjb25zdCBwYWNrYWdlSnNvblBhdGggPSBqb2luKGluc3RhbGxSb290LCBcInBhY2thZ2UuanNvblwiKTtcblx0XHRpZiAoIWV4aXN0c1N5bmMocGFja2FnZUpzb25QYXRoKSkge1xuXHRcdFx0Y29uc3QgcGtnSnNvbiA9IHsgbmFtZTogXCJwaS1leHRlbnNpb25zXCIsIHByaXZhdGU6IHRydWUgfTtcblx0XHRcdHdyaXRlRmlsZVN5bmMocGFja2FnZUpzb25QYXRoLCBKU09OLnN0cmluZ2lmeShwa2dKc29uLCBudWxsLCAyKSwgXCJ1dGYtOFwiKTtcblx0XHR9XG5cdH1cblxuXHRwcml2YXRlIGVuc3VyZUdpdElnbm9yZShkaXI6IHN0cmluZyk6IHZvaWQge1xuXHRcdGlmICghZXhpc3RzU3luYyhkaXIpKSB7XG5cdFx0XHRta2RpclN5bmMoZGlyLCB7IHJlY3Vyc2l2ZTogdHJ1ZSB9KTtcblx0XHR9XG5cdFx0Y29uc3QgaWdub3JlUGF0aCA9IGpvaW4oZGlyLCBcIi5naXRpZ25vcmVcIik7XG5cdFx0aWYgKCFleGlzdHNTeW5jKGlnbm9yZVBhdGgpKSB7XG5cdFx0XHR3cml0ZUZpbGVTeW5jKGlnbm9yZVBhdGgsIFwiKlxcbiEuZ2l0aWdub3JlXFxuXCIsIFwidXRmLThcIik7XG5cdFx0fVxuXHR9XG5cblx0cHJpdmF0ZSBnZXROcG1JbnN0YWxsUm9vdChzY29wZTogU291cmNlU2NvcGUsIHRlbXBvcmFyeTogYm9vbGVhbik6IHN0cmluZyB7XG5cdFx0aWYgKHRlbXBvcmFyeSkge1xuXHRcdFx0cmV0dXJuIHRoaXMuZ2V0VGVtcG9yYXJ5RGlyKFwibnBtXCIpO1xuXHRcdH1cblx0XHRpZiAoc2NvcGUgPT09IFwicHJvamVjdFwiKSB7XG5cdFx0XHRyZXR1cm4gam9pbih0aGlzLmN3ZCwgQ09ORklHX0RJUl9OQU1FLCBcIm5wbVwiKTtcblx0XHR9XG5cdFx0cmV0dXJuIGpvaW4odGhpcy5nZXRHbG9iYWxOcG1Sb290KCksIFwiLi5cIik7XG5cdH1cblxuXHRwcml2YXRlIGdldEdsb2JhbE5wbVJvb3QoKTogc3RyaW5nIHtcblx0XHRjb25zdCBucG1Db21tYW5kID0gdGhpcy5nZXROcG1Db21tYW5kKCk7XG5cdFx0Y29uc3QgY29tbWFuZEtleSA9IFtucG1Db21tYW5kLmNvbW1hbmQsIC4uLm5wbUNvbW1hbmQuYXJnc10uam9pbihcIlxcMFwiKTtcblx0XHRpZiAodGhpcy5nbG9iYWxOcG1Sb290ICYmIHRoaXMuZ2xvYmFsTnBtUm9vdENvbW1hbmRLZXkgPT09IGNvbW1hbmRLZXkpIHtcblx0XHRcdHJldHVybiB0aGlzLmdsb2JhbE5wbVJvb3Q7XG5cdFx0fVxuXHRcdGNvbnN0IGlzQnVuUGFja2FnZU1hbmFnZXIgPSBucG1Db21tYW5kLmNvbW1hbmQgPT09IFwiYnVuXCI7XG5cdFx0aWYgKGlzQnVuUGFja2FnZU1hbmFnZXIpIHtcblx0XHRcdGNvbnN0IGJpbkRpciA9IHRoaXMucnVuTnBtQ29tbWFuZFN5bmMoW1wicG1cIiwgXCJiaW5cIiwgXCItZ1wiXSkudHJpbSgpO1xuXHRcdFx0dGhpcy5nbG9iYWxOcG1Sb290ID0gam9pbihkaXJuYW1lKGJpbkRpciksIFwiaW5zdGFsbFwiLCBcImdsb2JhbFwiLCBcIm5vZGVfbW9kdWxlc1wiKTtcblx0XHR9IGVsc2Uge1xuXHRcdFx0dGhpcy5nbG9iYWxOcG1Sb290ID0gdGhpcy5ydW5OcG1Db21tYW5kU3luYyhbXCJyb290XCIsIFwiLWdcIl0pLnRyaW0oKTtcblx0XHR9XG5cdFx0dGhpcy5nbG9iYWxOcG1Sb290Q29tbWFuZEtleSA9IGNvbW1hbmRLZXk7XG5cdFx0cmV0dXJuIHRoaXMuZ2xvYmFsTnBtUm9vdDtcblx0fVxuXG5cdHByaXZhdGUgZ2V0TnBtSW5zdGFsbFBhdGgoc291cmNlOiBOcG1Tb3VyY2UsIHNjb3BlOiBTb3VyY2VTY29wZSk6IHN0cmluZyB7XG5cdFx0aWYgKHNjb3BlID09PSBcInRlbXBvcmFyeVwiKSB7XG5cdFx0XHRyZXR1cm4gam9pbih0aGlzLmdldFRlbXBvcmFyeURpcihcIm5wbVwiKSwgXCJub2RlX21vZHVsZXNcIiwgc291cmNlLm5hbWUpO1xuXHRcdH1cblx0XHRpZiAoc2NvcGUgPT09IFwicHJvamVjdFwiKSB7XG5cdFx0XHRyZXR1cm4gam9pbih0aGlzLmN3ZCwgQ09ORklHX0RJUl9OQU1FLCBcIm5wbVwiLCBcIm5vZGVfbW9kdWxlc1wiLCBzb3VyY2UubmFtZSk7XG5cdFx0fVxuXHRcdHJldHVybiBqb2luKHRoaXMuZ2V0R2xvYmFsTnBtUm9vdCgpLCBzb3VyY2UubmFtZSk7XG5cdH1cblxuXHRwcml2YXRlIGdldEdpdEluc3RhbGxQYXRoKHNvdXJjZTogR2l0U291cmNlLCBzY29wZTogU291cmNlU2NvcGUpOiBzdHJpbmcge1xuXHRcdGlmIChzY29wZSA9PT0gXCJ0ZW1wb3JhcnlcIikge1xuXHRcdFx0cmV0dXJuIHRoaXMuZ2V0VGVtcG9yYXJ5RGlyKGBnaXQtJHtzb3VyY2UuaG9zdH1gLCBzb3VyY2UucGF0aCk7XG5cdFx0fVxuXHRcdGlmIChzY29wZSA9PT0gXCJwcm9qZWN0XCIpIHtcblx0XHRcdHJldHVybiBqb2luKHRoaXMuY3dkLCBDT05GSUdfRElSX05BTUUsIFwiZ2l0XCIsIHNvdXJjZS5ob3N0LCBzb3VyY2UucGF0aCk7XG5cdFx0fVxuXHRcdHJldHVybiBqb2luKHRoaXMuYWdlbnREaXIsIFwiZ2l0XCIsIHNvdXJjZS5ob3N0LCBzb3VyY2UucGF0aCk7XG5cdH1cblxuXHRwcml2YXRlIGdldEdpdEluc3RhbGxSb290KHNjb3BlOiBTb3VyY2VTY29wZSk6IHN0cmluZyB8IHVuZGVmaW5lZCB7XG5cdFx0aWYgKHNjb3BlID09PSBcInRlbXBvcmFyeVwiKSB7XG5cdFx0XHRyZXR1cm4gdW5kZWZpbmVkO1xuXHRcdH1cblx0XHRpZiAoc2NvcGUgPT09IFwicHJvamVjdFwiKSB7XG5cdFx0XHRyZXR1cm4gam9pbih0aGlzLmN3ZCwgQ09ORklHX0RJUl9OQU1FLCBcImdpdFwiKTtcblx0XHR9XG5cdFx0cmV0dXJuIGpvaW4odGhpcy5hZ2VudERpciwgXCJnaXRcIik7XG5cdH1cblxuXHRwcml2YXRlIGdldFRlbXBvcmFyeURpcihwcmVmaXg6IHN0cmluZywgc3VmZml4Pzogc3RyaW5nKTogc3RyaW5nIHtcblx0XHRjb25zdCBoYXNoID0gY3JlYXRlSGFzaChcInNoYTI1NlwiKVxuXHRcdFx0LnVwZGF0ZShgJHtwcmVmaXh9LSR7c3VmZml4ID8/IFwiXCJ9YClcblx0XHRcdC5kaWdlc3QoXCJoZXhcIilcblx0XHRcdC5zbGljZSgwLCA4KTtcblx0XHRyZXR1cm4gam9pbih0bXBkaXIoKSwgXCJwaS1leHRlbnNpb25zXCIsIHByZWZpeCwgaGFzaCwgc3VmZml4ID8/IFwiXCIpO1xuXHR9XG5cblx0cHJpdmF0ZSBnZXRCYXNlRGlyRm9yU2NvcGUoc2NvcGU6IFNvdXJjZVNjb3BlKTogc3RyaW5nIHtcblx0XHRpZiAoc2NvcGUgPT09IFwicHJvamVjdFwiKSB7XG5cdFx0XHRyZXR1cm4gam9pbih0aGlzLmN3ZCwgQ09ORklHX0RJUl9OQU1FKTtcblx0XHR9XG5cdFx0aWYgKHNjb3BlID09PSBcInVzZXJcIikge1xuXHRcdFx0cmV0dXJuIHRoaXMuYWdlbnREaXI7XG5cdFx0fVxuXHRcdHJldHVybiB0aGlzLmN3ZDtcblx0fVxuXG5cdHByaXZhdGUgcmVzb2x2ZVBhdGgoaW5wdXQ6IHN0cmluZyk6IHN0cmluZyB7XG5cdFx0Y29uc3QgdHJpbW1lZCA9IGlucHV0LnRyaW0oKTtcblx0XHRpZiAodHJpbW1lZCA9PT0gXCJ+XCIpIHJldHVybiBnZXRIb21lRGlyKCk7XG5cdFx0aWYgKHRyaW1tZWQuc3RhcnRzV2l0aChcIn4vXCIpKSByZXR1cm4gam9pbihnZXRIb21lRGlyKCksIHRyaW1tZWQuc2xpY2UoMikpO1xuXHRcdGlmICh0cmltbWVkLnN0YXJ0c1dpdGgoXCJ+XCIpKSByZXR1cm4gam9pbihnZXRIb21lRGlyKCksIHRyaW1tZWQuc2xpY2UoMSkpO1xuXHRcdHJldHVybiByZXNvbHZlKHRoaXMuY3dkLCB0cmltbWVkKTtcblx0fVxuXG5cdHByaXZhdGUgcmVzb2x2ZVBhdGhGcm9tQmFzZShpbnB1dDogc3RyaW5nLCBiYXNlRGlyOiBzdHJpbmcpOiBzdHJpbmcge1xuXHRcdGNvbnN0IHRyaW1tZWQgPSBpbnB1dC50cmltKCk7XG5cdFx0aWYgKHRyaW1tZWQgPT09IFwiflwiKSByZXR1cm4gZ2V0SG9tZURpcigpO1xuXHRcdGlmICh0cmltbWVkLnN0YXJ0c1dpdGgoXCJ+L1wiKSkgcmV0dXJuIGpvaW4oZ2V0SG9tZURpcigpLCB0cmltbWVkLnNsaWNlKDIpKTtcblx0XHRpZiAodHJpbW1lZC5zdGFydHNXaXRoKFwiflwiKSkgcmV0dXJuIGpvaW4oZ2V0SG9tZURpcigpLCB0cmltbWVkLnNsaWNlKDEpKTtcblx0XHRyZXR1cm4gcmVzb2x2ZShiYXNlRGlyLCB0cmltbWVkKTtcblx0fVxuXG5cdHByaXZhdGUgY29sbGVjdFBhY2thZ2VSZXNvdXJjZXMoXG5cdFx0cGFja2FnZVJvb3Q6IHN0cmluZyxcblx0XHRhY2N1bXVsYXRvcjogUmVzb3VyY2VBY2N1bXVsYXRvcixcblx0XHRmaWx0ZXI6IFBhY2thZ2VGaWx0ZXIgfCB1bmRlZmluZWQsXG5cdFx0bWV0YWRhdGE6IFBhdGhNZXRhZGF0YSxcblx0KTogYm9vbGVhbiB7XG5cdFx0aWYgKGZpbHRlcikge1xuXHRcdFx0Zm9yIChjb25zdCByZXNvdXJjZVR5cGUgb2YgUkVTT1VSQ0VfVFlQRVMpIHtcblx0XHRcdFx0Y29uc3QgcGF0dGVybnMgPSBmaWx0ZXJbcmVzb3VyY2VUeXBlIGFzIGtleW9mIFBhY2thZ2VGaWx0ZXJdO1xuXHRcdFx0XHRjb25zdCB0YXJnZXQgPSB0aGlzLmdldFRhcmdldE1hcChhY2N1bXVsYXRvciwgcmVzb3VyY2VUeXBlKTtcblx0XHRcdFx0aWYgKHBhdHRlcm5zICE9PSB1bmRlZmluZWQpIHtcblx0XHRcdFx0XHR0aGlzLmFwcGx5UGFja2FnZUZpbHRlcihwYWNrYWdlUm9vdCwgcGF0dGVybnMsIHJlc291cmNlVHlwZSwgdGFyZ2V0LCBtZXRhZGF0YSk7XG5cdFx0XHRcdH0gZWxzZSB7XG5cdFx0XHRcdFx0dGhpcy5jb2xsZWN0RGVmYXVsdFJlc291cmNlcyhwYWNrYWdlUm9vdCwgcmVzb3VyY2VUeXBlLCB0YXJnZXQsIG1ldGFkYXRhKTtcblx0XHRcdFx0fVxuXHRcdFx0fVxuXHRcdFx0cmV0dXJuIHRydWU7XG5cdFx0fVxuXG5cdFx0Y29uc3QgbWFuaWZlc3QgPSB0aGlzLnJlYWRQaU1hbmlmZXN0KHBhY2thZ2VSb290KTtcblx0XHRpZiAobWFuaWZlc3QpIHtcblx0XHRcdGZvciAoY29uc3QgcmVzb3VyY2VUeXBlIG9mIFJFU09VUkNFX1RZUEVTKSB7XG5cdFx0XHRcdGNvbnN0IGVudHJpZXMgPSBtYW5pZmVzdFtyZXNvdXJjZVR5cGUgYXMga2V5b2YgUGlNYW5pZmVzdF07XG5cdFx0XHRcdHRoaXMuYWRkTWFuaWZlc3RFbnRyaWVzKFxuXHRcdFx0XHRcdGVudHJpZXMsXG5cdFx0XHRcdFx0cGFja2FnZVJvb3QsXG5cdFx0XHRcdFx0cmVzb3VyY2VUeXBlLFxuXHRcdFx0XHRcdHRoaXMuZ2V0VGFyZ2V0TWFwKGFjY3VtdWxhdG9yLCByZXNvdXJjZVR5cGUpLFxuXHRcdFx0XHRcdG1ldGFkYXRhLFxuXHRcdFx0XHQpO1xuXHRcdFx0fVxuXHRcdFx0cmV0dXJuIHRydWU7XG5cdFx0fVxuXG5cdFx0bGV0IGhhc0FueURpciA9IGZhbHNlO1xuXHRcdGZvciAoY29uc3QgcmVzb3VyY2VUeXBlIG9mIFJFU09VUkNFX1RZUEVTKSB7XG5cdFx0XHRjb25zdCBkaXIgPSBqb2luKHBhY2thZ2VSb290LCByZXNvdXJjZVR5cGUpO1xuXHRcdFx0aWYgKGV4aXN0c1N5bmMoZGlyKSkge1xuXHRcdFx0XHQvLyBDb2xsZWN0IGFsbCBmaWxlcyBmcm9tIHRoZSBkaXJlY3RvcnkgKGFsbCBlbmFibGVkIGJ5IGRlZmF1bHQpXG5cdFx0XHRcdGNvbnN0IGZpbGVzID0gY29sbGVjdFJlc291cmNlRmlsZXMoZGlyLCByZXNvdXJjZVR5cGUpO1xuXHRcdFx0XHRmb3IgKGNvbnN0IGYgb2YgZmlsZXMpIHtcblx0XHRcdFx0XHR0aGlzLmFkZFJlc291cmNlKHRoaXMuZ2V0VGFyZ2V0TWFwKGFjY3VtdWxhdG9yLCByZXNvdXJjZVR5cGUpLCBmLCBtZXRhZGF0YSwgdHJ1ZSk7XG5cdFx0XHRcdH1cblx0XHRcdFx0aGFzQW55RGlyID0gdHJ1ZTtcblx0XHRcdH1cblx0XHR9XG5cdFx0cmV0dXJuIGhhc0FueURpcjtcblx0fVxuXG5cdHByaXZhdGUgY29sbGVjdERlZmF1bHRSZXNvdXJjZXMoXG5cdFx0cGFja2FnZVJvb3Q6IHN0cmluZyxcblx0XHRyZXNvdXJjZVR5cGU6IFJlc291cmNlVHlwZSxcblx0XHR0YXJnZXQ6IE1hcDxzdHJpbmcsIHsgbWV0YWRhdGE6IFBhdGhNZXRhZGF0YTsgZW5hYmxlZDogYm9vbGVhbiB9Pixcblx0XHRtZXRhZGF0YTogUGF0aE1ldGFkYXRhLFxuXHQpOiB2b2lkIHtcblx0XHRjb25zdCBtYW5pZmVzdCA9IHRoaXMucmVhZFBpTWFuaWZlc3QocGFja2FnZVJvb3QpO1xuXHRcdGNvbnN0IGVudHJpZXMgPSBtYW5pZmVzdD8uW3Jlc291cmNlVHlwZSBhcyBrZXlvZiBQaU1hbmlmZXN0XTtcblx0XHRpZiAoZW50cmllcykge1xuXHRcdFx0dGhpcy5hZGRNYW5pZmVzdEVudHJpZXMoZW50cmllcywgcGFja2FnZVJvb3QsIHJlc291cmNlVHlwZSwgdGFyZ2V0LCBtZXRhZGF0YSk7XG5cdFx0XHRyZXR1cm47XG5cdFx0fVxuXHRcdGNvbnN0IGRpciA9IGpvaW4ocGFja2FnZVJvb3QsIHJlc291cmNlVHlwZSk7XG5cdFx0aWYgKGV4aXN0c1N5bmMoZGlyKSkge1xuXHRcdFx0Ly8gQ29sbGVjdCBhbGwgZmlsZXMgZnJvbSB0aGUgZGlyZWN0b3J5IChhbGwgZW5hYmxlZCBieSBkZWZhdWx0KVxuXHRcdFx0Y29uc3QgZmlsZXMgPSBjb2xsZWN0UmVzb3VyY2VGaWxlcyhkaXIsIHJlc291cmNlVHlwZSk7XG5cdFx0XHRmb3IgKGNvbnN0IGYgb2YgZmlsZXMpIHtcblx0XHRcdFx0dGhpcy5hZGRSZXNvdXJjZSh0YXJnZXQsIGYsIG1ldGFkYXRhLCB0cnVlKTtcblx0XHRcdH1cblx0XHR9XG5cdH1cblxuXHRwcml2YXRlIGFwcGx5UGFja2FnZUZpbHRlcihcblx0XHRwYWNrYWdlUm9vdDogc3RyaW5nLFxuXHRcdHVzZXJQYXR0ZXJuczogc3RyaW5nW10sXG5cdFx0cmVzb3VyY2VUeXBlOiBSZXNvdXJjZVR5cGUsXG5cdFx0dGFyZ2V0OiBNYXA8c3RyaW5nLCB7IG1ldGFkYXRhOiBQYXRoTWV0YWRhdGE7IGVuYWJsZWQ6IGJvb2xlYW4gfT4sXG5cdFx0bWV0YWRhdGE6IFBhdGhNZXRhZGF0YSxcblx0KTogdm9pZCB7XG5cdFx0Y29uc3QgeyBhbGxGaWxlcyB9ID0gdGhpcy5jb2xsZWN0TWFuaWZlc3RGaWxlcyhwYWNrYWdlUm9vdCwgcmVzb3VyY2VUeXBlKTtcblxuXHRcdGlmICh1c2VyUGF0dGVybnMubGVuZ3RoID09PSAwKSB7XG5cdFx0XHQvLyBFbXB0eSBhcnJheSBleHBsaWNpdGx5IGRpc2FibGVzIGFsbCByZXNvdXJjZXMgb2YgdGhpcyB0eXBlXG5cdFx0XHRmb3IgKGNvbnN0IGYgb2YgYWxsRmlsZXMpIHtcblx0XHRcdFx0dGhpcy5hZGRSZXNvdXJjZSh0YXJnZXQsIGYsIG1ldGFkYXRhLCBmYWxzZSk7XG5cdFx0XHR9XG5cdFx0XHRyZXR1cm47XG5cdFx0fVxuXG5cdFx0Ly8gQXBwbHkgdXNlciBwYXR0ZXJuc1xuXHRcdGNvbnN0IGVuYWJsZWRCeVVzZXIgPSBhcHBseVBhdHRlcm5zKGFsbEZpbGVzLCB1c2VyUGF0dGVybnMsIHBhY2thZ2VSb290KTtcblxuXHRcdGZvciAoY29uc3QgZiBvZiBhbGxGaWxlcykge1xuXHRcdFx0Y29uc3QgZW5hYmxlZCA9IGVuYWJsZWRCeVVzZXIuaGFzKGYpO1xuXHRcdFx0dGhpcy5hZGRSZXNvdXJjZSh0YXJnZXQsIGYsIG1ldGFkYXRhLCBlbmFibGVkKTtcblx0XHR9XG5cdH1cblxuXHQvKipcblx0ICogQ29sbGVjdCBhbGwgZmlsZXMgZnJvbSBhIHBhY2thZ2UgZm9yIGEgcmVzb3VyY2UgdHlwZSwgYXBwbHlpbmcgbWFuaWZlc3QgcGF0dGVybnMuXG5cdCAqIFJldHVybnMgeyBhbGxGaWxlcywgZW5hYmxlZEJ5TWFuaWZlc3QgfSB3aGVyZSBlbmFibGVkQnlNYW5pZmVzdCBpcyB0aGUgc2V0IG9mIGZpbGVzXG5cdCAqIHRoYXQgcGFzcyB0aGUgbWFuaWZlc3QncyBvd24gcGF0dGVybnMuXG5cdCAqL1xuXHRwcml2YXRlIGNvbGxlY3RNYW5pZmVzdEZpbGVzKFxuXHRcdHBhY2thZ2VSb290OiBzdHJpbmcsXG5cdFx0cmVzb3VyY2VUeXBlOiBSZXNvdXJjZVR5cGUsXG5cdCk6IHsgYWxsRmlsZXM6IHN0cmluZ1tdOyBlbmFibGVkQnlNYW5pZmVzdDogU2V0PHN0cmluZz4gfSB7XG5cdFx0Y29uc3QgbWFuaWZlc3QgPSB0aGlzLnJlYWRQaU1hbmlmZXN0KHBhY2thZ2VSb290KTtcblx0XHRjb25zdCBlbnRyaWVzID0gbWFuaWZlc3Q/LltyZXNvdXJjZVR5cGUgYXMga2V5b2YgUGlNYW5pZmVzdF07XG5cdFx0aWYgKGVudHJpZXMgJiYgZW50cmllcy5sZW5ndGggPiAwKSB7XG5cdFx0XHRjb25zdCBhbGxGaWxlcyA9IHRoaXMuY29sbGVjdEZpbGVzRnJvbU1hbmlmZXN0RW50cmllcyhlbnRyaWVzLCBwYWNrYWdlUm9vdCwgcmVzb3VyY2VUeXBlKTtcblx0XHRcdGNvbnN0IG1hbmlmZXN0UGF0dGVybnMgPSBlbnRyaWVzLmZpbHRlcihpc092ZXJyaWRlUGF0dGVybik7XG5cdFx0XHRjb25zdCBlbmFibGVkQnlNYW5pZmVzdCA9XG5cdFx0XHRcdG1hbmlmZXN0UGF0dGVybnMubGVuZ3RoID4gMCA/IGFwcGx5UGF0dGVybnMoYWxsRmlsZXMsIG1hbmlmZXN0UGF0dGVybnMsIHBhY2thZ2VSb290KSA6IG5ldyBTZXQoYWxsRmlsZXMpO1xuXHRcdFx0cmV0dXJuIHsgYWxsRmlsZXM6IEFycmF5LmZyb20oZW5hYmxlZEJ5TWFuaWZlc3QpLCBlbmFibGVkQnlNYW5pZmVzdCB9O1xuXHRcdH1cblxuXHRcdGNvbnN0IGNvbnZlbnRpb25EaXIgPSBqb2luKHBhY2thZ2VSb290LCByZXNvdXJjZVR5cGUpO1xuXHRcdGlmICghZXhpc3RzU3luYyhjb252ZW50aW9uRGlyKSkge1xuXHRcdFx0cmV0dXJuIHsgYWxsRmlsZXM6IFtdLCBlbmFibGVkQnlNYW5pZmVzdDogbmV3IFNldCgpIH07XG5cdFx0fVxuXHRcdGNvbnN0IGFsbEZpbGVzID0gY29sbGVjdFJlc291cmNlRmlsZXMoY29udmVudGlvbkRpciwgcmVzb3VyY2VUeXBlKTtcblx0XHRyZXR1cm4geyBhbGxGaWxlcywgZW5hYmxlZEJ5TWFuaWZlc3Q6IG5ldyBTZXQoYWxsRmlsZXMpIH07XG5cdH1cblxuXHRwcml2YXRlIHJlYWRQaU1hbmlmZXN0KHBhY2thZ2VSb290OiBzdHJpbmcpOiBQaU1hbmlmZXN0IHwgbnVsbCB7XG5cdFx0Y29uc3QgcGFja2FnZUpzb25QYXRoID0gam9pbihwYWNrYWdlUm9vdCwgXCJwYWNrYWdlLmpzb25cIik7XG5cdFx0aWYgKCFleGlzdHNTeW5jKHBhY2thZ2VKc29uUGF0aCkpIHtcblx0XHRcdHJldHVybiBudWxsO1xuXHRcdH1cblxuXHRcdHRyeSB7XG5cdFx0XHRjb25zdCBjb250ZW50ID0gcmVhZEZpbGVTeW5jKHBhY2thZ2VKc29uUGF0aCwgXCJ1dGYtOFwiKTtcblx0XHRcdGNvbnN0IHBrZyA9IEpTT04ucGFyc2UoY29udGVudCkgYXMgeyBwaT86IFBpTWFuaWZlc3QgfTtcblx0XHRcdHJldHVybiBwa2cucGkgPz8gbnVsbDtcblx0XHR9IGNhdGNoIHtcblx0XHRcdHJldHVybiBudWxsO1xuXHRcdH1cblx0fVxuXG5cdHByaXZhdGUgYWRkTWFuaWZlc3RFbnRyaWVzKFxuXHRcdGVudHJpZXM6IHN0cmluZ1tdIHwgdW5kZWZpbmVkLFxuXHRcdHJvb3Q6IHN0cmluZyxcblx0XHRyZXNvdXJjZVR5cGU6IFJlc291cmNlVHlwZSxcblx0XHR0YXJnZXQ6IE1hcDxzdHJpbmcsIHsgbWV0YWRhdGE6IFBhdGhNZXRhZGF0YTsgZW5hYmxlZDogYm9vbGVhbiB9Pixcblx0XHRtZXRhZGF0YTogUGF0aE1ldGFkYXRhLFxuXHQpOiB2b2lkIHtcblx0XHRpZiAoIWVudHJpZXMpIHJldHVybjtcblxuXHRcdGNvbnN0IGFsbEZpbGVzID0gdGhpcy5jb2xsZWN0RmlsZXNGcm9tTWFuaWZlc3RFbnRyaWVzKGVudHJpZXMsIHJvb3QsIHJlc291cmNlVHlwZSk7XG5cdFx0Y29uc3QgcGF0dGVybnMgPSBlbnRyaWVzLmZpbHRlcihpc092ZXJyaWRlUGF0dGVybik7XG5cdFx0Y29uc3QgZW5hYmxlZFBhdGhzID0gYXBwbHlQYXR0ZXJucyhhbGxGaWxlcywgcGF0dGVybnMsIHJvb3QpO1xuXG5cdFx0Zm9yIChjb25zdCBmIG9mIGFsbEZpbGVzKSB7XG5cdFx0XHRpZiAoZW5hYmxlZFBhdGhzLmhhcyhmKSkge1xuXHRcdFx0XHR0aGlzLmFkZFJlc291cmNlKHRhcmdldCwgZiwgbWV0YWRhdGEsIHRydWUpO1xuXHRcdFx0fVxuXHRcdH1cblx0fVxuXG5cdHByaXZhdGUgY29sbGVjdEZpbGVzRnJvbU1hbmlmZXN0RW50cmllcyhlbnRyaWVzOiBzdHJpbmdbXSwgcm9vdDogc3RyaW5nLCByZXNvdXJjZVR5cGU6IFJlc291cmNlVHlwZSk6IHN0cmluZ1tdIHtcblx0XHRjb25zdCBzb3VyY2VFbnRyaWVzID0gZW50cmllcy5maWx0ZXIoKGVudHJ5KSA9PiAhaXNPdmVycmlkZVBhdHRlcm4oZW50cnkpKTtcblx0XHRjb25zdCByZXNvbHZlZCA9IHNvdXJjZUVudHJpZXMuZmxhdE1hcCgoZW50cnkpID0+IHtcblx0XHRcdGlmICghaGFzR2xvYlBhdHRlcm4oZW50cnkpKSB7XG5cdFx0XHRcdHJldHVybiBbcmVzb2x2ZShyb290LCBlbnRyeSldO1xuXHRcdFx0fVxuXG5cdFx0XHRyZXR1cm4gZ2xvYlN5bmMoZW50cnksIHtcblx0XHRcdFx0Y3dkOiByb290LFxuXHRcdFx0XHRhYnNvbHV0ZTogdHJ1ZSxcblx0XHRcdFx0ZG90OiBmYWxzZSxcblx0XHRcdFx0bm9kaXI6IGZhbHNlLFxuXHRcdFx0fSkubWFwKChtYXRjaCkgPT4gcmVzb2x2ZShtYXRjaCkpO1xuXHRcdH0pO1xuXHRcdHJldHVybiB0aGlzLmNvbGxlY3RGaWxlc0Zyb21QYXRocyhyZXNvbHZlZCwgcmVzb3VyY2VUeXBlKTtcblx0fVxuXG5cdHByaXZhdGUgcmVzb2x2ZUxvY2FsRW50cmllcyhcblx0XHRlbnRyaWVzOiBzdHJpbmdbXSxcblx0XHRyZXNvdXJjZVR5cGU6IFJlc291cmNlVHlwZSxcblx0XHR0YXJnZXQ6IE1hcDxzdHJpbmcsIHsgbWV0YWRhdGE6IFBhdGhNZXRhZGF0YTsgZW5hYmxlZDogYm9vbGVhbiB9Pixcblx0XHRtZXRhZGF0YTogUGF0aE1ldGFkYXRhLFxuXHRcdGJhc2VEaXI6IHN0cmluZyxcblx0KTogdm9pZCB7XG5cdFx0aWYgKGVudHJpZXMubGVuZ3RoID09PSAwKSByZXR1cm47XG5cblx0XHQvLyBDb2xsZWN0IGFsbCBmaWxlcyBmcm9tIHBsYWluIGVudHJpZXMgKG5vbi1wYXR0ZXJuIGVudHJpZXMpXG5cdFx0Y29uc3QgeyBwbGFpbiwgcGF0dGVybnMgfSA9IHNwbGl0UGF0dGVybnMoZW50cmllcyk7XG5cdFx0Y29uc3QgcmVzb2x2ZWRQbGFpbiA9IHBsYWluLm1hcCgocCkgPT4gdGhpcy5yZXNvbHZlUGF0aEZyb21CYXNlKHAsIGJhc2VEaXIpKTtcblx0XHRjb25zdCBhbGxGaWxlcyA9IHRoaXMuY29sbGVjdEZpbGVzRnJvbVBhdGhzKHJlc29sdmVkUGxhaW4sIHJlc291cmNlVHlwZSk7XG5cblx0XHQvLyBEZXRlcm1pbmUgd2hpY2ggZmlsZXMgYXJlIGVuYWJsZWQgYmFzZWQgb24gcGF0dGVybnNcblx0XHRjb25zdCBlbmFibGVkUGF0aHMgPSBhcHBseVBhdHRlcm5zKGFsbEZpbGVzLCBwYXR0ZXJucywgYmFzZURpcik7XG5cblx0XHQvLyBBZGQgYWxsIGZpbGVzIHdpdGggdGhlaXIgZW5hYmxlZCBzdGF0ZVxuXHRcdGZvciAoY29uc3QgZiBvZiBhbGxGaWxlcykge1xuXHRcdFx0dGhpcy5hZGRSZXNvdXJjZSh0YXJnZXQsIGYsIG1ldGFkYXRhLCBlbmFibGVkUGF0aHMuaGFzKGYpKTtcblx0XHR9XG5cdH1cblxuXHRwcml2YXRlIGFkZEF1dG9EaXNjb3ZlcmVkUmVzb3VyY2VzKFxuXHRcdGFjY3VtdWxhdG9yOiBSZXNvdXJjZUFjY3VtdWxhdG9yLFxuXHRcdGdsb2JhbFNldHRpbmdzOiBSZXR1cm5UeXBlPFNldHRpbmdzTWFuYWdlcltcImdldEdsb2JhbFNldHRpbmdzXCJdPixcblx0XHRwcm9qZWN0U2V0dGluZ3M6IFJldHVyblR5cGU8U2V0dGluZ3NNYW5hZ2VyW1wiZ2V0UHJvamVjdFNldHRpbmdzXCJdPixcblx0XHRnbG9iYWxCYXNlRGlyOiBzdHJpbmcsXG5cdFx0cHJvamVjdEJhc2VEaXI6IHN0cmluZyxcblx0KTogdm9pZCB7XG5cdFx0Y29uc3QgdXNlck1ldGFkYXRhOiBQYXRoTWV0YWRhdGEgPSB7XG5cdFx0XHRzb3VyY2U6IFwiYXV0b1wiLFxuXHRcdFx0c2NvcGU6IFwidXNlclwiLFxuXHRcdFx0b3JpZ2luOiBcInRvcC1sZXZlbFwiLFxuXHRcdFx0YmFzZURpcjogZ2xvYmFsQmFzZURpcixcblx0XHR9O1xuXHRcdGNvbnN0IHByb2plY3RNZXRhZGF0YTogUGF0aE1ldGFkYXRhID0ge1xuXHRcdFx0c291cmNlOiBcImF1dG9cIixcblx0XHRcdHNjb3BlOiBcInByb2plY3RcIixcblx0XHRcdG9yaWdpbjogXCJ0b3AtbGV2ZWxcIixcblx0XHRcdGJhc2VEaXI6IHByb2plY3RCYXNlRGlyLFxuXHRcdH07XG5cblx0XHRjb25zdCB1c2VyT3ZlcnJpZGVzID0ge1xuXHRcdFx0ZXh0ZW5zaW9uczogKGdsb2JhbFNldHRpbmdzLmV4dGVuc2lvbnMgPz8gW10pIGFzIHN0cmluZ1tdLFxuXHRcdFx0c2tpbGxzOiAoZ2xvYmFsU2V0dGluZ3Muc2tpbGxzID8/IFtdKSBhcyBzdHJpbmdbXSxcblx0XHRcdHByb21wdHM6IChnbG9iYWxTZXR0aW5ncy5wcm9tcHRzID8/IFtdKSBhcyBzdHJpbmdbXSxcblx0XHRcdHRoZW1lczogKGdsb2JhbFNldHRpbmdzLnRoZW1lcyA/PyBbXSkgYXMgc3RyaW5nW10sXG5cdFx0fTtcblx0XHRjb25zdCBwcm9qZWN0T3ZlcnJpZGVzID0ge1xuXHRcdFx0ZXh0ZW5zaW9uczogKHByb2plY3RTZXR0aW5ncy5leHRlbnNpb25zID8/IFtdKSBhcyBzdHJpbmdbXSxcblx0XHRcdHNraWxsczogKHByb2plY3RTZXR0aW5ncy5za2lsbHMgPz8gW10pIGFzIHN0cmluZ1tdLFxuXHRcdFx0cHJvbXB0czogKHByb2plY3RTZXR0aW5ncy5wcm9tcHRzID8/IFtdKSBhcyBzdHJpbmdbXSxcblx0XHRcdHRoZW1lczogKHByb2plY3RTZXR0aW5ncy50aGVtZXMgPz8gW10pIGFzIHN0cmluZ1tdLFxuXHRcdH07XG5cblx0XHRjb25zdCB1c2VyRGlycyA9IHtcblx0XHRcdGV4dGVuc2lvbnM6IGpvaW4oZ2xvYmFsQmFzZURpciwgXCJleHRlbnNpb25zXCIpLFxuXHRcdFx0c2tpbGxzOiBqb2luKGdsb2JhbEJhc2VEaXIsIFwic2tpbGxzXCIpLFxuXHRcdFx0cHJvbXB0czogam9pbihnbG9iYWxCYXNlRGlyLCBcInByb21wdHNcIiksXG5cdFx0XHR0aGVtZXM6IGpvaW4oZ2xvYmFsQmFzZURpciwgXCJ0aGVtZXNcIiksXG5cdFx0fTtcblx0XHRjb25zdCBwcm9qZWN0RGlycyA9IHtcblx0XHRcdGV4dGVuc2lvbnM6IGpvaW4ocHJvamVjdEJhc2VEaXIsIFwiZXh0ZW5zaW9uc1wiKSxcblx0XHRcdHNraWxsczogam9pbihwcm9qZWN0QmFzZURpciwgXCJza2lsbHNcIiksXG5cdFx0XHRwcm9tcHRzOiBqb2luKHByb2plY3RCYXNlRGlyLCBcInByb21wdHNcIiksXG5cdFx0XHR0aGVtZXM6IGpvaW4ocHJvamVjdEJhc2VEaXIsIFwidGhlbWVzXCIpLFxuXHRcdH07XG5cdFx0Y29uc3QgdXNlckFnZW50c1NraWxsc0RpciA9IGpvaW4oZ2V0SG9tZURpcigpLCBcIi5hZ2VudHNcIiwgXCJza2lsbHNcIik7XG5cdFx0Y29uc3QgcHJvamVjdEFnZW50c1NraWxsRGlycyA9IGNvbGxlY3RBbmNlc3RvckFnZW50c1NraWxsRGlycyh0aGlzLmN3ZCkuZmlsdGVyKFxuXHRcdFx0KGRpcikgPT4gcmVzb2x2ZShkaXIpICE9PSByZXNvbHZlKHVzZXJBZ2VudHNTa2lsbHNEaXIpLFxuXHRcdCk7XG5cblx0XHRjb25zdCBhZGRSZXNvdXJjZXMgPSAoXG5cdFx0XHRyZXNvdXJjZVR5cGU6IFJlc291cmNlVHlwZSxcblx0XHRcdHBhdGhzOiBzdHJpbmdbXSxcblx0XHRcdG1ldGFkYXRhOiBQYXRoTWV0YWRhdGEsXG5cdFx0XHRvdmVycmlkZXM6IHN0cmluZ1tdLFxuXHRcdFx0YmFzZURpcjogc3RyaW5nLFxuXHRcdCkgPT4ge1xuXHRcdFx0Y29uc3QgdGFyZ2V0ID0gdGhpcy5nZXRUYXJnZXRNYXAoYWNjdW11bGF0b3IsIHJlc291cmNlVHlwZSk7XG5cdFx0XHRmb3IgKGNvbnN0IHBhdGggb2YgcGF0aHMpIHtcblx0XHRcdFx0Y29uc3QgZW5hYmxlZCA9IGlzRW5hYmxlZEJ5T3ZlcnJpZGVzKHBhdGgsIG92ZXJyaWRlcywgYmFzZURpcik7XG5cdFx0XHRcdHRoaXMuYWRkUmVzb3VyY2UodGFyZ2V0LCBwYXRoLCBtZXRhZGF0YSwgZW5hYmxlZCk7XG5cdFx0XHR9XG5cdFx0fTtcblxuXHRcdGFkZFJlc291cmNlcyhcblx0XHRcdFwiZXh0ZW5zaW9uc1wiLFxuXHRcdFx0Y29sbGVjdEF1dG9FeHRlbnNpb25FbnRyaWVzKHByb2plY3REaXJzLmV4dGVuc2lvbnMpLFxuXHRcdFx0cHJvamVjdE1ldGFkYXRhLFxuXHRcdFx0cHJvamVjdE92ZXJyaWRlcy5leHRlbnNpb25zLFxuXHRcdFx0cHJvamVjdEJhc2VEaXIsXG5cdFx0KTtcblx0XHRhZGRSZXNvdXJjZXMoXG5cdFx0XHRcInNraWxsc1wiLFxuXHRcdFx0W1xuXHRcdFx0XHQuLi5jb2xsZWN0QXV0b1NraWxsRW50cmllcyhwcm9qZWN0RGlycy5za2lsbHMsIFwicGlcIiksXG5cdFx0XHRcdC4uLnByb2plY3RBZ2VudHNTa2lsbERpcnMuZmxhdE1hcCgoZGlyKSA9PiBjb2xsZWN0QXV0b1NraWxsRW50cmllcyhkaXIsIFwiYWdlbnRzXCIpKSxcblx0XHRcdF0sXG5cdFx0XHRwcm9qZWN0TWV0YWRhdGEsXG5cdFx0XHRwcm9qZWN0T3ZlcnJpZGVzLnNraWxscyxcblx0XHRcdHByb2plY3RCYXNlRGlyLFxuXHRcdCk7XG5cdFx0YWRkUmVzb3VyY2VzKFxuXHRcdFx0XCJwcm9tcHRzXCIsXG5cdFx0XHRjb2xsZWN0QXV0b1Byb21wdEVudHJpZXMocHJvamVjdERpcnMucHJvbXB0cyksXG5cdFx0XHRwcm9qZWN0TWV0YWRhdGEsXG5cdFx0XHRwcm9qZWN0T3ZlcnJpZGVzLnByb21wdHMsXG5cdFx0XHRwcm9qZWN0QmFzZURpcixcblx0XHQpO1xuXHRcdGFkZFJlc291cmNlcyhcblx0XHRcdFwidGhlbWVzXCIsXG5cdFx0XHRjb2xsZWN0QXV0b1RoZW1lRW50cmllcyhwcm9qZWN0RGlycy50aGVtZXMpLFxuXHRcdFx0cHJvamVjdE1ldGFkYXRhLFxuXHRcdFx0cHJvamVjdE92ZXJyaWRlcy50aGVtZXMsXG5cdFx0XHRwcm9qZWN0QmFzZURpcixcblx0XHQpO1xuXG5cdFx0YWRkUmVzb3VyY2VzKFxuXHRcdFx0XCJleHRlbnNpb25zXCIsXG5cdFx0XHRjb2xsZWN0QXV0b0V4dGVuc2lvbkVudHJpZXModXNlckRpcnMuZXh0ZW5zaW9ucyksXG5cdFx0XHR1c2VyTWV0YWRhdGEsXG5cdFx0XHR1c2VyT3ZlcnJpZGVzLmV4dGVuc2lvbnMsXG5cdFx0XHRnbG9iYWxCYXNlRGlyLFxuXHRcdCk7XG5cdFx0YWRkUmVzb3VyY2VzKFxuXHRcdFx0XCJza2lsbHNcIixcblx0XHRcdFsuLi5jb2xsZWN0QXV0b1NraWxsRW50cmllcyh1c2VyRGlycy5za2lsbHMsIFwicGlcIiksIC4uLmNvbGxlY3RBdXRvU2tpbGxFbnRyaWVzKHVzZXJBZ2VudHNTa2lsbHNEaXIsIFwiYWdlbnRzXCIpXSxcblx0XHRcdHVzZXJNZXRhZGF0YSxcblx0XHRcdHVzZXJPdmVycmlkZXMuc2tpbGxzLFxuXHRcdFx0Z2xvYmFsQmFzZURpcixcblx0XHQpO1xuXHRcdGFkZFJlc291cmNlcyhcblx0XHRcdFwicHJvbXB0c1wiLFxuXHRcdFx0Y29sbGVjdEF1dG9Qcm9tcHRFbnRyaWVzKHVzZXJEaXJzLnByb21wdHMpLFxuXHRcdFx0dXNlck1ldGFkYXRhLFxuXHRcdFx0dXNlck92ZXJyaWRlcy5wcm9tcHRzLFxuXHRcdFx0Z2xvYmFsQmFzZURpcixcblx0XHQpO1xuXHRcdGFkZFJlc291cmNlcyhcblx0XHRcdFwidGhlbWVzXCIsXG5cdFx0XHRjb2xsZWN0QXV0b1RoZW1lRW50cmllcyh1c2VyRGlycy50aGVtZXMpLFxuXHRcdFx0dXNlck1ldGFkYXRhLFxuXHRcdFx0dXNlck92ZXJyaWRlcy50aGVtZXMsXG5cdFx0XHRnbG9iYWxCYXNlRGlyLFxuXHRcdCk7XG5cdH1cblxuXHRwcml2YXRlIGNvbGxlY3RGaWxlc0Zyb21QYXRocyhwYXRoczogc3RyaW5nW10sIHJlc291cmNlVHlwZTogUmVzb3VyY2VUeXBlKTogc3RyaW5nW10ge1xuXHRcdGNvbnN0IGZpbGVzOiBzdHJpbmdbXSA9IFtdO1xuXHRcdGZvciAoY29uc3QgcCBvZiBwYXRocykge1xuXHRcdFx0aWYgKCFleGlzdHNTeW5jKHApKSBjb250aW51ZTtcblxuXHRcdFx0dHJ5IHtcblx0XHRcdFx0Y29uc3Qgc3RhdHMgPSBzdGF0U3luYyhwKTtcblx0XHRcdFx0aWYgKHN0YXRzLmlzRmlsZSgpKSB7XG5cdFx0XHRcdFx0ZmlsZXMucHVzaChwKTtcblx0XHRcdFx0fSBlbHNlIGlmIChzdGF0cy5pc0RpcmVjdG9yeSgpKSB7XG5cdFx0XHRcdFx0ZmlsZXMucHVzaCguLi5jb2xsZWN0UmVzb3VyY2VGaWxlcyhwLCByZXNvdXJjZVR5cGUpKTtcblx0XHRcdFx0fVxuXHRcdFx0fSBjYXRjaCB7XG5cdFx0XHRcdC8vIElnbm9yZSBlcnJvcnNcblx0XHRcdH1cblx0XHR9XG5cdFx0cmV0dXJuIGZpbGVzO1xuXHR9XG5cblx0cHJpdmF0ZSBnZXRUYXJnZXRNYXAoXG5cdFx0YWNjdW11bGF0b3I6IFJlc291cmNlQWNjdW11bGF0b3IsXG5cdFx0cmVzb3VyY2VUeXBlOiBSZXNvdXJjZVR5cGUsXG5cdCk6IE1hcDxzdHJpbmcsIHsgbWV0YWRhdGE6IFBhdGhNZXRhZGF0YTsgZW5hYmxlZDogYm9vbGVhbiB9PiB7XG5cdFx0c3dpdGNoIChyZXNvdXJjZVR5cGUpIHtcblx0XHRcdGNhc2UgXCJleHRlbnNpb25zXCI6XG5cdFx0XHRcdHJldHVybiBhY2N1bXVsYXRvci5leHRlbnNpb25zO1xuXHRcdFx0Y2FzZSBcInNraWxsc1wiOlxuXHRcdFx0XHRyZXR1cm4gYWNjdW11bGF0b3Iuc2tpbGxzO1xuXHRcdFx0Y2FzZSBcInByb21wdHNcIjpcblx0XHRcdFx0cmV0dXJuIGFjY3VtdWxhdG9yLnByb21wdHM7XG5cdFx0XHRjYXNlIFwidGhlbWVzXCI6XG5cdFx0XHRcdHJldHVybiBhY2N1bXVsYXRvci50aGVtZXM7XG5cdFx0XHRkZWZhdWx0OlxuXHRcdFx0XHR0aHJvdyBuZXcgRXJyb3IoYFVua25vd24gcmVzb3VyY2UgdHlwZTogJHtyZXNvdXJjZVR5cGV9YCk7XG5cdFx0fVxuXHR9XG5cblx0cHJpdmF0ZSBhZGRSZXNvdXJjZShcblx0XHRtYXA6IE1hcDxzdHJpbmcsIHsgbWV0YWRhdGE6IFBhdGhNZXRhZGF0YTsgZW5hYmxlZDogYm9vbGVhbiB9Pixcblx0XHRwYXRoOiBzdHJpbmcsXG5cdFx0bWV0YWRhdGE6IFBhdGhNZXRhZGF0YSxcblx0XHRlbmFibGVkOiBib29sZWFuLFxuXHQpOiB2b2lkIHtcblx0XHRpZiAoIXBhdGgpIHJldHVybjtcblx0XHRpZiAoIW1hcC5oYXMocGF0aCkpIHtcblx0XHRcdG1hcC5zZXQocGF0aCwgeyBtZXRhZGF0YSwgZW5hYmxlZCB9KTtcblx0XHR9XG5cdH1cblxuXHRwcml2YXRlIGNyZWF0ZUFjY3VtdWxhdG9yKCk6IFJlc291cmNlQWNjdW11bGF0b3Ige1xuXHRcdHJldHVybiB7XG5cdFx0XHRleHRlbnNpb25zOiBuZXcgTWFwKCksXG5cdFx0XHRza2lsbHM6IG5ldyBNYXAoKSxcblx0XHRcdHByb21wdHM6IG5ldyBNYXAoKSxcblx0XHRcdHRoZW1lczogbmV3IE1hcCgpLFxuXHRcdH07XG5cdH1cblxuXHRwcml2YXRlIHRvUmVzb2x2ZWRQYXRocyhhY2N1bXVsYXRvcjogUmVzb3VyY2VBY2N1bXVsYXRvcik6IFJlc29sdmVkUGF0aHMge1xuXHRcdGNvbnN0IG1hcFRvUmVzb2x2ZWQgPSAoXG5cdFx0XHRlbnRyaWVzOiBNYXA8c3RyaW5nLCB7IG1ldGFkYXRhOiBQYXRoTWV0YWRhdGE7IGVuYWJsZWQ6IGJvb2xlYW4gfT4sXG5cdFx0KTogUmVzb2x2ZWRSZXNvdXJjZVtdID0+IHtcblx0XHRcdGNvbnN0IHJlc29sdmVkID0gQXJyYXkuZnJvbShlbnRyaWVzLmVudHJpZXMoKSkubWFwKChbcGF0aCwgeyBtZXRhZGF0YSwgZW5hYmxlZCB9XSkgPT4gKHtcblx0XHRcdFx0cGF0aCxcblx0XHRcdFx0ZW5hYmxlZCxcblx0XHRcdFx0bWV0YWRhdGEsXG5cdFx0XHR9KSk7XG5cdFx0XHRyZXNvbHZlZC5zb3J0KChhLCBiKSA9PiByZXNvdXJjZVByZWNlZGVuY2VSYW5rKGEubWV0YWRhdGEpIC0gcmVzb3VyY2VQcmVjZWRlbmNlUmFuayhiLm1ldGFkYXRhKSk7XG5cblx0XHRcdGNvbnN0IHNlZW4gPSBuZXcgU2V0PHN0cmluZz4oKTtcblx0XHRcdHJldHVybiByZXNvbHZlZC5maWx0ZXIoKGVudHJ5KSA9PiB7XG5cdFx0XHRcdGNvbnN0IGNhbm9uaWNhbFBhdGggPSBjYW5vbmljYWxpemVQYXRoKGVudHJ5LnBhdGgpO1xuXHRcdFx0XHRpZiAoc2Vlbi5oYXMoY2Fub25pY2FsUGF0aCkpIHJldHVybiBmYWxzZTtcblx0XHRcdFx0c2Vlbi5hZGQoY2Fub25pY2FsUGF0aCk7XG5cdFx0XHRcdHJldHVybiB0cnVlO1xuXHRcdFx0fSk7XG5cdFx0fTtcblxuXHRcdHJldHVybiB7XG5cdFx0XHRleHRlbnNpb25zOiBtYXBUb1Jlc29sdmVkKGFjY3VtdWxhdG9yLmV4dGVuc2lvbnMpLFxuXHRcdFx0c2tpbGxzOiBtYXBUb1Jlc29sdmVkKGFjY3VtdWxhdG9yLnNraWxscyksXG5cdFx0XHRwcm9tcHRzOiBtYXBUb1Jlc29sdmVkKGFjY3VtdWxhdG9yLnByb21wdHMpLFxuXHRcdFx0dGhlbWVzOiBtYXBUb1Jlc29sdmVkKGFjY3VtdWxhdG9yLnRoZW1lcyksXG5cdFx0fTtcblx0fVxuXG5cdHByaXZhdGUgc2hvdWxkVXNlV2luZG93c1NoZWxsKGNvbW1hbmQ6IHN0cmluZyk6IGJvb2xlYW4ge1xuXHRcdGlmIChwcm9jZXNzLnBsYXRmb3JtICE9PSBcIndpbjMyXCIpIHtcblx0XHRcdHJldHVybiBmYWxzZTtcblx0XHR9XG5cdFx0Y29uc3QgY29tbWFuZE5hbWUgPSBiYXNlbmFtZShjb21tYW5kKS50b0xvd2VyQ2FzZSgpO1xuXHRcdHJldHVybiAoXG5cdFx0XHRjb21tYW5kTmFtZSA9PT0gXCJucG1cIiB8fFxuXHRcdFx0Y29tbWFuZE5hbWUgPT09IFwibnB4XCIgfHxcblx0XHRcdGNvbW1hbmROYW1lID09PSBcInBucG1cIiB8fFxuXHRcdFx0Y29tbWFuZE5hbWUgPT09IFwieWFyblwiIHx8XG5cdFx0XHRjb21tYW5kTmFtZSA9PT0gXCJ5YXJucGtnXCIgfHxcblx0XHRcdGNvbW1hbmROYW1lID09PSBcImNvcmVwYWNrXCIgfHxcblx0XHRcdGNvbW1hbmROYW1lLmVuZHNXaXRoKFwiLmNtZFwiKSB8fFxuXHRcdFx0Y29tbWFuZE5hbWUuZW5kc1dpdGgoXCIuYmF0XCIpXG5cdFx0KTtcblx0fVxuXG5cdHByaXZhdGUgc3Bhd25Db21tYW5kKGNvbW1hbmQ6IHN0cmluZywgYXJnczogc3RyaW5nW10sIG9wdGlvbnM/OiB7IGN3ZD86IHN0cmluZyB9KTogQ2hpbGRQcm9jZXNzIHtcblx0XHRyZXR1cm4gc3Bhd24oY29tbWFuZCwgYXJncywge1xuXHRcdFx0Y3dkOiBvcHRpb25zPy5jd2QsXG5cdFx0XHRzdGRpbzogaXNTdGRvdXRUYWtlbk92ZXIoKSA/IFtcImlnbm9yZVwiLCAyLCAyXSA6IFwiaW5oZXJpdFwiLFxuXHRcdFx0c2hlbGw6IHRoaXMuc2hvdWxkVXNlV2luZG93c1NoZWxsKGNvbW1hbmQpLFxuXHRcdFx0ZW52OiBnZXRFbnYoKSxcblx0XHR9KTtcblx0fVxuXG5cdHByaXZhdGUgc3Bhd25DYXB0dXJlQ29tbWFuZChcblx0XHRjb21tYW5kOiBzdHJpbmcsXG5cdFx0YXJnczogc3RyaW5nW10sXG5cdFx0b3B0aW9ucz86IHsgY3dkPzogc3RyaW5nOyBlbnY/OiBSZWNvcmQ8c3RyaW5nLCBzdHJpbmc+IH0sXG5cdCk6IENoaWxkUHJvY2Vzc0J5U3RkaW88bnVsbCwgUmVhZGFibGUsIFJlYWRhYmxlPiB7XG5cdFx0Y29uc3QgYmFzZUVudiA9IGdldEVudigpO1xuXHRcdHJldHVybiBzcGF3bihjb21tYW5kLCBhcmdzLCB7XG5cdFx0XHRjd2Q6IG9wdGlvbnM/LmN3ZCxcblx0XHRcdHN0ZGlvOiBbXCJpZ25vcmVcIiwgXCJwaXBlXCIsIFwicGlwZVwiXSxcblx0XHRcdHNoZWxsOiB0aGlzLnNob3VsZFVzZVdpbmRvd3NTaGVsbChjb21tYW5kKSxcblx0XHRcdGVudjogb3B0aW9ucz8uZW52ID8geyAuLi5iYXNlRW52LCAuLi5vcHRpb25zLmVudiB9IDogYmFzZUVudixcblx0XHR9KTtcblx0fVxuXG5cdHByaXZhdGUgcnVuQ29tbWFuZENhcHR1cmUoXG5cdFx0Y29tbWFuZDogc3RyaW5nLFxuXHRcdGFyZ3M6IHN0cmluZ1tdLFxuXHRcdG9wdGlvbnM/OiB7IGN3ZD86IHN0cmluZzsgdGltZW91dE1zPzogbnVtYmVyOyBlbnY/OiBSZWNvcmQ8c3RyaW5nLCBzdHJpbmc+IH0sXG5cdCk6IFByb21pc2U8c3RyaW5nPiB7XG5cdFx0cmV0dXJuIG5ldyBQcm9taXNlKChyZXNvbHZlUHJvbWlzZSwgcmVqZWN0KSA9PiB7XG5cdFx0XHRjb25zdCBjaGlsZCA9IHRoaXMuc3Bhd25DYXB0dXJlQ29tbWFuZChjb21tYW5kLCBhcmdzLCBvcHRpb25zKTtcblx0XHRcdGxldCBzdGRvdXQgPSBcIlwiO1xuXHRcdFx0bGV0IHN0ZGVyciA9IFwiXCI7XG5cdFx0XHRsZXQgdGltZWRPdXQgPSBmYWxzZTtcblx0XHRcdGNvbnN0IHRpbWVvdXQgPVxuXHRcdFx0XHR0eXBlb2Ygb3B0aW9ucz8udGltZW91dE1zID09PSBcIm51bWJlclwiXG5cdFx0XHRcdFx0PyBzZXRUaW1lb3V0KCgpID0+IHtcblx0XHRcdFx0XHRcdFx0dGltZWRPdXQgPSB0cnVlO1xuXHRcdFx0XHRcdFx0XHRjaGlsZC5raWxsKCk7XG5cdFx0XHRcdFx0XHR9LCBvcHRpb25zLnRpbWVvdXRNcylcblx0XHRcdFx0XHQ6IHVuZGVmaW5lZDtcblxuXHRcdFx0Y2hpbGQuc3Rkb3V0Py5vbihcImRhdGFcIiwgKGRhdGEpID0+IHtcblx0XHRcdFx0c3Rkb3V0ICs9IGRhdGEudG9TdHJpbmcoKTtcblx0XHRcdH0pO1xuXHRcdFx0Y2hpbGQuc3RkZXJyPy5vbihcImRhdGFcIiwgKGRhdGEpID0+IHtcblx0XHRcdFx0c3RkZXJyICs9IGRhdGEudG9TdHJpbmcoKTtcblx0XHRcdH0pO1xuXHRcdFx0Y2hpbGQub25jZShcImVycm9yXCIsIChlcnJvcikgPT4ge1xuXHRcdFx0XHRpZiAodGltZW91dCkgY2xlYXJUaW1lb3V0KHRpbWVvdXQpO1xuXHRcdFx0XHRyZWplY3QoZXJyb3IpO1xuXHRcdFx0fSk7XG5cdFx0XHRjaGlsZC5vbmNlKFwiY2xvc2VcIiwgKGNvZGUsIHNpZ25hbCkgPT4ge1xuXHRcdFx0XHRpZiAodGltZW91dCkgY2xlYXJUaW1lb3V0KHRpbWVvdXQpO1xuXHRcdFx0XHRpZiAodGltZWRPdXQpIHtcblx0XHRcdFx0XHRyZWplY3QobmV3IEVycm9yKGAke2NvbW1hbmR9ICR7YXJncy5qb2luKFwiIFwiKX0gdGltZWQgb3V0IGFmdGVyICR7b3B0aW9ucz8udGltZW91dE1zfW1zYCkpO1xuXHRcdFx0XHRcdHJldHVybjtcblx0XHRcdFx0fVxuXHRcdFx0XHRpZiAoY29kZSA9PT0gMCkge1xuXHRcdFx0XHRcdHJlc29sdmVQcm9taXNlKHN0ZG91dC50cmltKCkpO1xuXHRcdFx0XHRcdHJldHVybjtcblx0XHRcdFx0fVxuXHRcdFx0XHRjb25zdCBleGl0U3RhdHVzID0gY29kZSA9PT0gbnVsbCA/IGBzaWduYWwgJHtzaWduYWwgPz8gXCJ1bmtub3duXCJ9YCA6IGBjb2RlICR7Y29kZX1gO1xuXHRcdFx0XHRyZWplY3QobmV3IEVycm9yKGAke2NvbW1hbmR9ICR7YXJncy5qb2luKFwiIFwiKX0gZmFpbGVkIHdpdGggJHtleGl0U3RhdHVzfTogJHtzdGRlcnIgfHwgc3Rkb3V0fWApKTtcblx0XHRcdH0pO1xuXHRcdH0pO1xuXHR9XG5cblx0cHJpdmF0ZSBydW5Db21tYW5kKGNvbW1hbmQ6IHN0cmluZywgYXJnczogc3RyaW5nW10sIG9wdGlvbnM/OiB7IGN3ZD86IHN0cmluZyB9KTogUHJvbWlzZTx2b2lkPiB7XG5cdFx0cmV0dXJuIG5ldyBQcm9taXNlKChyZXNvbHZlUHJvbWlzZSwgcmVqZWN0KSA9PiB7XG5cdFx0XHRjb25zdCBjaGlsZCA9IHRoaXMuc3Bhd25Db21tYW5kKGNvbW1hbmQsIGFyZ3MsIG9wdGlvbnMpO1xuXHRcdFx0Y2hpbGQub24oXCJlcnJvclwiLCByZWplY3QpO1xuXHRcdFx0Y2hpbGQub24oXCJleGl0XCIsIChjb2RlKSA9PiB7XG5cdFx0XHRcdGlmIChjb2RlID09PSAwKSB7XG5cdFx0XHRcdFx0cmVzb2x2ZVByb21pc2UoKTtcblx0XHRcdFx0fSBlbHNlIHtcblx0XHRcdFx0XHRyZWplY3QobmV3IEVycm9yKGAke2NvbW1hbmR9ICR7YXJncy5qb2luKFwiIFwiKX0gZmFpbGVkIHdpdGggY29kZSAke2NvZGV9YCkpO1xuXHRcdFx0XHR9XG5cdFx0XHR9KTtcblx0XHR9KTtcblx0fVxuXG5cdHByaXZhdGUgcnVuQ29tbWFuZFN5bmMoY29tbWFuZDogc3RyaW5nLCBhcmdzOiBzdHJpbmdbXSk6IHN0cmluZyB7XG5cdFx0Y29uc3QgcmVzdWx0ID0gc3Bhd25TeW5jKGNvbW1hbmQsIGFyZ3MsIHtcblx0XHRcdHN0ZGlvOiBbXCJpZ25vcmVcIiwgXCJwaXBlXCIsIFwicGlwZVwiXSxcblx0XHRcdGVuY29kaW5nOiBcInV0Zi04XCIsXG5cdFx0XHRzaGVsbDogdGhpcy5zaG91bGRVc2VXaW5kb3dzU2hlbGwoY29tbWFuZCksXG5cdFx0XHRlbnY6IGdldEVudigpLFxuXHRcdH0pO1xuXHRcdGlmIChyZXN1bHQuZXJyb3IgfHwgcmVzdWx0LnN0YXR1cyAhPT0gMCkge1xuXHRcdFx0dGhyb3cgbmV3IEVycm9yKFxuXHRcdFx0XHRgRmFpbGVkIHRvIHJ1biAke2NvbW1hbmR9ICR7YXJncy5qb2luKFwiIFwiKX06ICR7cmVzdWx0LmVycm9yPy5tZXNzYWdlIHx8IHJlc3VsdC5zdGRlcnIgfHwgcmVzdWx0LnN0ZG91dH1gLFxuXHRcdFx0KTtcblx0XHR9XG5cdFx0cmV0dXJuIChyZXN1bHQuc3Rkb3V0IHx8IHJlc3VsdC5zdGRlcnIgfHwgXCJcIikudHJpbSgpO1xuXHR9XG59XG4ifV0sImlzRXJyb3IiOmZhbHNlLCJ0aW1lc3RhbXAiOjE3Nzc1NjQyMzUzODN9fSx7InR5cGUiOiJtZXNzYWdlIiwiaWQiOiJjOTE3ZjFjNyIsInBhcmVudElkIjoiYjkxMjI2MmEiLCJ0aW1lc3RhbXAiOiIyMDI2LTA0LTMwVDE1OjUwOjM4LjEwNloiLCJtZXNzYWdlIjp7InJvbGUiOiJhc3Npc3RhbnQiLCJjb250ZW50IjpbeyJ0eXBlIjoidGhpbmtpbmciLCJ0aGlua2luZyI6IiBOb3cgSSBoYXZlIGEgY29tcGxldGUgcGljdHVyZSBvZiB0aGUgY29kZS4gTGV0IG1lIGFsc28gcmVhZCB0aGUgdGVzdCBmaWxlIHRvIHVuZGVyc3RhbmQgZXhhY3RseSB3aGF0IHRlc3RzIGFyZSBmYWlsaW5nOiIsInRoaW5raW5nU2lnbmF0dXJlIjoicmVhc29uaW5nIn0seyJ0eXBlIjoidG9vbENhbGwiLCJpZCI6ImZ1bmN0aW9ucy5ncmVwOjQiLCJuYW1lIjoiZ3JlcCIsImFyZ3VtZW50cyI6eyJwYXR0ZXJuIjoiYXV0by1kaXNjb3ZlcmVkIHNraWxsIG1ldGFkYXRhIiwicGF0aCI6InBhY2thZ2VzL2NvZGluZy1hZ2VudC90ZXN0IiwiY29udGV4dCI6NX19XSwiYXBpIjoib3BlbmFpLWNvbXBsZXRpb25zIiwicHJvdmlkZXIiOiJzeW50aGV0aWMiLCJtb2RlbCI6ImhmOm1vb25zaG90YWkvS2ltaS1LMi41IiwidXNhZ2UiOnsiaW5wdXQiOjYwODAsIm91dHB1dCI6NjIsImNhY2hlUmVhZCI6Mjk0NzIsImNhY2hlV3JpdGUiOjAsInRvdGFsVG9rZW5zIjozNTYxNCwiY29zdCI6eyJpbnB1dCI6MC4wMDI3MzYsIm91dHB1dCI6MC4wMDAyMTA4LCJjYWNoZVJlYWQiOjAuMDEzMjYyNCwiY2FjaGVXcml0ZSI6MCwidG90YWwiOjAuMDE2MjA5Mn19LCJzdG9wUmVhc29uIjoidG9vbFVzZSIsInRpbWVzdGFtcCI6MTc3NzU2NDIzNTM4NCwicmVzcG9uc2VJZCI6ImNoYXRjbXBsLWFmZjU5Yzk1OWYwYzEzZmQifX0seyJ0eXBlIjoibWVzc2FnZSIsImlkIjoiZDQzNjBkMWIiLCJwYXJlbnRJZCI6ImM5MTdmMWM3IiwidGltZXN0YW1wIjoiMjAyNi0wNC0zMFQxNTo1MDozOC4xMjdaIiwibWVzc2FnZSI6eyJyb2xlIjoidG9vbFJlc3VsdCIsInRvb2xDYWxsSWQiOiJmdW5jdGlvbnMuZ3JlcDo0IiwidG9vbE5hbWUiOiJncmVwIiwiY29udGVudCI6W3sidHlwZSI6InRleHQiLCJ0ZXh0IjoicGFja2FnZS1tYW5hZ2VyLnRlc3QudHM6MjYwOiAgIC8vIFNob3VsZCBOT1QgZmluZCBoZWxwZXIudHMgKG5vdCBkZWNsYXJlZCBpbiBtYW5pZmVzdClcbnBhY2thZ2UtbWFuYWdlci50ZXN0LnRzOjI2MTogICBleHBlY3QocmVzdWx0LmV4dGVuc2lvbnMuc29tZSgocikgPT4gcGF0aEVuZHNXaXRoKHIucGF0aCwgXCJoZWxwZXIudHNcIikpKS50b0JlKGZhbHNlKTtcbnBhY2thZ2UtbWFuYWdlci50ZXN0LnRzOjI2MjogICB9KTtcbnBhY2thZ2UtbWFuYWdlci50ZXN0LnRzOjI2MzogICB9KTtcbnBhY2thZ2UtbWFuYWdlci50ZXN0LnRzOjI2NDogICBcbnBhY2thZ2UtbWFuYWdlci50ZXN0LnRzOjI2NTogZGVzY3JpYmUoXCJhdXRvLWRpc2NvdmVyZWQgc2tpbGwgbWV0YWRhdGFcIiwgKCkgPT4ge1xucGFja2FnZS1tYW5hZ2VyLnRlc3QudHM6MjY2OiAgIGl0KFwic2hvdWxkIHVzZSB0aGUgYWdlbnQgZGlyIGFzIGJhc2VEaXIgZm9yIHVzZXIgLnBpL2FnZW50IHNraWxsc1wiLCBhc3luYyAoKSA9PiB7XG5wYWNrYWdlLW1hbmFnZXIudGVzdC50czoyNjc6ICAgY29uc3Qgc2tpbGxQYXRoID0gam9pbihhZ2VudERpciwgXCJza2lsbHNcIiwgXCJ1c2VyLXBpXCIsIFwiU0tJTEwubWRcIik7XG5wYWNrYWdlLW1hbmFnZXIudGVzdC50czoyNjg6ICAgbWtkaXJTeW5jKGpvaW4oYWdlbnREaXIsIFwic2tpbGxzXCIsIFwidXNlci1waVwiKSwgeyByZWN1cnNpdmU6IHRydWUgfSk7XG5wYWNrYWdlLW1hbmFnZXIudGVzdC50czoyNjk6ICAgd3JpdGVGaWxlU3luYyhza2lsbFBhdGgsIFwiLS0tXFxubmFtZTogdXNlci1waVxcbmRlc2NyaXB0aW9uOiB1c2VyIHBpXFxuLS0tXFxuXCIpO1xucGFja2FnZS1tYW5hZ2VyLnRlc3QudHM6MjcwOiAgICJ9XSwiZGV0YWlscyI6eyJtYXRjaENvdW50IjoxLCJtYXRjaGVzIjpbeyJwYXRoIjoicGFja2FnZS1tYW5hZ2VyLnRlc3QudHMiLCJsaW5lIjoyNjAsInRleHQiOiIgIC8vIFNob3VsZCBOT1QgZmluZCBoZWxwZXIudHMgKG5vdCBkZWNsYXJlZCBpbiBtYW5pZmVzdCkifSx7InBhdGgiOiJwYWNrYWdlLW1hbmFnZXIudGVzdC50cyIsImxpbmUiOjI2MSwidGV4dCI6IiAgZXhwZWN0KHJlc3VsdC5leHRlbnNpb25zLnNvbWUoKHIpID0+IHBhdGhFbmRzV2l0aChyLnBhdGgsIFwiaGVscGVyLnRzXCIpKSkudG9CZShmYWxzZSk7In0seyJwYXRoIjoicGFja2FnZS1tYW5hZ2VyLnRlc3QudHMiLCJsaW5lIjoyNjIsInRleHQiOiIgIH0pOyJ9LHsicGF0aCI6InBhY2thZ2UtbWFuYWdlci50ZXN0LnRzIiwibGluZSI6MjYzLCJ0ZXh0IjoiICB9KTsifSx7InBhdGgiOiJwYWNrYWdlLW1hbmFnZXIudGVzdC50cyIsImxpbmUiOjI2NCwidGV4dCI6IiAgIn0seyJwYXRoIjoicGFja2FnZS1tYW5hZ2VyLnRlc3QudHMiLCJsaW5lIjoyNjUsInRleHQiOiJkZXNjcmliZShcImF1dG8tZGlzY292ZXJlZCBza2lsbCBtZXRhZGF0YVwiLCAoKSA9PiB7In0seyJwYXRoIjoicGFja2FnZS1tYW5hZ2VyLnRlc3QudHMiLCJsaW5lIjoyNjYsInRleHQiOiIgIGl0KFwic2hvdWxkIHVzZSB0aGUgYWdlbnQgZGlyIGFzIGJhc2VEaXIgZm9yIHVzZXIgLnBpL2FnZW50IHNraWxsc1wiLCBhc3luYyAoKSA9PiB7In0seyJwYXRoIjoicGFja2FnZS1tYW5hZ2VyLnRlc3QudHMiLCJsaW5lIjoyNjcsInRleHQiOiIgIGNvbnN0IHNraWxsUGF0aCA9IGpvaW4oYWdlbnREaXIsIFwic2tpbGxzXCIsIFwidXNlci1waVwiLCBcIlNLSUxMLm1kXCIpOyJ9LHsicGF0aCI6InBhY2thZ2UtbWFuYWdlci50ZXN0LnRzIiwibGluZSI6MjY4LCJ0ZXh0IjoiICBta2RpclN5bmMoam9pbihhZ2VudERpciwgXCJza2lsbHNcIiwgXCJ1c2VyLXBpXCIpLCB7IHJlY3Vyc2l2ZTogdHJ1ZSB9KTsifSx7InBhdGgiOiJwYWNrYWdlLW1hbmFnZXIudGVzdC50cyIsImxpbmUiOjI2OSwidGV4dCI6IiAgd3JpdGVGaWxlU3luYyhza2lsbFBhdGgsIFwiLS0tXFxubmFtZTogdXNlci1waVxcbmRlc2NyaXB0aW9uOiB1c2VyIHBpXFxuLS0tXFxuXCIpOyJ9LHsicGF0aCI6InBhY2thZ2UtbWFuYWdlci50ZXN0LnRzIiwibGluZSI6MjcwLCJ0ZXh0IjoiICAifV0sInJlbGF0aXZlVG8iOiJwYWNrYWdlcy9jb2RpbmctYWdlbnQvdGVzdCJ9LCJpc0Vycm9yIjpmYWxzZSwidGltZXN0YW1wIjoxNzc3NTY0MjM4MTI3fX0seyJ0eXBlIjoibWVzc2FnZSIsImlkIjoiMWM4ZTBmNWIiLCJwYXJlbnRJZCI6ImQ0MzYwZDFiIiwidGltZXN0YW1wIjoiMjAyNi0wNC0zMFQxNTo1MDo0MC42MjZaIiwibWVzc2FnZSI6eyJyb2xlIjoiYXNzaXN0YW50IiwiY29udGVudCI6W3sidHlwZSI6InRvb2xDYWxsIiwiaWQiOiJmdW5jdGlvbnMucmVhZDo1IiwibmFtZSI6InJlYWQiLCJhcmd1bWVudHMiOnsicGF0aCI6InBhY2thZ2VzL2NvZGluZy1hZ2VudC90ZXN0L3BhY2thZ2UtbWFuYWdlci50ZXN0LnRzIiwib2Zmc2V0IjoyNjUsImxpbWl0IjoxNTB9fV0sImFwaSI6Im9wZW5haS1jb21wbGV0aW9ucyIsInByb3ZpZGVyIjoic3ludGhldGljIiwibW9kZWwiOiJoZjptb29uc2hvdGFpL0tpbWktSzIuNSIsInVzYWdlIjp7ImlucHV0IjozMDgsIm91dHB1dCI6MzYsImNhY2hlUmVhZCI6MzU1MjAsImNhY2hlV3JpdGUiOjAsInRvdGFsVG9rZW5zIjozNTg2NCwiY29zdCI6eyJpbnB1dCI6MC4wMDAxMzg2LCJvdXRwdXQiOjAuMDAwMTIyNCwiY2FjaGVSZWFkIjowLjAxNTk4NCwiY2FjaGVXcml0ZSI6MCwidG90YWwiOjAuMDE2MjQ1MDAwMDAwMDAwMDAyfX0sInN0b3BSZWFzb24iOiJ0b29sVXNlIiwidGltZXN0YW1wIjoxNzc3NTY0MjM4MTI3LCJyZXNwb25zZUlkIjoiY2hhdGNtcGwtOTYwMGUyZjM1MjY3NjNiOCJ9fSx7InR5cGUiOiJtZXNzYWdlIiwiaWQiOiJjNGQ5MmZhNCIsInBhcmVudElkIjoiMWM4ZTBmNWIiLCJ0aW1lc3RhbXAiOiIyMDI2LTA0LTMwVDE1OjUwOjQwLjYzM1oiLCJtZXNzYWdlIjp7InJvbGUiOiJ0b29sUmVzdWx0IiwidG9vbENhbGxJZCI6ImZ1bmN0aW9ucy5yZWFkOjUiLCJ0b29sTmFtZSI6InJlYWQiLCJjb250ZW50IjpbeyJ0eXBlIjoidGV4dCIsInRleHQiOiJcdGRlc2NyaWJlKFwiYXV0by1kaXNjb3ZlcmVkIHNraWxsIG1ldGFkYXRhXCIsICgpID0+IHtcblx0XHRpdChcInNob3VsZCB1c2UgdGhlIGFnZW50IGRpciBhcyBiYXNlRGlyIGZvciB1c2VyIC5waS9hZ2VudCBza2lsbHNcIiwgYXN5bmMgKCkgPT4ge1xuXHRcdFx0Y29uc3Qgc2tpbGxQYXRoID0gam9pbihhZ2VudERpciwgXCJza2lsbHNcIiwgXCJ1c2VyLXBpXCIsIFwiU0tJTEwubWRcIik7XG5cdFx0XHRta2RpclN5bmMoam9pbihhZ2VudERpciwgXCJza2lsbHNcIiwgXCJ1c2VyLXBpXCIpLCB7IHJlY3Vyc2l2ZTogdHJ1ZSB9KTtcblx0XHRcdHdyaXRlRmlsZVN5bmMoc2tpbGxQYXRoLCBcIi0tLVxcbm5hbWU6IHVzZXItcGlcXG5kZXNjcmlwdGlvbjogdXNlciBwaVxcbi0tLVxcblwiKTtcblxuXHRcdFx0Y29uc3QgcmVzdWx0ID0gYXdhaXQgcGFja2FnZU1hbmFnZXIucmVzb2x2ZSgpO1xuXHRcdFx0Y29uc3Qgc2tpbGwgPSByZXN1bHQuc2tpbGxzLmZpbmQoKHIpID0+IHIucGF0aCA9PT0gc2tpbGxQYXRoKTtcblxuXHRcdFx0ZXhwZWN0KHNraWxsPy5tZXRhZGF0YS5zb3VyY2UpLnRvQmUoXCJhdXRvXCIpO1xuXHRcdFx0ZXhwZWN0KHNraWxsPy5tZXRhZGF0YS5zY29wZSkudG9CZShcInVzZXJcIik7XG5cdFx0XHRleHBlY3Qoc2tpbGw/Lm1ldGFkYXRhLmJhc2VEaXIpLnRvQmUoYWdlbnREaXIpO1xuXHRcdH0pO1xuXG5cdFx0aXQoXCJzaG91bGQgdXNlIHRoZSBwcm9qZWN0IC5waSBkaXIgYXMgYmFzZURpciBmb3IgcHJvamVjdCAucGkgc2tpbGxzXCIsIGFzeW5jICgpID0+IHtcblx0XHRcdGNvbnN0IHByb2plY3RCYXNlRGlyID0gam9pbih0ZW1wRGlyLCBcIi5waVwiKTtcblx0XHRcdGNvbnN0IHNraWxsUGF0aCA9IGpvaW4ocHJvamVjdEJhc2VEaXIsIFwic2tpbGxzXCIsIFwicHJvamVjdC1waVwiLCBcIlNLSUxMLm1kXCIpO1xuXHRcdFx0bWtkaXJTeW5jKGpvaW4ocHJvamVjdEJhc2VEaXIsIFwic2tpbGxzXCIsIFwicHJvamVjdC1waVwiKSwgeyByZWN1cnNpdmU6IHRydWUgfSk7XG5cdFx0XHR3cml0ZUZpbGVTeW5jKHNraWxsUGF0aCwgXCItLS1cXG5uYW1lOiBwcm9qZWN0LXBpXFxuZGVzY3JpcHRpb246IHByb2plY3QgcGlcXG4tLS1cXG5cIik7XG5cblx0XHRcdGNvbnN0IHJlc3VsdCA9IGF3YWl0IHBhY2thZ2VNYW5hZ2VyLnJlc29sdmUoKTtcblx0XHRcdGNvbnN0IHNraWxsID0gcmVzdWx0LnNraWxscy5maW5kKChyKSA9PiByLnBhdGggPT09IHNraWxsUGF0aCk7XG5cblx0XHRcdGV4cGVjdChza2lsbD8ubWV0YWRhdGEuc291cmNlKS50b0JlKFwiYXV0b1wiKTtcblx0XHRcdGV4cGVjdChza2lsbD8ubWV0YWRhdGEuc2NvcGUpLnRvQmUoXCJwcm9qZWN0XCIpO1xuXHRcdFx0ZXhwZWN0KHNraWxsPy5tZXRhZGF0YS5iYXNlRGlyKS50b0JlKHByb2plY3RCYXNlRGlyKTtcblx0XHR9KTtcblxuXHRcdGl0KFwic2hvdWxkIHVzZSB+Ly5hZ2VudHMgYXMgYmFzZURpciBmb3IgdXNlciAuYWdlbnRzIHNraWxsc1wiLCBhc3luYyAoKSA9PiB7XG5cdFx0XHRjb25zdCBwcmV2aW91c0hvbWUgPSBwcm9jZXNzLmVudi5IT01FO1xuXHRcdFx0cHJvY2Vzcy5lbnYuSE9NRSA9IHRlbXBEaXI7XG5cblx0XHRcdHRyeSB7XG5cdFx0XHRcdGNvbnN0IGFnZW50c0Jhc2VEaXIgPSBqb2luKHRlbXBEaXIsIFwiLmFnZW50c1wiKTtcblx0XHRcdFx0Y29uc3Qgc2tpbGxQYXRoID0gam9pbihhZ2VudHNCYXNlRGlyLCBcInNraWxsc1wiLCBcInVzZXItYWdlbnRzXCIsIFwiU0tJTEwubWRcIik7XG5cdFx0XHRcdG1rZGlyU3luYyhqb2luKGFnZW50c0Jhc2VEaXIsIFwic2tpbGxzXCIsIFwidXNlci1hZ2VudHNcIiksIHsgcmVjdXJzaXZlOiB0cnVlIH0pO1xuXHRcdFx0XHR3cml0ZUZpbGVTeW5jKHNraWxsUGF0aCwgXCItLS1cXG5uYW1lOiB1c2VyLWFnZW50c1xcbmRlc2NyaXB0aW9uOiB1c2VyIGFnZW50c1xcbi0tLVxcblwiKTtcblxuXHRcdFx0XHRjb25zdCByZXN1bHQgPSBhd2FpdCBwYWNrYWdlTWFuYWdlci5yZXNvbHZlKCk7XG5cdFx0XHRcdGNvbnN0IHNraWxsID0gcmVzdWx0LnNraWxscy5maW5kKChyKSA9PiByLnBhdGggPT09IHNraWxsUGF0aCk7XG5cblx0XHRcdFx0ZXhwZWN0KHNraWxsPy5tZXRhZGF0YS5zb3VyY2UpLnRvQmUoXCJhdXRvXCIpO1xuXHRcdFx0XHRleHBlY3Qoc2tpbGw/Lm1ldGFkYXRhLnNjb3BlKS50b0JlKFwidXNlclwiKTtcblx0XHRcdFx0ZXhwZWN0KHNraWxsPy5tZXRhZGF0YS5iYXNlRGlyKS50b0JlKGFnZW50c0Jhc2VEaXIpO1xuXHRcdFx0fSBmaW5hbGx5IHtcblx0XHRcdFx0aWYgKHByZXZpb3VzSG9tZSA9PT0gdW5kZWZpbmVkKSB7XG5cdFx0XHRcdFx0ZGVsZXRlIHByb2Nlc3MuZW52LkhPTUU7XG5cdFx0XHRcdH0gZWxzZSB7XG5cdFx0XHRcdFx0cHJvY2Vzcy5lbnYuSE9NRSA9IHByZXZpb3VzSG9tZTtcblx0XHRcdFx0fVxuXHRcdFx0fVxuXHRcdH0pO1xuXG5cdFx0aXQoXCJzaG91bGQgdXNlIGVhY2ggcHJvamVjdCAuYWdlbnRzIGRpciBhcyBiYXNlRGlyIGZvciBwcm9qZWN0IC5hZ2VudHMgc2tpbGxzXCIsIGFzeW5jICgpID0+IHtcblx0XHRcdGNvbnN0IHJlcG9Sb290ID0gam9pbih0ZW1wRGlyLCBcInJlcG9cIik7XG5cdFx0XHRjb25zdCBuZXN0ZWRDd2QgPSBqb2luKHJlcG9Sb290LCBcInBhY2thZ2VzXCIsIFwiZmVhdHVyZVwiKTtcblx0XHRcdG1rZGlyU3luYyhuZXN0ZWRDd2QsIHsgcmVjdXJzaXZlOiB0cnVlIH0pO1xuXHRcdFx0bWtkaXJTeW5jKGpvaW4ocmVwb1Jvb3QsIFwiLmdpdFwiKSwgeyByZWN1cnNpdmU6IHRydWUgfSk7XG5cblx0XHRcdGNvbnN0IHJlcG9BZ2VudHNCYXNlRGlyID0gam9pbihyZXBvUm9vdCwgXCIuYWdlbnRzXCIpO1xuXHRcdFx0Y29uc3QgcmVwb1NraWxsID0gam9pbihyZXBvQWdlbnRzQmFzZURpciwgXCJza2lsbHNcIiwgXCJyZXBvXCIsIFwiU0tJTEwubWRcIik7XG5cdFx0XHRta2RpclN5bmMoam9pbihyZXBvQWdlbnRzQmFzZURpciwgXCJza2lsbHNcIiwgXCJyZXBvXCIpLCB7IHJlY3Vyc2l2ZTogdHJ1ZSB9KTtcblx0XHRcdHdyaXRlRmlsZVN5bmMocmVwb1NraWxsLCBcIi0tLVxcbm5hbWU6IHJlcG9cXG5kZXNjcmlwdGlvbjogcmVwb1xcbi0tLVxcblwiKTtcblxuXHRcdFx0Y29uc3QgcGFja2FnZUFnZW50c0Jhc2VEaXIgPSBqb2luKHJlcG9Sb290LCBcInBhY2thZ2VzXCIsIFwiLmFnZW50c1wiKTtcblx0XHRcdGNvbnN0IHBhY2thZ2VTa2lsbCA9IGpvaW4ocGFja2FnZUFnZW50c0Jhc2VEaXIsIFwic2tpbGxzXCIsIFwicGFja2FnZVwiLCBcIlNLSUxMLm1kXCIpO1xuXHRcdFx0bWtkaXJTeW5jKGpvaW4ocGFja2FnZUFnZW50c0Jhc2VEaXIsIFwic2tpbGxzXCIsIFwicGFja2FnZVwiKSwgeyByZWN1cnNpdmU6IHRydWUgfSk7XG5cdFx0XHR3cml0ZUZpbGVTeW5jKHBhY2thZ2VTa2lsbCwgXCItLS1cXG5uYW1lOiBwYWNrYWdlXFxuZGVzY3JpcHRpb246IHBhY2thZ2VcXG4tLS1cXG5cIik7XG5cblx0XHRcdGNvbnN0IHBtID0gbmV3IERlZmF1bHRQYWNrYWdlTWFuYWdlcih7XG5cdFx0XHRcdGN3ZDogbmVzdGVkQ3dkLFxuXHRcdFx0XHRhZ2VudERpcixcblx0XHRcdFx0c2V0dGluZ3NNYW5hZ2VyLFxuXHRcdFx0fSk7XG5cblx0XHRcdGNvbnN0IHJlc3VsdCA9IGF3YWl0IHBtLnJlc29sdmUoKTtcblx0XHRcdGNvbnN0IHJlc29sdmVkUmVwb1NraWxsID0gcmVzdWx0LnNraWxscy5maW5kKChyKSA9PiByLnBhdGggPT09IHJlcG9Ta2lsbCk7XG5cdFx0XHRjb25zdCByZXNvbHZlZFBhY2thZ2VTa2lsbCA9IHJlc3VsdC5za2lsbHMuZmluZCgocikgPT4gci5wYXRoID09PSBwYWNrYWdlU2tpbGwpO1xuXG5cdFx0XHRleHBlY3QocmVzb2x2ZWRSZXBvU2tpbGw/Lm1ldGFkYXRhLnNvdXJjZSkudG9CZShcImF1dG9cIik7XG5cdFx0XHRleHBlY3QocmVzb2x2ZWRSZXBvU2tpbGw/Lm1ldGFkYXRhLnNjb3BlKS50b0JlKFwicHJvamVjdFwiKTtcblx0XHRcdGV4cGVjdChyZXNvbHZlZFJlcG9Ta2lsbD8ubWV0YWRhdGEuYmFzZURpcikudG9CZShyZXBvQWdlbnRzQmFzZURpcik7XG5cdFx0XHRleHBlY3QocmVzb2x2ZWRQYWNrYWdlU2tpbGw/Lm1ldGFkYXRhLnNvdXJjZSkudG9CZShcImF1dG9cIik7XG5cdFx0XHRleHBlY3QocmVzb2x2ZWRQYWNrYWdlU2tpbGw/Lm1ldGFkYXRhLnNjb3BlKS50b0JlKFwicHJvamVjdFwiKTtcblx0XHRcdGV4cGVjdChyZXNvbHZlZFBhY2thZ2VTa2lsbD8ubWV0YWRhdGEuYmFzZURpcikudG9CZShwYWNrYWdlQWdlbnRzQmFzZURpcik7XG5cdFx0fSk7XG5cdH0pO1xuXG5cdGRlc2NyaWJlKFwiLmFnZW50cy9za2lsbHMgYXV0by1kaXNjb3ZlcnlcIiwgKCkgPT4ge1xuXHRcdGl0KFwic2hvdWxkIHNjYW4gLmFnZW50cy9za2lsbHMgZnJvbSBjd2QgdXAgdG8gZ2l0IHJlcG8gcm9vdFwiLCBhc3luYyAoKSA9PiB7XG5cdFx0XHRjb25zdCByZXBvUm9vdCA9IGpvaW4odGVtcERpciwgXCJyZXBvXCIpO1xuXHRcdFx0Y29uc3QgbmVzdGVkQ3dkID0gam9pbihyZXBvUm9vdCwgXCJwYWNrYWdlc1wiLCBcImZlYXR1cmVcIik7XG5cdFx0XHRta2RpclN5bmMobmVzdGVkQ3dkLCB7IHJlY3Vyc2l2ZTogdHJ1ZSB9KTtcblx0XHRcdG1rZGlyU3luYyhqb2luKHJlcG9Sb290LCBcIi5naXRcIiksIHsgcmVjdXJzaXZlOiB0cnVlIH0pO1xuXG5cdFx0XHRjb25zdCBhYm92ZVJlcG9Ta2lsbCA9IGpvaW4odGVtcERpciwgXCIuYWdlbnRzXCIsIFwic2tpbGxzXCIsIFwiYWJvdmUtcmVwb1wiLCBcIlNLSUxMLm1kXCIpO1xuXHRcdFx0bWtkaXJTeW5jKGpvaW4odGVtcERpciwgXCIuYWdlbnRzXCIsIFwic2tpbGxzXCIsIFwiYWJvdmUtcmVwb1wiKSwgeyByZWN1cnNpdmU6IHRydWUgfSk7XG5cdFx0XHR3cml0ZUZpbGVTeW5jKGFib3ZlUmVwb1NraWxsLCBcIi0tLVxcbm5hbWU6IGFib3ZlLXJlcG9cXG5kZXNjcmlwdGlvbjogYWJvdmVcXG4tLS1cXG5cIik7XG5cblx0XHRcdGNvbnN0IHJlcG9Sb290U2tpbGwgPSBqb2luKHJlcG9Sb290LCBcIi5hZ2VudHNcIiwgXCJza2lsbHNcIiwgXCJyZXBvLXJvb3RcIiwgXCJTS0lMTC5tZFwiKTtcblx0XHRcdG1rZGlyU3luYyhqb2luKHJlcG9Sb290LCBcIi5hZ2VudHNcIiwgXCJza2lsbHNcIiwgXCJyZXBvLXJvb3RcIiksIHsgcmVjdXJzaXZlOiB0cnVlIH0pO1xuXHRcdFx0d3JpdGVGaWxlU3luYyhyZXBvUm9vdFNraWxsLCBcIi0tLVxcbm5hbWU6IHJlcG8tcm9vdFxcbmRlc2NyaXB0aW9uOiByZXBvXFxuLS0tXFxuXCIpO1xuXG5cdFx0XHRjb25zdCBuZXN0ZWRTa2lsbCA9IGpvaW4ocmVwb1Jvb3QsIFwicGFja2FnZXNcIiwgXCIuYWdlbnRzXCIsIFwic2tpbGxzXCIsIFwibmVzdGVkXCIsIFwiU0tJTEwubWRcIik7XG5cdFx0XHRta2RpclN5bmMoam9pbihyZXBvUm9vdCwgXCJwYWNrYWdlc1wiLCBcIi5hZ2VudHNcIiwgXCJza2lsbHNcIiwgXCJuZXN0ZWRcIiksIHsgcmVjdXJzaXZlOiB0cnVlIH0pO1xuXHRcdFx0d3JpdGVGaWxlU3luYyhuZXN0ZWRTa2lsbCwgXCItLS1cXG5uYW1lOiBuZXN0ZWRcXG5kZXNjcmlwdGlvbjogbmVzdGVkXFxuLS0tXFxuXCIpO1xuXG5cdFx0XHRjb25zdCBwbSA9IG5ldyBEZWZhdWx0UGFja2FnZU1hbmFnZXIoe1xuXHRcdFx0XHRjd2Q6IG5lc3RlZEN3ZCxcblx0XHRcdFx0YWdlbnREaXIsXG5cdFx0XHRcdHNldHRpbmdzTWFuYWdlcixcblx0XHRcdH0pO1xuXG5cdFx0XHRjb25zdCByZXN1bHQgPSBhd2FpdCBwbS5yZXNvbHZlKCk7XG5cdFx0XHRleHBlY3QocmVzdWx0LnNraWxscy5zb21lKChyKSA9PiByLnBhdGggPT09IHJlcG9Sb290U2tpbGwgJiYgci5lbmFibGVkKSkudG9CZSh0cnVlKTtcblx0XHRcdGV4cGVjdChyZXN1bHQuc2tpbGxzLnNvbWUoKHIpID0+IHIucGF0aCA9PT0gbmVzdGVkU2tpbGwgJiYgci5lbmFibGVkKSkudG9CZSh0cnVlKTtcblx0XHRcdGV4cGVjdChyZXN1bHQuc2tpbGxzLnNvbWUoKHIpID0+IHIucGF0aCA9PT0gYWJvdmVSZXBvU2tpbGwpKS50b0JlKGZhbHNlKTtcblx0XHR9KTtcblxuXHRcdGl0KFwic2hvdWxkIHNjYW4gLmFnZW50cy9za2lsbHMgdXAgdG8gZmlsZXN5c3RlbSByb290IHdoZW4gbm90IGluIGEgZ2l0IHJlcG9cIiwgYXN5bmMgKCkgPT4ge1xuXHRcdFx0Y29uc3Qgbm9uUmVwb1Jvb3QgPSBqb2luKHRlbXBEaXIsIFwibm9uLXJlcG9cIik7XG5cdFx0XHRjb25zdCBuZXN0ZWRDd2QgPSBqb2luKG5vblJlcG9Sb290LCBcImFcIiwgXCJiXCIpO1xuXHRcdFx0bWtkaXJTeW5jKG5lc3RlZEN3ZCwgeyByZWN1cnNpdmU6IHRydWUgfSk7XG5cblx0XHRcdGNvbnN0IHJvb3RTa2lsbCA9IGpvaW4obm9uUmVwb1Jvb3QsIFwiLmFnZW50c1wiLCBcInNraWxsc1wiLCBcInJvb3RcIiwgXCJTS0lMTC5tZFwiKTtcblx0XHRcdG1rZGlyU3luYyhqb2luKG5vblJlcG9Sb290LCBcIi5hZ2VudHNcIiwgXCJza2lsbHNcIiwgXCJyb290XCIpLCB7IHJlY3Vyc2l2ZTogdHJ1ZSB9KTtcblx0XHRcdHdyaXRlRmlsZVN5bmMocm9vdFNraWxsLCBcIi0tLVxcbm5hbWU6IHJvb3RcXG5kZXNjcmlwdGlvbjogcm9vdFxcbi0tLVxcblwiKTtcblxuXHRcdFx0Y29uc3QgbWlkZGxlU2tpbGwgPSBqb2luKG5vblJlcG9Sb290LCBcImFcIiwgXCIuYWdlbnRzXCIsIFwic2tpbGxzXCIsIFwibWlkZGxlXCIsIFwiU0tJTEwubWRcIik7XG5cdFx0XHRta2RpclN5bmMoam9pbihub25SZXBvUm9vdCwgXCJhXCIsIFwiLmFnZW50c1wiLCBcInNraWxsc1wiLCBcIm1pZGRsZVwiKSwgeyByZWN1cnNpdmU6IHRydWUgfSk7XG5cdFx0XHR3cml0ZUZpbGVTeW5jKG1pZGRsZVNraWxsLCBcIi0tLVxcbm5hbWU6IG1pZGRsZVxcbmRlc2NyaXB0aW9uOiBtaWRkbGVcXG4tLS1cXG5cIik7XG5cblx0XHRcdGNvbnN0IHBtID0gbmV3IERlZmF1bHRQYWNrYWdlTWFuYWdlcih7XG5cdFx0XHRcdGN3ZDogbmVzdGVkQ3dkLFxuXHRcdFx0XHRhZ2VudERpcixcblx0XHRcdFx0c2V0dGluZ3NNYW5hZ2VyLFxuXHRcdFx0fSk7XG5cblx0XHRcdGNvbnN0IHJlc3VsdCA9IGF3YWl0IHBtLnJlc29sdmUoKTtcblx0XHRcdGV4cGVjdChyZXN1bHQuc2tpbGxzLnNvbWUoKHIpID0+IHIucGF0aCA9PT0gcm9vdFNraWxsICYmIHIuZW5hYmxlZCkpLnRvQmUodHJ1ZSk7XG5cdFx0XHRleHBlY3QocmVzdWx0LnNraWxscy5zb21lKChyKSA9PiByLnBhdGggPT09IG1pZGRsZVNraWxsICYmIHIuZW5hYmxlZCkpLnRvQmUodHJ1ZSk7XG5cdFx0fSk7XG5cblx0XHRpdChcInNob3VsZCBpZ25vcmUgcm9vdCBtYXJrZG93biBmaWxlcyBpbiAuYWdlbnRzL3NraWxsc1wiLCBhc3luYyAoKSA9PiB7XG5cdFx0XHRjb25zdCBhZ2VudHNTa2lsbHNEaXIgPSBqb2luKHRlbXBEaXIsIFwiLmFnZW50c1wiLCBcInNraWxsc1wiKTtcblx0XHRcdG1rZGlyU3luYyhqb2luKGFnZW50c1NraWxsc0RpciwgXCJuZXN0ZWQtc2tpbGxcIiksIHsgcmVjdXJzaXZlOiB0cnVlIH0pO1xuXHRcdFx0Y29uc3Qgcm9vdFNraWxsID0gam9pbihhZ2VudHNTa2lsbHNEaXIsIFwicm9vdC1maWxlLm1kXCIpO1xuXHRcdFx0Y29uc3QgbmVzdGVkU2tpbGwgPSBqb2luKGFnZW50c1NraWxsc0RpciwgXCJuZXN0ZWQtc2tpbGxcIiwgXCJTS0lMTC5tZFwiKTtcblx0XHRcdHdyaXRlRmlsZVN5bmMocm9vdFNraWxsLCBcIi0tLVxcbm5hbWU6IHJvb3QtZmlsZVxcbmRlc2NyaXB0aW9uOiBSb290IG1hcmtkb3duIGZpbGVcXG4tLS1cXG5cIik7XG5cdFx0XHR3cml0ZUZpbGVTeW5jKG5lc3RlZFNraWxsLCBcIi0tLVxcbm5hbWU6IG5lc3RlZC1za2lsbFxcbmRlc2NyaXB0aW9uOiBOZXN0ZWQgc2tpbGxcXG4tLS1cXG5cIik7XG5cblsxNjA2IG1vcmUgbGluZXMgaW4gZmlsZS4gVXNlIG9mZnNldD00MTUgdG8gY29udGludWUuXSJ9XSwiaXNFcnJvciI6ZmFsc2UsInRpbWVzdGFtcCI6MTc3NzU2NDI0MDYzM319LHsidHlwZSI6Im1lc3NhZ2UiLCJpZCI6IjMyZGZlMjIzIiwicGFyZW50SWQiOiJjNGQ5MmZhNCIsInRpbWVzdGFtcCI6IjIwMjYtMDQtMzBUMTU6NTA6NTUuNzY0WiIsIm1lc3NhZ2UiOnsicm9sZSI6ImFzc2lzdGFudCIsImNvbnRlbnQiOlt7InR5cGUiOiJ0aGlua2luZyIsInRoaW5raW5nIjoiIE5vdyBJIHVuZGVyc3RhbmQgdGhlIGlzc3VlLiBMZXQgbWUgaW1wbGVtZW50IHRoZSBmaXg6XG5cbjEuIEluIGBwYWNrYWdlLW1hbmFnZXIudHNgLCBJIG5lZWQgdG8gbW9kaWZ5IGBhZGRBdXRvRGlzY292ZXJlZFJlc291cmNlc2AgdG8gaGFuZGxlIGVhY2ggc2tpbGwgcm9vdCBzZXBhcmF0ZWx5IHdpdGggaXRzIG93biBtZXRhZGF0YSBhbmQgYmFzZURpclxuMi4gSW4gYGNvbmZpZy1zZWxlY3Rvci50c2AsIEkgbmVlZCB0byB1cGRhdGUgdGhlIGdyb3VwIGtleSB0byBpbmNsdWRlIGJhc2VEaXIgYW5kIHVwZGF0ZSB0aGUgbGFiZWwgcmVuZGVyaW5nXG5cbkxldCBtZSBpbXBsZW1lbnQgdGhlIGZpeDoiLCJ0aGlua2luZ1NpZ25hdHVyZSI6InJlYXNvbmluZyJ9LHsidHlwZSI6InRvb2xDYWxsIiwiaWQiOiJmdW5jdGlvbnMuZWRpdDo2IiwibmFtZSI6ImVkaXQiLCJhcmd1bWVudHMiOnsicGF0aCI6InBhY2thZ2VzL2NvZGluZy1hZ2VudC9zcmMvY29yZS9wYWNrYWdlLW1hbmFnZXIudHMiLCJlZGl0cyI6W3sib2xkVGV4dCI6Ilx0cHJpdmF0ZSBhZGRBdXRvRGlzY292ZXJlZFJlc291cmNlcyhcblx0XHRhY2N1bXVsYXRvcjogUmVzb3VyY2VBY2N1bXVsYXRvcixcblx0XHRnbG9iYWxTZXR0aW5nczogUmV0dXJuVHlwZTxTZXR0aW5nc01hbmFnZXJbXCJnZXRHbG9iYWxTZXR0aW5nc1wiXT4sXG5cdFx0cHJvamVjdFNldHRpbmdzOiBSZXR1cm5UeXBlPFNldHRpbmdzTWFuYWdlcltcImdldFByb2plY3RTZXR0aW5nc1wiXT4sXG5cdFx0Z2xvYmFsQmFzZURpcjogc3RyaW5nLFxuXHRcdHByb2plY3RCYXNlRGlyOiBzdHJpbmcsXG5cdCk6IHZvaWQge1xuXHRcdGNvbnN0IHVzZXJNZXRhZGF0YTogUGF0aE1ldGFkYXRhID0ge1xuXHRcdFx0c291cmNlOiBcImF1dG9cIixcblx0XHRcdHNjb3BlOiBcInVzZXJcIixcblx0XHRcdG9yaWdpbjogXCJ0b3AtbGV2ZWxcIixcblx0XHRcdGJhc2VEaXI6IGdsb2JhbEJhc2VEaXIsXG5cdFx0fTtcblx0XHRjb25zdCBwcm9qZWN0TWV0YWRhdGE6IFBhdGhNZXRhZGF0YSA9IHtcblx0XHRcdHNvdXJjZTogXCJhdXRvXCIsXG5cdFx0XHRzY29wZTogXCJwcm9qZWN0XCIsXG5cdFx0XHRvcmlnaW46IFwidG9wLWxldmVsXCIsXG5cdFx0XHRiYXNlRGlyOiBwcm9qZWN0QmFzZURpcixcblx0XHR9O1xuXG5cdFx0Y29uc3QgdXNlck92ZXJyaWRlcyA9IHtcblx0XHRcdGV4dGVuc2lvbnM6IChnbG9iYWxTZXR0aW5ncy5leHRlbnNpb25zID8/IFtdKSBhcyBzdHJpbmdbXSxcblx0XHRcdHNraWxsczogKGdsb2JhbFNldHRpbmdzLnNraWxscyA/PyBbXSkgYXMgc3RyaW5nW10sXG5cdFx0XHRwcm9tcHRzOiAoZ2xvYmFsU2V0dGluZ3MucHJvbXB0cyA/PyBbXSkgYXMgc3RyaW5nW10sXG5cdFx0XHR0aGVtZXM6IChnbG9iYWxTZXR0aW5ncy50aGVtZXMgPz8gW10pIGFzIHN0cmluZ1tdLFxuXHRcdH07XG5cdFx0Y29uc3QgcHJvamVjdE92ZXJyaWRlcyA9IHtcblx0XHRcdGV4dGVuc2lvbnM6IChwcm9qZWN0U2V0dGluZ3MuZXh0ZW5zaW9ucyA/PyBbXSkgYXMgc3RyaW5nW10sXG5cdFx0XHRza2lsbHM6IChwcm9qZWN0U2V0dGluZ3Muc2tpbGxzID8/IFtdKSBhcyBzdHJpbmdbXSxcblx0XHRcdHByb21wdHM6IChwcm9qZWN0U2V0dGluZ3MucHJvbXB0cyA/PyBbXSkgYXMgc3RyaW5nW10sXG5cdFx0XHR0aGVtZXM6IChwcm9qZWN0U2V0dGluZ3MudGhlbWVzID8/IFtdKSBhcyBzdHJpbmdbXSxcblx0XHR9O1xuXG5cdFx0Y29uc3QgdXNlckRpcnMgPSB7XG5cdFx0XHRleHRlbnNpb25zOiBqb2luKGdsb2JhbEJhc2VEaXIsIFwiZXh0ZW5zaW9uc1wiKSxcblx0XHRcdHNraWxsczogam9pbihnbG9iYWxCYXNlRGlyLCBcInNraWxsc1wiKSxcblx0XHRcdHByb21wdHM6IGpvaW4oZ2xvYmFsQmFzZURpciwgXCJwcm9tcHRzXCIpLFxuXHRcdFx0dGhlbWVzOiBqb2luKGdsb2JhbEJhc2VEaXIsIFwidGhlbWVzXCIpLFxuXHRcdH07XG5cdFx0Y29uc3QgcHJvamVjdERpcnMgPSB7XG5cdFx0XHRleHRlbnNpb25zOiBqb2luKHByb2plY3RCYXNlRGlyLCBcImV4dGVuc2lvbnNcIiksXG5cdFx0XHRza2lsbHM6IGpvaW4ocHJvamVjdEJhc2VEaXIsIFwic2tpbGxzXCIpLFxuXHRcdFx0cHJvbXB0czogam9pbihwcm9qZWN0QmFzZURpciwgXCJwcm9tcHRzXCIpLFxuXHRcdFx0dGhlbWVzOiBqb2luKHByb2plY3RCYXNlRGlyLCBcInRoZW1lc1wiKSxcblx0XHR9O1xuXHRcdGNvbnN0IHVzZXJBZ2VudHNTa2lsbHNEaXIgPSBqb2luKGdldEhvbWVEaXIoKSwgXCIuYWdlbnRzXCIsIFwic2tpbGxzXCIpO1xuXHRcdGNvbnN0IHByb2plY3RBZ2VudHNTa2lsbERpcnMgPSBjb2xsZWN0QW5jZXN0b3JBZ2VudHNTa2lsbERpcnModGhpcy5jd2QpLmZpbHRlcihcblx0XHRcdChkaXIpID0+IHJlc29sdmUoZGlyKSAhPT0gcmVzb2x2ZSh1c2VyQWdlbnRzU2tpbGxzRGlyKSxcblx0XHQpO1xuXG5cdFx0Y29uc3QgYWRkUmVzb3VyY2VzID0gKFxuXHRcdFx0cmVzb3VyY2VUeXBlOiBSZXNvdXJjZVR5cGUsXG5cdFx0XHRwYXRoczogc3RyaW5nW10sXG5cdFx0XHRtZXRhZGF0YTogUGF0aE1ldGFkYXRhLFxuXHRcdFx0b3ZlcnJpZGVzOiBzdHJpbmdbXSxcblx0XHRcdGJhc2VEaXI6IHN0cmluZyxcblx0XHQpID0+IHtcblx0XHRcdGNvbnN0IHRhcmdldCA9IHRoaXMuZ2V0VGFyZ2V0TWFwKGFjY3VtdWxhdG9yLCByZXNvdXJjZVR5cGUpO1xuXHRcdFx0Zm9yIChjb25zdCBwYXRoIG9mIHBhdGhzKSB7XG5cdFx0XHRcdGNvbnN0IGVuYWJsZWQgPSBpc0VuYWJsZWRCeU92ZXJyaWRlcyhwYXRoLCBvdmVycmlkZXMsIGJhc2VEaXIpO1xuXHRcdFx0XHR0aGlzLmFkZFJlc291cmNlKHRhcmdldCwgcGF0aCwgbWV0YWRhdGEsIGVuYWJsZWQpO1xuXHRcdFx0fVxuXHRcdH07XG5cblx0XHRhZGRSZXNvdXJjZXMoXG5cdFx0XHRcImV4dGVuc2lvbnNcIixcblx0XHRcdGNvbGxlY3RBdXRvRXh0ZW5zaW9uRW50cmllcyhwcm9qZWN0RGlycy5leHRlbnNpb25zKSxcblx0XHRcdHByb2plY3RNZXRhZGF0YSxcblx0XHRcdHByb2plY3RPdmVycmlkZXMuZXh0ZW5zaW9ucyxcblx0XHRcdHByb2plY3RCYXNlRGlyLFxuXHRcdCk7XG5cdFx0YWRkUmVzb3VyY2VzKFxuXHRcdFx0XCJza2lsbHNcIixcblx0XHRcdFtcblx0XHRcdFx0Li4uY29sbGVjdEF1dG9Ta2lsbEVudHJpZXMocHJvamVjdERpcnMuc2tpbGxzLCBcInBpXCIpLFxuXHRcdFx0XHQuLi5wcm9qZWN0QWdlbnRzU2tpbGxEaXJzLmZsYXRNYXAoKGRpcikgPT4gY29sbGVjdEF1dG9Ta2lsbEVudHJpZXMoZGlyLCBcImFnZW50c1wiKSksXG5cdFx0XHRdLFxuXHRcdFx0cHJvamVjdE1ldGFkYXRhLFxuXHRcdFx0cHJvamVjdE92ZXJyaWRlcy5za2lsbHMsXG5cdFx0XHRwcm9qZWN0QmFzZURpcixcblx0XHQpO1xuXHRcdGFkZFJlc291cmNlcyhcblx0XHRcdFwicHJvbXB0c1wiLFxuXHRcdFx0Y29sbGVjdEF1dG9Qcm9tcHRFbnRyaWVzKHByb2plY3REaXJzLnByb21wdHMpLFxuXHRcdFx0cHJvamVjdE1ldGFkYXRhLFxuXHRcdFx0cHJvamVjdE92ZXJyaWRlcy5wcm9tcHRzLFxuXHRcdFx0cHJvamVjdEJhc2VEaXIsXG5cdFx0KTtcblx0XHRhZGRSZXNvdXJjZXMoXG5cdFx0XHRcInRoZW1lc1wiLFxuXHRcdFx0Y29sbGVjdEF1dG9UaGVtZUVudHJpZXMocHJvamVjdERpcnMudGhlbWVzKSxcblx0XHRcdHByb2plY3RNZXRhZGF0YSxcblx0XHRcdHByb2plY3RPdmVycmlkZXMudGhlbWVzLFxuXHRcdFx0cHJvamVjdEJhc2VEaXIsXG5cdFx0KTtcblxuXHRcdGFkZFJlc291cmNlcyhcblx0XHRcdFwiZXh0ZW5zaW9uc1wiLFxuXHRcdFx0Y29sbGVjdEF1dG9FeHRlbnNpb25FbnRyaWVzKHVzZXJEaXJzLmV4dGVuc2lvbnMpLFxuXHRcdFx0dXNlck1ldGFkYXRhLFxuXHRcdFx0dXNlck92ZXJyaWRlcy5leHRlbnNpb25zLFxuXHRcdFx0Z2xvYmFsQmFzZURpcixcblx0XHQpO1xuXHRcdGFkZFJlc291cmNlcyhcblx0XHRcdFwic2tpbGxzXCIsXG5cdFx0XHRbLi4uY29sbGVjdEF1dG9Ta2lsbEVudHJpZXModXNlckRpcnMuc2tpbGxzLCBcInBpXCIpLCAuLi5jb2xsZWN0QXV0b1NraWxsRW50cmllcyh1c2VyQWdlbnRzU2tpbGxzRGlyLCBcImFnZW50c1wiKV0sXG5cdFx0XHR1c2VyTWV0YWRhdGEsXG5cdFx0XHR1c2VyT3ZlcnJpZGVzLnNraWxscyxcblx0XHRcdGdsb2JhbEJhc2VEaXIsXG5cdFx0KTtcblx0XHRhZGRSZXNvdXJjZXMoXG5cdFx0XHRcInByb21wdHNcIixcblx0XHRcdGNvbGxlY3RBdXRvUHJvbXB0RW50cmllcyh1c2VyRGlycy5wcm9tcHRzKSxcblx0XHRcdHVzZXJNZXRhZGF0YSxcblx0XHRcdHVzZXJPdmVycmlkZXMucHJvbXB0cyxcblx0XHRcdGdsb2JhbEJhc2VEaXIsXG5cdFx0KTtcblx0XHRhZGRSZXNvdXJjZXMoXG5cdFx0XHRcInRoZW1lc1wiLFxuXHRcdFx0Y29sbGVjdEF1dG9UaGVtZUVudHJpZXModXNlckRpcnMudGhlbWVzKSxcblx0XHRcdHVzZXJNZXRhZGF0YSxcblx0XHRcdHVzZXJPdmVycmlkZXMudGhlbWVzLFxuXHRcdFx0Z2xvYmFsQmFzZURpcixcblx0XHQpO1xuXHR9IiwibmV3VGV4dCI6Ilx0cHJpdmF0ZSBhZGRBdXRvRGlzY292ZXJlZFJlc291cmNlcyhcblx0XHRhY2N1bXVsYXRvcjogUmVzb3VyY2VBY2N1bXVsYXRvcixcblx0XHRnbG9iYWxTZXR0aW5nczogUmV0dXJuVHlwZTxTZXR0aW5nc01hbmFnZXJbXCJnZXRHbG9iYWxTZXR0aW5nc1wiXT4sXG5cdFx0cHJvamVjdFNldHRpbmdzOiBSZXR1cm5UeXBlPFNldHRpbmdzTWFuYWdlcltcImdldFByb2plY3RTZXR0aW5nc1wiXT4sXG5cdFx0Z2xvYmFsQmFzZURpcjogc3RyaW5nLFxuXHRcdHByb2plY3RCYXNlRGlyOiBzdHJpbmcsXG5cdCk6IHZvaWQge1xuXHRcdGNvbnN0IHVzZXJNZXRhZGF0YTogUGF0aE1ldGFkYXRhID0ge1xuXHRcdFx0c291cmNlOiBcImF1dG9cIixcblx0XHRcdHNjb3BlOiBcInVzZXJcIixcblx0XHRcdG9yaWdpbjogXCJ0b3AtbGV2ZWxcIixcblx0XHRcdGJhc2VEaXI6IGdsb2JhbEJhc2VEaXIsXG5cdFx0fTtcblx0XHRjb25zdCBwcm9qZWN0TWV0YWRhdGE6IFBhdGhNZXRhZGF0YSA9IHtcblx0XHRcdHNvdXJjZTogXCJhdXRvXCIsXG5cdFx0XHRzY29wZTogXCJwcm9qZWN0XCIsXG5cdFx0XHRvcmlnaW46IFwidG9wLWxldmVsXCIsXG5cdFx0XHRiYXNlRGlyOiBwcm9qZWN0QmFzZURpcixcblx0XHR9O1xuXG5cdFx0Y29uc3QgdXNlck92ZXJyaWRlcyA9IHtcblx0XHRcdGV4dGVuc2lvbnM6IChnbG9iYWxTZXR0aW5ncy5leHRlbnNpb25zID8/IFtdKSBhcyBzdHJpbmdbXSxcblx0XHRcdHNraWxsczogKGdsb2JhbFNldHRpbmdzLnNraWxscyA/PyBbXSkgYXMgc3RyaW5nW10sXG5cdFx0XHRwcm9tcHRzOiAoZ2xvYmFsU2V0dGluZ3MucHJvbXB0cyA/PyBbXSkgYXMgc3RyaW5nW10sXG5cdFx0XHR0aGVtZXM6IChnbG9iYWxTZXR0aW5ncy50aGVtZXMgPz8gW10pIGFzIHN0cmluZ1tdLFxuXHRcdH07XG5cdFx0Y29uc3QgcHJvamVjdE92ZXJyaWRlcyA9IHtcblx0XHRcdGV4dGVuc2lvbnM6IChwcm9qZWN0U2V0dGluZ3MuZXh0ZW5zaW9ucyA/PyBbXSkgYXMgc3RyaW5nW10sXG5cdFx0XHRza2lsbHM6IChwcm9qZWN0U2V0dGluZ3Muc2tpbGxzID8/IFtdKSBhcyBzdHJpbmdbXSxcblx0XHRcdHByb21wdHM6IChwcm9qZWN0U2V0dGluZ3MucHJvbXB0cyA/PyBbXSkgYXMgc3RyaW5nW10sXG5cdFx0XHR0aGVtZXM6IChwcm9qZWN0U2V0dGluZ3MudGhlbWVzID8/IFtdKSBhcyBzdHJpbmdbXSxcblx0XHR9O1xuXG5cdFx0Y29uc3QgdXNlckRpcnMgPSB7XG5cdFx0XHRleHRlbnNpb25zOiBqb2luKGdsb2JhbEJhc2VEaXIsIFwiZXh0ZW5zaW9uc1wiKSxcblx0XHRcdHNraWxsczogam9pbihnbG9iYWxCYXNlRGlyLCBcInNraWxsc1wiKSxcblx0XHRcdHByb21wdHM6IGpvaW4oZ2xvYmFsQmFzZURpciwgXCJwcm9tcHRzXCIpLFxuXHRcdFx0dGhlbWVzOiBqb2luKGdsb2JhbEJhc2VEaXIsIFwidGhlbWVzXCIpLFxuXHRcdH07XG5cdFx0Y29uc3QgcHJvamVjdERpcnMgPSB7XG5cdFx0XHRleHRlbnNpb25zOiBqb2luKHByb2plY3RCYXNlRGlyLCBcImV4dGVuc2lvbnNcIiksXG5cdFx0XHRza2lsbHM6IGpvaW4ocHJvamVjdEJhc2VEaXIsIFwic2tpbGxzXCIpLFxuXHRcdFx0cHJvbXB0czogam9pbihwcm9qZWN0QmFzZURpciwgXCJwcm9tcHRzXCIpLFxuXHRcdFx0dGhlbWVzOiBqb2luKHByb2plY3RCYXNlRGlyLCBcInRoZW1lc1wiKSxcblx0XHR9O1xuXHRcdGNvbnN0IHVzZXJBZ2VudHNTa2lsbHNEaXIgPSBqb2luKGdldEhvbWVEaXIoKSwgXCIuYWdlbnRzXCIsIFwic2tpbGxzXCIpO1xuXHRcdGNvbnN0IHByb2plY3RBZ2VudHNTa2lsbERpcnMgPSBjb2xsZWN0QW5jZXN0b3JBZ2VudHNTa2lsbERpcnModGhpcy5jd2QpLmZpbHRlcihcblx0XHRcdChkaXIpID0+IHJlc29sdmUoZGlyKSAhPT0gcmVzb2x2ZSh1c2VyQWdlbnRzU2tpbGxzRGlyKSxcblx0XHQpO1xuXG5cdFx0Y29uc3QgYWRkUmVzb3VyY2VzID0gKFxuXHRcdFx0cmVzb3VyY2VUeXBlOiBSZXNvdXJjZVR5cGUsXG5cdFx0XHRwYXRoczogc3RyaW5nW10sXG5cdFx0XHRtZXRhZGF0YTogUGF0aE1ldGFkYXRhLFxuXHRcdFx0b3ZlcnJpZGVzOiBzdHJpbmdbXSxcblx0XHRcdGJhc2VEaXI6IHN0cmluZyxcblx0XHQpID0+IHtcblx0XHRcdGNvbnN0IHRhcmdldCA9IHRoaXMuZ2V0VGFyZ2V0TWFwKGFjY3VtdWxhdG9yLCByZXNvdXJjZVR5cGUpO1xuXHRcdFx0Zm9yIChjb25zdCBwYXRoIG9mIHBhdGhzKSB7XG5cdFx0XHRcdGNvbnN0IGVuYWJsZWQgPSBpc0VuYWJsZWRCeU92ZXJyaWRlcyhwYXRoLCBvdmVycmlkZXMsIGJhc2VEaXIpO1xuXHRcdFx0XHR0aGlzLmFkZFJlc291cmNlKHRhcmdldCwgcGF0aCwgbWV0YWRhdGEsIGVuYWJsZWQpO1xuXHRcdFx0fVxuXHRcdH07XG5cblx0XHQvLyBQcm9qZWN0IGV4dGVuc2lvbnMgZnJvbSAucGkvXG5cdFx0YWRkUmVzb3VyY2VzKFxuXHRcdFx0XCJleHRlbnNpb25zXCIsXG5cdFx0XHRjb2xsZWN0QXV0b0V4dGVuc2lvbkVudHJpZXMocHJvamVjdERpcnMuZXh0ZW5zaW9ucyksXG5cdFx0XHRwcm9qZWN0TWV0YWRhdGEsXG5cdFx0XHRwcm9qZWN0T3ZlcnJpZGVzLmV4dGVuc2lvbnMsXG5cdFx0XHRwcm9qZWN0QmFzZURpcixcblx0XHQpO1xuXG5cdFx0Ly8gUHJvamVjdCBza2lsbHMgZnJvbSAucGkvXG5cdFx0YWRkUmVzb3VyY2VzKFxuXHRcdFx0XCJza2lsbHNcIixcblx0XHRcdGNvbGxlY3RBdXRvU2tpbGxFbnRyaWVzKHByb2plY3REaXJzLnNraWxscywgXCJwaVwiKSxcblx0XHRcdHByb2plY3RNZXRhZGF0YSxcblx0XHRcdHByb2plY3RPdmVycmlkZXMuc2tpbGxzLFxuXHRcdFx0cHJvamVjdEJhc2VEaXIsXG5cdFx0KTtcblxuXHRcdC8vIFByb2plY3Qgc2tpbGxzIGZyb20gLmFnZW50cy8gKGVhY2ggd2l0aCBpdHMgb3duIGJhc2VEaXIpXG5cdFx0Zm9yIChjb25zdCBhZ2VudHNTa2lsbHNEaXIgb2YgcHJvamVjdEFnZW50c1NraWxsRGlycykge1xuXHRcdFx0Y29uc3QgYWdlbnRzQmFzZURpciA9IGRpcm5hbWUoYWdlbnRzU2tpbGxzRGlyKTsgLy8gdGhlIC5hZ2VudHMgZGlyZWN0b3J5XG5cdFx0XHRjb25zdCBhZ2VudHNNZXRhZGF0YTogUGF0aE1ldGFkYXRhID0ge1xuXHRcdFx0XHQuLi5wcm9qZWN0TWV0YWRhdGEsXG5cdFx0XHRcdGJhc2VEaXI6IGFnZW50c0Jhc2VEaXIsXG5cdFx0XHR9O1xuXHRcdFx0YWRkUmVzb3VyY2VzKFxuXHRcdFx0XHRcInNraWxsc1wiLFxuXHRcdFx0XHRjb2xsZWN0QXV0b1NraWxsRW50cmllcyhhZ2VudHNTa2lsbHNEaXIsIFwiYWdlbnRzXCIpLFxuXHRcdFx0XHRhZ2VudHNNZXRhZGF0YSxcblx0XHRcdFx0cHJvamVjdE92ZXJyaWRlcy5za2lsbHMsXG5cdFx0XHRcdGFnZW50c0Jhc2VEaXIsXG5cdFx0XHQpO1xuXHRcdH1cblxuXHRcdGFkZFJlc291cmNlcyhcblx0XHRcdFwicHJvbXB0c1wiLFxuXHRcdFx0Y29sbGVjdEF1dG9Qcm9tcHRFbnRyaWVzKHByb2plY3REaXJzLnByb21wdHMpLFxuXHRcdFx0cHJvamVjdE1ldGFkYXRhLFxuXHRcdFx0cHJvamVjdE92ZXJyaWRlcy5wcm9tcHRzLFxuXHRcdFx0cHJvamVjdEJhc2VEaXIsXG5cdFx0KTtcblx0XHRhZGRSZXNvdXJjZXMoXG5cdFx0XHRcInRoZW1lc1wiLFxuXHRcdFx0Y29sbGVjdEF1dG9UaGVtZUVudHJpZXMocHJvamVjdERpcnMudGhlbWVzKSxcblx0XHRcdHByb2plY3RNZXRhZGF0YSxcblx0XHRcdHByb2plY3RPdmVycmlkZXMudGhlbWVzLFxuXHRcdFx0cHJvamVjdEJhc2VEaXIsXG5cdFx0KTtcblxuXHRcdC8vIFVzZXIgZXh0ZW5zaW9ucyBmcm9tIH4vLnBpL2FnZW50L1xuXHRcdGFkZFJlc291cmNlcyhcblx0XHRcdFwiZXh0ZW5zaW9uc1wiLFxuXHRcdFx0Y29sbGVjdEF1dG9FeHRlbnNpb25FbnRyaWVzKHVzZXJEaXJzLmV4dGVuc2lvbnMpLFxuXHRcdFx0dXNlck1ldGFkYXRhLFxuXHRcdFx0dXNlck92ZXJyaWRlcy5leHRlbnNpb25zLFxuXHRcdFx0Z2xvYmFsQmFzZURpcixcblx0XHQpO1xuXG5cdFx0Ly8gVXNlciBza2lsbHMgZnJvbSB+Ly5waS9hZ2VudC9cblx0XHRhZGRSZXNvdXJjZXMoXG5cdFx0XHRcInNraWxsc1wiLFxuXHRcdFx0Y29sbGVjdEF1dG9Ta2lsbEVudHJpZXModXNlckRpcnMuc2tpbGxzLCBcInBpXCIpLFxuXHRcdFx0dXNlck1ldGFkYXRhLFxuXHRcdFx0dXNlck92ZXJyaWRlcy5za2lsbHMsXG5cdFx0XHRnbG9iYWxCYXNlRGlyLFxuXHRcdCk7XG5cblx0XHQvLyBVc2VyIHNraWxscyBmcm9tIH4vLmFnZW50cy8gKHdpdGggaXRzIG93biBiYXNlRGlyKVxuXHRcdGNvbnN0IHVzZXJBZ2VudHNCYXNlRGlyID0gZGlybmFtZSh1c2VyQWdlbnRzU2tpbGxzRGlyKTtcblx0XHRjb25zdCB1c2VyQWdlbnRzTWV0YWRhdGE6IFBhdGhNZXRhZGF0YSA9IHtcblx0XHRcdC4uLnVzZXJNZXRhZGF0YSxcblx0XHRcdGJhc2VEaXI6IHVzZXJBZ2VudHNCYXNlRGlyLFxuXHRcdH07XG5cdFx0YWRkUmVzb3VyY2VzKFxuXHRcdFx0XCJza2lsbHNcIixcblx0XHRcdGNvbGxlY3RBdXRvU2tpbGxFbnRyaWVzKHVzZXJBZ2VudHNTa2lsbHNEaXIsIFwiYWdlbnRzXCIpLFxuXHRcdFx0dXNlckFnZW50c01ldGFkYXRhLFxuXHRcdFx0dXNlck92ZXJyaWRlcy5za2lsbHMsXG5cdFx0XHR1c2VyQWdlbnRzQmFzZURpcixcblx0XHQpO1xuXG5cdFx0YWRkUmVzb3VyY2VzKFxuXHRcdFx0XCJwcm9tcHRzXCIsXG5cdFx0XHRjb2xsZWN0QXV0b1Byb21wdEVudHJpZXModXNlckRpcnMucHJvbXB0cyksXG5cdFx0XHR1c2VyTWV0YWRhdGEsXG5cdFx0XHR1c2VyT3ZlcnJpZGVzLnByb21wdHMsXG5cdFx0XHRnbG9iYWxCYXNlRGlyLFxuXHRcdCk7XG5cdFx0YWRkUmVzb3VyY2VzKFxuXHRcdFx0XCJ0aGVtZXNcIixcblx0XHRcdGNvbGxlY3RBdXRvVGhlbWVFbnRyaWVzKHVzZXJEaXJzLnRoZW1lcyksXG5cdFx0XHR1c2VyTWV0YWRhdGEsXG5cdFx0XHR1c2VyT3ZlcnJpZGVzLnRoZW1lcyxcblx0XHRcdGdsb2JhbEJhc2VEaXIsXG5cdFx0KTtcblx0fSJ9XX19XSwiYXBpIjoib3BlbmFpLWNvbXBsZXRpb25zIiwicHJvdmlkZXIiOiJzeW50aGV0aWMiLCJtb2RlbCI6ImhmOm1vb25zaG90YWkvS2ltaS1LMi41IiwidXNhZ2UiOnsiaW5wdXQiOjE5NzYsIm91dHB1dCI6MjgxMiwiY2FjaGVSZWFkIjozNTc3NiwiY2FjaGVXcml0ZSI6MCwidG90YWxUb2tlbnMiOjQwNTY0LCJjb3N0Ijp7ImlucHV0IjowLjAwMDg4OTIsIm91dHB1dCI6MC4wMDk1NjA4LCJjYWNoZVJlYWQiOjAuMDE2MDk5MiwiY2FjaGVXcml0ZSI6MCwidG90YWwiOjAuMDI2NTQ5MjAwMDAwMDAwMDAyfX0sInN0b3BSZWFzb24iOiJ0b29sVXNlIiwidGltZXN0YW1wIjoxNzc3NTY0MjQwNjM0LCJyZXNwb25zZUlkIjoiY2hhdGNtcGwtYjg2ODIwOWVjZmU2ODcyZiJ9fSx7InR5cGUiOiJtZXNzYWdlIiwiaWQiOiJmMTE2ODMxMyIsInBhcmVudElkIjoiMzJkZmUyMjMiLCJ0aW1lc3RhbXAiOiIyMDI2LTA0LTMwVDE1OjUwOjU1Ljc2OVoiLCJtZXNzYWdlIjp7InJvbGUiOiJ0b29sUmVzdWx0IiwidG9vbENhbGxJZCI6ImZ1bmN0aW9ucy5lZGl0OjYiLCJ0b29sTmFtZSI6ImVkaXQiLCJjb250ZW50IjpbeyJ0eXBlIjoidGV4dCIsInRleHQiOiJTdWNjZXNzZnVsbHkgcmVwbGFjZWQgMSBibG9jayhzKSBpbiBwYWNrYWdlcy9jb2RpbmctYWdlbnQvc3JjL2NvcmUvcGFja2FnZS1tYW5hZ2VyLnRzLiJ9XSwiZGV0YWlscyI6eyJkaWZmIjoiICAgICAgLi4uXG4gMjE4MCBcdFx0XHRcdHRoaXMuYWRkUmVzb3VyY2UodGFyZ2V0LCBwYXRoLCBtZXRhZGF0YSwgZW5hYmxlZCk7XG4gMjE4MSBcdFx0XHR9XG4gMjE4MiBcdFx0fTtcbiAyMTgzIFxuKzIxODQgXHRcdC8vIFByb2plY3QgZXh0ZW5zaW9ucyBmcm9tIC5waS9cbiAyMTg0IFx0XHRhZGRSZXNvdXJjZXMoXG4gMjE4NSBcdFx0XHRcImV4dGVuc2lvbnNcIixcbiAyMTg2IFx0XHRcdGNvbGxlY3RBdXRvRXh0ZW5zaW9uRW50cmllcyhwcm9qZWN0RGlycy5leHRlbnNpb25zKSxcbiAyMTg3IFx0XHRcdHByb2plY3RNZXRhZGF0YSxcbiAyMTg4IFx0XHRcdHByb2plY3RPdmVycmlkZXMuZXh0ZW5zaW9ucyxcbiAyMTg5IFx0XHRcdHByb2plY3RCYXNlRGlyLFxuIDIxOTAgXHRcdCk7XG4rMjE5MiBcbisyMTkzIFx0XHQvLyBQcm9qZWN0IHNraWxscyBmcm9tIC5waS9cbiAyMTkxIFx0XHRhZGRSZXNvdXJjZXMoXG4gMjE5MiBcdFx0XHRcInNraWxsc1wiLFxuLTIxOTMgXHRcdFx0W1xuLTIxOTQgXHRcdFx0XHQuLi5jb2xsZWN0QXV0b1NraWxsRW50cmllcyhwcm9qZWN0RGlycy5za2lsbHMsIFwicGlcIiksXG4tMjE5NSBcdFx0XHRcdC4uLnByb2plY3RBZ2VudHNTa2lsbERpcnMuZmxhdE1hcCgoZGlyKSA9PiBjb2xsZWN0QXV0b1NraWxsRW50cmllcyhkaXIsIFwiYWdlbnRzXCIpKSxcbi0yMTk2IFx0XHRcdF0sXG4rMjE5NiBcdFx0XHRjb2xsZWN0QXV0b1NraWxsRW50cmllcyhwcm9qZWN0RGlycy5za2lsbHMsIFwicGlcIiksXG4gMjE5NyBcdFx0XHRwcm9qZWN0TWV0YWRhdGEsXG4gMjE5OCBcdFx0XHRwcm9qZWN0T3ZlcnJpZGVzLnNraWxscyxcbiAyMTk5IFx0XHRcdHByb2plY3RCYXNlRGlyLFxuIDIyMDAgXHRcdCk7XG4rMjIwMSBcbisyMjAyIFx0XHQvLyBQcm9qZWN0IHNraWxscyBmcm9tIC5hZ2VudHMvIChlYWNoIHdpdGggaXRzIG93biBiYXNlRGlyKVxuKzIyMDMgXHRcdGZvciAoY29uc3QgYWdlbnRzU2tpbGxzRGlyIG9mIHByb2plY3RBZ2VudHNTa2lsbERpcnMpIHtcbisyMjA0IFx0XHRcdGNvbnN0IGFnZW50c0Jhc2VEaXIgPSBkaXJuYW1lKGFnZW50c1NraWxsc0Rpcik7IC8vIHRoZSAuYWdlbnRzIGRpcmVjdG9yeVxuKzIyMDUgXHRcdFx0Y29uc3QgYWdlbnRzTWV0YWRhdGE6IFBhdGhNZXRhZGF0YSA9IHtcbisyMjA2IFx0XHRcdFx0Li4ucHJvamVjdE1ldGFkYXRhLFxuKzIyMDcgXHRcdFx0XHRiYXNlRGlyOiBhZ2VudHNCYXNlRGlyLFxuKzIyMDggXHRcdFx0fTtcbisyMjA5IFx0XHRcdGFkZFJlc291cmNlcyhcbisyMjEwIFx0XHRcdFx0XCJza2lsbHNcIixcbisyMjExIFx0XHRcdFx0Y29sbGVjdEF1dG9Ta2lsbEVudHJpZXMoYWdlbnRzU2tpbGxzRGlyLCBcImFnZW50c1wiKSxcbisyMjEyIFx0XHRcdFx0YWdlbnRzTWV0YWRhdGEsXG4rMjIxMyBcdFx0XHRcdHByb2plY3RPdmVycmlkZXMuc2tpbGxzLFxuKzIyMTQgXHRcdFx0XHRhZ2VudHNCYXNlRGlyLFxuKzIyMTUgXHRcdFx0KTtcbisyMjE2IFx0XHR9XG4rMjIxNyBcbiAyMjAxIFx0XHRhZGRSZXNvdXJjZXMoXG4gMjIwMiBcdFx0XHRcInByb21wdHNcIixcbiAyMjAzIFx0XHRcdGNvbGxlY3RBdXRvUHJvbXB0RW50cmllcyhwcm9qZWN0RGlycy5wcm9tcHRzKSxcbiAyMjA0IFx0XHRcdHByb2plY3RNZXRhZGF0YSxcbiAgICAgIC4uLlxuIDIyMTIgXHRcdFx0cHJvamVjdE92ZXJyaWRlcy50aGVtZXMsXG4gMjIxMyBcdFx0XHRwcm9qZWN0QmFzZURpcixcbiAyMjE0IFx0XHQpO1xuIDIyMTUgXG4rMjIzMyBcdFx0Ly8gVXNlciBleHRlbnNpb25zIGZyb20gfi8ucGkvYWdlbnQvXG4gMjIxNiBcdFx0YWRkUmVzb3VyY2VzKFxuIDIyMTcgXHRcdFx0XCJleHRlbnNpb25zXCIsXG4gMjIxOCBcdFx0XHRjb2xsZWN0QXV0b0V4dGVuc2lvbkVudHJpZXModXNlckRpcnMuZXh0ZW5zaW9ucyksXG4gMjIxOSBcdFx0XHR1c2VyTWV0YWRhdGEsXG4gMjIyMCBcdFx0XHR1c2VyT3ZlcnJpZGVzLmV4dGVuc2lvbnMsXG4gMjIyMSBcdFx0XHRnbG9iYWxCYXNlRGlyLFxuIDIyMjIgXHRcdCk7XG4rMjI0MSBcbisyMjQyIFx0XHQvLyBVc2VyIHNraWxscyBmcm9tIH4vLnBpL2FnZW50L1xuIDIyMjMgXHRcdGFkZFJlc291cmNlcyhcbiAyMjI0IFx0XHRcdFwic2tpbGxzXCIsXG4tMjIyNSBcdFx0XHRbLi4uY29sbGVjdEF1dG9Ta2lsbEVudHJpZXModXNlckRpcnMuc2tpbGxzLCBcInBpXCIpLCAuLi5jb2xsZWN0QXV0b1NraWxsRW50cmllcyh1c2VyQWdlbnRzU2tpbGxzRGlyLCBcImFnZW50c1wiKV0sXG4rMjI0NSBcdFx0XHRjb2xsZWN0QXV0b1NraWxsRW50cmllcyh1c2VyRGlycy5za2lsbHMsIFwicGlcIiksXG4gMjIyNiBcdFx0XHR1c2VyTWV0YWRhdGEsXG4gMjIyNyBcdFx0XHR1c2VyT3ZlcnJpZGVzLnNraWxscyxcbiAyMjI4IFx0XHRcdGdsb2JhbEJhc2VEaXIsXG4gMjIyOSBcdFx0KTtcbisyMjUwIFxuKzIyNTEgXHRcdC8vIFVzZXIgc2tpbGxzIGZyb20gfi8uYWdlbnRzLyAod2l0aCBpdHMgb3duIGJhc2VEaXIpXG4rMjI1MiBcdFx0Y29uc3QgdXNlckFnZW50c0Jhc2VEaXIgPSBkaXJuYW1lKHVzZXJBZ2VudHNTa2lsbHNEaXIpO1xuKzIyNTMgXHRcdGNvbnN0IHVzZXJBZ2VudHNNZXRhZGF0YTogUGF0aE1ldGFkYXRhID0ge1xuKzIyNTQgXHRcdFx0Li4udXNlck1ldGFkYXRhLFxuKzIyNTUgXHRcdFx0YmFzZURpcjogdXNlckFnZW50c0Jhc2VEaXIsXG4rMjI1NiBcdFx0fTtcbiAyMjMwIFx0XHRhZGRSZXNvdXJjZXMoXG4rMjI1OCBcdFx0XHRcInNraWxsc1wiLFxuKzIyNTkgXHRcdFx0Y29sbGVjdEF1dG9Ta2lsbEVudHJpZXModXNlckFnZW50c1NraWxsc0RpciwgXCJhZ2VudHNcIiksXG4rMjI2MCBcdFx0XHR1c2VyQWdlbnRzTWV0YWRhdGEsXG4rMjI2MSBcdFx0XHR1c2VyT3ZlcnJpZGVzLnNraWxscyxcbisyMjYyIFx0XHRcdHVzZXJBZ2VudHNCYXNlRGlyLFxuKzIyNjMgXHRcdCk7XG4rMjI2NCBcbisyMjY1IFx0XHRhZGRSZXNvdXJjZXMoXG4gMjIzMSBcdFx0XHRcInByb21wdHNcIixcbiAyMjMyIFx0XHRcdGNvbGxlY3RBdXRvUHJvbXB0RW50cmllcyh1c2VyRGlycy5wcm9tcHRzKSxcbiAyMjMzIFx0XHRcdHVzZXJNZXRhZGF0YSxcbiAyMjM0IFx0XHRcdHVzZXJPdmVycmlkZXMucHJvbXB0cyxcbiAgICAgIC4uLiIsImZpcnN0Q2hhbmdlZExpbmUiOjIxODR9LCJpc0Vycm9yIjpmYWxzZSwidGltZXN0YW1wIjoxNzc3NTY0MjU1NzY5fX0seyJ0eXBlIjoibWVzc2FnZSIsImlkIjoiMjMwNDI1OWEiLCJwYXJlbnRJZCI6ImYxMTY4MzEzIiwidGltZXN0YW1wIjoiMjAyNi0wNC0zMFQxNTo1MTowMC42MThaIiwibWVzc2FnZSI6eyJyb2xlIjoiYXNzaXN0YW50IiwiY29udGVudCI6W3sidHlwZSI6InRoaW5raW5nIiwidGhpbmtpbmciOiIgTm93IGxldCBtZSB1cGRhdGUgdGhlIGNvbmZpZy1zZWxlY3Rvci50cyB0byBmaXggdGhlIGdyb3VwaW5nIGFuZCBsYWJlbHM6IiwidGhpbmtpbmdTaWduYXR1cmUiOiJyZWFzb25pbmcifSx7InR5cGUiOiJ0b29sQ2FsbCIsImlkIjoiZnVuY3Rpb25zLmVkaXQ6NyIsIm5hbWUiOiJlZGl0IiwiYXJndW1lbnRzIjp7InBhdGgiOiJwYWNrYWdlcy9jb2RpbmctYWdlbnQvc3JjL21vZGVzL2ludGVyYWN0aXZlL2NvbXBvbmVudHMvY29uZmlnLXNlbGVjdG9yLnRzIiwiZWRpdHMiOlt7Im9sZFRleHQiOiJpbXBvcnQgeyBiYXNlbmFtZSwgZGlybmFtZSwgam9pbiwgcmVsYXRpdmUgfSBmcm9tIFwibm9kZTpwYXRoXCI7IiwibmV3VGV4dCI6ImltcG9ydCB7IGJhc2VuYW1lLCBkaXJuYW1lLCBqb2luLCByZWxhdGl2ZSB9IGZyb20gXCJub2RlOnBhdGhcIjtcbmltcG9ydCB7IGhvbWVkaXIgfSBmcm9tIFwibm9kZTpvc1wiOyJ9LHsib2xkVGV4dCI6ImZ1bmN0aW9uIGdldEdyb3VwTGFiZWwobWV0YWRhdGE6IFBhdGhNZXRhZGF0YSk6IHN0cmluZyB7XG5cdGlmIChtZXRhZGF0YS5vcmlnaW4gPT09IFwicGFja2FnZVwiKSB7XG5cdFx0cmV0dXJuIGAke21ldGFkYXRhLnNvdXJjZX0gKCR7bWV0YWRhdGEuc2NvcGV9KWA7XG5cdH1cblx0Ly8gVG9wLWxldmVsIHJlc291cmNlc1xuXHRpZiAobWV0YWRhdGEuc291cmNlID09PSBcImF1dG9cIikge1xuXHRcdHJldHVybiBtZXRhZGF0YS5zY29wZSA9PT0gXCJ1c2VyXCIgPyBcIlVzZXIgKH4vLnBpL2FnZW50LylcIiA6IFwiUHJvamVjdCAoLnBpLylcIjtcblx0fVxuXHRyZXR1cm4gbWV0YWRhdGEuc2NvcGUgPT09IFwidXNlclwiID8gXCJVc2VyIHNldHRpbmdzXCIgOiBcIlByb2plY3Qgc2V0dGluZ3NcIjtcbn0iLCJuZXdUZXh0IjoiZnVuY3Rpb24gZm9ybWF0QmFzZURpcihiYXNlRGlyOiBzdHJpbmcpOiBzdHJpbmcge1xuXHRjb25zdCBob21lRGlyID0gaG9tZWRpcigpO1xuXHRjb25zdCBkaXNwbGF5UGF0aCA9XG5cdFx0YmFzZURpciA9PT0gaG9tZURpclxuXHRcdFx0PyBcIn5cIlxuXHRcdFx0OiBiYXNlRGlyLnN0YXJ0c1dpdGgoYCR7aG9tZURpcn0vYClcblx0XHRcdFx0PyBgfi8ke3JlbGF0aXZlKGhvbWVEaXIsIGJhc2VEaXIpfWBcblx0XHRcdFx0OiBiYXNlRGlyO1xuXG5cdHJldHVybiBkaXNwbGF5UGF0aC5lbmRzV2l0aChcIi9cIikgPyBkaXNwbGF5UGF0aCA6IGAke2Rpc3BsYXlQYXRofS9gO1xufVxuXG5mdW5jdGlvbiBnZXRHcm91cExhYmVsKG1ldGFkYXRhOiBQYXRoTWV0YWRhdGEpOiBzdHJpbmcge1xuXHRpZiAobWV0YWRhdGEub3JpZ2luID09PSBcInBhY2thZ2VcIikge1xuXHRcdHJldHVybiBgJHttZXRhZGF0YS5zb3VyY2V9ICgke21ldGFkYXRhLnNjb3BlfSlgO1xuXHR9XG5cdC8vIFRvcC1sZXZlbCByZXNvdXJjZXNcblx0aWYgKG1ldGFkYXRhLnNvdXJjZSA9PT0gXCJhdXRvXCIpIHtcblx0XHRpZiAobWV0YWRhdGEuYmFzZURpcikge1xuXHRcdFx0cmV0dXJuIG1ldGFkYXRhLnNjb3BlID09PSBcInVzZXJcIlxuXHRcdFx0XHQ/IGBVc2VyICgke2Zvcm1hdEJhc2VEaXIobWV0YWRhdGEuYmFzZURpcil9KWBcblx0XHRcdFx0OiBgUHJvamVjdCAoJHtmb3JtYXRCYXNlRGlyKG1ldGFkYXRhLmJhc2VEaXIpfSlgO1xuXHRcdH1cblx0XHRyZXR1cm4gbWV0YWRhdGEuc2NvcGUgPT09IFwidXNlclwiID8gXCJVc2VyICh+Ly5waS9hZ2VudC8pXCIgOiBcIlByb2plY3QgKC5waS8pXCI7XG5cdH1cblx0cmV0dXJuIG1ldGFkYXRhLnNjb3BlID09PSBcInVzZXJcIiA/IFwiVXNlciBzZXR0aW5nc1wiIDogXCJQcm9qZWN0IHNldHRpbmdzXCI7XG59In0seyJvbGRUZXh0IjoiXHRcdFx0Y29uc3QgZ3JvdXBLZXkgPSBgJHttZXRhZGF0YS5vcmlnaW59OiR7bWV0YWRhdGEuc2NvcGV9OiR7bWV0YWRhdGEuc291cmNlfWA7IiwibmV3VGV4dCI6Ilx0XHRcdGNvbnN0IGdyb3VwS2V5ID0gYCR7bWV0YWRhdGEub3JpZ2lufToke21ldGFkYXRhLnNjb3BlfToke21ldGFkYXRhLnNvdXJjZX06JHttZXRhZGF0YS5iYXNlRGlyID8/IFwiXCJ9YDsifV19fV0sImFwaSI6Im9wZW5haS1jb21wbGV0aW9ucyIsInByb3ZpZGVyIjoic3ludGhldGljIiwibW9kZWwiOiJoZjptb29uc2hvdGFpL0tpbWktSzIuNSIsInVzYWdlIjp7ImlucHV0IjoyODI3LCJvdXRwdXQiOjU1OCwiY2FjaGVSZWFkIjozNzY5NiwiY2FjaGVXcml0ZSI6MCwidG90YWxUb2tlbnMiOjQxMDgxLCJjb3N0Ijp7ImlucHV0IjowLjAwMTI3MjE1LCJvdXRwdXQiOjAuMDAxODk3MiwiY2FjaGVSZWFkIjowLjAxNjk2MzIsImNhY2hlV3JpdGUiOjAsInRvdGFsIjowLjAyMDEzMjU1MDAwMDAwMDAwM319LCJzdG9wUmVhc29uIjoidG9vbFVzZSIsInRpbWVzdGFtcCI6MTc3NzU2NDI1NTc3MCwicmVzcG9uc2VJZCI6ImNoYXRjbXBsLTg1MDM5YzBkZGM0NjQ2MjkifX0seyJ0eXBlIjoibWVzc2FnZSIsImlkIjoiYjM1ZjUzMmIiLCJwYXJlbnRJZCI6IjIzMDQyNTlhIiwidGltZXN0YW1wIjoiMjAyNi0wNC0zMFQxNTo1MTowMC42MjBaIiwibWVzc2FnZSI6eyJyb2xlIjoidG9vbFJlc3VsdCIsInRvb2xDYWxsSWQiOiJmdW5jdGlvbnMuZWRpdDo3IiwidG9vbE5hbWUiOiJlZGl0IiwiY29udGVudCI6W3sidHlwZSI6InRleHQiLCJ0ZXh0IjoiU3VjY2Vzc2Z1bGx5IHJlcGxhY2VkIDMgYmxvY2socykgaW4gcGFja2FnZXMvY29kaW5nLWFnZW50L3NyYy9tb2Rlcy9pbnRlcmFjdGl2ZS9jb21wb25lbnRzL2NvbmZpZy1zZWxlY3Rvci50cy4ifV0sImRldGFpbHMiOnsiZGlmZiI6IiAgICAgLi4uXG4gICAyICAqIFRVSSBjb21wb25lbnQgZm9yIG1hbmFnaW5nIHBhY2thZ2UgcmVzb3VyY2VzIChlbmFibGUvZGlzYWJsZSlcbiAgIDMgICovXG4gICA0IFxuICAgNSBpbXBvcnQgeyBiYXNlbmFtZSwgZGlybmFtZSwgam9pbiwgcmVsYXRpdmUgfSBmcm9tIFwibm9kZTpwYXRoXCI7XG4rICA2IGltcG9ydCB7IGhvbWVkaXIgfSBmcm9tIFwibm9kZTpvc1wiO1xuICAgNiBpbXBvcnQge1xuICAgNyBcdHR5cGUgQ29tcG9uZW50LFxuICAgOCBcdENvbnRhaW5lcixcbiAgIDkgXHR0eXBlIEZvY3VzYWJsZSxcbiAgICAgLi4uXG4gIDU0IFx0c291cmNlOiBzdHJpbmc7XG4gIDU1IFx0c3ViZ3JvdXBzOiBSZXNvdXJjZVN1Ymdyb3VwW107XG4gIDU2IH1cbiAgNTcgXG4rIDU5IGZ1bmN0aW9uIGZvcm1hdEJhc2VEaXIoYmFzZURpcjogc3RyaW5nKTogc3RyaW5nIHtcbisgNjAgXHRjb25zdCBob21lRGlyID0gaG9tZWRpcigpO1xuKyA2MSBcdGNvbnN0IGRpc3BsYXlQYXRoID1cbisgNjIgXHRcdGJhc2VEaXIgPT09IGhvbWVEaXJcbisgNjMgXHRcdFx0PyBcIn5cIlxuKyA2NCBcdFx0XHQ6IGJhc2VEaXIuc3RhcnRzV2l0aChgJHtob21lRGlyfS9gKVxuKyA2NSBcdFx0XHRcdD8gYH4vJHtyZWxhdGl2ZShob21lRGlyLCBiYXNlRGlyKX1gXG4rIDY2IFx0XHRcdFx0OiBiYXNlRGlyO1xuKyA2NyBcbisgNjggXHRyZXR1cm4gZGlzcGxheVBhdGguZW5kc1dpdGgoXCIvXCIpID8gZGlzcGxheVBhdGggOiBgJHtkaXNwbGF5UGF0aH0vYDtcbisgNjkgfVxuKyA3MCBcbiAgNTggZnVuY3Rpb24gZ2V0R3JvdXBMYWJlbChtZXRhZGF0YTogUGF0aE1ldGFkYXRhKTogc3RyaW5nIHtcbiAgNTkgXHRpZiAobWV0YWRhdGEub3JpZ2luID09PSBcInBhY2thZ2VcIikge1xuICA2MCBcdFx0cmV0dXJuIGAke21ldGFkYXRhLnNvdXJjZX0gKCR7bWV0YWRhdGEuc2NvcGV9KWA7XG4gIDYxIFx0fVxuICA2MiBcdC8vIFRvcC1sZXZlbCByZXNvdXJjZXNcbiAgNjMgXHRpZiAobWV0YWRhdGEuc291cmNlID09PSBcImF1dG9cIikge1xuKyA3NyBcdFx0aWYgKG1ldGFkYXRhLmJhc2VEaXIpIHtcbisgNzggXHRcdFx0cmV0dXJuIG1ldGFkYXRhLnNjb3BlID09PSBcInVzZXJcIlxuKyA3OSBcdFx0XHRcdD8gYFVzZXIgKCR7Zm9ybWF0QmFzZURpcihtZXRhZGF0YS5iYXNlRGlyKX0pYFxuKyA4MCBcdFx0XHRcdDogYFByb2plY3QgKCR7Zm9ybWF0QmFzZURpcihtZXRhZGF0YS5iYXNlRGlyKX0pYDtcbisgODEgXHRcdH1cbiAgNjQgXHRcdHJldHVybiBtZXRhZGF0YS5zY29wZSA9PT0gXCJ1c2VyXCIgPyBcIlVzZXIgKH4vLnBpL2FnZW50LylcIiA6IFwiUHJvamVjdCAoLnBpLylcIjtcbiAgNjUgXHR9XG4gIDY2IFx0cmV0dXJuIG1ldGFkYXRhLnNjb3BlID09PSBcInVzZXJcIiA/IFwiVXNlciBzZXR0aW5nc1wiIDogXCJQcm9qZWN0IHNldHRpbmdzXCI7XG4gIDY3IH1cbiAgICAgLi4uXG4gIDcxIFxuICA3MiBcdGNvbnN0IGFkZFRvR3JvdXAgPSAocmVzb3VyY2VzOiBSZXNvbHZlZFJlc291cmNlW10sIHJlc291cmNlVHlwZTogUmVzb3VyY2VUeXBlKSA9PiB7XG4gIDczIFx0XHRmb3IgKGNvbnN0IHJlcyBvZiByZXNvdXJjZXMpIHtcbiAgNzQgXHRcdFx0Y29uc3QgeyBwYXRoLCBlbmFibGVkLCBtZXRhZGF0YSB9ID0gcmVzO1xuLSA3NSBcdFx0XHRjb25zdCBncm91cEtleSA9IGAke21ldGFkYXRhLm9yaWdpbn06JHttZXRhZGF0YS5zY29wZX06JHttZXRhZGF0YS5zb3VyY2V9YDtcbisgOTMgXHRcdFx0Y29uc3QgZ3JvdXBLZXkgPSBgJHttZXRhZGF0YS5vcmlnaW59OiR7bWV0YWRhdGEuc2NvcGV9OiR7bWV0YWRhdGEuc291cmNlfToke21ldGFkYXRhLmJhc2VEaXIgPz8gXCJcIn1gO1xuICA3NiBcbiAgNzcgXHRcdFx0aWYgKCFncm91cE1hcC5oYXMoZ3JvdXBLZXkpKSB7XG4gIDc4IFx0XHRcdFx0Z3JvdXBNYXAuc2V0KGdyb3VwS2V5LCB7XG4gIDc5IFx0XHRcdFx0XHRrZXk6IGdyb3VwS2V5LFxuICAgICAuLi4iLCJmaXJzdENoYW5nZWRMaW5lIjo2fSwiaXNFcnJvciI6ZmFsc2UsInRpbWVzdGFtcCI6MTc3NzU2NDI2MDYyMH19LHsidHlwZSI6Im1lc3NhZ2UiLCJpZCI6IjlhZDIwZjNiIiwicGFyZW50SWQiOiJiMzVmNTMyYiIsInRpbWVzdGFtcCI6IjIwMjYtMDQtMzBUMTU6NTE6MDMuMzcyWiIsIm1lc3NhZ2UiOnsicm9sZSI6ImFzc2lzdGFudCIsImNvbnRlbnQiOlt7InR5cGUiOiJ0aGlua2luZyIsInRoaW5raW5nIjoiIE5vdyBsZXQgbWUgcnVuIHRoZSB0ZXN0cyB0byB2ZXJpZnkgdGhlIGZpeDoiLCJ0aGlua2luZ1NpZ25hdHVyZSI6InJlYXNvbmluZyJ9LHsidHlwZSI6InRvb2xDYWxsIiwiaWQiOiJmdW5jdGlvbnMuYmFzaDo4IiwibmFtZSI6ImJhc2giLCJhcmd1bWVudHMiOnsiY29tbWFuZCI6ImNkIHBhY2thZ2VzL2NvZGluZy1hZ2VudCAmJiBucHggdHN4IC4uLy4uL25vZGVfbW9kdWxlcy92aXRlc3QvZGlzdC9jbGkuanMgLS1ydW4gdGVzdC9wYWNrYWdlLW1hbmFnZXIudGVzdC50cyAtdCBcImF1dG8tZGlzY292ZXJlZCBza2lsbCBtZXRhZGF0YVwiIDI+JjEifX1dLCJhcGkiOiJvcGVuYWktY29tcGxldGlvbnMiLCJwcm92aWRlciI6InN5bnRoZXRpYyIsIm1vZGVsIjoiaGY6bW9vbnNob3RhaS9LaW1pLUsyLjUiLCJ1c2FnZSI6eyJpbnB1dCI6NjI0LCJvdXRwdXQiOjY3LCJjYWNoZVJlYWQiOjQwNDgwLCJjYWNoZVdyaXRlIjowLCJ0b3RhbFRva2VucyI6NDExNzEsImNvc3QiOnsiaW5wdXQiOjAuMDAwMjgwOCwib3V0cHV0IjowLjAwMDIyNzgsImNhY2hlUmVhZCI6MC4wMTgyMTYwMDAwMDAwMDAwMDMsImNhY2hlV3JpdGUiOjAsInRvdGFsIjowLjAxODcyNDYwMDAwMDAwMDAwNH19LCJzdG9wUmVhc29uIjoidG9vbFVzZSIsInRpbWVzdGFtcCI6MTc3NzU2NDI2MDYyMSwicmVzcG9uc2VJZCI6ImNoYXRjbXBsLTg0YzQxZjVlMWRjODU4ZDIifX0seyJ0eXBlIjoibWVzc2FnZSIsImlkIjoiNTcwYzQ0YTAiLCJwYXJlbnRJZCI6IjlhZDIwZjNiIiwidGltZXN0YW1wIjoiMjAyNi0wNC0zMFQxNTo1MTowNC40OTRaIiwibWVzc2FnZSI6eyJyb2xlIjoidG9vbFJlc3VsdCIsInRvb2xDYWxsSWQiOiJmdW5jdGlvbnMuYmFzaDo4IiwidG9vbE5hbWUiOiJiYXNoIiwiY29udGVudCI6W3sidHlwZSI6InRleHQiLCJ0ZXh0IjoiXG4gUlVOICB2My4yLjQgL1VzZXJzL2FsaW91ZGlhbGxvL2NvZGUvc3JjL2dpdGh1Yi5jb20vYWxpb3UvcGktbW9uby9wYWNrYWdlcy9jb2RpbmctYWdlbnRcblxuIOKckyB0ZXN0L3BhY2thZ2UtbWFuYWdlci50ZXN0LnRzICg5OSB0ZXN0cyB8IDk1IHNraXBwZWQpIDhtc1xuXG4gVGVzdCBGaWxlcyAgMSBwYXNzZWQgKDEpXG4gICAgICBUZXN0cyAgNCBwYXNzZWQgfCA5NSBza2lwcGVkICg5OSlcbiAgIFN0YXJ0IGF0ICAxNzo1MTowNFxuICAgRHVyYXRpb24gIDMxNm1zICh0cmFuc2Zvcm0gMTA2bXMsIHNldHVwIDBtcywgY29sbGVjdCAxNDJtcywgdGVzdHMgOG1zLCBlbnZpcm9ubWVudCAwbXMsIHByZXBhcmUgMzltcylcblxuIn1dLCJkZXRhaWxzIjp7Il9kdXJhdGlvbk1zIjoxMTIwfSwiaXNFcnJvciI6ZmFsc2UsInRpbWVzdGFtcCI6MTc3NzU2NDI2NDQ5NH19LHsidHlwZSI6Im1lc3NhZ2UiLCJpZCI6IjZjMjUzNWRhIiwicGFyZW50SWQiOiI1NzBjNDRhMCIsInRpbWVzdGFtcCI6IjIwMjYtMDQtMzBUMTU6NTE6MDcuMzQ2WiIsIm1lc3NhZ2UiOnsicm9sZSI6ImFzc2lzdGFudCIsImNvbnRlbnQiOlt7InR5cGUiOiJ0aGlua2luZyIsInRoaW5raW5nIjoiIEFsbCA0IHRlc3RzIHBhc3MuIE5vdyBsZXQgbWUgcnVuIHRoZSBmdWxsIHRlc3Qgc3VpdGUgZm9yIHBhY2thZ2UtbWFuYWdlci50ZXN0LnRzIHRvIG1ha2Ugc3VyZSBJIGhhdmVuJ3QgYnJva2VuIGFueXRoaW5nIGVsc2U6IiwidGhpbmtpbmdTaWduYXR1cmUiOiJyZWFzb25pbmcifSx7InR5cGUiOiJ0b29sQ2FsbCIsImlkIjoiZnVuY3Rpb25zLmJhc2g6OSIsIm5hbWUiOiJiYXNoIiwiYXJndW1lbnRzIjp7ImNvbW1hbmQiOiJjZCBwYWNrYWdlcy9jb2RpbmctYWdlbnQgJiYgbnB4IHRzeCAuLi8uLi9ub2RlX21vZHVsZXMvdml0ZXN0L2Rpc3QvY2xpLmpzIC0tcnVuIHRlc3QvcGFja2FnZS1tYW5hZ2VyLnRlc3QudHMgMj4mMSJ9fV0sImFwaSI6Im9wZW5haS1jb21wbGV0aW9ucyIsInByb3ZpZGVyIjoic3ludGhldGljIiwibW9kZWwiOiJoZjptb29uc2hvdGFpL0tpbWktSzIuNSIsInVzYWdlIjp7ImlucHV0IjoyNDEsIm91dHB1dCI6NzUsImNhY2hlUmVhZCI6NDEwNTYsImNhY2hlV3JpdGUiOjAsInRvdGFsVG9rZW5zIjo0MTM3MiwiY29zdCI6eyJpbnB1dCI6MC4wMDAxMDg0NTAwMDAwMDAwMDAwMSwib3V0cHV0IjowLjAwMDI1NSwiY2FjaGVSZWFkIjowLjAxODQ3NTIsImNhY2hlV3JpdGUiOjAsInRvdGFsIjowLjAxODgzODY1MDAwMDAwMDAwMn19LCJzdG9wUmVhc29uIjoidG9vbFVzZSIsInRpbWVzdGFtcCI6MTc3NzU2NDI2NDQ5NCwicmVzcG9uc2VJZCI6ImNoYXRjbXBsLWI4ZTgxNjJmNzQwMWEwODEifX0seyJ0eXBlIjoibWVzc2FnZSIsImlkIjoiNTI0NTY2M2MiLCJwYXJlbnRJZCI6IjZjMjUzNWRhIiwidGltZXN0YW1wIjoiMjAyNi0wNC0zMFQxNTo1MTowOS40MzNaIiwibWVzc2FnZSI6eyJyb2xlIjoidG9vbFJlc3VsdCIsInRvb2xDYWxsSWQiOiJmdW5jdGlvbnMuYmFzaDo5IiwidG9vbE5hbWUiOiJiYXNoIiwiY29udGVudCI6W3sidHlwZSI6InRleHQiLCJ0ZXh0IjoiXG4gUlVOICB2My4yLjQgL1VzZXJzL2FsaW91ZGlhbGxvL2NvZGUvc3JjL2dpdGh1Yi5jb20vYWxpb3UvcGktbW9uby9wYWNrYWdlcy9jb2RpbmctYWdlbnRcblxubnBtIGVycm9yIGNvZGUgRTQwNFxubnBtIGVycm9yIDQwNCBOb3QgRm91bmQgLSBHRVQgaHR0cHM6Ly9yZWdpc3RyeS5ucG1qcy5vcmcvbm9uZXhpc3RlbnQtcGFja2FnZSAtIE5vdCBmb3VuZFxubnBtIGVycm9yIDQwNFxubnBtIGVycm9yIDQwNCAgJ25vbmV4aXN0ZW50LXBhY2thZ2VAMS4wLjAnIGlzIG5vdCBpbiB0aGlzIHJlZ2lzdHJ5LlxubnBtIGVycm9yIDQwNFxubnBtIGVycm9yIDQwNCBOb3RlIHRoYXQgeW91IGNhbiBhbHNvIGluc3RhbGwgZnJvbSBhXG5ucG0gZXJyb3IgNDA0IHRhcmJhbGwsIGZvbGRlciwgaHR0cCB1cmwsIG9yIGdpdCB1cmwuXG5ucG0gZXJyb3IgQSBjb21wbGV0ZSBsb2cgb2YgdGhpcyBydW4gY2FuIGJlIGZvdW5kIGluOiAvVXNlcnMvYWxpb3VkaWFsbG8vLm5wbS9fbG9ncy8yMDI2LTA0LTMwVDE1XzUxXzA4XzI4MlotZGVidWctMC5sb2dcbkNsb25pbmcgaW50byAnL3Zhci9mb2xkZXJzL2x5L2ZkNWwwbTB4NXg1Z3pycXI1MzJybGd2aDAwMDBnbi9UL3BtLXRlc3QtMTc3NzU2NDI2ODg1My16dmkwcmlta3JrZi9hZ2VudC9naXQvZ2l0aHViLmNvbS9ub25leGlzdGVudC9yZXBvJy4uLlxuZmF0YWw6IGNvdWxkIG5vdCByZWFkIFVzZXJuYW1lIGZvciAnaHR0cHM6Ly9naXRodWIuY29tJzogdGVybWluYWwgcHJvbXB0cyBkaXNhYmxlZFxuIOKdryB0ZXN0L3BhY2thZ2UtbWFuYWdlci50ZXN0LnRzICg5OSB0ZXN0cyB8IDEgZmFpbGVkKSAxMTUybXNcbiAgIOKckyBEZWZhdWx0UGFja2FnZU1hbmFnZXIgPiByZXNvbHZlID4gc2hvdWxkIHJldHVybiBubyBwYWNrYWdlLXNvdXJjZWQgcGF0aHMgd2hlbiBubyBzb3VyY2VzIGNvbmZpZ3VyZWQgM21zXG4gICDinJMgRGVmYXVsdFBhY2thZ2VNYW5hZ2VyID4gcmVzb2x2ZSA+IHNob3VsZCByZXNvbHZlIGxvY2FsIGV4dGVuc2lvbiBwYXRocyBmcm9tIHNldHRpbmdzIDFtc1xuICAg4pyTIERlZmF1bHRQYWNrYWdlTWFuYWdlciA+IHJlc29sdmUgPiBzaG91bGQgcmVzb2x2ZSBza2lsbCBwYXRocyBmcm9tIHNldHRpbmdzIDFtc1xuICAg4pyTIERlZmF1bHRQYWNrYWdlTWFuYWdlciA+IHJlc29sdmUgPiBzaG91bGQgYXV0by1kaXNjb3ZlciByb290IG1hcmtkb3duIHNraWxscyBmcm9tIC5waSBza2lsbCBkaXJzIDFtc1xuICAg4pyTIERlZmF1bHRQYWNrYWdlTWFuYWdlciA+IHJlc29sdmUgPiBzaG91bGQgcmVzb2x2ZSBwcm9qZWN0IHBhdGhzIHJlbGF0aXZlIHRvIC5waSAybXNcbiAgIOKckyBEZWZhdWx0UGFja2FnZU1hbmFnZXIgPiByZXNvbHZlID4gc2hvdWxkIGF1dG8tZGlzY292ZXIgdXNlciBwcm9tcHRzIHdpdGggb3ZlcnJpZGVzIDJtc1xuICAgw5cgRGVmYXVsdFBhY2thZ2VNYW5hZ2VyID4gcmVzb2x2ZSA+IHNob3VsZCByZXNvbHZlIHN5bWxpbmtlZCB1c2VyIGFuZCBwcm9qZWN0IHJlc291cmNlcyBvbmNlIDltc1xuICAgICDihpIgZXhwZWN0ZWQgeyBleHRlbnNpb25zOiAxLCBza2lsbHM6IDIsIOKApigyKSB9IHRvIGRlZXBseSBlcXVhbCB7IGV4dGVuc2lvbnM6IDEsIHNraWxsczogMSwg4oCmKDIpIH1cbiAgIOKckyBEZWZhdWx0UGFja2FnZU1hbmFnZXIgPiByZXNvbHZlID4gc2hvdWxkIGF1dG8tZGlzY292ZXIgcHJvamVjdCBwcm9tcHRzIHdpdGggb3ZlcnJpZGVzIDFtc1xuICAg4pyTIERlZmF1bHRQYWNrYWdlTWFuYWdlciA+IHJlc29sdmUgPiBzaG91bGQgcmVzb2x2ZSBkaXJlY3Rvcnkgd2l0aCBwYWNrYWdlLmpzb24gcGkuZXh0ZW5zaW9ucyBpbiBleHRlbnNpb25zIHNldHRpbmcgMm1zXG4gICDinJMgRGVmYXVsdFBhY2thZ2VNYW5hZ2VyID4gYXV0by1kaXNjb3ZlcmVkIHNraWxsIG1ldGFkYXRhID4gc2hvdWxkIHVzZSB0aGUgYWdlbnQgZGlyIGFzIGJhc2VEaXIgZm9yIHVzZXIgLnBpL2FnZW50IHNraWxscyAxbXNcbiAgIOKckyBEZWZhdWx0UGFja2FnZU1hbmFnZXIgPiBhdXRvLWRpc2NvdmVyZWQgc2tpbGwgbWV0YWRhdGEgPiBzaG91bGQgdXNlIHRoZSBwcm9qZWN0IC5waSBkaXIgYXMgYmFzZURpciBmb3IgcHJvamVjdCAucGkgc2tpbGxzIDFtc1xuICAg4pyTIERlZmF1bHRQYWNrYWdlTWFuYWdlciA+IGF1dG8tZGlzY292ZXJlZCBza2lsbCBtZXRhZGF0YSA+IHNob3VsZCB1c2Ugfi8uYWdlbnRzIGFzIGJhc2VEaXIgZm9yIHVzZXIgLmFnZW50cyBza2lsbHMgMW1zXG4gICDinJMgRGVmYXVsdFBhY2thZ2VNYW5hZ2VyID4gYXV0by1kaXNjb3ZlcmVkIHNraWxsIG1ldGFkYXRhID4gc2hvdWxkIHVzZSBlYWNoIHByb2plY3QgLmFnZW50cyBkaXIgYXMgYmFzZURpciBmb3IgcHJvamVjdCAuYWdlbnRzIHNraWxscyAybXNcbiAgIOKckyBEZWZhdWx0UGFja2FnZU1hbmFnZXIgPiAuYWdlbnRzL3NraWxscyBhdXRvLWRpc2NvdmVyeSA+IHNob3VsZCBzY2FuIC5hZ2VudHMvc2tpbGxzIGZyb20gY3dkIHVwIHRvIGdpdCByZXBvIHJvb3QgMm1zXG4gICDinJMgRGVmYXVsdFBhY2thZ2VNYW5hZ2VyID4gLmFnZW50cy9za2lsbHMgYXV0by1kaXNjb3ZlcnkgPiBzaG91bGQgc2NhbiAuYWdlbnRzL3NraWxscyB1cCB0byBmaWxlc3lzdGVtIHJvb3Qgd2hlbiBub3QgaW4gYSBnaXQgcmVwbyAybXNcbiAgIOKckyBEZWZhdWx0UGFja2FnZU1hbmFnZXIgPiAuYWdlbnRzL3NraWxscyBhdXRvLWRpc2NvdmVyeSA+IHNob3VsZCBpZ25vcmUgcm9vdCBtYXJrZG93biBmaWxlcyBpbiAuYWdlbnRzL3NraWxscyAxbXNcbiAgIOKckyBEZWZhdWx0UGFja2FnZU1hbmFnZXIgPiAuYWdlbnRzL3NraWxscyBhdXRvLWRpc2NvdmVyeSA+IHNob3VsZCBrZWVwIH4vLmFnZW50cy9za2lsbHMgdXNlci1zY29wZWQgd2hlbiBjd2QgaXMgdW5kZXIgaG9tZSBpbiBhIG5vbi1naXQgZGlyZWN0b3J5IDJtc1xuICAg4pyTIERlZmF1bHRQYWNrYWdlTWFuYWdlciA+IC5hZ2VudHMvc2tpbGxzIGF1dG8tZGlzY292ZXJ5ID4gc2hvdWxkIGRlZHVwZSB1c2VyIHNraWxsIGVudHJpZXMgd2hlbiB+Ly5waS9hZ2VudC9za2lsbHMgaXMgYSBzeW1saW5rIHRvIH4vLmFnZW50cy9za2lsbHMgMW1zXG4gICDinJMgRGVmYXVsdFBhY2thZ2VNYW5hZ2VyID4gaWdub3JlIGZpbGVzID4gc2hvdWxkIHJlc3BlY3QgLmdpdGlnbm9yZSBpbiBza2lsbCBkaXJlY3RvcmllcyAybXNcbiAgIOKckyBEZWZhdWx0UGFja2FnZU1hbmFnZXIgPiBpZ25vcmUgZmlsZXMgPiBzaG91bGQgbm90IGFwcGx5IHBhcmVudCAuZ2l0aWdub3JlIHRvIC5waSBhdXRvLWRpc2NvdmVyeSAxbXNcbiAgIOKckyBEZWZhdWx0UGFja2FnZU1hbmFnZXIgPiByZXNvbHZlRXh0ZW5zaW9uU291cmNlcyA+IHNob3VsZCByZXNvbHZlIGxvY2FsIHBhdGhzIDBtc1xuICAg4pyTIERlZmF1bHRQYWNrYWdlTWFuYWdlciA+IHJlc29sdmVFeHRlbnNpb25Tb3VyY2VzID4gc2hvdWxkIGhhbmRsZSBkaXJlY3RvcmllcyB3aXRoIHBpIG1hbmlmZXN0IDFtc1xuICAg4pyTIERlZmF1bHRQYWNrYWdlTWFuYWdlciA+IHJlc29sdmVFeHRlbnNpb25Tb3VyY2VzID4gc2hvdWxkIGhhbmRsZSBkaXJlY3RvcmllcyB3aXRoIGF1dG8tZGlzY292ZXJ5IGxheW91dCAxbXNcbiAgIOKckyBEZWZhdWx0UGFja2FnZU1hbmFnZXIgPiByZXNvbHZlRXh0ZW5zaW9uU291cmNlcyA+IHNob3VsZCBzdG9wIHJlY3Vyc2luZyB3aGVuIGEgcGFja2FnZSBza2lsbCBkaXJlY3RvcnkgY29udGFpbnMgU0tJTEwubWQgMW1zXG4gICDinJMgRGVmYXVsdFBhY2thZ2VNYW5hZ2VyID4gcHJvZ3Jlc3MgY2FsbGJhY2sgPiBzaG91bGQgZW1pdCBwcm9ncmVzcyBldmVudHMgMG1zXG4gICDinJMgRGVmYXVsdFBhY2thZ2VNYW5hZ2VyID4gd2luZG93cyBjb21tYW5kIHNwYXduaW5nID4gc2hvdWxkIGF2b2lkIHRoZSBzaGVsbCBmb3IgZ2l0IHNvIFdpbmRvd3MgcGF0aHMgd2l0aCBzcGFjZXMgc3RheSBzaW5nbGUgYXJndW1lbnRzIDFtc1xuICAg4pyTIERlZmF1bHRQYWNrYWdlTWFuYWdlciA+IG5wbUNvbW1hbmQgPiBzaG91bGQgdXNlIG5wbUNvbW1hbmQgYXJndiBmb3IgbnBtIGluc3RhbGxzIDFtc1xuICAg4pyTIERlZmF1bHRQYWNrYWdlTWFuYWdlciA+IG5wbUNvbW1hbmQgPiBzaG91bGQgaW5zdGFsbCBnaXQgcGFja2FnZSBkZXBlbmRlbmNpZXMgd2l0aCAtLW9taXQ9ZGV2IDJtc1xuICAg4pyTIERlZmF1bHRQYWNrYWdlTWFuYWdlciA+IG5wbUNvbW1hbmQgPiBzaG91bGQgdXNlIHBsYWluIGluc3RhbGwgZm9yIGdpdCBwYWNrYWdlIGRlcGVuZGVuY2llcyB3aGVuIG5wbUNvbW1hbmQgaXMgY29uZmlndXJlZCAxbXNcbiAgIOKckyBEZWZhdWx0UGFja2FnZU1hbmFnZXIgPiBucG1Db21tYW5kID4gc2hvdWxkIHVwZGF0ZSBnaXQgcGFja2FnZSBkZXBlbmRlbmNpZXMgd2l0aCAtLW9taXQ9ZGV2IDJtc1xuICAg4pyTIERlZmF1bHRQYWNrYWdlTWFuYWdlciA+IG5wbUNvbW1hbmQgPiBzaG91bGQgdXNlIHBsYWluIGluc3RhbGwgdGhyb3VnaCBucG1Db21tYW5kIGFyZ3Ygd2hlbiB1cGRhdGluZyBnaXQgcGFja2FnZSBkZXBlbmRlbmNpZXMgMm1zXG4gICDinJMgRGVmYXVsdFBhY2thZ2VNYW5hZ2VyID4gbnBtQ29tbWFuZCA+IHNob3VsZCB1c2UgbnBtQ29tbWFuZCBhcmd2IGZvciBucG0gcm9vdCBsb29rdXAgYW5kIGludmFsaWRhdGUgY2FjaGVkIHJvb3Qgd2hlbiBucG1Db21tYW5kIGNoYW5nZXMgMW1zXG4gICDinJMgRGVmYXVsdFBhY2thZ2VNYW5hZ2VyID4gc291cmNlIHBhcnNpbmcgPiBzaG91bGQgZW1pdCBwcm9ncmVzcyBldmVudHMgb24gaW5zdGFsbCBhdHRlbXB0ICA2MTNtc1xuICAg4pyTIERlZmF1bHRQYWNrYWdlTWFuYWdlciA+IHNvdXJjZSBwYXJzaW5nID4gc2hvdWxkIHJlY29nbml6ZSBnaXRodWIgVVJMcyB3aXRob3V0IGdpdDogcHJlZml4ICA0MDRtc1xuICAg4pyTIERlZmF1bHRQYWNrYWdlTWFuYWdlciA+IHNvdXJjZSBwYXJzaW5nID4gc2hvdWxkIHBhcnNlIHBhY2thZ2Ugc291cmNlIHR5cGVzIGZyb20gZG9jcyBleGFtcGxlcyAxbXNcbiAgIOKckyBEZWZhdWx0UGFja2FnZU1hbmFnZXIgPiBzb3VyY2UgcGFyc2luZyA+IHNob3VsZCBuZXZlciBwYXJzZSBkb3QtcmVsYXRpdmUgcGF0aHMgYXMgZ2l0IDBtc1xuICAg4pyTIERlZmF1bHRQYWNrYWdlTWFuYWdlciA+IHNldHRpbmdzIHNvdXJjZSBub3JtYWxpemF0aW9uID4gc2hvdWxkIHN0b3JlIGdsb2JhbCBsb2NhbCBwYWNrYWdlcyByZWxhdGl2ZSB0byBhZ2VudCBzZXR0aW5ncyBiYXNlIDFtc1xuICAg4pyTIERlZmF1bHRQYWNrYWdlTWFuYWdlciA+IHNldHRpbmdzIHNvdXJjZSBub3JtYWxpemF0aW9uID4gc2hvdWxkIHN0b3JlIHByb2plY3QgbG9jYWwgcGFja2FnZXMgcmVsYXRpdmUgdG8gLnBpIHNldHRpbmdzIGJhc2UgMW1zXG4gICDinJMgRGVmYXVsdFBhY2thZ2VNYW5hZ2VyID4gc2V0dGluZ3Mgc291cmNlIG5vcm1hbGl6YXRpb24gPiBzaG91bGQgcmVtb3ZlIGxvY2FsIHBhY2thZ2UgZW50cmllcyB1c2luZyBlcXVpdmFsZW50IHBhdGggZm9ybXMgMW1zXG4gICDinJMgRGVmYXVsdFBhY2thZ2VNYW5hZ2VyID4gSFRUUFMgZ2l0IFVSTCBwYXJzaW5nIChvbGQgYmVoYXZpb3IpID4gc2hvdWxkIHBhcnNlIEhUVFBTIEdpdEh1YiBVUkxzIGNvcnJlY3RseSAwbXNcbiAgIOKckyBEZWZhdWx0UGFja2FnZU1hbmFnZXIgPiBIVFRQUyBnaXQgVVJMIHBhcnNpbmcgKG9sZCBiZWhhdmlvcikgPiBzaG91bGQgcGFyc2UgSFRUUFMgVVJMcyB3aXRoIGdpdDogcHJlZml4IDBtc1xuICAg4pyTIERlZmF1bHRQYWNrYWdlTWFuYWdlciA+IEhUVFBTIGdpdCBVUkwgcGFyc2luZyAob2xkIGJlaGF2aW9yKSA+IHNob3VsZCBwYXJzZSBIVFRQUyBVUkxzIHdpdGggcmVmIDBtc1xuICAg4pyTIERlZmF1bHRQYWNrYWdlTWFuYWdlciA+IEhUVFBTIGdpdCBVUkwgcGFyc2luZyAob2xkIGJlaGF2aW9yKSA+IHNob3VsZCBwYXJzZSBob3N0L3BhdGggc2hvcnRoYW5kIG9ubHkgd2l0aCBnaXQ6IHByZWZpeCAwbXNcbiAgIOKckyBEZWZhdWx0UGFja2FnZU1hbmFnZXIgPiBIVFRQUyBnaXQgVVJMIHBhcnNpbmcgKG9sZCBiZWhhdmlvcikgPiBzaG91bGQgdHJlYXQgaG9zdC9wYXRoIHNob3J0aGFuZCBhcyBsb2NhbCB3aXRob3V0IGdpdDogcHJlZml4IDBtc1xuICAg4pyTIERlZmF1bHRQYWNrYWdlTWFuYWdlciA+IEhUVFBTIGdpdCBVUkwgcGFyc2luZyAob2xkIGJlaGF2aW9yKSA+IHNob3VsZCBwYXJzZSBIVFRQUyBVUkxzIHdpdGggLmdpdCBzdWZmaXggMG1zXG4gICDinJMgRGVmYXVsdFBhY2thZ2VNYW5hZ2VyID4gSFRUUFMgZ2l0IFVSTCBwYXJzaW5nIChvbGQgYmVoYXZpb3IpID4gc2hvdWxkIHBhcnNlIEdpdExhYiBIVFRQUyBVUkxzIDBtc1xuICAg4pyTIERlZmF1bHRQYWNrYWdlTWFuYWdlciA+IEhUVFBTIGdpdCBVUkwgcGFyc2luZyAob2xkIGJlaGF2aW9yKSA+IHNob3VsZCBwYXJzZSBCaXRidWNrZXQgSFRUUFMgVVJMcyAwbXNcbiAgIOKckyBEZWZhdWx0UGFja2FnZU1hbmFnZXIgPiBIVFRQUyBnaXQgVVJMIHBhcnNpbmcgKG9sZCBiZWhhdmlvcikgPiBzaG91bGQgcGFyc2UgQ29kZWJlcmcgSFRUUFMgVVJMcyAwbXNcbiAgIOKckyBEZWZhdWx0UGFja2FnZU1hbmFnZXIgPiBIVFRQUyBnaXQgVVJMIHBhcnNpbmcgKG9sZCBiZWhhdmlvcikgPiBzaG91bGQgZ2VuZXJhdGUgY29ycmVjdCBwYWNrYWdlIGlkZW50aXR5IGZvciBwcm90b2NvbCBhbmQgZ2l0Oi1wcmVmaXhlZCBVUkxzIDBtc1xuICAg4pyTIERlZmF1bHRQYWNrYWdlTWFuYWdlciA+IEhUVFBTIGdpdCBVUkwgcGFyc2luZyAob2xkIGJlaGF2aW9yKSA+IHNob3VsZCBkZWR1cGxpY2F0ZSBnaXQgVVJMcyB3aXRoIGRpZmZlcmVudCBzdXBwb3J0ZWQgZm9ybWF0cyAxbXNcbiAgIOKckyBEZWZhdWx0UGFja2FnZU1hbmFnZXIgPiBIVFRQUyBnaXQgVVJMIHBhcnNpbmcgKG9sZCBiZWhhdmlvcikgPiBzaG91bGQgaGFuZGxlIEhUVFBTIFVSTHMgd2l0aCByZWZzIGluIHJlc29sdmUgMG1zXG4gICDinJMgRGVmYXVsdFBhY2thZ2VNYW5hZ2VyID4gcGF0dGVybiBmaWx0ZXJpbmcgaW4gdG9wLWxldmVsIGFycmF5cyA+IHNob3VsZCBleGNsdWRlIGV4dGVuc2lvbnMgd2l0aCAhIHBhdHRlcm4gMm1zXG4gICDinJMgRGVmYXVsdFBhY2thZ2VNYW5hZ2VyID4gcGF0dGVybiBmaWx0ZXJpbmcgaW4gdG9wLWxldmVsIGFycmF5cyA+IHNob3VsZCBmaWx0ZXIgdGhlbWVzIHdpdGggZ2xvYiBwYXR0ZXJucyAxbXNcbiAgIOKckyBEZWZhdWx0UGFja2FnZU1hbmFnZXIgPiBwYXR0ZXJuIGZpbHRlcmluZyBpbiB0b3AtbGV2ZWwgYXJyYXlzID4gc2hvdWxkIGZpbHRlciBwcm9tcHRzIHdpdGggZXhjbHVzaW9uIHBhdHRlcm4gMW1zXG4gICDinJMgRGVmYXVsdFBhY2thZ2VNYW5hZ2VyID4gcGF0dGVybiBmaWx0ZXJpbmcgaW4gdG9wLWxldmVsIGFycmF5cyA+IHNob3VsZCBmaWx0ZXIgc2tpbGxzIHdpdGggZXhjbHVzaW9uIHBhdHRlcm4gMm1zXG4gICDinJMgRGVmYXVsdFBhY2thZ2VNYW5hZ2VyID4gcGF0dGVybiBmaWx0ZXJpbmcgaW4gdG9wLWxldmVsIGFycmF5cyA+IHNob3VsZCB3b3JrIHdpdGhvdXQgcGF0dGVybnMgKGJhY2t3YXJkIGNvbXBhdGlibGUpIDFtc1xuICAg4pyTIERlZmF1bHRQYWNrYWdlTWFuYWdlciA+IHBhdHRlcm4gZmlsdGVyaW5nIGluIHBpIG1hbmlmZXN0ID4gc2hvdWxkIHN1cHBvcnQgZ2xvYiBwYXR0ZXJucyBpbiBtYW5pZmVzdCBleHRlbnNpb25zIDJtc1xuICAg4pyTIERlZmF1bHRQYWNrYWdlTWFuYWdlciA+IHBhdHRlcm4gZmlsdGVyaW5nIGluIHBpIG1hbmlmZXN0ID4gc2hvdWxkIHN1cHBvcnQgZ2xvYiBwYXR0ZXJucyBpbiBtYW5pZmVzdCBza2lsbHMgMW1zXG4gICDinJMgRGVmYXVsdFBhY2thZ2VNYW5hZ2VyID4gcGF0dGVybiBmaWx0ZXJpbmcgaW4gcGkgbWFuaWZlc3QgPiBzaG91bGQgZXhwYW5kIHBvc2l0aXZlIGdsb2IgbWFuaWZlc3QgZW50cmllcyBiZWZvcmUgY29sbGVjdGluZyBza2lsbHMgNW1zXG4gICDinJMgRGVmYXVsdFBhY2thZ2VNYW5hZ2VyID4gcGF0dGVybiBmaWx0ZXJpbmcgaW4gcGFja2FnZSBmaWx0ZXJzID4gc2hvdWxkIGFwcGx5IHVzZXIgZmlsdGVycyBvbiB0b3Agb2YgbWFuaWZlc3QgZmlsdGVycyAobm90IHJlcGxhY2UpIDJtc1xuICAg4pyTIERlZmF1bHRQYWNrYWdlTWFuYWdlciA+IHBhdHRlcm4gZmlsdGVyaW5nIGluIHBhY2thZ2UgZmlsdGVycyA+IHNob3VsZCBleGNsdWRlIGV4dGVuc2lvbnMgZnJvbSBwYWNrYWdlIHdpdGggISBwYXR0ZXJuIDFtc1xuICAg4pyTIERlZmF1bHRQYWNrYWdlTWFuYWdlciA+IHBhdHRlcm4gZmlsdGVyaW5nIGluIHBhY2thZ2UgZmlsdGVycyA+IHNob3VsZCBmaWx0ZXIgdGhlbWVzIGZyb20gcGFja2FnZSAxbXNcbiAgIOKckyBEZWZhdWx0UGFja2FnZU1hbmFnZXIgPiBwYXR0ZXJuIGZpbHRlcmluZyBpbiBwYWNrYWdlIGZpbHRlcnMgPiBzaG91bGQgY29tYmluZSBpbmNsdWRlIGFuZCBleGNsdWRlIHBhdHRlcm5zIDFtc1xuICAg4pyTIERlZmF1bHRQYWNrYWdlTWFuYWdlciA+IHBhdHRlcm4gZmlsdGVyaW5nIGluIHBhY2thZ2UgZmlsdGVycyA+IHNob3VsZCB3b3JrIHdpdGggZGlyZWN0IHBhdGhzIChubyBwYXR0ZXJucykgMW1zXG4gICDinJMgRGVmYXVsdFBhY2thZ2VNYW5hZ2VyID4gZm9yY2UtaW5jbHVkZSBwYXR0ZXJucyA+IHNob3VsZCBmb3JjZS1pbmNsdWRlIGV4dGVuc2lvbnMgd2l0aCArIHBhdHRlcm4gYWZ0ZXIgZXhjbHVzaW9uIDFtc1xuICAg4pyTIERlZmF1bHRQYWNrYWdlTWFuYWdlciA+IGZvcmNlLWluY2x1ZGUgcGF0dGVybnMgPiBzaG91bGQgZm9yY2UtaW5jbHVkZSBvdmVycmlkZXMgZXhjbHVkZSBpbiBwYWNrYWdlIGZpbHRlcnMgMW1zXG4gICDinJMgRGVmYXVsdFBhY2thZ2VNYW5hZ2VyID4gZm9yY2UtaW5jbHVkZSBwYXR0ZXJucyA+IHNob3VsZCBmb3JjZS1pbmNsdWRlIG11bHRpcGxlIHJlc291cmNlcyAybXNcbiAgIOKckyBEZWZhdWx0UGFja2FnZU1hbmFnZXIgPiBmb3JjZS1pbmNsdWRlIHBhdHRlcm5zID4gc2hvdWxkIGZvcmNlLWluY2x1ZGUgYWZ0ZXIgc3BlY2lmaWMgZXhjbHVzaW9uIDFtc1xuICAg4pyTIERlZmF1bHRQYWNrYWdlTWFuYWdlciA+IGZvcmNlLWluY2x1ZGUgcGF0dGVybnMgPiBzaG91bGQgaGFuZGxlIGZvcmNlLWluY2x1ZGUgaW4gbWFuaWZlc3QgcGF0dGVybnMgMW1zXG4gICDinJMgRGVmYXVsdFBhY2thZ2VNYW5hZ2VyID4gZm9yY2UtaW5jbHVkZSBwYXR0ZXJucyA+IHNob3VsZCBmb3JjZS1pbmNsdWRlIHRoZW1lcyAxbXNcbiAgIOKckyBEZWZhdWx0UGFja2FnZU1hbmFnZXIgPiBmb3JjZS1pbmNsdWRlIHBhdHRlcm5zID4gc2hvdWxkIGZvcmNlLWluY2x1ZGUgcHJvbXB0cyAybXNcbiAgIOKckyBEZWZhdWx0UGFja2FnZU1hbmFnZXIgPiBmb3JjZS1leGNsdWRlIHBhdHRlcm5zID4gc2hvdWxkIGZvcmNlLWV4Y2x1ZGUgdG9wLWxldmVsIHJlc291cmNlcyAxbXNcbiAgIOKckyBEZWZhdWx0UGFja2FnZU1hbmFnZXIgPiBmb3JjZS1leGNsdWRlIHBhdHRlcm5zID4gc2hvdWxkIGZvcmNlLWV4Y2x1ZGUgaW4gcGFja2FnZSBmaWx0ZXJzIDFtc1xuICAg4pyTIERlZmF1bHRQYWNrYWdlTWFuYWdlciA+IHBhY2thZ2UgZGVkdXBsaWNhdGlvbiA+IHNob3VsZCBkZWR1cGUgc2FtZSBsb2NhbCBwYWNrYWdlIGluIGdsb2JhbCBhbmQgcHJvamVjdCAocHJvamVjdCB3aW5zKSAxbXNcbiAgIOKckyBEZWZhdWx0UGFja2FnZU1hbmFnZXIgPiBwYWNrYWdlIGRlZHVwbGljYXRpb24gPiBzaG91bGQga2VlcCBib3RoIGlmIGRpZmZlcmVudCBwYWNrYWdlcyAxbXNcbiAgIOKckyBEZWZhdWx0UGFja2FnZU1hbmFnZXIgPiBwYWNrYWdlIGRlZHVwbGljYXRpb24gPiBzaG91bGQgZGVkdXBlIFNTSCBhbmQgSFRUUFMgVVJMcyBmb3Igc2FtZSByZXBvIDBtc1xuICAg4pyTIERlZmF1bHRQYWNrYWdlTWFuYWdlciA+IHBhY2thZ2UgZGVkdXBsaWNhdGlvbiA+IHNob3VsZCBkZWR1cGUgU1NIIGFuZCBIVFRQUyB3aXRoIHJlZnMgMG1zXG4gICDinJMgRGVmYXVsdFBhY2thZ2VNYW5hZ2VyID4gcGFja2FnZSBkZWR1cGxpY2F0aW9uID4gc2hvdWxkIGRlZHVwZSBTU0ggVVJMIHdpdGggc3NoOi8vIHByb3RvY29sIGFuZCBnaXRAIGZvcm1hdCAwbXNcbiAgIOKckyBEZWZhdWx0UGFja2FnZU1hbmFnZXIgPiBwYWNrYWdlIGRlZHVwbGljYXRpb24gPiBzaG91bGQgZGVkdXBlIGFsbCBzdXBwb3J0ZWQgVVJMIGZvcm1hdHMgZm9yIHNhbWUgcmVwbyAwbXNcbiAgIOKckyBEZWZhdWx0UGFja2FnZU1hbmFnZXIgPiBwYWNrYWdlIGRlZHVwbGljYXRpb24gPiBzaG91bGQga2VlcCBkaWZmZXJlbnQgcmVwb3Mgc2VwYXJhdGUgKEhUVFBTIHZzIFNTSCkgMG1zXG4gICDinJMgRGVmYXVsdFBhY2thZ2VNYW5hZ2VyID4gbXVsdGktZmlsZSBleHRlbnNpb24gZGlzY292ZXJ5IChpc3N1ZSAjMTEwMikgPiBzaG91bGQgb25seSBsb2FkIGluZGV4LnRzIGZyb20gc3ViZGlyZWN0b3JpZXMsIG5vdCBoZWxwZXIgbW9kdWxlcyAxbXNcbiAgIOKckyBEZWZhdWx0UGFja2FnZU1hbmFnZXIgPiBtdWx0aS1maWxlIGV4dGVuc2lvbiBkaXNjb3ZlcnkgKGlzc3VlICMxMTAyKSA+IHNob3VsZCByZXNwZWN0IHBhY2thZ2UuanNvbiBwaS5leHRlbnNpb25zIG1hbmlmZXN0IGluIHN1YmRpcmVjdG9yaWVzIDFtc1xuICAg4pyTIERlZmF1bHRQYWNrYWdlTWFuYWdlciA+IG11bHRpLWZpbGUgZXh0ZW5zaW9uIGRpc2NvdmVyeSAoaXNzdWUgIzExMDIpID4gc2hvdWxkIGhhbmRsZSBtaXhlZCB0b3AtbGV2ZWwgZmlsZXMgYW5kIHN1YmRpcmVjdG9yaWVzIDFtc1xuICAg4pyTIERlZmF1bHRQYWNrYWdlTWFuYWdlciA+IG11bHRpLWZpbGUgZXh0ZW5zaW9uIGRpc2NvdmVyeSAoaXNzdWUgIzExMDIpID4gc2hvdWxkIHNraXAgc3ViZGlyZWN0b3JpZXMgd2l0aG91dCBpbmRleC50cyBvciBtYW5pZmVzdCAxbXNcbiAgIOKckyBEZWZhdWx0UGFja2FnZU1hbmFnZXIgPiBvZmZsaW5lIG1vZGUgYW5kIG5ldHdvcmsgdGltZW91dHMgPiBzaG91bGQgdXBkYXRlIHByb2plY3QgbnBtIHBhY2thZ2VzIHVzaW5nIEBsYXRlc3Qgd2hlbiBuZXdlciB2ZXJzaW9uIGlzIGF2YWlsYWJsZSAybXNcbiAgIOKckyBEZWZhdWx0UGFja2FnZU1hbmFnZXIgPiBvZmZsaW5lIG1vZGUgYW5kIG5ldHdvcmsgdGltZW91dHMgPiBzaG91bGQgc2tpcCBwcm9qZWN0IG5wbSB1cGRhdGUgd2hlbiBpbnN0YWxsZWQgdmVyc2lvbiBtYXRjaGVzIGxhdGVzdCAxbXNcbiAgIOKckyBEZWZhdWx0UGFja2FnZU1hbmFnZXIgPiBvZmZsaW5lIG1vZGUgYW5kIG5ldHdvcmsgdGltZW91dHMgPiBzaG91bGQgYmF0Y2ggbnBtIHVwZGF0ZXMgcGVyIHNjb3BlIGFuZCBydW4gZ2l0IHVwZGF0ZXMgaW4gcGFyYWxsZWwgd2hpbGUgc2tpcHBpbmcgcGlubmVkIGFuZCBjdXJyZW50IHBhY2thZ2VzIDIzbXNcbiAgIOKckyBEZWZhdWx0UGFja2FnZU1hbmFnZXIgPiBvZmZsaW5lIG1vZGUgYW5kIG5ldHdvcmsgdGltZW91dHMgPiBzaG91bGQgc3VnZ2VzdCBucG0gc291cmNlIHByZWZpeGVzIGZvciB1cGRhdGUgbG9va3VwcyAxbXNcbiAgIOKckyBEZWZhdWx0UGFja2FnZU1hbmFnZXIgPiBvZmZsaW5lIG1vZGUgYW5kIG5ldHdvcmsgdGltZW91dHMgPiBzaG91bGQgc3VnZ2VzdCBnaXQgc291cmNlIHByZWZpeGVzIGZvciB1cGRhdGUgbG9va3VwcyAwbXNcbiAgIOKckyBEZWZhdWx0UGFja2FnZU1hbmFnZXIgPiBvZmZsaW5lIG1vZGUgYW5kIG5ldHdvcmsgdGltZW91dHMgPiBzaG91bGQgc2tpcCBpbnN0YWxsaW5nIG1pc3NpbmcgcGFja2FnZSBzb3VyY2VzIHdoZW4gb2ZmbGluZSAxbXNcbiAgIOKckyBEZWZhdWx0UGFja2FnZU1hbmFnZXIgPiBvZmZsaW5lIG1vZGUgYW5kIG5ldHdvcmsgdGltZW91dHMgPiBzaG91bGQgc2tpcCByZWZyZXNoaW5nIHRlbXBvcmFyeSBnaXQgc291cmNlcyB3aGVuIG9mZmxpbmUgMW1zXG4gICDinJMgRGVmYXVsdFBhY2thZ2VNYW5hZ2VyID4gb2ZmbGluZSBtb2RlIGFuZCBuZXR3b3JrIHRpbWVvdXRzID4gc2hvdWxkIG5vdCBydW4gbnBtIHZpZXcgZHVyaW5nIHJlc29sdmUgZm9yIGluc3RhbGxlZCB1bnBpbm5lZCBwYWNrYWdlcyAxbXNcbiAgIOKckyBEZWZhdWx0UGFja2FnZU1hbmFnZXIgPiBvZmZsaW5lIG1vZGUgYW5kIG5ldHdvcmsgdGltZW91dHMgPiBzaG91bGQgcmVpbnN0YWxsIHBpbm5lZCBucG0gcGFja2FnZXMgd2hlbiBpbnN0YWxsZWQgdmVyc2lvbiBkb2VzIG5vdCBtYXRjaCAxbXNcbiAgIOKckyBEZWZhdWx0UGFja2FnZU1hbmFnZXIgPiBvZmZsaW5lIG1vZGUgYW5kIG5ldHdvcmsgdGltZW91dHMgPiBzaG91bGQgbm90IGNoZWNrIHBhY2thZ2UgdXBkYXRlcyB3aGVuIG9mZmxpbmUgMG1zXG4gICDinJMgRGVmYXVsdFBhY2thZ2VNYW5hZ2VyID4gb2ZmbGluZSBtb2RlIGFuZCBuZXR3b3JrIHRpbWVvdXRzID4gc2hvdWxkIHJlcG9ydCB1cGRhdGVzIGZvciBpbnN0YWxsZWQgdW5waW5uZWQgbnBtIHBhY2thZ2VzIDFtc1xuICAg4pyTIERlZmF1bHRQYWNrYWdlTWFuYWdlciA+IG9mZmxpbmUgbW9kZSBhbmQgbmV0d29yayB0aW1lb3V0cyA+IHNob3VsZCBza2lwIHBpbm5lZCBwYWNrYWdlcyB3aGVuIGNoZWNraW5nIGZvciB1cGRhdGVzIDFtc1xuICAg4pyTIERlZmF1bHRQYWNrYWdlTWFuYWdlciA+IG9mZmxpbmUgbW9kZSBhbmQgbmV0d29yayB0aW1lb3V0cyA+IHNob3VsZCB1c2UgbnBtIHZpZXcgdG8gZmV0Y2ggbGF0ZXN0IHZlcnNpb24gMG1zXG4gICDinJMgRGVmYXVsdFBhY2thZ2VNYW5hZ2VyID4gb2ZmbGluZSBtb2RlIGFuZCBuZXR3b3JrIHRpbWVvdXRzID4gc2hvdWxkIHVzZSBucG1Db21tYW5kIGFyZ3YgZm9yIG5wbSB1cGRhdGUgY2hlY2tzIDBtc1xuICAg4pyTIERlZmF1bHRQYWNrYWdlTWFuYWdlciA+IG9mZmxpbmUgbW9kZSBhbmQgbmV0d29yayB0aW1lb3V0cyA+IHNob3VsZCB3YWl0IGZvciBjbG9zZSBiZWZvcmUgcmVzb2x2aW5nIGNhcHR1cmVkIHN0ZG91dCAxbXNcblxu4o6v4o6v4o6v4o6v4o6v4o6v4o6vIEZhaWxlZCBUZXN0cyAxIOKOr+KOr+KOr+KOr+KOr+KOr+KOr1xuXG4gRkFJTCAgdGVzdC9wYWNrYWdlLW1hbmFnZXIudGVzdC50cyA+IERlZmF1bHRQYWNrYWdlTWFuYWdlciA+IHJlc29sdmUgPiBzaG91bGQgcmVzb2x2ZSBzeW1saW5rZWQgdXNlciBhbmQgcHJvamVjdCByZXNvdXJjZXMgb25jZVxuQXNzZXJ0aW9uRXJyb3I6IGV4cGVjdGVkIHsgZXh0ZW5zaW9uczogMSwgc2tpbGxzOiAyLCDigKYoMikgfSB0byBkZWVwbHkgZXF1YWwgeyBleHRlbnNpb25zOiAxLCBza2lsbHM6IDEsIOKApigyKSB9XG5cblx1MDAxYlszMm0tIEV4cGVjdGVkXHUwMDFiWzM5bVxuXHUwMDFiWzMxbSsgUmVjZWl2ZWRcdTAwMWJbMzltXG5cblx1MDAxYlsybSAge1x1MDAxYlsyMm1cblx1MDAxYlsybSAgICBcImV4dGVuc2lvbnNcIjogMSxcdTAwMWJbMjJtXG5cdTAwMWJbMm0gICAgXCJwcm9tcHRzXCI6IDEsXHUwMDFiWzIybVxuXHUwMDFiWzMybS0gICBcInNraWxsc1wiOiAxLFx1MDAxYlszOW1cblx1MDAxYlszMW0rICAgXCJza2lsbHNcIjogMixcdTAwMWJbMzltXG5cdTAwMWJbMm0gICAgXCJ0aGVtZXNcIjogMSxcdTAwMWJbMjJtXG5cdTAwMWJbMm0gIH1cdTAwMWJbMjJtXG5cbiDina8gdGVzdC9wYWNrYWdlLW1hbmFnZXIudGVzdC50czoyMDM6N1xuICAgIDIwMXwgICAgIHByb21wdHM6IHJlc3VsdC5wcm9tcHRzLmxlbmd0aCxcbiAgICAyMDJ8ICAgICB0aGVtZXM6IHJlc3VsdC50aGVtZXMubGVuZ3RoLFxuICAgIDIwM3wgICAgfSkudG9FcXVhbCh7XG4gICAgICAgfCAgICAgICBeXG4gICAgMjA0fCAgICAgZXh0ZW5zaW9uczogMSxcbiAgICAyMDV8ICAgICBza2lsbHM6IDEsXG5cbuKOr+KOr+KOr+KOr+KOr+KOr+KOr+KOr+KOr+KOr+KOr+KOr+KOr+KOr+KOr+KOr+KOr+KOr+KOr+KOr+KOr+KOr+KOr+KOr1sxLzFd4o6vXG5cblxuIFRlc3QgRmlsZXMgIDEgZmFpbGVkICgxKVxuICAgICAgVGVzdHMgIDEgZmFpbGVkIHwgOTggcGFzc2VkICg5OSlcbiAgIFN0YXJ0IGF0ICAxNzo1MTowN1xuICAgRHVyYXRpb24gIDEuNDNzICh0cmFuc2Zvcm0gMTAybXMsIHNldHVwIDBtcywgY29sbGVjdCAxMzNtcywgdGVzdHMgMS4xNXMsIGVudmlyb25tZW50IDBtcywgcHJlcGFyZSAzM21zKVxuXG5cblxuQ29tbWFuZCBleGl0ZWQgd2l0aCBjb2RlIDEifV0sImRldGFpbHMiOnt9LCJpc0Vycm9yIjp0cnVlLCJ0aW1lc3RhbXAiOjE3Nzc1NjQyNjk0MzN9fSx7InR5cGUiOiJtZXNzYWdlIiwiaWQiOiIyYTkyM2JhNSIsInBhcmVudElkIjoiNTI0NTY2M2MiLCJ0aW1lc3RhbXAiOiIyMDI2LTA0LTMwVDE1OjUxOjEyLjI5OFoiLCJtZXNzYWdlIjp7InJvbGUiOiJhc3Npc3RhbnQiLCJjb250ZW50IjpbeyJ0eXBlIjoidGhpbmtpbmciLCJ0aGlua2luZyI6IiBUaGVyZSdzIG9uZSBmYWlsaW5nIHRlc3QuIFRoZSB0ZXN0IFwic2hvdWxkIHJlc29sdmUgc3ltbGlua2VkIHVzZXIgYW5kIHByb2plY3QgcmVzb3VyY2VzIG9uY2VcIiBpcyBleHBlY3RpbmcgMSBza2lsbCBidXQgZ2V0dGluZyAyLiBUaGlzIGlzIGJlY2F1c2UgbXkgY2hhbmdlIGJyb2tlIHRoZSBkZWR1cGxpY2F0aW9uIHdoZW4gYH4vLnBpL2FnZW50L3NraWxsc2AgaXMgYSBzeW1saW5rIHRvIGB+Ly5hZ2VudHMvc2tpbGxzYC5cblxuTGV0IG1lIGxvb2sgYXQgdGhlIHRlc3QgdG8gdW5kZXJzdGFuZCB0aGUgZXhwZWN0ZWQgYmVoYXZpb3I6IiwidGhpbmtpbmdTaWduYXR1cmUiOiJyZWFzb25pbmcifSx7InR5cGUiOiJ0b29sQ2FsbCIsImlkIjoiZnVuY3Rpb25zLmdyZXA6MTAiLCJuYW1lIjoiZ3JlcCIsImFyZ3VtZW50cyI6eyJwYXR0ZXJuIjoic2hvdWxkIHJlc29sdmUgc3ltbGlua2VkIHVzZXIgYW5kIHByb2plY3QgcmVzb3VyY2VzIG9uY2UiLCJwYXRoIjoicGFja2FnZXMvY29kaW5nLWFnZW50L3Rlc3QvcGFja2FnZS1tYW5hZ2VyLnRlc3QudHMiLCJjb250ZXh0Ijo0MH19XSwiYXBpIjoib3BlbmFpLWNvbXBsZXRpb25zIiwicHJvdmlkZXIiOiJzeW50aGV0aWMiLCJtb2RlbCI6ImhmOm1vb25zaG90YWkvS2ltaS1LMi41IiwidXNhZ2UiOnsiaW5wdXQiOjMzNzIsIm91dHB1dCI6MTE2LCJjYWNoZVJlYWQiOjQxMjQ4LCJjYWNoZVdyaXRlIjowLCJ0b3RhbFRva2VucyI6NDQ3MzYsImNvc3QiOnsiaW5wdXQiOjAuMDAxNTE3NDAwMDAwMDAwMDAwMSwib3V0cHV0IjowLjAwMDM5NDQsImNhY2hlUmVhZCI6MC4wMTg1NjE2LCJjYWNoZVdyaXRlIjowLCJ0b3RhbCI6MC4wMjA0NzM0MDAwMDAwMDAwMDN9fSwic3RvcFJlYXNvbiI6InRvb2xVc2UiLCJ0aW1lc3RhbXAiOjE3Nzc1NjQyNjk0MzQsInJlc3BvbnNlSWQiOiJjaGF0Y21wbC1iNmZlY2JjYzQ2ZjcwMzk1In19LHsidHlwZSI6Im1lc3NhZ2UiLCJpZCI6ImUzZTQ5NGUzIiwicGFyZW50SWQiOiIyYTkyM2JhNSIsInRpbWVzdGFtcCI6IjIwMjYtMDQtMzBUMTU6NTE6MTIuMzEzWiIsIm1lc3NhZ2UiOnsicm9sZSI6InRvb2xSZXN1bHQiLCJ0b29sQ2FsbElkIjoiZnVuY3Rpb25zLmdyZXA6MTAiLCJ0b29sTmFtZSI6ImdyZXAiLCJjb250ZW50IjpbeyJ0eXBlIjoidGV4dCIsInRleHQiOiJwYWNrYWdlLW1hbmFnZXIudGVzdC50czoxMjE6ICAgaXQoXCJzaG91bGQgYXV0by1kaXNjb3ZlciByb290IG1hcmtkb3duIHNraWxscyBmcm9tIC5waSBza2lsbCBkaXJzXCIsIGFzeW5jICgpID0+IHtcbnBhY2thZ2UtbWFuYWdlci50ZXN0LnRzOjEyMjogICBjb25zdCBza2lsbEZpbGUgPSBqb2luKGFnZW50RGlyLCBcInNraWxsc1wiLCBcInNpbmdsZS1maWxlLm1kXCIpO1xucGFja2FnZS1tYW5hZ2VyLnRlc3QudHM6MTIzOiAgIG1rZGlyU3luYyhqb2luKGFnZW50RGlyLCBcInNraWxsc1wiKSwgeyByZWN1cnNpdmU6IHRydWUgfSk7XG5wYWNrYWdlLW1hbmFnZXIudGVzdC50czoxMjQ6ICAgd3JpdGVGaWxlU3luYyhcbnBhY2thZ2UtbWFuYWdlci50ZXN0LnRzOjEyNTogICBza2lsbEZpbGUsXG5wYWNrYWdlLW1hbmFnZXIudGVzdC50czoxMjY6ICAgYC0tLVxucGFja2FnZS1tYW5hZ2VyLnRlc3QudHM6MTI3OiAgIG5hbWU6IHNpbmdsZS1maWxlXG5wYWNrYWdlLW1hbmFnZXIudGVzdC50czoxMjg6ICAgZGVzY3JpcHRpb246IEEgcm9vdCBtYXJrZG93biBza2lsbFxucGFja2FnZS1tYW5hZ2VyLnRlc3QudHM6MTI5OiAgIC0tLVxucGFja2FnZS1tYW5hZ2VyLnRlc3QudHM6MTMwOiAgIENvbnRlbnRgLFxucGFja2FnZS1tYW5hZ2VyLnRlc3QudHM6MTMxOiAgICk7XG5wYWNrYWdlLW1hbmFnZXIudGVzdC50czoxMzI6ICAgXG5wYWNrYWdlLW1hbmFnZXIudGVzdC50czoxMzM6ICAgY29uc3QgcmVzdWx0ID0gYXdhaXQgcGFja2FnZU1hbmFnZXIucmVzb2x2ZSgpO1xucGFja2FnZS1tYW5hZ2VyLnRlc3QudHM6MTM0OiAgIGV4cGVjdChyZXN1bHQuc2tpbGxzLnNvbWUoKHIpID0+IHIucGF0aCA9PT0gc2tpbGxGaWxlICYmIHIuZW5hYmxlZCkpLnRvQmUodHJ1ZSk7XG5wYWNrYWdlLW1hbmFnZXIudGVzdC50czoxMzU6ICAgfSk7XG5wYWNrYWdlLW1hbmFnZXIudGVzdC50czoxMzY6ICAgXG5wYWNrYWdlLW1hbmFnZXIudGVzdC50czoxMzc6ICAgaXQoXCJzaG91bGQgcmVzb2x2ZSBwcm9qZWN0IHBhdGhzIHJlbGF0aXZlIHRvIC5waVwiLCBhc3luYyAoKSA9PiB7XG5wYWNrYWdlLW1hbmFnZXIudGVzdC50czoxMzg6ICAgY29uc3QgZXh0RGlyID0gam9pbih0ZW1wRGlyLCBcIi5waVwiLCBcImV4dGVuc2lvbnNcIik7XG5wYWNrYWdlLW1hbmFnZXIudGVzdC50czoxMzk6ICAgbWtkaXJTeW5jKGV4dERpciwgeyByZWN1cnNpdmU6IHRydWUgfSk7XG5wYWNrYWdlLW1hbmFnZXIudGVzdC50czoxNDA6ICAgY29uc3QgZXh0UGF0aCA9IGpvaW4oZXh0RGlyLCBcInByb2plY3QtZXh0LnRzXCIpO1xucGFja2FnZS1tYW5hZ2VyLnRlc3QudHM6MTQxOiAgIHdyaXRlRmlsZVN5bmMoZXh0UGF0aCwgXCJleHBvcnQgZGVmYXVsdCBmdW5jdGlvbigpIHt9XCIpO1xucGFja2FnZS1tYW5hZ2VyLnRlc3QudHM6MTQyOiAgIFxucGFja2FnZS1tYW5hZ2VyLnRlc3QudHM6MTQzOiAgIHNldHRpbmdzTWFuYWdlci5zZXRQcm9qZWN0RXh0ZW5zaW9uUGF0aHMoW1wiZXh0ZW5zaW9ucy9wcm9qZWN0LWV4dC50c1wiXSk7XG5wYWNrYWdlLW1hbmFnZXIudGVzdC50czoxNDQ6ICAgXG5wYWNrYWdlLW1hbmFnZXIudGVzdC50czoxNDU6ICAgY29uc3QgcmVzdWx0ID0gYXdhaXQgcGFja2FnZU1hbmFnZXIucmVzb2x2ZSgpO1xucGFja2FnZS1tYW5hZ2VyLnRlc3QudHM6MTQ2OiAgIGV4cGVjdChyZXN1bHQuZXh0ZW5zaW9ucy5zb21lKChyKSA9PiByLnBhdGggPT09IGV4dFBhdGggJiYgci5lbmFibGVkKSkudG9CZSh0cnVlKTtcbnBhY2thZ2UtbWFuYWdlci50ZXN0LnRzOjE0NzogICB9KTtcbnBhY2thZ2UtbWFuYWdlci50ZXN0LnRzOjE0ODogICBcbnBhY2thZ2UtbWFuYWdlci50ZXN0LnRzOjE0OTogICBpdChcInNob3VsZCBhdXRvLWRpc2NvdmVyIHVzZXIgcHJvbXB0cyB3aXRoIG92ZXJyaWRlc1wiLCBhc3luYyAoKSA9PiB7XG5wYWNrYWdlLW1hbmFnZXIudGVzdC50czoxNTA6ICAgY29uc3QgcHJvbXB0c0RpciA9IGpvaW4oYWdlbnREaXIsIFwicHJvbXB0c1wiKTtcbnBhY2thZ2UtbWFuYWdlci50ZXN0LnRzOjE1MTogICBta2RpclN5bmMocHJvbXB0c0RpciwgeyByZWN1cnNpdmU6IHRydWUgfSk7XG5wYWNrYWdlLW1hbmFnZXIudGVzdC50czoxNTI6ICAgY29uc3QgcHJvbXB0UGF0aCA9IGpvaW4ocHJvbXB0c0RpciwgXCJhdXRvLm1kXCIpO1xucGFja2FnZS1tYW5hZ2VyLnRlc3QudHM6MTUzOiAgIHdyaXRlRmlsZVN5bmMocHJvbXB0UGF0aCwgXCJBdXRvIHByb21wdFwiKTtcbnBhY2thZ2UtbWFuYWdlci50ZXN0LnRzOjE1NDogICBcbnBhY2thZ2UtbWFuYWdlci50ZXN0LnRzOjE1NTogICBzZXR0aW5nc01hbmFnZXIuc2V0UHJvbXB0VGVtcGxhdGVQYXRocyhbXCIhcHJvbXB0cy9hdXRvLm1kXCJdKTtcbnBhY2thZ2UtbWFuYWdlci50ZXN0LnRzOjE1NjogICBcbnBhY2thZ2UtbWFuYWdlci50ZXN0LnRzOjE1NzogICBjb25zdCByZXN1bHQgPSBhd2FpdCBwYWNrYWdlTWFuYWdlci5yZXNvbHZlKCk7XG5wYWNrYWdlLW1hbmFnZXIudGVzdC50czoxNTg6ICAgZXhwZWN0KHJlc3VsdC5wcm9tcHRzLnNvbWUoKHIpID0+IHIucGF0aCA9PT0gcHJvbXB0UGF0aCAmJiAhci5lbmFibGVkKSkudG9CZSh0cnVlKTtcbnBhY2thZ2UtbWFuYWdlci50ZXN0LnRzOjE1OTogICB9KTtcbnBhY2thZ2UtbWFuYWdlci50ZXN0LnRzOjE2MDogICBcbnBhY2thZ2UtbWFuYWdlci50ZXN0LnRzOjE2MTogaXQoXCJzaG91bGQgcmVzb2x2ZSBzeW1saW5rZWQgdXNlciBhbmQgcHJvamVjdCByZXNvdXJjZXMgb25jZVwiLCBhc3luYyAoKSA9PiB7XG5wYWNrYWdlLW1hbmFnZXIudGVzdC50czoxNjI6ICAgY29uc3Qgc2hhcmVkRGlyID0gam9pbih0ZW1wRGlyLCBcInNoYXJlZC1yZXNvdXJjZXNcIik7XG5wYWNrYWdlLW1hbmFnZXIudGVzdC50czoxNjM6ICAgY29uc3Qgc2hhcmVkRXh0ZW5zaW9uc0RpciA9IGpvaW4oc2hhcmVkRGlyLCBcImV4dGVuc2lvbnNcIik7XG5wYWNrYWdlLW1hbmFnZXIudGVzdC50czoxNjQ6ICAgY29uc3Qgc2hhcmVkU2tpbGxzRGlyID0gam9pbihzaGFyZWREaXIsIFwic2tpbGxzXCIpO1xucGFja2FnZS1tYW5hZ2VyLnRlc3QudHM6MTY1OiAgIGNvbnN0IHNoYXJlZFByb21wdHNEaXIgPSBqb2luKHNoYXJlZERpciwgXCJwcm9tcHRzXCIpO1xucGFja2FnZS1tYW5hZ2VyLnRlc3QudHM6MTY2OiAgIGNvbnN0IHNoYXJlZFRoZW1lc0RpciA9IGpvaW4oc2hhcmVkRGlyLCBcInRoZW1lc1wiKTtcbnBhY2thZ2UtbWFuYWdlci50ZXN0LnRzOjE2NzogICBta2RpclN5bmMoc2hhcmVkRXh0ZW5zaW9uc0RpciwgeyByZWN1cnNpdmU6IHRydWUgfSk7XG5wYWNrYWdlLW1hbmFnZXIudGVzdC50czoxNjg6ICAgbWtkaXJTeW5jKHNoYXJlZFNraWxsc0RpciwgeyByZWN1cnNpdmU6IHRydWUgfSk7XG5wYWNrYWdlLW1hbmFnZXIudGVzdC50czoxNjk6ICAgbWtkaXJTeW5jKHNoYXJlZFByb21wdHNEaXIsIHsgcmVjdXJzaXZlOiB0cnVlIH0pO1xucGFja2FnZS1tYW5hZ2VyLnRlc3QudHM6MTcwOiAgIG1rZGlyU3luYyhzaGFyZWRUaGVtZXNEaXIsIHsgcmVjdXJzaXZlOiB0cnVlIH0pO1xucGFja2FnZS1tYW5hZ2VyLnRlc3QudHM6MTcxOiAgIFxucGFja2FnZS1tYW5hZ2VyLnRlc3QudHM6MTcyOiAgIHdyaXRlRmlsZVN5bmMoam9pbihzaGFyZWRFeHRlbnNpb25zRGlyLCBcInNoYXJlZC50c1wiKSwgXCJleHBvcnQgZGVmYXVsdCBmdW5jdGlvbigpIHt9XCIpO1xucGFja2FnZS1tYW5hZ2VyLnRlc3QudHM6MTczOiAgIG1rZGlyU3luYyhqb2luKHNoYXJlZFNraWxsc0RpciwgXCJzaGFyZWQtc2tpbGxcIiksIHsgcmVjdXJzaXZlOiB0cnVlIH0pO1xucGFja2FnZS1tYW5hZ2VyLnRlc3QudHM6MTc0OiAgIHdyaXRlRmlsZVN5bmMoXG5wYWNrYWdlLW1hbmFnZXIudGVzdC50czoxNzU6ICAgam9pbihzaGFyZWRTa2lsbHNEaXIsIFwic2hhcmVkLXNraWxsXCIsIFwiU0tJTEwubWRcIiksXG5wYWNrYWdlLW1hbmFnZXIudGVzdC50czoxNzY6ICAgYC0tLVxucGFja2FnZS1tYW5hZ2VyLnRlc3QudHM6MTc3OiAgIG5hbWU6IHNoYXJlZC1za2lsbFxucGFja2FnZS1tYW5hZ2VyLnRlc3QudHM6MTc4OiAgIGRlc2NyaXB0aW9uOiBTaGFyZWQgc2tpbGxcbnBhY2thZ2UtbWFuYWdlci50ZXN0LnRzOjE3OTogICAtLS1cbnBhY2thZ2UtbWFuYWdlci50ZXN0LnRzOjE4MDogICBDb250ZW50YCxcbnBhY2thZ2UtbWFuYWdlci50ZXN0LnRzOjE4MTogICApO1xucGFja2FnZS1tYW5hZ2VyLnRlc3QudHM6MTgyOiAgIHdyaXRlRmlsZVN5bmMoam9pbihzaGFyZWRQcm9tcHRzRGlyLCBcInNoYXJlZC5tZFwiKSwgXCJTaGFyZWQgcHJvbXB0XCIpO1xucGFja2FnZS1tYW5hZ2VyLnRlc3QudHM6MTgzOiAgIHdyaXRlRmlsZVN5bmMoam9pbihzaGFyZWRUaGVtZXNEaXIsIFwic2hhcmVkLmpzb25cIiksIEpTT04uc3RyaW5naWZ5KHsgbmFtZTogXCJzaGFyZWQtdGhlbWVcIiB9KSk7XG5wYWNrYWdlLW1hbmFnZXIudGVzdC50czoxODQ6ICAgXG5wYWNrYWdlLW1hbmFnZXIudGVzdC50czoxODU6ICAgbWtkaXJTeW5jKGpvaW4oYWdlbnREaXIpLCB7IHJlY3Vyc2l2ZTogdHJ1ZSB9KTtcbnBhY2thZ2UtbWFuYWdlci50ZXN0LnRzOjE4NjogICBta2RpclN5bmMoam9pbih0ZW1wRGlyLCBcIi5waVwiKSwgeyByZWN1cnNpdmU6IHRydWUgfSk7XG5wYWNrYWdlLW1hbmFnZXIudGVzdC50czoxODc6ICAgc3ltbGlua1N5bmMoc2hhcmVkRXh0ZW5zaW9uc0Rpciwgam9pbihhZ2VudERpciwgXCJleHRlbnNpb25zXCIpLCBcImRpclwiKTtcbnBhY2thZ2UtbWFuYWdlci50ZXN0LnRzOjE4ODogICBzeW1saW5rU3luYyhzaGFyZWRTa2lsbHNEaXIsIGpvaW4oYWdlbnREaXIsIFwic2tpbGxzXCIpLCBcImRpclwiKTtcbnBhY2thZ2UtbWFuYWdlci50ZXN0LnRzOjE4OTogICBzeW1saW5rU3luYyhzaGFyZWRQcm9tcHRzRGlyLCBqb2luKGFnZW50RGlyLCBcInByb21wdHNcIiksIFwiZGlyXCIpO1xucGFja2FnZS1tYW5hZ2VyLnRlc3QudHM6MTkwOiAgIHN5bWxpbmtTeW5jKHNoYXJlZFRoZW1lc0Rpciwgam9pbihhZ2VudERpciwgXCJ0aGVtZXNcIiksIFwiZGlyXCIpO1xucGFja2FnZS1tYW5hZ2VyLnRlc3QudHM6MTkxOiAgIHN5bWxpbmtTeW5jKHNoYXJlZEV4dGVuc2lvbnNEaXIsIGpvaW4odGVtcERpciwgXCIucGlcIiwgXCJleHRlbnNpb25zXCIpLCBcImRpclwiKTtcbnBhY2thZ2UtbWFuYWdlci50ZXN0LnRzOjE5MjogICBzeW1saW5rU3luYyhzaGFyZWRTa2lsbHNEaXIsIGpvaW4odGVtcERpciwgXCIucGlcIiwgXCJza2lsbHNcIiksIFwiZGlyXCIpO1xucGFja2FnZS1tYW5hZ2VyLnRlc3QudHM6MTkzOiAgIHN5bWxpbmtTeW5jKHNoYXJlZFByb21wdHNEaXIsIGpvaW4odGVtcERpciwgXCIucGlcIiwgXCJwcm9tcHRzXCIpLCBcImRpclwiKTtcbnBhY2thZ2UtbWFuYWdlci50ZXN0LnRzOjE5NDogICBzeW1saW5rU3luYyhzaGFyZWRUaGVtZXNEaXIsIGpvaW4odGVtcERpciwgXCIucGlcIiwgXCJ0aGVtZXNcIiksIFwiZGlyXCIpO1xucGFja2FnZS1tYW5hZ2VyLnRlc3QudHM6MTk1OiAgIFxucGFja2FnZS1tYW5hZ2VyLnRlc3QudHM6MTk2OiAgIGNvbnN0IHJlc3VsdCA9IGF3YWl0IHBhY2thZ2VNYW5hZ2VyLnJlc29sdmUoKTtcbnBhY2thZ2UtbWFuYWdlci50ZXN0LnRzOjE5NzogICBcbnBhY2thZ2UtbWFuYWdlci50ZXN0LnRzOjE5ODogICBleHBlY3Qoe1xucGFja2FnZS1tYW5hZ2VyLnRlc3QudHM6MTk5OiAgIGV4dGVuc2lvbnM6IHJlc3VsdC5leHRlbnNpb25zLmxlbmd0aCxcbnBhY2thZ2UtbWFuYWdlci50ZXN0LnRzOjIwMDogICBza2lsbHM6IHJlc3VsdC5za2lsbHMubGVuZ3RoLFxucGFja2FnZS1tYW5hZ2VyLnRlc3QudHM6MjAxOiAgIHByb21wdHM6IHJlc3VsdC5wcm9tcHRzLmxlbmd0aCwifV0sImRldGFpbHMiOnsibWF0Y2hDb3VudCI6MSwibWF0Y2hlcyI6W3sicGF0aCI6InBhY2thZ2UtbWFuYWdlci50ZXN0LnRzIiwibGluZSI6MTIxLCJ0ZXh0IjoiICBpdChcInNob3VsZCBhdXRvLWRpc2NvdmVyIHJvb3QgbWFya2Rvd24gc2tpbGxzIGZyb20gLnBpIHNraWxsIGRpcnNcIiwgYXN5bmMgKCkgPT4geyJ9LHsicGF0aCI6InBhY2thZ2UtbWFuYWdlci50ZXN0LnRzIiwibGluZSI6MTIyLCJ0ZXh0IjoiICBjb25zdCBza2lsbEZpbGUgPSBqb2luKGFnZW50RGlyLCBcInNraWxsc1wiLCBcInNpbmdsZS1maWxlLm1kXCIpOyJ9LHsicGF0aCI6InBhY2thZ2UtbWFuYWdlci50ZXN0LnRzIiwibGluZSI6MTIzLCJ0ZXh0IjoiICBta2RpclN5bmMoam9pbihhZ2VudERpciwgXCJza2lsbHNcIiksIHsgcmVjdXJzaXZlOiB0cnVlIH0pOyJ9LHsicGF0aCI6InBhY2thZ2UtbWFuYWdlci50ZXN0LnRzIiwibGluZSI6MTI0LCJ0ZXh0IjoiICB3cml0ZUZpbGVTeW5jKCJ9LHsicGF0aCI6InBhY2thZ2UtbWFuYWdlci50ZXN0LnRzIiwibGluZSI6MTI1LCJ0ZXh0IjoiICBza2lsbEZpbGUsIn0seyJwYXRoIjoicGFja2FnZS1tYW5hZ2VyLnRlc3QudHMiLCJsaW5lIjoxMjYsInRleHQiOiIgIGAtLS0ifSx7InBhdGgiOiJwYWNrYWdlLW1hbmFnZXIudGVzdC50cyIsImxpbmUiOjEyNywidGV4dCI6IiAgbmFtZTogc2luZ2xlLWZpbGUifSx7InBhdGgiOiJwYWNrYWdlLW1hbmFnZXIudGVzdC50cyIsImxpbmUiOjEyOCwidGV4dCI6IiAgZGVzY3JpcHRpb246IEEgcm9vdCBtYXJrZG93biBza2lsbCJ9LHsicGF0aCI6InBhY2thZ2UtbWFuYWdlci50ZXN0LnRzIiwibGluZSI6MTI5LCJ0ZXh0IjoiICAtLS0ifSx7InBhdGgiOiJwYWNrYWdlLW1hbmFnZXIudGVzdC50cyIsImxpbmUiOjEzMCwidGV4dCI6IiAgQ29udGVudGAsIn0seyJwYXRoIjoicGFja2FnZS1tYW5hZ2VyLnRlc3QudHMiLCJsaW5lIjoxMzEsInRleHQiOiIgICk7In0seyJwYXRoIjoicGFja2FnZS1tYW5hZ2VyLnRlc3QudHMiLCJsaW5lIjoxMzIsInRleHQiOiIgICJ9LHsicGF0aCI6InBhY2thZ2UtbWFuYWdlci50ZXN0LnRzIiwibGluZSI6MTMzLCJ0ZXh0IjoiICBjb25zdCByZXN1bHQgPSBhd2FpdCBwYWNrYWdlTWFuYWdlci5yZXNvbHZlKCk7In0seyJwYXRoIjoicGFja2FnZS1tYW5hZ2VyLnRlc3QudHMiLCJsaW5lIjoxMzQsInRleHQiOiIgIGV4cGVjdChyZXN1bHQuc2tpbGxzLnNvbWUoKHIpID0+IHIucGF0aCA9PT0gc2tpbGxGaWxlICYmIHIuZW5hYmxlZCkpLnRvQmUodHJ1ZSk7In0seyJwYXRoIjoicGFja2FnZS1tYW5hZ2VyLnRlc3QudHMiLCJsaW5lIjoxMzUsInRleHQiOiIgIH0pOyJ9LHsicGF0aCI6InBhY2thZ2UtbWFuYWdlci50ZXN0LnRzIiwibGluZSI6MTM2LCJ0ZXh0IjoiICAifSx7InBhdGgiOiJwYWNrYWdlLW1hbmFnZXIudGVzdC50cyIsImxpbmUiOjEzNywidGV4dCI6IiAgaXQoXCJzaG91bGQgcmVzb2x2ZSBwcm9qZWN0IHBhdGhzIHJlbGF0aXZlIHRvIC5waVwiLCBhc3luYyAoKSA9PiB7In0seyJwYXRoIjoicGFja2FnZS1tYW5hZ2VyLnRlc3QudHMiLCJsaW5lIjoxMzgsInRleHQiOiIgIGNvbnN0IGV4dERpciA9IGpvaW4odGVtcERpciwgXCIucGlcIiwgXCJleHRlbnNpb25zXCIpOyJ9LHsicGF0aCI6InBhY2thZ2UtbWFuYWdlci50ZXN0LnRzIiwibGluZSI6MTM5LCJ0ZXh0IjoiICBta2RpclN5bmMoZXh0RGlyLCB7IHJlY3Vyc2l2ZTogdHJ1ZSB9KTsifSx7InBhdGgiOiJwYWNrYWdlLW1hbmFnZXIudGVzdC50cyIsImxpbmUiOjE0MCwidGV4dCI6IiAgY29uc3QgZXh0UGF0aCA9IGpvaW4oZXh0RGlyLCBcInByb2plY3QtZXh0LnRzXCIpOyJ9LHsicGF0aCI6InBhY2thZ2UtbWFuYWdlci50ZXN0LnRzIiwibGluZSI6MTQxLCJ0ZXh0IjoiICB3cml0ZUZpbGVTeW5jKGV4dFBhdGgsIFwiZXhwb3J0IGRlZmF1bHQgZnVuY3Rpb24oKSB7fVwiKTsifSx7InBhdGgiOiJwYWNrYWdlLW1hbmFnZXIudGVzdC50cyIsImxpbmUiOjE0MiwidGV4dCI6IiAgIn0seyJwYXRoIjoicGFja2FnZS1tYW5hZ2VyLnRlc3QudHMiLCJsaW5lIjoxNDMsInRleHQiOiIgIHNldHRpbmdzTWFuYWdlci5zZXRQcm9qZWN0RXh0ZW5zaW9uUGF0aHMoW1wiZXh0ZW5zaW9ucy9wcm9qZWN0LWV4dC50c1wiXSk7In0seyJwYXRoIjoicGFja2FnZS1tYW5hZ2VyLnRlc3QudHMiLCJsaW5lIjoxNDQsInRleHQiOiIgICJ9LHsicGF0aCI6InBhY2thZ2UtbWFuYWdlci50ZXN0LnRzIiwibGluZSI6MTQ1LCJ0ZXh0IjoiICBjb25zdCByZXN1bHQgPSBhd2FpdCBwYWNrYWdlTWFuYWdlci5yZXNvbHZlKCk7In0seyJwYXRoIjoicGFja2FnZS1tYW5hZ2VyLnRlc3QudHMiLCJsaW5lIjoxNDYsInRleHQiOiIgIGV4cGVjdChyZXN1bHQuZXh0ZW5zaW9ucy5zb21lKChyKSA9PiByLnBhdGggPT09IGV4dFBhdGggJiYgci5lbmFibGVkKSkudG9CZSh0cnVlKTsifSx7InBhdGgiOiJwYWNrYWdlLW1hbmFnZXIudGVzdC50cyIsImxpbmUiOjE0NywidGV4dCI6IiAgfSk7In0seyJwYXRoIjoicGFja2FnZS1tYW5hZ2VyLnRlc3QudHMiLCJsaW5lIjoxNDgsInRleHQiOiIgICJ9LHsicGF0aCI6InBhY2thZ2UtbWFuYWdlci50ZXN0LnRzIiwibGluZSI6MTQ5LCJ0ZXh0IjoiICBpdChcInNob3VsZCBhdXRvLWRpc2NvdmVyIHVzZXIgcHJvbXB0cyB3aXRoIG92ZXJyaWRlc1wiLCBhc3luYyAoKSA9PiB7In0seyJwYXRoIjoicGFja2FnZS1tYW5hZ2VyLnRlc3QudHMiLCJsaW5lIjoxNTAsInRleHQiOiIgIGNvbnN0IHByb21wdHNEaXIgPSBqb2luKGFnZW50RGlyLCBcInByb21wdHNcIik7In0seyJwYXRoIjoicGFja2FnZS1tYW5hZ2VyLnRlc3QudHMiLCJsaW5lIjoxNTEsInRleHQiOiIgIG1rZGlyU3luYyhwcm9tcHRzRGlyLCB7IHJlY3Vyc2l2ZTogdHJ1ZSB9KTsifSx7InBhdGgiOiJwYWNrYWdlLW1hbmFnZXIudGVzdC50cyIsImxpbmUiOjE1MiwidGV4dCI6IiAgY29uc3QgcHJvbXB0UGF0aCA9IGpvaW4ocHJvbXB0c0RpciwgXCJhdXRvLm1kXCIpOyJ9LHsicGF0aCI6InBhY2thZ2UtbWFuYWdlci50ZXN0LnRzIiwibGluZSI6MTUzLCJ0ZXh0IjoiICB3cml0ZUZpbGVTeW5jKHByb21wdFBhdGgsIFwiQXV0byBwcm9tcHRcIik7In0seyJwYXRoIjoicGFja2FnZS1tYW5hZ2VyLnRlc3QudHMiLCJsaW5lIjoxNTQsInRleHQiOiIgICJ9LHsicGF0aCI6InBhY2thZ2UtbWFuYWdlci50ZXN0LnRzIiwibGluZSI6MTU1LCJ0ZXh0IjoiICBzZXR0aW5nc01hbmFnZXIuc2V0UHJvbXB0VGVtcGxhdGVQYXRocyhbXCIhcHJvbXB0cy9hdXRvLm1kXCJdKTsifSx7InBhdGgiOiJwYWNrYWdlLW1hbmFnZXIudGVzdC50cyIsImxpbmUiOjE1NiwidGV4dCI6IiAgIn0seyJwYXRoIjoicGFja2FnZS1tYW5hZ2VyLnRlc3QudHMiLCJsaW5lIjoxNTcsInRleHQiOiIgIGNvbnN0IHJlc3VsdCA9IGF3YWl0IHBhY2thZ2VNYW5hZ2VyLnJlc29sdmUoKTsifSx7InBhdGgiOiJwYWNrYWdlLW1hbmFnZXIudGVzdC50cyIsImxpbmUiOjE1OCwidGV4dCI6IiAgZXhwZWN0KHJlc3VsdC5wcm9tcHRzLnNvbWUoKHIpID0+IHIucGF0aCA9PT0gcHJvbXB0UGF0aCAmJiAhci5lbmFibGVkKSkudG9CZSh0cnVlKTsifSx7InBhdGgiOiJwYWNrYWdlLW1hbmFnZXIudGVzdC50cyIsImxpbmUiOjE1OSwidGV4dCI6IiAgfSk7In0seyJwYXRoIjoicGFja2FnZS1tYW5hZ2VyLnRlc3QudHMiLCJsaW5lIjoxNjAsInRleHQiOiIgICJ9LHsicGF0aCI6InBhY2thZ2UtbWFuYWdlci50ZXN0LnRzIiwibGluZSI6MTYxLCJ0ZXh0IjoiaXQoXCJzaG91bGQgcmVzb2x2ZSBzeW1saW5rZWQgdXNlciBhbmQgcHJvamVjdCByZXNvdXJjZXMgb25jZVwiLCBhc3luYyAoKSA9PiB7In0seyJwYXRoIjoicGFja2FnZS1tYW5hZ2VyLnRlc3QudHMiLCJsaW5lIjoxNjIsInRleHQiOiIgIGNvbnN0IHNoYXJlZERpciA9IGpvaW4odGVtcERpciwgXCJzaGFyZWQtcmVzb3VyY2VzXCIpOyJ9LHsicGF0aCI6InBhY2thZ2UtbWFuYWdlci50ZXN0LnRzIiwibGluZSI6MTYzLCJ0ZXh0IjoiICBjb25zdCBzaGFyZWRFeHRlbnNpb25zRGlyID0gam9pbihzaGFyZWREaXIsIFwiZXh0ZW5zaW9uc1wiKTsifSx7InBhdGgiOiJwYWNrYWdlLW1hbmFnZXIudGVzdC50cyIsImxpbmUiOjE2NCwidGV4dCI6IiAgY29uc3Qgc2hhcmVkU2tpbGxzRGlyID0gam9pbihzaGFyZWREaXIsIFwic2tpbGxzXCIpOyJ9LHsicGF0aCI6InBhY2thZ2UtbWFuYWdlci50ZXN0LnRzIiwibGluZSI6MTY1LCJ0ZXh0IjoiICBjb25zdCBzaGFyZWRQcm9tcHRzRGlyID0gam9pbihzaGFyZWREaXIsIFwicHJvbXB0c1wiKTsifSx7InBhdGgiOiJwYWNrYWdlLW1hbmFnZXIudGVzdC50cyIsImxpbmUiOjE2NiwidGV4dCI6IiAgY29uc3Qgc2hhcmVkVGhlbWVzRGlyID0gam9pbihzaGFyZWREaXIsIFwidGhlbWVzXCIpOyJ9LHsicGF0aCI6InBhY2thZ2UtbWFuYWdlci50ZXN0LnRzIiwibGluZSI6MTY3LCJ0ZXh0IjoiICBta2RpclN5bmMoc2hhcmVkRXh0ZW5zaW9uc0RpciwgeyByZWN1cnNpdmU6IHRydWUgfSk7In0seyJwYXRoIjoicGFja2FnZS1tYW5hZ2VyLnRlc3QudHMiLCJsaW5lIjoxNjgsInRleHQiOiIgIG1rZGlyU3luYyhzaGFyZWRTa2lsbHNEaXIsIHsgcmVjdXJzaXZlOiB0cnVlIH0pOyJ9LHsicGF0aCI6InBhY2thZ2UtbWFuYWdlci50ZXN0LnRzIiwibGluZSI6MTY5LCJ0ZXh0IjoiICBta2RpclN5bmMoc2hhcmVkUHJvbXB0c0RpciwgeyByZWN1cnNpdmU6IHRydWUgfSk7In0seyJwYXRoIjoicGFja2FnZS1tYW5hZ2VyLnRlc3QudHMiLCJsaW5lIjoxNzAsInRleHQiOiIgIG1rZGlyU3luYyhzaGFyZWRUaGVtZXNEaXIsIHsgcmVjdXJzaXZlOiB0cnVlIH0pOyJ9LHsicGF0aCI6InBhY2thZ2UtbWFuYWdlci50ZXN0LnRzIiwibGluZSI6MTcxLCJ0ZXh0IjoiICAifSx7InBhdGgiOiJwYWNrYWdlLW1hbmFnZXIudGVzdC50cyIsImxpbmUiOjE3MiwidGV4dCI6IiAgd3JpdGVGaWxlU3luYyhqb2luKHNoYXJlZEV4dGVuc2lvbnNEaXIsIFwic2hhcmVkLnRzXCIpLCBcImV4cG9ydCBkZWZhdWx0IGZ1bmN0aW9uKCkge31cIik7In0seyJwYXRoIjoicGFja2FnZS1tYW5hZ2VyLnRlc3QudHMiLCJsaW5lIjoxNzMsInRleHQiOiIgIG1rZGlyU3luYyhqb2luKHNoYXJlZFNraWxsc0RpciwgXCJzaGFyZWQtc2tpbGxcIiksIHsgcmVjdXJzaXZlOiB0cnVlIH0pOyJ9LHsicGF0aCI6InBhY2thZ2UtbWFuYWdlci50ZXN0LnRzIiwibGluZSI6MTc0LCJ0ZXh0IjoiICB3cml0ZUZpbGVTeW5jKCJ9LHsicGF0aCI6InBhY2thZ2UtbWFuYWdlci50ZXN0LnRzIiwibGluZSI6MTc1LCJ0ZXh0IjoiICBqb2luKHNoYXJlZFNraWxsc0RpciwgXCJzaGFyZWQtc2tpbGxcIiwgXCJTS0lMTC5tZFwiKSwifSx7InBhdGgiOiJwYWNrYWdlLW1hbmFnZXIudGVzdC50cyIsImxpbmUiOjE3NiwidGV4dCI6IiAgYC0tLSJ9LHsicGF0aCI6InBhY2thZ2UtbWFuYWdlci50ZXN0LnRzIiwibGluZSI6MTc3LCJ0ZXh0IjoiICBuYW1lOiBzaGFyZWQtc2tpbGwifSx7InBhdGgiOiJwYWNrYWdlLW1hbmFnZXIudGVzdC50cyIsImxpbmUiOjE3OCwidGV4dCI6IiAgZGVzY3JpcHRpb246IFNoYXJlZCBza2lsbCJ9LHsicGF0aCI6InBhY2thZ2UtbWFuYWdlci50ZXN0LnRzIiwibGluZSI6MTc5LCJ0ZXh0IjoiICAtLS0ifSx7InBhdGgiOiJwYWNrYWdlLW1hbmFnZXIudGVzdC50cyIsImxpbmUiOjE4MCwidGV4dCI6IiAgQ29udGVudGAsIn0seyJwYXRoIjoicGFja2FnZS1tYW5hZ2VyLnRlc3QudHMiLCJsaW5lIjoxODEsInRleHQiOiIgICk7In0seyJwYXRoIjoicGFja2FnZS1tYW5hZ2VyLnRlc3QudHMiLCJsaW5lIjoxODIsInRleHQiOiIgIHdyaXRlRmlsZVN5bmMoam9pbihzaGFyZWRQcm9tcHRzRGlyLCBcInNoYXJlZC5tZFwiKSwgXCJTaGFyZWQgcHJvbXB0XCIpOyJ9LHsicGF0aCI6InBhY2thZ2UtbWFuYWdlci50ZXN0LnRzIiwibGluZSI6MTgzLCJ0ZXh0IjoiICB3cml0ZUZpbGVTeW5jKGpvaW4oc2hhcmVkVGhlbWVzRGlyLCBcInNoYXJlZC5qc29uXCIpLCBKU09OLnN0cmluZ2lmeSh7IG5hbWU6IFwic2hhcmVkLXRoZW1lXCIgfSkpOyJ9LHsicGF0aCI6InBhY2thZ2UtbWFuYWdlci50ZXN0LnRzIiwibGluZSI6MTg0LCJ0ZXh0IjoiICAifSx7InBhdGgiOiJwYWNrYWdlLW1hbmFnZXIudGVzdC50cyIsImxpbmUiOjE4NSwidGV4dCI6IiAgbWtkaXJTeW5jKGpvaW4oYWdlbnREaXIpLCB7IHJlY3Vyc2l2ZTogdHJ1ZSB9KTsifSx7InBhdGgiOiJwYWNrYWdlLW1hbmFnZXIudGVzdC50cyIsImxpbmUiOjE4NiwidGV4dCI6IiAgbWtkaXJTeW5jKGpvaW4odGVtcERpciwgXCIucGlcIiksIHsgcmVjdXJzaXZlOiB0cnVlIH0pOyJ9LHsicGF0aCI6InBhY2thZ2UtbWFuYWdlci50ZXN0LnRzIiwibGluZSI6MTg3LCJ0ZXh0IjoiICBzeW1saW5rU3luYyhzaGFyZWRFeHRlbnNpb25zRGlyLCBqb2luKGFnZW50RGlyLCBcImV4dGVuc2lvbnNcIiksIFwiZGlyXCIpOyJ9LHsicGF0aCI6InBhY2thZ2UtbWFuYWdlci50ZXN0LnRzIiwibGluZSI6MTg4LCJ0ZXh0IjoiICBzeW1saW5rU3luYyhzaGFyZWRTa2lsbHNEaXIsIGpvaW4oYWdlbnREaXIsIFwic2tpbGxzXCIpLCBcImRpclwiKTsifSx7InBhdGgiOiJwYWNrYWdlLW1hbmFnZXIudGVzdC50cyIsImxpbmUiOjE4OSwidGV4dCI6IiAgc3ltbGlua1N5bmMoc2hhcmVkUHJvbXB0c0Rpciwgam9pbihhZ2VudERpciwgXCJwcm9tcHRzXCIpLCBcImRpclwiKTsifSx7InBhdGgiOiJwYWNrYWdlLW1hbmFnZXIudGVzdC50cyIsImxpbmUiOjE5MCwidGV4dCI6IiAgc3ltbGlua1N5bmMoc2hhcmVkVGhlbWVzRGlyLCBqb2luKGFnZW50RGlyLCBcInRoZW1lc1wiKSwgXCJkaXJcIik7In0seyJwYXRoIjoicGFja2FnZS1tYW5hZ2VyLnRlc3QudHMiLCJsaW5lIjoxOTEsInRleHQiOiIgIHN5bWxpbmtTeW5jKHNoYXJlZEV4dGVuc2lvbnNEaXIsIGpvaW4odGVtcERpciwgXCIucGlcIiwgXCJleHRlbnNpb25zXCIpLCBcImRpclwiKTsifSx7InBhdGgiOiJwYWNrYWdlLW1hbmFnZXIudGVzdC50cyIsImxpbmUiOjE5MiwidGV4dCI6IiAgc3ltbGlua1N5bmMoc2hhcmVkU2tpbGxzRGlyLCBqb2luKHRlbXBEaXIsIFwiLnBpXCIsIFwic2tpbGxzXCIpLCBcImRpclwiKTsifSx7InBhdGgiOiJwYWNrYWdlLW1hbmFnZXIudGVzdC50cyIsImxpbmUiOjE5MywidGV4dCI6IiAgc3ltbGlua1N5bmMoc2hhcmVkUHJvbXB0c0Rpciwgam9pbih0ZW1wRGlyLCBcIi5waVwiLCBcInByb21wdHNcIiksIFwiZGlyXCIpOyJ9LHsicGF0aCI6InBhY2thZ2UtbWFuYWdlci50ZXN0LnRzIiwibGluZSI6MTk0LCJ0ZXh0IjoiICBzeW1saW5rU3luYyhzaGFyZWRUaGVtZXNEaXIsIGpvaW4odGVtcERpciwgXCIucGlcIiwgXCJ0aGVtZXNcIiksIFwiZGlyXCIpOyJ9LHsicGF0aCI6InBhY2thZ2UtbWFuYWdlci50ZXN0LnRzIiwibGluZSI6MTk1LCJ0ZXh0IjoiICAifSx7InBhdGgiOiJwYWNrYWdlLW1hbmFnZXIudGVzdC50cyIsImxpbmUiOjE5NiwidGV4dCI6IiAgY29uc3QgcmVzdWx0ID0gYXdhaXQgcGFja2FnZU1hbmFnZXIucmVzb2x2ZSgpOyJ9LHsicGF0aCI6InBhY2thZ2UtbWFuYWdlci50ZXN0LnRzIiwibGluZSI6MTk3LCJ0ZXh0IjoiICAifSx7InBhdGgiOiJwYWNrYWdlLW1hbmFnZXIudGVzdC50cyIsImxpbmUiOjE5OCwidGV4dCI6IiAgZXhwZWN0KHsifSx7InBhdGgiOiJwYWNrYWdlLW1hbmFnZXIudGVzdC50cyIsImxpbmUiOjE5OSwidGV4dCI6IiAgZXh0ZW5zaW9uczogcmVzdWx0LmV4dGVuc2lvbnMubGVuZ3RoLCJ9LHsicGF0aCI6InBhY2thZ2UtbWFuYWdlci50ZXN0LnRzIiwibGluZSI6MjAwLCJ0ZXh0IjoiICBza2lsbHM6IHJlc3VsdC5za2lsbHMubGVuZ3RoLCJ9LHsicGF0aCI6InBhY2thZ2UtbWFuYWdlci50ZXN0LnRzIiwibGluZSI6MjAxLCJ0ZXh0IjoiICBwcm9tcHRzOiByZXN1bHQucHJvbXB0cy5sZW5ndGgsIn1dfSwiaXNFcnJvciI6ZmFsc2UsInRpbWVzdGFtcCI6MTc3NzU2NDI3MjMxM319LHsidHlwZSI6Im1lc3NhZ2UiLCJpZCI6ImQ4ZmQ5ZDEyIiwicGFyZW50SWQiOiJlM2U0OTRlMyIsInRpbWVzdGFtcCI6IjIwMjYtMDQtMzBUMTU6NTE6MTguMDQ4WiIsIm1lc3NhZ2UiOnsicm9sZSI6ImFzc2lzdGFudCIsImNvbnRlbnQiOlt7InR5cGUiOiJ0aGlua2luZyIsInRoaW5raW5nIjoiIEkgc2VlLiBUaGUgdGVzdCBpcyBjcmVhdGluZyBzeW1saW5rcyB3aGVyZSB1c2VyIHNraWxscyBkaXIgYW5kIHByb2plY3Qgc2tpbGxzIGRpciBwb2ludCB0byB0aGUgc2FtZSBwaHlzaWNhbCBsb2NhdGlvbi4gVGhlIHRlc3QgZXhwZWN0cyAxIHNraWxsIGJ1dCBnZXRzIDIgYmVjYXVzZSBub3cgdGhleSBoYXZlIGRpZmZlcmVudCBgYmFzZURpcmAgdmFsdWVzICh1c2VyJ3MgYWdlbnREaXIgdnMgcHJvamVjdCdzIC5waSBkaXIpLCBzbyB0aGV5J3JlIG5vdCBkZWR1cGxpY2F0ZWQgYnkgYGNhbm9uaWNhbGl6ZVBhdGhgIGFueW1vcmUuXG5cbkxvb2tpbmcgYXQgdGhlIGB0b1Jlc29sdmVkUGF0aHNgIG1ldGhvZCwgaXQgZGVkdXBsaWNhdGVzIGJ5IGNhbm9uaWNhbCBwYXRoLiBCdXQgd2l0aCBteSBjaGFuZ2UsIHRoZSBzYW1lIHNraWxsIGZpbGUgKHZpYSBzeW1saW5rKSBub3cgYXBwZWFycyB0d2ljZSB3aXRoIGRpZmZlcmVudCBtZXRhZGF0YSAoZGlmZmVyZW50IGJhc2VEaXIpLCBhbmQgc2luY2UgdGhlIGNhbm9uaWNhbCBwYXRoIGlzIHRoZSBzYW1lLCBpdCBzaG91bGQgYmUgZGVkdXBsaWNhdGVkLlxuXG5XYWl0LCBsZXQgbWUgbG9vayBhdCB0aGUgdGVzdCBtb3JlIGNhcmVmdWxseS4gVGhlIHN5bWxpbmtzIHBvaW50IHRvIHRoZSBzYW1lIHNoYXJlZCBkaXJlY3Rvcnk6XG4tIGBhZ2VudERpci9za2lsbHNgIOKGkiBgc2hhcmVkRGlyL3NraWxsc2Bcbi0gYHRlbXBEaXIvLnBpL3NraWxsc2Ag4oaSIGBzaGFyZWREaXIvc2tpbGxzYFxuXG5TbyB0aGUgYWN0dWFsIHNraWxsIGZpbGUgaXMgYXQgYHNoYXJlZERpci9za2lsbHMvc2hhcmVkLXNraWxsL1NLSUxMLm1kYC5cblxuV2hlbiB3ZSByZXNvbHZlOlxuMS4gVXNlciBhdXRvLWRpc2NvdmVyeSBmaW5kczogYHNoYXJlZERpci9za2lsbHMvc2hhcmVkLXNraWxsL1NLSUxMLm1kYCB3aXRoIGBiYXNlRGlyID0gYWdlbnREaXJgXG4yLiBQcm9qZWN0IGF1dG8tZGlzY292ZXJ5IGZpbmRzOiBgc2hhcmVkRGlyL3NraWxscy9zaGFyZWQtc2tpbGwvU0tJTEwubWRgIHdpdGggYGJhc2VEaXIgPSB0ZW1wRGlyLy5waWBcblxuVGhlIGNhbm9uaWNhbCBwYXRoIG9mIGJvdGggaXMgdGhlIHNhbWU6IGBzaGFyZWREaXIvc2tpbGxzL3NoYXJlZC1za2lsbC9TS0lMTC5tZGAuXG5cbkxvb2tpbmcgYXQgYHRvUmVzb2x2ZWRQYXRoc2A6XG5gYGB0c1xuY29uc3QgY2Fub25pY2FsaXplUGF0aCA9IGNhbm9uaWNhbGl6ZVBhdGgoZW50cnkucGF0aCk7XG5pZiAoc2Vlbi5oYXMoY2Fub25pY2FsUGF0aCkpIHJldHVybiBmYWxzZTtcbmBgYFxuXG5UaGlzIHNob3VsZCBkZWR1cGUgYnkgcGF0aC4gQnV0IHRoZSBpc3N1ZSBpcyB0aGF0IG9uZSBlbnRyeSBoYXMgc2NvcGUgXCJ1c2VyXCIgYW5kIHRoZSBvdGhlciBoYXMgc2NvcGUgXCJwcm9qZWN0XCIsIGFuZCBwcm9qZWN0IHNjb3BlIHNob3VsZCB3aW4gKGhpZ2hlciBwcmVjZWRlbmNlID0gbG93ZXIgcmFuaykuXG5cbkxldCBtZSBjaGVjayB0aGUgcHJlY2VkZW5jZSBsb2dpYy4gYHJlc291cmNlUHJlY2VkZW5jZVJhbmtgOlxuLSBwcm9qZWN0ICsgYXV0byA9IDAgKyAxID0gMVxuLSB1c2VyICsgYXV0byA9IDIgKyAxID0gM1xuXG5TbyBwcm9qZWN0IGhhcyBoaWdoZXIgcHJlY2VkZW5jZSAobG93ZXIgcmFuaykuIFRoZSBzb3J0IHB1dHMgbG93ZXIgcmFuayBmaXJzdC4gVGhlbiBgc2VlbmAgZGVkdXBlcyBieSBjYW5vbmljYWwgcGF0aC5cblxuVGhpcyBzaG91bGQgd29yay4uLiBidXQgd2h5IGlzIGl0IHJldHVybmluZyAyIHNraWxscz9cblxuQWN0dWFsbHksIGxldCBtZSBsb29rIGF0IGB0b1Jlc29sdmVkUGF0aHNgIGFnYWluLiBcblxuVGhlIGBtYXBUb1Jlc29sdmVkYCBmdW5jdGlvbiBzb3J0cyBieSBwcmVjZWRlbmNlIHJhbmsgYW5kIHRoZW4gZGVkdXBsaWNhdGVzIGJ5IGNhbm9uaWNhbCBwYXRoLiBQcm9qZWN0IHNraWxscyBzaG91bGQgY29tZSBiZWZvcmUgdXNlciBza2lsbHMgaW4gdGhlIGFycmF5IHNpbmNlIHRoZXkgaGF2ZSBsb3dlciByYW5rIHZhbHVlcy4gV2hlbiBpdGVyYXRpbmcgdGhyb3VnaCwgdGhlIGZpcnN0IG9jY3VycmVuY2UgKHByb2plY3QpIGdldHMgYWRkZWQgdG8gdGhlIGBzZWVuYCBzZXQsIGFuZCBzdWJzZXF1ZW50IGR1cGxpY2F0ZXMgKHVzZXIpIHNob3VsZCBiZSBmaWx0ZXJlZCBvdXQuIEJ1dCBzb21ldGhpbmcncyBub3Qgd29ya2luZyBhcyBleHBlY3RlZCBoZXJlLiIsInRoaW5raW5nU2lnbmF0dXJlIjoicmVhc29uaW5nIn0seyJ0eXBlIjoidG9vbENhbGwiLCJpZCI6ImZ1bmN0aW9ucy5ncmVwOjExIiwibmFtZSI6ImdyZXAiLCJhcmd1bWVudHMiOnsicGF0dGVybiI6ImZ1bmN0aW9uIGNhbm9uaWNhbGl6ZVBhdGgiLCJwYXRoIjoicGFja2FnZXMvY29kaW5nLWFnZW50L3NyYyIsImNvbnRleHQiOjEwfX1dLCJhcGkiOiJvcGVuYWktY29tcGxldGlvbnMiLCJwcm92aWRlciI6InN5bnRoZXRpYyIsIm1vZGVsIjoiaGY6bW9vbnNob3RhaS9LaW1pLUsyLjUiLCJ1c2FnZSI6eyJpbnB1dCI6MTUwNSwib3V0cHV0Ijo1NTksImNhY2hlUmVhZCI6NDQ1NzYsImNhY2hlV3JpdGUiOjAsInRvdGFsVG9rZW5zIjo0NjY0MCwiY29zdCI6eyJpbnB1dCI6MC4wMDA2NzcyNSwib3V0cHV0IjowLjAwMTkwMDYwMDAwMDAwMDAwMDEsImNhY2hlUmVhZCI6MC4wMjAwNTkyMDAwMDAwMDAwMDMsImNhY2hlV3JpdGUiOjAsInRvdGFsIjowLjAyMjYzNzA1MDAwMDAwMDAwMn19LCJzdG9wUmVhc29uIjoidG9vbFVzZSIsInRpbWVzdGFtcCI6MTc3NzU2NDI3MjMxNCwicmVzcG9uc2VJZCI6ImNoYXRjbXBsLWE5ZDczZThhZmU4YTM1NTkifX0seyJ0eXBlIjoibWVzc2FnZSIsImlkIjoiZjU3ZTIzMTkiLCJwYXJlbnRJZCI6ImQ4ZmQ5ZDEyIiwidGltZXN0YW1wIjoiMjAyNi0wNC0zMFQxNTo1MToxOC4wNTdaIiwibWVzc2FnZSI6eyJyb2xlIjoidG9vbFJlc3VsdCIsInRvb2xDYWxsSWQiOiJmdW5jdGlvbnMuZ3JlcDoxMSIsInRvb2xOYW1lIjoiZ3JlcCIsImNvbnRlbnQiOlt7InR5cGUiOiJ0ZXh0IiwidGV4dCI6InV0aWxzL3BhdGhzLnRzOjE6ICAgaW1wb3J0IHsgcmVhbHBhdGhTeW5jIH0gZnJvbSBcIm5vZGU6ZnNcIjtcbnV0aWxzL3BhdGhzLnRzOjI6ICAgXG51dGlscy9wYXRocy50czozOiAgIC8qKlxudXRpbHMvcGF0aHMudHM6NDogICAqIFJlc29sdmUgYSBwYXRoIHRvIGl0cyBjYW5vbmljYWwgKHJlYWwpIGZvcm0sIGZvbGxvd2luZyBzeW1saW5rcy5cbnV0aWxzL3BhdGhzLnRzOjU6ICAgKiBGYWxscyBiYWNrIHRvIHRoZSByYXcgcGF0aCBpZiByZXNvbHV0aW9uIGZhaWxzIChlLmcuIHRoZSB0YXJnZXQgZG9lc1xudXRpbHMvcGF0aHMudHM6NjogICAqIG5vdCBleGlzdCB5ZXQpLCBzbyB0aGF0IGNhbGxlcnMgbmV2ZXIgY3Jhc2ggb24gbWlzc2luZyBmaWxlc3lzdGVtXG51dGlscy9wYXRocy50czo3OiAgICogZW50cmllcy5cbnV0aWxzL3BhdGhzLnRzOjg6ICAgKi9cbnV0aWxzL3BhdGhzLnRzOjk6IGV4cG9ydCBmdW5jdGlvbiBjYW5vbmljYWxpemVQYXRoKHBhdGg6IHN0cmluZyk6IHN0cmluZyB7XG51dGlscy9wYXRocy50czoxMDogICB0cnkge1xudXRpbHMvcGF0aHMudHM6MTE6ICAgcmV0dXJuIHJlYWxwYXRoU3luYyhwYXRoKTtcbnV0aWxzL3BhdGhzLnRzOjEyOiAgIH0gY2F0Y2gge1xudXRpbHMvcGF0aHMudHM6MTM6ICAgcmV0dXJuIHBhdGg7XG51dGlscy9wYXRocy50czoxNDogICB9XG51dGlscy9wYXRocy50czoxNTogICB9XG51dGlscy9wYXRocy50czoxNjogICBcbnV0aWxzL3BhdGhzLnRzOjE3OiAgIC8qKlxudXRpbHMvcGF0aHMudHM6MTg6ICAgKiBSZXR1cm5zIHRydWUgaWYgdGhlIHZhbHVlIGlzIE5PVCBhIHBhY2thZ2Ugc291cmNlIChucG06LCBnaXQ6LCBldGMuKVxudXRpbHMvcGF0aHMudHM6MTk6ICAgKiBvciBhIFVSTCBwcm90b2NvbC4gQmFyZSBuYW1lcyBhbmQgcmVsYXRpdmUgcGF0aHMgd2l0aG91dCAuLyBwcmVmaXhcbm1vZGVzL2ludGVyYWN0aXZlL2NvbXBvbmVudHMvc2Vzc2lvbi1zZWxlY3Rvci50czo0MTogICBcbm1vZGVzL2ludGVyYWN0aXZlL2NvbXBvbmVudHMvc2Vzc2lvbi1zZWxlY3Rvci50czo0MjogICBpZiAoZGlmZk1pbnMgPCAxKSByZXR1cm4gXCJub3dcIjtcbm1vZGVzL2ludGVyYWN0aXZlL2NvbXBvbmVudHMvc2Vzc2lvbi1zZWxlY3Rvci50czo0MzogICBpZiAoZGlmZk1pbnMgPCA2MCkgcmV0dXJuIGAke2RpZmZNaW5zfW1gO1xubW9kZXMvaW50ZXJhY3RpdmUvY29tcG9uZW50cy9zZXNzaW9uLXNlbGVjdG9yLnRzOjQ0OiAgIGlmIChkaWZmSG91cnMgPCAyNCkgcmV0dXJuIGAke2RpZmZIb3Vyc31oYDtcbm1vZGVzL2ludGVyYWN0aXZlL2NvbXBvbmVudHMvc2Vzc2lvbi1zZWxlY3Rvci50czo0NTogICBpZiAoZGlmZkRheXMgPCA3KSByZXR1cm4gYCR7ZGlmZkRheXN9ZGA7XG5tb2Rlcy9pbnRlcmFjdGl2ZS9jb21wb25lbnRzL3Nlc3Npb24tc2VsZWN0b3IudHM6NDY6ICAgaWYgKGRpZmZEYXlzIDwgMzApIHJldHVybiBgJHtNYXRoLmZsb29yKGRpZmZEYXlzIC8gNyl9d2A7XG5tb2Rlcy9pbnRlcmFjdGl2ZS9jb21wb25lbnRzL3Nlc3Npb24tc2VsZWN0b3IudHM6NDc6ICAgaWYgKGRpZmZEYXlzIDwgMzY1KSByZXR1cm4gYCR7TWF0aC5mbG9vcihkaWZmRGF5cyAvIDMwKX1tb2A7XG5tb2Rlcy9pbnRlcmFjdGl2ZS9jb21wb25lbnRzL3Nlc3Npb24tc2VsZWN0b3IudHM6NDg6ICAgcmV0dXJuIGAke01hdGguZmxvb3IoZGlmZkRheXMgLyAzNjUpfXlgO1xubW9kZXMvaW50ZXJhY3RpdmUvY29tcG9uZW50cy9zZXNzaW9uLXNlbGVjdG9yLnRzOjQ5OiAgIH1cbm1vZGVzL2ludGVyYWN0aXZlL2NvbXBvbmVudHMvc2Vzc2lvbi1zZWxlY3Rvci50czo1MDogICBcbm1vZGVzL2ludGVyYWN0aXZlL2NvbXBvbmVudHMvc2Vzc2lvbi1zZWxlY3Rvci50czo1MTogZnVuY3Rpb24gY2Fub25pY2FsaXplUGF0aChwYXRoOiBzdHJpbmcgfCB1bmRlZmluZWQpOiBzdHJpbmcgfCB1bmRlZmluZWQge1xubW9kZXMvaW50ZXJhY3RpdmUvY29tcG9uZW50cy9zZXNzaW9uLXNlbGVjdG9yLnRzOjUyOiAgIGlmICghcGF0aCkgcmV0dXJuIHBhdGg7XG5tb2Rlcy9pbnRlcmFjdGl2ZS9jb21wb25lbnRzL3Nlc3Npb24tc2VsZWN0b3IudHM6NTM6ICAgcmV0dXJuIF9jYW5vbmljYWxpemVQYXRoKHBhdGgpO1xubW9kZXMvaW50ZXJhY3RpdmUvY29tcG9uZW50cy9zZXNzaW9uLXNlbGVjdG9yLnRzOjU0OiAgIH1cbm1vZGVzL2ludGVyYWN0aXZlL2NvbXBvbmVudHMvc2Vzc2lvbi1zZWxlY3Rvci50czo1NTogICBcbm1vZGVzL2ludGVyYWN0aXZlL2NvbXBvbmVudHMvc2Vzc2lvbi1zZWxlY3Rvci50czo1NjogICBjbGFzcyBTZXNzaW9uU2VsZWN0b3JIZWFkZXIgaW1wbGVtZW50cyBDb21wb25lbnQge1xubW9kZXMvaW50ZXJhY3RpdmUvY29tcG9uZW50cy9zZXNzaW9uLXNlbGVjdG9yLnRzOjU3OiAgIHByaXZhdGUgc2NvcGU6IFNlc3Npb25TY29wZTtcbm1vZGVzL2ludGVyYWN0aXZlL2NvbXBvbmVudHMvc2Vzc2lvbi1zZWxlY3Rvci50czo1ODogICBwcml2YXRlIHNvcnRNb2RlOiBTb3J0TW9kZTtcbm1vZGVzL2ludGVyYWN0aXZlL2NvbXBvbmVudHMvc2Vzc2lvbi1zZWxlY3Rvci50czo1OTogICBwcml2YXRlIG5hbWVGaWx0ZXI6IE5hbWVGaWx0ZXI7XG5tb2Rlcy9pbnRlcmFjdGl2ZS9jb21wb25lbnRzL3Nlc3Npb24tc2VsZWN0b3IudHM6NjA6ICAgcHJpdmF0ZSByZXF1ZXN0UmVuZGVyOiAoKSA9PiB2b2lkO1xubW9kZXMvaW50ZXJhY3RpdmUvY29tcG9uZW50cy9zZXNzaW9uLXNlbGVjdG9yLnRzOjYxOiAgIHByaXZhdGUgbG9hZGluZyA9IGZhbHNlOyJ9XSwiZGV0YWlscyI6eyJtYXRjaENvdW50IjoyLCJtYXRjaGVzIjpbeyJwYXRoIjoidXRpbHMvcGF0aHMudHMiLCJsaW5lIjoxLCJ0ZXh0IjoiICBpbXBvcnQgeyByZWFscGF0aFN5bmMgfSBmcm9tIFwibm9kZTpmc1wiOyJ9LHsicGF0aCI6InV0aWxzL3BhdGhzLnRzIiwibGluZSI6MiwidGV4dCI6IiAgIn0seyJwYXRoIjoidXRpbHMvcGF0aHMudHMiLCJsaW5lIjozLCJ0ZXh0IjoiICAvKioifSx7InBhdGgiOiJ1dGlscy9wYXRocy50cyIsImxpbmUiOjQsInRleHQiOiIgICogUmVzb2x2ZSBhIHBhdGggdG8gaXRzIGNhbm9uaWNhbCAocmVhbCkgZm9ybSwgZm9sbG93aW5nIHN5bWxpbmtzLiJ9LHsicGF0aCI6InV0aWxzL3BhdGhzLnRzIiwibGluZSI6NSwidGV4dCI6IiAgKiBGYWxscyBiYWNrIHRvIHRoZSByYXcgcGF0aCBpZiByZXNvbHV0aW9uIGZhaWxzIChlLmcuIHRoZSB0YXJnZXQgZG9lcyJ9LHsicGF0aCI6InV0aWxzL3BhdGhzLnRzIiwibGluZSI6NiwidGV4dCI6IiAgKiBub3QgZXhpc3QgeWV0KSwgc28gdGhhdCBjYWxsZXJzIG5ldmVyIGNyYXNoIG9uIG1pc3NpbmcgZmlsZXN5c3RlbSJ9LHsicGF0aCI6InV0aWxzL3BhdGhzLnRzIiwibGluZSI6NywidGV4dCI6IiAgKiBlbnRyaWVzLiJ9LHsicGF0aCI6InV0aWxzL3BhdGhzLnRzIiwibGluZSI6OCwidGV4dCI6IiAgKi8ifSx7InBhdGgiOiJ1dGlscy9wYXRocy50cyIsImxpbmUiOjksInRleHQiOiJleHBvcnQgZnVuY3Rpb24gY2Fub25pY2FsaXplUGF0aChwYXRoOiBzdHJpbmcpOiBzdHJpbmcgeyJ9LHsicGF0aCI6InV0aWxzL3BhdGhzLnRzIiwibGluZSI6MTAsInRleHQiOiIgIHRyeSB7In0seyJwYXRoIjoidXRpbHMvcGF0aHMudHMiLCJsaW5lIjoxMSwidGV4dCI6IiAgcmV0dXJuIHJlYWxwYXRoU3luYyhwYXRoKTsifSx7InBhdGgiOiJ1dGlscy9wYXRocy50cyIsImxpbmUiOjEyLCJ0ZXh0IjoiICB9IGNhdGNoIHsifSx7InBhdGgiOiJ1dGlscy9wYXRocy50cyIsImxpbmUiOjEzLCJ0ZXh0IjoiICByZXR1cm4gcGF0aDsifSx7InBhdGgiOiJ1dGlscy9wYXRocy50cyIsImxpbmUiOjE0LCJ0ZXh0IjoiICB9In0seyJwYXRoIjoidXRpbHMvcGF0aHMudHMiLCJsaW5lIjoxNSwidGV4dCI6IiAgfSJ9LHsicGF0aCI6InV0aWxzL3BhdGhzLnRzIiwibGluZSI6MTYsInRleHQiOiIgICJ9LHsicGF0aCI6InV0aWxzL3BhdGhzLnRzIiwibGluZSI6MTcsInRleHQiOiIgIC8qKiJ9LHsicGF0aCI6InV0aWxzL3BhdGhzLnRzIiwibGluZSI6MTgsInRleHQiOiIgICogUmV0dXJucyB0cnVlIGlmIHRoZSB2YWx1ZSBpcyBOT1QgYSBwYWNrYWdlIHNvdXJjZSAobnBtOiwgZ2l0OiwgZXRjLikifSx7InBhdGgiOiJ1dGlscy9wYXRocy50cyIsImxpbmUiOjE5LCJ0ZXh0IjoiICAqIG9yIGEgVVJMIHByb3RvY29sLiBCYXJlIG5hbWVzIGFuZCByZWxhdGl2ZSBwYXRocyB3aXRob3V0IC4vIHByZWZpeCJ9LHsicGF0aCI6Im1vZGVzL2ludGVyYWN0aXZlL2NvbXBvbmVudHMvc2Vzc2lvbi1zZWxlY3Rvci50cyIsImxpbmUiOjQxLCJ0ZXh0IjoiICAifSx7InBhdGgiOiJtb2Rlcy9pbnRlcmFjdGl2ZS9jb21wb25lbnRzL3Nlc3Npb24tc2VsZWN0b3IudHMiLCJsaW5lIjo0MiwidGV4dCI6IiAgaWYgKGRpZmZNaW5zIDwgMSkgcmV0dXJuIFwibm93XCI7In0seyJwYXRoIjoibW9kZXMvaW50ZXJhY3RpdmUvY29tcG9uZW50cy9zZXNzaW9uLXNlbGVjdG9yLnRzIiwibGluZSI6NDMsInRleHQiOiIgIGlmIChkaWZmTWlucyA8IDYwKSByZXR1cm4gYCR7ZGlmZk1pbnN9bWA7In0seyJwYXRoIjoibW9kZXMvaW50ZXJhY3RpdmUvY29tcG9uZW50cy9zZXNzaW9uLXNlbGVjdG9yLnRzIiwibGluZSI6NDQsInRleHQiOiIgIGlmIChkaWZmSG91cnMgPCAyNCkgcmV0dXJuIGAke2RpZmZIb3Vyc31oYDsifSx7InBhdGgiOiJtb2Rlcy9pbnRlcmFjdGl2ZS9jb21wb25lbnRzL3Nlc3Npb24tc2VsZWN0b3IudHMiLCJsaW5lIjo0NSwidGV4dCI6IiAgaWYgKGRpZmZEYXlzIDwgNykgcmV0dXJuIGAke2RpZmZEYXlzfWRgOyJ9LHsicGF0aCI6Im1vZGVzL2ludGVyYWN0aXZlL2NvbXBvbmVudHMvc2Vzc2lvbi1zZWxlY3Rvci50cyIsImxpbmUiOjQ2LCJ0ZXh0IjoiICBpZiAoZGlmZkRheXMgPCAzMCkgcmV0dXJuIGAke01hdGguZmxvb3IoZGlmZkRheXMgLyA3KX13YDsifSx7InBhdGgiOiJtb2Rlcy9pbnRlcmFjdGl2ZS9jb21wb25lbnRzL3Nlc3Npb24tc2VsZWN0b3IudHMiLCJsaW5lIjo0NywidGV4dCI6IiAgaWYgKGRpZmZEYXlzIDwgMzY1KSByZXR1cm4gYCR7TWF0aC5mbG9vcihkaWZmRGF5cyAvIDMwKX1tb2A7In0seyJwYXRoIjoibW9kZXMvaW50ZXJhY3RpdmUvY29tcG9uZW50cy9zZXNzaW9uLXNlbGVjdG9yLnRzIiwibGluZSI6NDgsInRleHQiOiIgIHJldHVybiBgJHtNYXRoLmZsb29yKGRpZmZEYXlzIC8gMzY1KX15YDsifSx7InBhdGgiOiJtb2Rlcy9pbnRlcmFjdGl2ZS9jb21wb25lbnRzL3Nlc3Npb24tc2VsZWN0b3IudHMiLCJsaW5lIjo0OSwidGV4dCI6IiAgfSJ9LHsicGF0aCI6Im1vZGVzL2ludGVyYWN0aXZlL2NvbXBvbmVudHMvc2Vzc2lvbi1zZWxlY3Rvci50cyIsImxpbmUiOjUwLCJ0ZXh0IjoiICAifSx7InBhdGgiOiJtb2Rlcy9pbnRlcmFjdGl2ZS9jb21wb25lbnRzL3Nlc3Npb24tc2VsZWN0b3IudHMiLCJsaW5lIjo1MSwidGV4dCI6ImZ1bmN0aW9uIGNhbm9uaWNhbGl6ZVBhdGgocGF0aDogc3RyaW5nIHwgdW5kZWZpbmVkKTogc3RyaW5nIHwgdW5kZWZpbmVkIHsifSx7InBhdGgiOiJtb2Rlcy9pbnRlcmFjdGl2ZS9jb21wb25lbnRzL3Nlc3Npb24tc2VsZWN0b3IudHMiLCJsaW5lIjo1MiwidGV4dCI6IiAgaWYgKCFwYXRoKSByZXR1cm4gcGF0aDsifSx7InBhdGgiOiJtb2Rlcy9pbnRlcmFjdGl2ZS9jb21wb25lbnRzL3Nlc3Npb24tc2VsZWN0b3IudHMiLCJsaW5lIjo1MywidGV4dCI6IiAgcmV0dXJuIF9jYW5vbmljYWxpemVQYXRoKHBhdGgpOyJ9LHsicGF0aCI6Im1vZGVzL2ludGVyYWN0aXZlL2NvbXBvbmVudHMvc2Vzc2lvbi1zZWxlY3Rvci50cyIsImxpbmUiOjU0LCJ0ZXh0IjoiICB9In0seyJwYXRoIjoibW9kZXMvaW50ZXJhY3RpdmUvY29tcG9uZW50cy9zZXNzaW9uLXNlbGVjdG9yLnRzIiwibGluZSI6NTUsInRleHQiOiIgICJ9LHsicGF0aCI6Im1vZGVzL2ludGVyYWN0aXZlL2NvbXBvbmVudHMvc2Vzc2lvbi1zZWxlY3Rvci50cyIsImxpbmUiOjU2LCJ0ZXh0IjoiICBjbGFzcyBTZXNzaW9uU2VsZWN0b3JIZWFkZXIgaW1wbGVtZW50cyBDb21wb25lbnQgeyJ9LHsicGF0aCI6Im1vZGVzL2ludGVyYWN0aXZlL2NvbXBvbmVudHMvc2Vzc2lvbi1zZWxlY3Rvci50cyIsImxpbmUiOjU3LCJ0ZXh0IjoiICBwcml2YXRlIHNjb3BlOiBTZXNzaW9uU2NvcGU7In0seyJwYXRoIjoibW9kZXMvaW50ZXJhY3RpdmUvY29tcG9uZW50cy9zZXNzaW9uLXNlbGVjdG9yLnRzIiwibGluZSI6NTgsInRleHQiOiIgIHByaXZhdGUgc29ydE1vZGU6IFNvcnRNb2RlOyJ9LHsicGF0aCI6Im1vZGVzL2ludGVyYWN0aXZlL2NvbXBvbmVudHMvc2Vzc2lvbi1zZWxlY3Rvci50cyIsImxpbmUiOjU5LCJ0ZXh0IjoiICBwcml2YXRlIG5hbWVGaWx0ZXI6IE5hbWVGaWx0ZXI7In0seyJwYXRoIjoibW9kZXMvaW50ZXJhY3RpdmUvY29tcG9uZW50cy9zZXNzaW9uLXNlbGVjdG9yLnRzIiwibGluZSI6NjAsInRleHQiOiIgIHByaXZhdGUgcmVxdWVzdFJlbmRlcjogKCkgPT4gdm9pZDsifSx7InBhdGgiOiJtb2Rlcy9pbnRlcmFjdGl2ZS9jb21wb25lbnRzL3Nlc3Npb24tc2VsZWN0b3IudHMiLCJsaW5lIjo2MSwidGV4dCI6IiAgcHJpdmF0ZSBsb2FkaW5nID0gZmFsc2U7In1dLCJyZWxhdGl2ZVRvIjoicGFja2FnZXMvY29kaW5nLWFnZW50L3NyYyJ9LCJpc0Vycm9yIjpmYWxzZSwidGltZXN0YW1wIjoxNzc3NTY0Mjc4MDU3fX0seyJ0eXBlIjoibWVzc2FnZSIsImlkIjoiMzZlMTVjZWMiLCJwYXJlbnRJZCI6ImY1N2UyMzE5IiwidGltZXN0YW1wIjoiMjAyNi0wNC0zMFQxNTo1MToyOC43NTZaIiwibWVzc2FnZSI6eyJyb2xlIjoiYXNzaXN0YW50IiwiY29udGVudCI6W3sidHlwZSI6InRoaW5raW5nIiwidGhpbmtpbmciOiIgVGhlIHRlc3QgZXhwZWN0cyAxIHNraWxsIGJ1dCB3ZSdyZSByZXR1cm5pbmcgMiBiZWNhdXNlIGB0b1Jlc29sdmVkUGF0aHNgIHVzZXMgYGNhbm9uaWNhbGl6ZVBhdGhgIHRvIGRlZHVwZS4gQnV0IHRoZSB1c2VyIGFuZCBwcm9qZWN0IHNraWxsIGVudHJpZXMgbm93IGhhdmUgZGlmZmVyZW50IG1ldGFkYXRhIChkaWZmZXJlbnQgYmFzZURpciksIHNvIHRoZSBjYW5vbmljYWxpemF0aW9uIGlzbid0IGRlZHVwaW5nIHRoZW0gcHJvcGVybHkuXG5cbkxvb2tpbmcgYXQgdGhlIGNvZGU6XG5cbmBgYHRzXG5wcml2YXRlIHRvUmVzb2x2ZWRQYXRocyhhY2N1bXVsYXRvcjogUmVzb3VyY2VBY2N1bXVsYXRvcik6IFJlc29sdmVkUGF0aHMge1xuXHRjb25zdCBtYXBUb1Jlc29sdmVkID0gKFxuXHRcdGVudHJpZXM6IE1hcDxzdHJpbmcsIHsgbWV0YWRhdGE6IFBhdGhNZXRhZGF0YTsgZW5hYmxlZDogYm9vbGVhbiB9Pixcblx0KTogUmVzb2x2ZWRSZXNvdXJjZVtdID0+IHtcblx0XHRjb25zdCByZXNvbHZlZCA9IEFycmF5LmZyb20oZW50cmllcy5lbnRyaWVzKCkpLm1hcCgoW3BhdGgsIHsgbWV0YWRhdGEsIGVuYWJsZWQgfV0pID0+ICh7XG5cdFx0XHRwYXRoLFxuXHRcdFx0bWV0YWRhdGEsXG5cdFx0XHRlbmFibGVkLFxuXHRcdH0pKTtcblx0XHRyZXNvbHZlZC5zb3J0KChhLCBiKSA9PiByZXNvdXJjZVByZWNlZGVuY2VSYW5rKGEubWV0YWRhdGEpIC0gcmVzb3VyY2VQcmVjZWRlbmNlUmFuayhiLm1ldGFkYXRhKSk7XG5cblx0XHRjb25zdCBzZWVuID0gbmV3IFNldDxzdHJpbmc+KCk7XG5cdFx0cmV0dXJuIHJlc29sdmVkLmZpbHRlcigoZW50cnkpID0+IHtcblx0XHRcdGNvbnN0IGNhbm9uaWNhbFBhdGggPSBjYW5vbmljYWxpemVQYXRoKGVudHJ5LnBhdGgpO1xuXHRcdFx0aWYgKHNlZW4uaGFzKGNhbm9uaWNhbFBhdGgpKSByZXR1cm4gZmFsc2U7XG5cdFx0XHRzZWVuLmFkZChjYW5vbmljYWxQYXRoKTtcblx0XHRcdHJldHVybiB0cnVlO1xuXHRcdH0pO1xuXHR9O1xuYGBgXG5cblRoZSBkZWR1cGxpY2F0aW9uIGlzIGJhc2VkIG9uIGNhbm9uaWNhbCBwYXRocyAod2hpY2ggZm9sbG93IHN5bWxpbmtzKSwgc28gdHdvIHN5bWxpbmtlZCBwYXRocyBwb2ludGluZyB0byB0aGUgc2FtZSByZWFsIGZpbGUgc2hvdWxkIGJlIGRlZHVwbGljYXRlZC5cblxuV2FpdCwgbG9va2luZyBhdCB0aGUgdGVzdCBtb3JlIGNhcmVmdWxseSAtIGl0IGNyZWF0ZXMgYSBzaGFyZWQgZGlyZWN0b3J5IGFuZCBzeW1saW5rcyBpdCB0byBib3RoIGFnZW50RGlyIGFuZCB0ZW1wRGlyLy5waTpcblxuYGBgXG5zeW1saW5rU3luYyhzaGFyZWRTa2lsbHNEaXIsIGpvaW4oYWdlbnREaXIsIFwic2tpbGxzXCIpLCBcImRpclwiKTtcbnN5bWxpbmtTeW5jKHNoYXJlZFNraWxsc0Rpciwgam9pbih0ZW1wRGlyLCBcIi5waVwiLCBcInNraWxsc1wiKSwgXCJkaXJcIik7XG5gYGBcblxuU28gYm90aCBzeW1saW5rcyBwb2ludCB0byB0aGUgc2FtZSB1bmRlcmx5aW5nIGRpcmVjdG9yeS4gV2hlbiB3ZSBjb2xsZWN0IHNraWxsczpcbjEuIEZyb20gdXNlciBkaXI6IHdlIGdldCBwYXRocyBsaWtlIGAvcmVhbC9zaGFyZWQtcmVzb3VyY2VzL3NraWxscy9zaGFyZWQtc2tpbGwvU0tJTEwubWRgXG4yLiBGcm9tIHByb2plY3QgZGlyOiB3ZSBnZXQgcGF0aHMgbGlrZSBgL3JlYWwvc2hhcmVkLXJlc291cmNlcy9za2lsbHMvc2hhcmVkLXNraWxsL1NLSUxMLm1kYCAoc2FtZSByZWFsIHBhdGggYWZ0ZXIgZm9sbG93aW5nIHN5bWxpbmtzKVxuXG5TaW5jZSBib3RoIGhhdmUgdGhlIHNhbWUgcmVhbCBwYXRoLCBgY2Fub25pY2FsaXplUGF0aGAgc2hvdWxkIHJldHVybiB0aGUgc2FtZSB2YWx1ZSBhbmQgZGVkdXBlIHRoZW0uXG5cbkJ1dCB3YWl0LCB0aGUgdGVzdCBpcyBmYWlsaW5nIG5vdyAtIHdlIGdldCAyIHNraWxscyBpbnN0ZWFkIG9mIDEuIExldCBtZSBjaGVjayB3aGF0IGBjYW5vbmljYWxpemVQYXRoYCBkb2VzLiBJdCBjYWxscyBgcmVhbHBhdGhTeW5jYCB3aGljaCBmb2xsb3dzIHN5bWxpbmtzLlxuXG5BY3R1YWxseSwgbG9va2luZyBhdCB0aGUgdGVzdCBvdXRwdXQgbW9yZSBjYXJlZnVsbHk6XG5cbmBgYFxuRXhwZWN0ZWQ6IHNraWxsczogMVxuUmVjZWl2ZWQ6IHNraWxsczogMlxuYGBgXG5cblNvIHRoZSBkZWR1cGxpY2F0aW9uIGlzIG5vdCB3b3JraW5nLiBCdXQgd2h5P1xuXG5PaCEgSSB0aGluayBJIHVuZGVyc3RhbmQuIFdoZW4gd2UgY29sbGVjdCBza2lsbHMgdXNpbmcgYGNvbGxlY3RBdXRvU2tpbGxFbnRyaWVzYCwgd2UgZ2V0IHBhdGhzLiBCdXQgYGNvbGxlY3RBdXRvU2tpbGxFbnRyaWVzYCB1c2VzIGBjb2xsZWN0U2tpbGxFbnRyaWVzYCB3aGljaCB1c2VzIGByZWFkZGlyU3luY2AgYW5kIGBzdGF0U3luY2Agb24gc3ltbGlua3MuXG5cbkxvb2tpbmcgYXQgYGNvbGxlY3RTa2lsbEVudHJpZXNgOlxuXG5gYGB0c1xuZnVuY3Rpb24gY29sbGVjdFNraWxsRW50cmllcyhcblx0ZGlyOiBzdHJpbmcsXG5cdG1vZGU6IFNraWxsRGlzY292ZXJ5TW9kZSxcblx0aWdub3JlTWF0Y2hlcj86IElnbm9yZU1hdGNoZXIsXG5cdHJvb3REaXI/OiBzdHJpbmcsXG4pOiBzdHJpbmdbXSB7XG5gYGBcblxuSXQgd2Fsa3MgdGhlIGRpcmVjdG9yeSBhbmQgcmV0dXJucyBmdWxsIHBhdGhzLiBJZiBgZGlyYCBpcyBhIHN5bWxpbmsgdG8gYSByZWFsIGRpcmVjdG9yeSwgdGhlIHBhdGhzIHJldHVybmVkIHNob3VsZCBiZSB3aXRoaW4gYGRpcmAgKHRoZSBzeW1saW5rKSwgbm90IHRoZSByZWFsIHBhdGguLi4gYnV0IGFjdHVhbGx5LCB3aGVuIHlvdSByZWFkIGEgc3ltbGlua2VkIGRpcmVjdG9yeSwgdGhlIHBhdGhzIHJldHVybmVkIGFyZSByZWxhdGl2ZSB0byB0aGUgc3ltbGluay5cblxuTGV0IG1lIHRoaW5rIGFib3V0IHRoaXMgbW9yZSBjYXJlZnVsbHk6XG5cbjEuIGBzaGFyZWRTa2lsbHNEaXJgID0gYC90bXAvc2hhcmVkLXJlc291cmNlcy9za2lsbHNgXG4yLiBgYWdlbnREaXIvc2tpbGxzYCBpcyBhIHN5bWxpbmsgdG8gYHNoYXJlZFNraWxsc0RpcmBcbjMuIFdoZW4gd2UgcmVhZCBgYWdlbnREaXIvc2tpbGxzYCwgTm9kZS5qcyByZXR1cm5zIGVudHJpZXMgYXMgaWYgd2UncmUgcmVhZGluZyBhIGRpcmVjdG9yeSBhdCBgYWdlbnREaXIvc2tpbGxzYC4gVGhlIHBhdGhzIGNvbnN0cnVjdGVkIHdpbGwgYmUgYGpvaW4oYWdlbnREaXIvc2tpbGxzLCBlbnRyeS5uYW1lKWAuXG5cblNvIHBhdGhzIGZyb20gdXNlciBza2lsbHMgY29sbGVjdGlvbjogYC90bXAvYWdlbnREaXIvc2tpbGxzL3NoYXJlZC1za2lsbC9TS0lMTC5tZGBcblBhdGhzIGZyb20gcHJvamVjdCBza2lsbHMgY29sbGVjdGlvbjogYC90bXAvdGVtcERpci8ucGkvc2tpbGxzL3NoYXJlZC1za2lsbC9TS0lMTC5tZGBcblxuVGhlc2UgYXJlIGRpZmZlcmVudCBwYXRocyEgRXZlbiB0aG91Z2ggdGhleSBwb2ludCB0byB0aGUgc2FtZSByZWFsIGZpbGUgdGhyb3VnaCBzeW1saW5rcywgdGhlIHN0cmluZyBwYXRocyBhcmUgZGlmZmVyZW50LlxuXG5UaGVuIHdoZW4gd2UgY2Fub25pY2FsaXplIHRoZW06XG4tIGNhbm9uaWNhbGl6ZShgL3RtcC9hZ2VudERpci9za2lsbHMvc2hhcmVkLXNraWxsL1NLSUxMLm1kYCkg4oaSIGAvdG1wL3NoYXJlZC1yZXNvdXJjZXMvc2tpbGxzL3NoYXJlZC1za2lsbC9TS0lMTC5tZGBcbi0gY2Fub25pY2FsaXplKGAvdG1wL3RlbXBEaXIvLnBpL3NraWxscy9zaGFyZWQtc2tpbGwvU0tJTEwubWRgKSDihpIgYC90bXAvc2hhcmVkLXJlc291cmNlcy9za2lsbHMvc2hhcmVkLXNraWxsL1NLSUxMLm1kYFxuXG5UaGVzZSBzaG91bGQgYmUgdGhlIHNhbWUhIFNvIHdoeSBpc24ndCBkZWR1cGxpY2F0aW9uIHdvcmtpbmc/XG5cbldhaXQsIGxldCBtZSByZS1yZWFkIHRoZSBgdG9SZXNvbHZlZFBhdGhzYCBmdW5jdGlvbjpcblxuYGBgdHNcbmNvbnN0IHNlZW4gPSBuZXcgU2V0PHN0cmluZz4oKTtcbnJldHVybiByZXNvbHZlZC5maWx0ZXIoKGVudHJ5KSA9PiB7XG5cdGNvbnN0IGNhbm9uaWNhbFBhdGggPSBjYW5vbmljYWxpemVQYXRoKGVudHJ5LnBhdGgpO1xuXHRpZiAoc2Vlbi5oYXMoY2Fub25pY2FsUGF0aCkpIHJldHVybiBmYWxzZTtcblx0c2Vlbi5hZGQoY2Fub25pY2FsUGF0aCk7XG5cdHJldHVybiB0cnVlO1xufSk7XG5gYGBcblxuSXQgc2hvdWxkIHdvcmsuIFVubGVzcyB0aGVyZSdzIHNvbWV0aGluZyB3cm9uZyB3aXRoIHRoZSBjYW5vbmljYWxpemF0aW9uIG9yIHRoZSBwYXRocyBhcmUgc29tZWhvdyBkaWZmZXJlbnQuXG5cbkFjdHVhbGx5LCBsZXQgbWUgY2hlY2sgaWYgdGhlIGlzc3VlIGlzIHRoYXQgd2UncmUgdXNpbmcgdGhlIHBhdGggYXMgdGhlIE1hcCBrZXkgaW4gdGhlIGFjY3VtdWxhdG9yLiBMb29raW5nIGF0IGhvdyByZXNvdXJjZXMgYXJlIGFkZGVkOlxuXG5gYGB0c1xucHJpdmF0ZSBhZGRSZXNvdXJjZShcblx0bWFwOiBNYXA8c3RyaW5nLCB7IG1ldGFkYXRhOiBQYXRoTWV0YWRhdGE7IGVuYWJsZWQ6IGJvb2xlYW4gfT4sXG5cdHBhdGg6IHN0cmluZyxcblx0bWV0YWRhdGE6IFBhdGhNZXRhZGF0YSxcblx0ZW5hYmxlZDogYm9vbGVhbixcbik6IHZvaWQge1xuXHRpZiAoIXBhdGgpIHJldHVybjtcblx0aWYgKCFtYXAuaGFzKHBhdGgpKSB7XG5cdFx0bWFwLnNldChwYXRoLCB7IG1ldGFkYXRhLCBlbmFibGVkIH0pO1xuXHR9XG59XG5gYGBcblxuVGhlIE1hcCB1c2VzIHRoZSByYXcgcGF0aCBhcyB0aGUga2V5LCBub3QgdGhlIGNhbm9uaWNhbCBwYXRoLiBTbyBpZiB3ZSBoYXZlIHR3byBkaWZmZXJlbnQgc3ltbGlua2VkIHBhdGhzIHBvaW50aW5nIHRvIHRoZSBzYW1lIHJlYWwgZmlsZSwgdGhleSB3b3VsZCBiZSBzdG9yZWQgYXMgc2VwYXJhdGUgZW50cmllcyBpbiB0aGUgTWFwLlxuXG5CdXQgdGhlbiBpbiBgdG9SZXNvbHZlZFBhdGhzYCwgd2UgZmlsdGVyIGJ5IGNhbm9uaWNhbCBwYXRoIHRvIGRlZHVwZS4gU28gdGhpcyBzaG91bGQgc3RpbGwgcmVzdWx0IGluIDEgZW50cnkuXG5cblVubGVzcy4uLiB0aGUgY2Fub25pY2FsIHBhdGhzIGFyZSBhY3R1YWxseSBkaWZmZXJlbnQgZm9yIHNvbWUgcmVhc29uLiBMZXQgbWUgbG9vayBhdCB0aGUgdGVzdCBzZXR1cCBhZ2FpbjpcblxuYGBgdHNcbmNvbnN0IHNoYXJlZERpciA9IGpvaW4odGVtcERpciwgXCJzaGFyZWQtcmVzb3VyY2VzXCIpO1xuLi4uXG5zeW1saW5rU3luYyhzaGFyZWRTa2lsbHNEaXIsIGpvaW4oYWdlbnREaXIsIFwic2tpbGxzXCIpLCBcImRpclwiKTtcbnN5bWxpbmtTeW5jKHNoYXJlZFNraWxsc0Rpciwgam9pbih0ZW1wRGlyLCBcIi5waVwiLCBcInNraWxsc1wiKSwgXCJkaXJcIik7XG5gYGBcblxuV2FpdCwgdGhlcmUncyBhIHBvdGVudGlhbCBpc3N1ZSBoZXJlLiBPbiBtYWNPUyAod2hpY2ggdGhlIHVzZXIgaXMgcnVubmluZyBvbiksIGByZWFscGF0aFN5bmNgIG1pZ2h0IGJlaGF2ZSBkaWZmZXJlbnRseSBkdWUgdG8gdGhlIHdheSBzeW1saW5rcyBhcmUgcmVzb2x2ZWQuIE9yIHRoZXJlIG1pZ2h0IGJlIGEgdGltaW5nIGlzc3VlLlxuXG5BY3R1YWxseSwgSSB0aGluayBJIG5lZWQgdG8gbG9vayBhdCB0aGUgYWN0dWFsIGZhaWx1cmUgbW9yZSBjYXJlZnVsbHkuIFRoZSB0ZXN0IGlzIGV4cGVjdGluZyAxIHNraWxsLCBidXQgd2UncmUgcmV0dXJuaW5nIDIuIFRoZSBza2lsbHMgYXJlIGRlZHVwbGljYXRlZCBpbiBgdG9SZXNvbHZlZFBhdGhzYCBiYXNlZCBvbiBjYW5vbmljYWwgcGF0aC5cblxuTGV0IG1lIGNoZWNrIGlmIHRoZXJlJ3Mgc29tZXRoaW5nIHRoYXQgY2hhbmdlZCBpbiB0aGUgb3JkZXIgb2YgcHJvY2Vzc2luZy4gUHJldmlvdXNseSwgYm90aCB1c2VyIGFuZCBwcm9qZWN0IHNraWxscyB3ZXJlIGFkZGVkIHdpdGggdGhlIHNhbWUgbWV0YWRhdGEgc3RydWN0dXJlIChzYW1lIGJhc2VEaXIpLiBOb3csIEknbSBzZXBhcmF0aW5nIHRoZW0uXG5cbldhaXQsIEkgdGhpbmsgSSBzZWUgdGhlIGlzc3VlIG5vdy4gTG9va2luZyBhdCB0aGUgdGVzdDpcblxuYGBgdHNcbnN5bWxpbmtTeW5jKHNoYXJlZFNraWxsc0Rpciwgam9pbihhZ2VudERpciwgXCJza2lsbHNcIiksIFwiZGlyXCIpO1xuc3ltbGlua1N5bmMoc2hhcmVkU2tpbGxzRGlyLCBqb2luKHRlbXBEaXIsIFwiLnBpXCIsIFwic2tpbGxzXCIpLCBcImRpclwiKTtcbmBgYFxuXG5UaGlzIGNyZWF0ZXMgc3ltbGlua3M6XG4tIGBhZ2VudERpci9za2lsbHNgIOKGkiBgc2hhcmVkU2tpbGxzRGlyYFxuLSBgdGVtcERpci8ucGkvc2tpbGxzYCDihpIgYHNoYXJlZFNraWxsc0RpcmBcblxuQm90aCBzeW1saW5rcyBwb2ludCB0byB0aGUgc2FtZSBkaXJlY3RvcnkuIFdoZW4gd2Ugd2FsayB0aGVzZSBkaXJlY3Rvcmllczpcbi0gVXNlciBza2lsbHM6IGNvbGxlY3RlZCBmcm9tIGBhZ2VudERpci9za2lsbHNgIHdoaWNoIGlzIGEgc3ltbGluayB0byBgc2hhcmVkU2tpbGxzRGlyYFxuLSBQcm9qZWN0IHNraWxsczogY29sbGVjdGVkIGZyb20gYHRlbXBEaXIvLnBpL3NraWxsc2Agd2hpY2ggaXMgYSBzeW1saW5rIHRvIGBzaGFyZWRTa2lsbHNEaXJgXG5cblRoZSBwYXRocyByZXR1cm5lZCBieSBgcmVhZGRpclN5bmNgIHNob3VsZCBiZSB0aGUgYWN0dWFsIHBhdGhzIHRoYXQgd2VyZSB3YWxrZWQuIElmIE5vZGUuanMgZm9sbG93cyBzeW1saW5rcyBkdXJpbmcgcmVhZGRpciwgdGhlIHBhdGhzIG1pZ2h0IGFscmVhZHkgYmUgY2Fub25pY2FsaXplZC4uLiBidXQgbm8sIGByZWFkZGlyU3luY2AgcmV0dXJucyBlbnRyaWVzIHJlbGF0aXZlIHRvIHRoZSBkaXJlY3RvcnkgcGF0aCB5b3UgZ2l2ZSBpdCwgYW5kIHdoZW4geW91IGpvaW4gdGhlbSwgeW91IGdldCBwYXRocyB1bmRlciB0aGUgc3ltbGluaywgbm90IHRoZSByZWFsIHBhdGguXG5cbkFjdHVhbGx5LCBsZXQgbWUgY2hlY2sgaWYgdGhlcmUncyBhIGRpZmZlcmVuY2UgYmV0d2VlbiBob3cgbWFjT1MgYW5kIExpbnV4IGhhbmRsZSB0aGlzLiBPbiBtYWNPUyB3aXRoIEFQRlMsIHRoZXJlIG1pZ2h0IGJlIHNvbWUgbm9ybWFsaXphdGlvbiBoYXBwZW5pbmcuXG5cbkxldCBtZSBsb29rIGF0IHRoZSBhY3R1YWwgdGVzdCBvdXRwdXQgYWdhaW4uIFRoZSB0ZXN0IGlzIGZhaWxpbmcgd2l0aDpcbmBgYFxuZXh0ZW5zaW9uczogMSxcbnByb21wdHM6IDEsXG5za2lsbHM6IDIsXG50aGVtZXM6IDEsXG5gYGBcblxuRXh0ZW5zaW9ucywgcHJvbXB0cywgYW5kIHRoZW1lcyBhcmUgZGVkdXBsaWNhdGluZyBjb3JyZWN0bHkgKDEgZWFjaCksIG9ubHkgc2tpbGxzIGhhcyAyLiBXaHk/XG5cbk9oISBJIHRoaW5rIEkgZm91bmQgdGhlIGlzc3VlLiBMb29raW5nIGF0IHRoZSBza2lsbHMgY29sbGVjdGlvbjpcblxuYGBgdHNcbi8vIFVzZXIgc2tpbGxzIGZyb20gfi8ucGkvYWdlbnQvXG5hZGRSZXNvdXJjZXMoXG5cdFwic2tpbGxzXCIsXG5cdGNvbGxlY3RBdXRvU2tpbGxFbnRyaWVzKHVzZXJEaXJzLnNraWxscywgXCJwaVwiKSxcblx0dXNlck1ldGFkYXRhLFxuXHR1c2VyT3ZlcnJpZGVzLnNraWxscyxcblx0Z2xvYmFsQmFzZURpcixcbik7XG5cbi8vIFVzZXIgc2tpbGxzIGZyb20gfi8uYWdlbnRzLyAod2l0aCBpdHMgb3duIGJhc2VEaXIpXG5jb25zdCB1c2VyQWdlbnRzQmFzZURpciA9IGRpcm5hbWUodXNlckFnZW50c1NraWxsc0Rpcik7XG5jb25zdCB1c2VyQWdlbnRzTWV0YWRhdGE6IFBhdGhNZXRhZGF0YSA9IHtcblx0Li4udXNlck1ldGFkYXRhLFxuXHRiYXNlRGlyOiB1c2VyQWdlbnRzQmFzZURpcixcbn07XG5hZGRSZXNvdXJjZXMoXG5cdFwic2tpbGxzXCIsXG5cdGNvbGxlY3RBdXRvU2tpbGxFbnRyaWVzKHVzZXJBZ2VudHNTa2lsbHNEaXIsIFwiYWdlbnRzXCIpLFxuXHR1c2VyQWdlbnRzTWV0YWRhdGEsXG5cdHVzZXJPdmVycmlkZXMuc2tpbGxzLFxuXHR1c2VyQWdlbnRzQmFzZURpcixcbik7XG5gYGBcblxuV2FpdCwgdGhlIHRlc3QgY3JlYXRlcyBhIHRlbXAgZGlyZWN0b3J5IGFuZCBzZXRzIGl0IHVwIHdpdGggc3ltbGlua3MuIFRoZSBgdXNlckFnZW50c1NraWxsc0RpcmAgaXMgYGpvaW4oZ2V0SG9tZURpcigpLCBcIi5hZ2VudHNcIiwgXCJza2lsbHNcIilgLiBJZiBgdGVtcERpcmAgaXMgc2V0IHRvIHRoZSBIT01FIGZvciB0aGUgdGVzdCwgdGhlbiB3ZSBtaWdodCBiZSBwaWNraW5nIHVwIHNraWxscyBmcm9tIGAuYWdlbnRzYCBhcyB3ZWxsIVxuXG5MZXQgbWUgY2hlY2sgdGhlIHRlc3Qgc2V0dXA6IiwidGhpbmtpbmdTaWduYXR1cmUiOiJyZWFzb25pbmcifSx7InR5cGUiOiJ0b29sQ2FsbCIsImlkIjoiZnVuY3Rpb25zLmdyZXA6MTIiLCJuYW1lIjoiZ3JlcCIsImFyZ3VtZW50cyI6eyJwYXR0ZXJuIjoiYmVmb3JlRWFjaHxiZWZvcmVBbGwiLCJwYXRoIjoicGFja2FnZXMvY29kaW5nLWFnZW50L3Rlc3QvcGFja2FnZS1tYW5hZ2VyLnRlc3QudHMiLCJjb250ZXh0IjozMH19XSwiYXBpIjoib3BlbmFpLWNvbXBsZXRpb25zIiwicHJvdmlkZXIiOiJzeW50aGV0aWMiLCJtb2RlbCI6ImhmOm1vb25zaG90YWkvS2ltaS1LMi41IiwidXNhZ2UiOnsiaW5wdXQiOjc3Niwib3V0cHV0IjoxOTEzLCJjYWNoZVJlYWQiOjQ2MDQ4LCJjYWNoZVdyaXRlIjowLCJ0b3RhbFRva2VucyI6NDg3MzcsImNvc3QiOnsiaW5wdXQiOjAuMDAwMzQ5MjAwMDAwMDAwMDAwMDMsIm91dHB1dCI6MC4wMDY1MDQyLCJjYWNoZVJlYWQiOjAuMDIwNzIxNjAwMDAwMDAwMDAzLCJjYWNoZVdyaXRlIjowLCJ0b3RhbCI6MC4wMjc1NzUwMDAwMDAwMDAwMDJ9fSwic3RvcFJlYXNvbiI6InRvb2xVc2UiLCJ0aW1lc3RhbXAiOjE3Nzc1NjQyNzgwNTgsInJlc3BvbnNlSWQiOiJjaGF0Y21wbC05NzYyOWU3MjI5OWNjNDc2In19LHsidHlwZSI6Im1lc3NhZ2UiLCJpZCI6Ijg4NGI1NTMxIiwicGFyZW50SWQiOiIzNmUxNWNlYyIsInRpbWVzdGFtcCI6IjIwMjYtMDQtMzBUMTU6NTE6MjguNzYxWiIsIm1lc3NhZ2UiOnsicm9sZSI6InRvb2xSZXN1bHQiLCJ0b29sQ2FsbElkIjoiZnVuY3Rpb25zLmdyZXA6MTIiLCJ0b29sTmFtZSI6ImdyZXAiLCJjb250ZW50IjpbeyJ0eXBlIjoidGV4dCIsInRleHQiOiJwYWNrYWdlLW1hbmFnZXIudGVzdC50czoxOiAgIGltcG9ydCB7IEV2ZW50RW1pdHRlciB9IGZyb20gXCJub2RlOmV2ZW50c1wiO1xucGFja2FnZS1tYW5hZ2VyLnRlc3QudHM6MjogICBpbXBvcnQgeyBta2RpclN5bmMsIHJtU3luYywgc3ltbGlua1N5bmMsIHdyaXRlRmlsZVN5bmMgfSBmcm9tIFwibm9kZTpmc1wiO1xucGFja2FnZS1tYW5hZ2VyLnRlc3QudHM6MzogICBpbXBvcnQgeyB0bXBkaXIgfSBmcm9tIFwibm9kZTpvc1wiO1xucGFja2FnZS1tYW5hZ2VyLnRlc3QudHM6NDogICBpbXBvcnQgeyBqb2luLCByZWxhdGl2ZSB9IGZyb20gXCJub2RlOnBhdGhcIjtcbnBhY2thZ2UtbWFuYWdlci50ZXN0LnRzOjU6ICAgaW1wb3J0IHsgUGFzc1Rocm91Z2ggfSBmcm9tIFwibm9kZTpzdHJlYW1cIjtcbnBhY2thZ2UtbWFuYWdlci50ZXN0LnRzOjY6IGltcG9ydCB7IGFmdGVyRWFjaCwgYmVmb3JlRWFjaCwgZGVzY3JpYmUsIGV4cGVjdCwgaXQsIHZpIH0gZnJvbSBcInZpdGVzdFwiO1xucGFja2FnZS1tYW5hZ2VyLnRlc3QudHM6NzogICBpbXBvcnQgeyBEZWZhdWx0UGFja2FnZU1hbmFnZXIsIHR5cGUgUHJvZ3Jlc3NFdmVudCwgdHlwZSBSZXNvbHZlZFJlc291cmNlIH0gZnJvbSBcIi4uL3NyYy9jb3JlL3BhY2thZ2UtbWFuYWdlci5qc1wiO1xucGFja2FnZS1tYW5hZ2VyLnRlc3QudHM6ODogICBpbXBvcnQgeyBTZXR0aW5nc01hbmFnZXIgfSBmcm9tIFwiLi4vc3JjL2NvcmUvc2V0dGluZ3MtbWFuYWdlci5qc1wiO1xucGFja2FnZS1tYW5hZ2VyLnRlc3QudHM6OTogICBcbnBhY2thZ2UtbWFuYWdlci50ZXN0LnRzOjEwOiAgIGZ1bmN0aW9uIG5vcm1hbGl6ZUZvck1hdGNoKHZhbHVlOiBzdHJpbmcpOiBzdHJpbmcge1xucGFja2FnZS1tYW5hZ2VyLnRlc3QudHM6MTE6ICAgcmV0dXJuIHZhbHVlLnJlcGxhY2UoL1xcXFwvZywgXCIvXCIpO1xucGFja2FnZS1tYW5hZ2VyLnRlc3QudHM6MTI6ICAgfVxucGFja2FnZS1tYW5hZ2VyLnRlc3QudHM6MTM6ICAgXG5wYWNrYWdlLW1hbmFnZXIudGVzdC50czoxNDogICBmdW5jdGlvbiBwYXRoRW5kc1dpdGgoYWN0dWFsUGF0aDogc3RyaW5nLCBzdWZmaXg6IHN0cmluZyk6IGJvb2xlYW4ge1xucGFja2FnZS1tYW5hZ2VyLnRlc3QudHM6MTU6ICAgcmV0dXJuIG5vcm1hbGl6ZUZvck1hdGNoKGFjdHVhbFBhdGgpLmVuZHNXaXRoKG5vcm1hbGl6ZUZvck1hdGNoKHN1ZmZpeCkpO1xucGFja2FnZS1tYW5hZ2VyLnRlc3QudHM6MTY6ICAgfVxucGFja2FnZS1tYW5hZ2VyLnRlc3QudHM6MTc6ICAgXG5wYWNrYWdlLW1hbmFnZXIudGVzdC50czoxODogICBjbGFzcyBNb2NrU3Bhd25lZFByb2Nlc3MgZXh0ZW5kcyBFdmVudEVtaXR0ZXIge1xucGFja2FnZS1tYW5hZ2VyLnRlc3QudHM6MTk6ICAgc3Rkb3V0ID0gbmV3IFBhc3NUaHJvdWdoKCk7XG5wYWNrYWdlLW1hbmFnZXIudGVzdC50czoyMDogICBzdGRlcnIgPSBuZXcgUGFzc1Rocm91Z2goKTtcbnBhY2thZ2UtbWFuYWdlci50ZXN0LnRzOjIxOiAgIFxucGFja2FnZS1tYW5hZ2VyLnRlc3QudHM6MjI6ICAga2lsbCgpOiBib29sZWFuIHtcbnBhY2thZ2UtbWFuYWdlci50ZXN0LnRzOjIzOiAgIHRoaXMuZW1pdChcImNsb3NlXCIsIG51bGwsIFwiU0lHVEVSTVwiKTtcbnBhY2thZ2UtbWFuYWdlci50ZXN0LnRzOjI0OiAgIHJldHVybiB0cnVlO1xucGFja2FnZS1tYW5hZ2VyLnRlc3QudHM6MjU6ICAgfVxucGFja2FnZS1tYW5hZ2VyLnRlc3QudHM6MjY6ICAgfVxucGFja2FnZS1tYW5hZ2VyLnRlc3QudHM6Mjc6ICAgXG5wYWNrYWdlLW1hbmFnZXIudGVzdC50czoyODogICAvLyBIZWxwZXIgdG8gY2hlY2sgaWYgYSByZXNvdXJjZSBpcyBlbmFibGVkXG5wYWNrYWdlLW1hbmFnZXIudGVzdC50czoyOTogICBjb25zdCBpc0VuYWJsZWQgPSAocjogUmVzb2x2ZWRSZXNvdXJjZSwgcGF0aE1hdGNoOiBzdHJpbmcsIG1hdGNoRm46IFwiZW5kc1dpdGhcIiB8IFwiaW5jbHVkZXNcIiA9IFwiZW5kc1dpdGhcIikgPT4ge1xucGFja2FnZS1tYW5hZ2VyLnRlc3QudHM6MzA6ICAgY29uc3Qgbm9ybWFsaXplZFBhdGggPSBub3JtYWxpemVGb3JNYXRjaChyLnBhdGgpO1xucGFja2FnZS1tYW5hZ2VyLnRlc3QudHM6MzE6ICAgY29uc3Qgbm9ybWFsaXplZE1hdGNoID0gbm9ybWFsaXplRm9yTWF0Y2gocGF0aE1hdGNoKTtcbnBhY2thZ2UtbWFuYWdlci50ZXN0LnRzOjMyOiAgIHJldHVybiBtYXRjaEZuID09PSBcImVuZHNXaXRoXCJcbnBhY2thZ2UtbWFuYWdlci50ZXN0LnRzOjMzOiAgID8gbm9ybWFsaXplZFBhdGguZW5kc1dpdGgobm9ybWFsaXplZE1hdGNoKSAmJiByLmVuYWJsZWRcbnBhY2thZ2UtbWFuYWdlci50ZXN0LnRzOjM0OiAgIDogbm9ybWFsaXplZFBhdGguaW5jbHVkZXMobm9ybWFsaXplZE1hdGNoKSAmJiByLmVuYWJsZWQ7XG5wYWNrYWdlLW1hbmFnZXIudGVzdC50czozNTogICB9O1xucGFja2FnZS1tYW5hZ2VyLnRlc3QudHM6MzY6ICAgXG5wYWNrYWdlLW1hbmFnZXIudGVzdC50czoyMjogICBraWxsKCk6IGJvb2xlYW4ge1xucGFja2FnZS1tYW5hZ2VyLnRlc3QudHM6MjM6ICAgdGhpcy5lbWl0KFwiY2xvc2VcIiwgbnVsbCwgXCJTSUdURVJNXCIpO1xucGFja2FnZS1tYW5hZ2VyLnRlc3QudHM6MjQ6ICAgcmV0dXJuIHRydWU7XG5wYWNrYWdlLW1hbmFnZXIudGVzdC50czoyNTogICB9XG5wYWNrYWdlLW1hbmFnZXIudGVzdC50czoyNjogICB9XG5wYWNrYWdlLW1hbmFnZXIudGVzdC50czoyNzogICBcbnBhY2thZ2UtbWFuYWdlci50ZXN0LnRzOjI4OiAgIC8vIEhlbHBlciB0byBjaGVjayBpZiBhIHJlc291cmNlIGlzIGVuYWJsZWRcbnBhY2thZ2UtbWFuYWdlci50ZXN0LnRzOjI5OiAgIGNvbnN0IGlzRW5hYmxlZCA9IChyOiBSZXNvbHZlZFJlc291cmNlLCBwYXRoTWF0Y2g6IHN0cmluZywgbWF0Y2hGbjogXCJlbmRzV2l0aFwiIHwgXCJpbmNsdWRlc1wiID0gXCJlbmRzV2l0aFwiKSA9PiB7XG5wYWNrYWdlLW1hbmFnZXIudGVzdC50czozMDogICBjb25zdCBub3JtYWxpemVkUGF0aCA9IG5vcm1hbGl6ZUZvck1hdGNoKHIucGF0aCk7XG5wYWNrYWdlLW1hbmFnZXIudGVzdC50czozMTogICBjb25zdCBub3JtYWxpemVkTWF0Y2ggPSBub3JtYWxpemVGb3JNYXRjaChwYXRoTWF0Y2gpO1xucGFja2FnZS1tYW5hZ2VyLnRlc3QudHM6MzI6ICAgcmV0dXJuIG1hdGNoRm4gPT09IFwiZW5kc1dpdGhcIlxucGFja2FnZS1tYW5hZ2VyLnRlc3QudHM6MzM6ICAgPyBub3JtYWxpemVkUGF0aC5lbmRzV2l0aChub3JtYWxpemVkTWF0Y2gpICYmIHIuZW5hYmxlZFxucGFja2FnZS1tYW5hZ2VyLnRlc3QudHM6MzQ6ICAgOiBub3JtYWxpemVkUGF0aC5pbmNsdWRlcyhub3JtYWxpemVkTWF0Y2gpICYmIHIuZW5hYmxlZDtcbnBhY2thZ2UtbWFuYWdlci50ZXN0LnRzOjM1OiAgIH07XG5wYWNrYWdlLW1hbmFnZXIudGVzdC50czozNjogICBcbnBhY2thZ2UtbWFuYWdlci50ZXN0LnRzOjM3OiAgIGNvbnN0IGlzRGlzYWJsZWQgPSAocjogUmVzb2x2ZWRSZXNvdXJjZSwgcGF0aE1hdGNoOiBzdHJpbmcsIG1hdGNoRm46IFwiZW5kc1dpdGhcIiB8IFwiaW5jbHVkZXNcIiA9IFwiZW5kc1dpdGhcIikgPT4ge1xucGFja2FnZS1tYW5hZ2VyLnRlc3QudHM6Mzg6ICAgY29uc3Qgbm9ybWFsaXplZFBhdGggPSBub3JtYWxpemVGb3JNYXRjaChyLnBhdGgpO1xucGFja2FnZS1tYW5hZ2VyLnRlc3QudHM6Mzk6ICAgY29uc3Qgbm9ybWFsaXplZE1hdGNoID0gbm9ybWFsaXplRm9yTWF0Y2gocGF0aE1hdGNoKTtcbnBhY2thZ2UtbWFuYWdlci50ZXN0LnRzOjQwOiAgIHJldHVybiBtYXRjaEZuID09PSBcImVuZHNXaXRoXCJcbnBhY2thZ2UtbWFuYWdlci50ZXN0LnRzOjQxOiAgID8gbm9ybWFsaXplZFBhdGguZW5kc1dpdGgobm9ybWFsaXplZE1hdGNoKSAmJiAhci5lbmFibGVkXG5wYWNrYWdlLW1hbmFnZXIudGVzdC50czo0MjogICA6IG5vcm1hbGl6ZWRQYXRoLmluY2x1ZGVzKG5vcm1hbGl6ZWRNYXRjaCkgJiYgIXIuZW5hYmxlZDtcbnBhY2thZ2UtbWFuYWdlci50ZXN0LnRzOjQzOiAgIH07XG5wYWNrYWdlLW1hbmFnZXIudGVzdC50czo0NDogICBcbnBhY2thZ2UtbWFuYWdlci50ZXN0LnRzOjQ1OiAgIGRlc2NyaWJlKFwiRGVmYXVsdFBhY2thZ2VNYW5hZ2VyXCIsICgpID0+IHtcbnBhY2thZ2UtbWFuYWdlci50ZXN0LnRzOjQ2OiAgIGxldCB0ZW1wRGlyOiBzdHJpbmc7XG5wYWNrYWdlLW1hbmFnZXIudGVzdC50czo0NzogICBsZXQgYWdlbnREaXI6IHN0cmluZztcbnBhY2thZ2UtbWFuYWdlci50ZXN0LnRzOjQ4OiAgIGxldCBzZXR0aW5nc01hbmFnZXI6IFNldHRpbmdzTWFuYWdlcjtcbnBhY2thZ2UtbWFuYWdlci50ZXN0LnRzOjQ5OiAgIGxldCBwYWNrYWdlTWFuYWdlcjogRGVmYXVsdFBhY2thZ2VNYW5hZ2VyO1xucGFja2FnZS1tYW5hZ2VyLnRlc3QudHM6NTA6ICAgbGV0IHByZXZpb3VzT2ZmbGluZUVudjogc3RyaW5nIHwgdW5kZWZpbmVkO1xucGFja2FnZS1tYW5hZ2VyLnRlc3QudHM6NTE6ICAgXG5wYWNrYWdlLW1hbmFnZXIudGVzdC50czo1MjogYmVmb3JlRWFjaCgoKSA9PiB7XG5wYWNrYWdlLW1hbmFnZXIudGVzdC50czo1MzogICBwcmV2aW91c09mZmxpbmVFbnYgPSBwcm9jZXNzLmVudi5QSV9PRkZMSU5FO1xucGFja2FnZS1tYW5hZ2VyLnRlc3QudHM6NTQ6ICAgZGVsZXRlIHByb2Nlc3MuZW52LlBJX09GRkxJTkU7XG5wYWNrYWdlLW1hbmFnZXIudGVzdC50czo1NTogICB0ZW1wRGlyID0gam9pbih0bXBkaXIoKSwgYHBtLXRlc3QtJHtEYXRlLm5vdygpfS0ke01hdGgucmFuZG9tKCkudG9TdHJpbmcoMzYpLnNsaWNlKDIpfWApO1xucGFja2FnZS1tYW5hZ2VyLnRlc3QudHM6NTY6ICAgbWtkaXJTeW5jKHRlbXBEaXIsIHsgcmVjdXJzaXZlOiB0cnVlIH0pO1xucGFja2FnZS1tYW5hZ2VyLnRlc3QudHM6NTc6ICAgYWdlbnREaXIgPSBqb2luKHRlbXBEaXIsIFwiYWdlbnRcIik7XG5wYWNrYWdlLW1hbmFnZXIudGVzdC50czo1ODogICBta2RpclN5bmMoYWdlbnREaXIsIHsgcmVjdXJzaXZlOiB0cnVlIH0pO1xucGFja2FnZS1tYW5hZ2VyLnRlc3QudHM6NTk6ICAgXG5wYWNrYWdlLW1hbmFnZXIudGVzdC50czo2MDogICBzZXR0aW5nc01hbmFnZXIgPSBTZXR0aW5nc01hbmFnZXIuaW5NZW1vcnkoKTtcbnBhY2thZ2UtbWFuYWdlci50ZXN0LnRzOjYxOiAgIHBhY2thZ2VNYW5hZ2VyID0gbmV3IERlZmF1bHRQYWNrYWdlTWFuYWdlcih7XG5wYWNrYWdlLW1hbmFnZXIudGVzdC50czo2MjogICBjd2Q6IHRlbXBEaXIsXG5wYWNrYWdlLW1hbmFnZXIudGVzdC50czo2MzogICBhZ2VudERpcixcbnBhY2thZ2UtbWFuYWdlci50ZXN0LnRzOjY0OiAgIHNldHRpbmdzTWFuYWdlcixcbnBhY2thZ2UtbWFuYWdlci50ZXN0LnRzOjY1OiAgIH0pO1xucGFja2FnZS1tYW5hZ2VyLnRlc3QudHM6NjY6ICAgfSk7XG5wYWNrYWdlLW1hbmFnZXIudGVzdC50czo2NzogICBcbnBhY2thZ2UtbWFuYWdlci50ZXN0LnRzOjY4OiAgIGFmdGVyRWFjaCgoKSA9PiB7XG5wYWNrYWdlLW1hbmFnZXIudGVzdC50czo2OTogICBpZiAocHJldmlvdXNPZmZsaW5lRW52ID09PSB1bmRlZmluZWQpIHtcbnBhY2thZ2UtbWFuYWdlci50ZXN0LnRzOjcwOiAgIGRlbGV0ZSBwcm9jZXNzLmVudi5QSV9PRkZMSU5FO1xucGFja2FnZS1tYW5hZ2VyLnRlc3QudHM6NzE6ICAgfSBlbHNlIHtcbnBhY2thZ2UtbWFuYWdlci50ZXN0LnRzOjcyOiAgIHByb2Nlc3MuZW52LlBJX09GRkxJTkUgPSBwcmV2aW91c09mZmxpbmVFbnY7XG5wYWNrYWdlLW1hbmFnZXIudGVzdC50czo3MzogICB9XG5wYWNrYWdlLW1hbmFnZXIudGVzdC50czo3NDogICB2aS5yZXN0b3JlQWxsTW9ja3MoKTtcbnBhY2thZ2UtbWFuYWdlci50ZXN0LnRzOjc1OiAgIHZpLnVuc3R1YkFsbEdsb2JhbHMoKTtcbnBhY2thZ2UtbWFuYWdlci50ZXN0LnRzOjc2OiAgIHJtU3luYyh0ZW1wRGlyLCB7IHJlY3Vyc2l2ZTogdHJ1ZSwgZm9yY2U6IHRydWUgfSk7XG5wYWNrYWdlLW1hbmFnZXIudGVzdC50czo3NzogICB9KTtcbnBhY2thZ2UtbWFuYWdlci50ZXN0LnRzOjc4OiAgIFxucGFja2FnZS1tYW5hZ2VyLnRlc3QudHM6Nzk6ICAgZGVzY3JpYmUoXCJyZXNvbHZlXCIsICgpID0+IHtcbnBhY2thZ2UtbWFuYWdlci50ZXN0LnRzOjgwOiAgIGl0KFwic2hvdWxkIHJldHVybiBubyBwYWNrYWdlLXNvdXJjZWQgcGF0aHMgd2hlbiBubyBzb3VyY2VzIGNvbmZpZ3VyZWRcIiwgYXN5bmMgKCkgPT4ge1xucGFja2FnZS1tYW5hZ2VyLnRlc3QudHM6ODE6ICAgY29uc3QgcmVzdWx0ID0gYXdhaXQgcGFja2FnZU1hbmFnZXIucmVzb2x2ZSgpO1xucGFja2FnZS1tYW5hZ2VyLnRlc3QudHM6ODI6ICAgZXhwZWN0KHJlc3VsdC5leHRlbnNpb25zKS50b0VxdWFsKFtdKTsifV0sImRldGFpbHMiOnsibWF0Y2hDb3VudCI6MiwibWF0Y2hlcyI6W3sicGF0aCI6InBhY2thZ2UtbWFuYWdlci50ZXN0LnRzIiwibGluZSI6MSwidGV4dCI6IiAgaW1wb3J0IHsgRXZlbnRFbWl0dGVyIH0gZnJvbSBcIm5vZGU6ZXZlbnRzXCI7In0seyJwYXRoIjoicGFja2FnZS1tYW5hZ2VyLnRlc3QudHMiLCJsaW5lIjoyLCJ0ZXh0IjoiICBpbXBvcnQgeyBta2RpclN5bmMsIHJtU3luYywgc3ltbGlua1N5bmMsIHdyaXRlRmlsZVN5bmMgfSBmcm9tIFwibm9kZTpmc1wiOyJ9LHsicGF0aCI6InBhY2thZ2UtbWFuYWdlci50ZXN0LnRzIiwibGluZSI6MywidGV4dCI6IiAgaW1wb3J0IHsgdG1wZGlyIH0gZnJvbSBcIm5vZGU6b3NcIjsifSx7InBhdGgiOiJwYWNrYWdlLW1hbmFnZXIudGVzdC50cyIsImxpbmUiOjQsInRleHQiOiIgIGltcG9ydCB7IGpvaW4sIHJlbGF0aXZlIH0gZnJvbSBcIm5vZGU6cGF0aFwiOyJ9LHsicGF0aCI6InBhY2thZ2UtbWFuYWdlci50ZXN0LnRzIiwibGluZSI6NSwidGV4dCI6IiAgaW1wb3J0IHsgUGFzc1Rocm91Z2ggfSBmcm9tIFwibm9kZTpzdHJlYW1cIjsifSx7InBhdGgiOiJwYWNrYWdlLW1hbmFnZXIudGVzdC50cyIsImxpbmUiOjYsInRleHQiOiJpbXBvcnQgeyBhZnRlckVhY2gsIGJlZm9yZUVhY2gsIGRlc2NyaWJlLCBleHBlY3QsIGl0LCB2aSB9IGZyb20gXCJ2aXRlc3RcIjsifSx7InBhdGgiOiJwYWNrYWdlLW1hbmFnZXIudGVzdC50cyIsImxpbmUiOjcsInRleHQiOiIgIGltcG9ydCB7IERlZmF1bHRQYWNrYWdlTWFuYWdlciwgdHlwZSBQcm9ncmVzc0V2ZW50LCB0eXBlIFJlc29sdmVkUmVzb3VyY2UgfSBmcm9tIFwiLi4vc3JjL2NvcmUvcGFja2FnZS1tYW5hZ2VyLmpzXCI7In0seyJwYXRoIjoicGFja2FnZS1tYW5hZ2VyLnRlc3QudHMiLCJsaW5lIjo4LCJ0ZXh0IjoiICBpbXBvcnQgeyBTZXR0aW5nc01hbmFnZXIgfSBmcm9tIFwiLi4vc3JjL2NvcmUvc2V0dGluZ3MtbWFuYWdlci5qc1wiOyJ9LHsicGF0aCI6InBhY2thZ2UtbWFuYWdlci50ZXN0LnRzIiwibGluZSI6OSwidGV4dCI6IiAgIn0seyJwYXRoIjoicGFja2FnZS1tYW5hZ2VyLnRlc3QudHMiLCJsaW5lIjoxMCwidGV4dCI6IiAgZnVuY3Rpb24gbm9ybWFsaXplRm9yTWF0Y2godmFsdWU6IHN0cmluZyk6IHN0cmluZyB7In0seyJwYXRoIjoicGFja2FnZS1tYW5hZ2VyLnRlc3QudHMiLCJsaW5lIjoxMSwidGV4dCI6IiAgcmV0dXJuIHZhbHVlLnJlcGxhY2UoL1xcXFwvZywgXCIvXCIpOyJ9LHsicGF0aCI6InBhY2thZ2UtbWFuYWdlci50ZXN0LnRzIiwibGluZSI6MTIsInRleHQiOiIgIH0ifSx7InBhdGgiOiJwYWNrYWdlLW1hbmFnZXIudGVzdC50cyIsImxpbmUiOjEzLCJ0ZXh0IjoiICAifSx7InBhdGgiOiJwYWNrYWdlLW1hbmFnZXIudGVzdC50cyIsImxpbmUiOjE0LCJ0ZXh0IjoiICBmdW5jdGlvbiBwYXRoRW5kc1dpdGgoYWN0dWFsUGF0aDogc3RyaW5nLCBzdWZmaXg6IHN0cmluZyk6IGJvb2xlYW4geyJ9LHsicGF0aCI6InBhY2thZ2UtbWFuYWdlci50ZXN0LnRzIiwibGluZSI6MTUsInRleHQiOiIgIHJldHVybiBub3JtYWxpemVGb3JNYXRjaChhY3R1YWxQYXRoKS5lbmRzV2l0aChub3JtYWxpemVGb3JNYXRjaChzdWZmaXgpKTsifSx7InBhdGgiOiJwYWNrYWdlLW1hbmFnZXIudGVzdC50cyIsImxpbmUiOjE2LCJ0ZXh0IjoiICB9In0seyJwYXRoIjoicGFja2FnZS1tYW5hZ2VyLnRlc3QudHMiLCJsaW5lIjoxNywidGV4dCI6IiAgIn0seyJwYXRoIjoicGFja2FnZS1tYW5hZ2VyLnRlc3QudHMiLCJsaW5lIjoxOCwidGV4dCI6IiAgY2xhc3MgTW9ja1NwYXduZWRQcm9jZXNzIGV4dGVuZHMgRXZlbnRFbWl0dGVyIHsifSx7InBhdGgiOiJwYWNrYWdlLW1hbmFnZXIudGVzdC50cyIsImxpbmUiOjE5LCJ0ZXh0IjoiICBzdGRvdXQgPSBuZXcgUGFzc1Rocm91Z2goKTsifSx7InBhdGgiOiJwYWNrYWdlLW1hbmFnZXIudGVzdC50cyIsImxpbmUiOjIwLCJ0ZXh0IjoiICBzdGRlcnIgPSBuZXcgUGFzc1Rocm91Z2goKTsifSx7InBhdGgiOiJwYWNrYWdlLW1hbmFnZXIudGVzdC50cyIsImxpbmUiOjIxLCJ0ZXh0IjoiICAifSx7InBhdGgiOiJwYWNrYWdlLW1hbmFnZXIudGVzdC50cyIsImxpbmUiOjIyLCJ0ZXh0IjoiICBraWxsKCk6IGJvb2xlYW4geyJ9LHsicGF0aCI6InBhY2thZ2UtbWFuYWdlci50ZXN0LnRzIiwibGluZSI6MjMsInRleHQiOiIgIHRoaXMuZW1pdChcImNsb3NlXCIsIG51bGwsIFwiU0lHVEVSTVwiKTsifSx7InBhdGgiOiJwYWNrYWdlLW1hbmFnZXIudGVzdC50cyIsImxpbmUiOjI0LCJ0ZXh0IjoiICByZXR1cm4gdHJ1ZTsifSx7InBhdGgiOiJwYWNrYWdlLW1hbmFnZXIudGVzdC50cyIsImxpbmUiOjI1LCJ0ZXh0IjoiICB9In0seyJwYXRoIjoicGFja2FnZS1tYW5hZ2VyLnRlc3QudHMiLCJsaW5lIjoyNiwidGV4dCI6IiAgfSJ9LHsicGF0aCI6InBhY2thZ2UtbWFuYWdlci50ZXN0LnRzIiwibGluZSI6MjcsInRleHQiOiIgICJ9LHsicGF0aCI6InBhY2thZ2UtbWFuYWdlci50ZXN0LnRzIiwibGluZSI6MjgsInRleHQiOiIgIC8vIEhlbHBlciB0byBjaGVjayBpZiBhIHJlc291cmNlIGlzIGVuYWJsZWQifSx7InBhdGgiOiJwYWNrYWdlLW1hbmFnZXIudGVzdC50cyIsImxpbmUiOjI5LCJ0ZXh0IjoiICBjb25zdCBpc0VuYWJsZWQgPSAocjogUmVzb2x2ZWRSZXNvdXJjZSwgcGF0aE1hdGNoOiBzdHJpbmcsIG1hdGNoRm46IFwiZW5kc1dpdGhcIiB8IFwiaW5jbHVkZXNcIiA9IFwiZW5kc1dpdGhcIikgPT4geyJ9LHsicGF0aCI6InBhY2thZ2UtbWFuYWdlci50ZXN0LnRzIiwibGluZSI6MzAsInRleHQiOiIgIGNvbnN0IG5vcm1hbGl6ZWRQYXRoID0gbm9ybWFsaXplRm9yTWF0Y2goci5wYXRoKTsifSx7InBhdGgiOiJwYWNrYWdlLW1hbmFnZXIudGVzdC50cyIsImxpbmUiOjMxLCJ0ZXh0IjoiICBjb25zdCBub3JtYWxpemVkTWF0Y2ggPSBub3JtYWxpemVGb3JNYXRjaChwYXRoTWF0Y2gpOyJ9LHsicGF0aCI6InBhY2thZ2UtbWFuYWdlci50ZXN0LnRzIiwibGluZSI6MzIsInRleHQiOiIgIHJldHVybiBtYXRjaEZuID09PSBcImVuZHNXaXRoXCIifSx7InBhdGgiOiJwYWNrYWdlLW1hbmFnZXIudGVzdC50cyIsImxpbmUiOjMzLCJ0ZXh0IjoiICA/IG5vcm1hbGl6ZWRQYXRoLmVuZHNXaXRoKG5vcm1hbGl6ZWRNYXRjaCkgJiYgci5lbmFibGVkIn0seyJwYXRoIjoicGFja2FnZS1tYW5hZ2VyLnRlc3QudHMiLCJsaW5lIjozNCwidGV4dCI6IiAgOiBub3JtYWxpemVkUGF0aC5pbmNsdWRlcyhub3JtYWxpemVkTWF0Y2gpICYmIHIuZW5hYmxlZDsifSx7InBhdGgiOiJwYWNrYWdlLW1hbmFnZXIudGVzdC50cyIsImxpbmUiOjM1LCJ0ZXh0IjoiICB9OyJ9LHsicGF0aCI6InBhY2thZ2UtbWFuYWdlci50ZXN0LnRzIiwibGluZSI6MzYsInRleHQiOiIgICJ9LHsicGF0aCI6InBhY2thZ2UtbWFuYWdlci50ZXN0LnRzIiwibGluZSI6MjIsInRleHQiOiIgIGtpbGwoKTogYm9vbGVhbiB7In0seyJwYXRoIjoicGFja2FnZS1tYW5hZ2VyLnRlc3QudHMiLCJsaW5lIjoyMywidGV4dCI6IiAgdGhpcy5lbWl0KFwiY2xvc2VcIiwgbnVsbCwgXCJTSUdURVJNXCIpOyJ9LHsicGF0aCI6InBhY2thZ2UtbWFuYWdlci50ZXN0LnRzIiwibGluZSI6MjQsInRleHQiOiIgIHJldHVybiB0cnVlOyJ9LHsicGF0aCI6InBhY2thZ2UtbWFuYWdlci50ZXN0LnRzIiwibGluZSI6MjUsInRleHQiOiIgIH0ifSx7InBhdGgiOiJwYWNrYWdlLW1hbmFnZXIudGVzdC50cyIsImxpbmUiOjI2LCJ0ZXh0IjoiICB9In0seyJwYXRoIjoicGFja2FnZS1tYW5hZ2VyLnRlc3QudHMiLCJsaW5lIjoyNywidGV4dCI6IiAgIn0seyJwYXRoIjoicGFja2FnZS1tYW5hZ2VyLnRlc3QudHMiLCJsaW5lIjoyOCwidGV4dCI6IiAgLy8gSGVscGVyIHRvIGNoZWNrIGlmIGEgcmVzb3VyY2UgaXMgZW5hYmxlZCJ9LHsicGF0aCI6InBhY2thZ2UtbWFuYWdlci50ZXN0LnRzIiwibGluZSI6MjksInRleHQiOiIgIGNvbnN0IGlzRW5hYmxlZCA9IChyOiBSZXNvbHZlZFJlc291cmNlLCBwYXRoTWF0Y2g6IHN0cmluZywgbWF0Y2hGbjogXCJlbmRzV2l0aFwiIHwgXCJpbmNsdWRlc1wiID0gXCJlbmRzV2l0aFwiKSA9PiB7In0seyJwYXRoIjoicGFja2FnZS1tYW5hZ2VyLnRlc3QudHMiLCJsaW5lIjozMCwidGV4dCI6IiAgY29uc3Qgbm9ybWFsaXplZFBhdGggPSBub3JtYWxpemVGb3JNYXRjaChyLnBhdGgpOyJ9LHsicGF0aCI6InBhY2thZ2UtbWFuYWdlci50ZXN0LnRzIiwibGluZSI6MzEsInRleHQiOiIgIGNvbnN0IG5vcm1hbGl6ZWRNYXRjaCA9IG5vcm1hbGl6ZUZvck1hdGNoKHBhdGhNYXRjaCk7In0seyJwYXRoIjoicGFja2FnZS1tYW5hZ2VyLnRlc3QudHMiLCJsaW5lIjozMiwidGV4dCI6IiAgcmV0dXJuIG1hdGNoRm4gPT09IFwiZW5kc1dpdGhcIiJ9LHsicGF0aCI6InBhY2thZ2UtbWFuYWdlci50ZXN0LnRzIiwibGluZSI6MzMsInRleHQiOiIgID8gbm9ybWFsaXplZFBhdGguZW5kc1dpdGgobm9ybWFsaXplZE1hdGNoKSAmJiByLmVuYWJsZWQifSx7InBhdGgiOiJwYWNrYWdlLW1hbmFnZXIudGVzdC50cyIsImxpbmUiOjM0LCJ0ZXh0IjoiICA6IG5vcm1hbGl6ZWRQYXRoLmluY2x1ZGVzKG5vcm1hbGl6ZWRNYXRjaCkgJiYgci5lbmFibGVkOyJ9LHsicGF0aCI6InBhY2thZ2UtbWFuYWdlci50ZXN0LnRzIiwibGluZSI6MzUsInRleHQiOiIgIH07In0seyJwYXRoIjoicGFja2FnZS1tYW5hZ2VyLnRlc3QudHMiLCJsaW5lIjozNiwidGV4dCI6IiAgIn0seyJwYXRoIjoicGFja2FnZS1tYW5hZ2VyLnRlc3QudHMiLCJsaW5lIjozNywidGV4dCI6IiAgY29uc3QgaXNEaXNhYmxlZCA9IChyOiBSZXNvbHZlZFJlc291cmNlLCBwYXRoTWF0Y2g6IHN0cmluZywgbWF0Y2hGbjogXCJlbmRzV2l0aFwiIHwgXCJpbmNsdWRlc1wiID0gXCJlbmRzV2l0aFwiKSA9PiB7In0seyJwYXRoIjoicGFja2FnZS1tYW5hZ2VyLnRlc3QudHMiLCJsaW5lIjozOCwidGV4dCI6IiAgY29uc3Qgbm9ybWFsaXplZFBhdGggPSBub3JtYWxpemVGb3JNYXRjaChyLnBhdGgpOyJ9LHsicGF0aCI6InBhY2thZ2UtbWFuYWdlci50ZXN0LnRzIiwibGluZSI6MzksInRleHQiOiIgIGNvbnN0IG5vcm1hbGl6ZWRNYXRjaCA9IG5vcm1hbGl6ZUZvck1hdGNoKHBhdGhNYXRjaCk7In0seyJwYXRoIjoicGFja2FnZS1tYW5hZ2VyLnRlc3QudHMiLCJsaW5lIjo0MCwidGV4dCI6IiAgcmV0dXJuIG1hdGNoRm4gPT09IFwiZW5kc1dpdGhcIiJ9LHsicGF0aCI6InBhY2thZ2UtbWFuYWdlci50ZXN0LnRzIiwibGluZSI6NDEsInRleHQiOiIgID8gbm9ybWFsaXplZFBhdGguZW5kc1dpdGgobm9ybWFsaXplZE1hdGNoKSAmJiAhci5lbmFibGVkIn0seyJwYXRoIjoicGFja2FnZS1tYW5hZ2VyLnRlc3QudHMiLCJsaW5lIjo0MiwidGV4dCI6IiAgOiBub3JtYWxpemVkUGF0aC5pbmNsdWRlcyhub3JtYWxpemVkTWF0Y2gpICYmICFyLmVuYWJsZWQ7In0seyJwYXRoIjoicGFja2FnZS1tYW5hZ2VyLnRlc3QudHMiLCJsaW5lIjo0MywidGV4dCI6IiAgfTsifSx7InBhdGgiOiJwYWNrYWdlLW1hbmFnZXIudGVzdC50cyIsImxpbmUiOjQ0LCJ0ZXh0IjoiICAifSx7InBhdGgiOiJwYWNrYWdlLW1hbmFnZXIudGVzdC50cyIsImxpbmUiOjQ1LCJ0ZXh0IjoiICBkZXNjcmliZShcIkRlZmF1bHRQYWNrYWdlTWFuYWdlclwiLCAoKSA9PiB7In0seyJwYXRoIjoicGFja2FnZS1tYW5hZ2VyLnRlc3QudHMiLCJsaW5lIjo0NiwidGV4dCI6IiAgbGV0IHRlbXBEaXI6IHN0cmluZzsifSx7InBhdGgiOiJwYWNrYWdlLW1hbmFnZXIudGVzdC50cyIsImxpbmUiOjQ3LCJ0ZXh0IjoiICBsZXQgYWdlbnREaXI6IHN0cmluZzsifSx7InBhdGgiOiJwYWNrYWdlLW1hbmFnZXIudGVzdC50cyIsImxpbmUiOjQ4LCJ0ZXh0IjoiICBsZXQgc2V0dGluZ3NNYW5hZ2VyOiBTZXR0aW5nc01hbmFnZXI7In0seyJwYXRoIjoicGFja2FnZS1tYW5hZ2VyLnRlc3QudHMiLCJsaW5lIjo0OSwidGV4dCI6IiAgbGV0IHBhY2thZ2VNYW5hZ2VyOiBEZWZhdWx0UGFja2FnZU1hbmFnZXI7In0seyJwYXRoIjoicGFja2FnZS1tYW5hZ2VyLnRlc3QudHMiLCJsaW5lIjo1MCwidGV4dCI6IiAgbGV0IHByZXZpb3VzT2ZmbGluZUVudjogc3RyaW5nIHwgdW5kZWZpbmVkOyJ9LHsicGF0aCI6InBhY2thZ2UtbWFuYWdlci50ZXN0LnRzIiwibGluZSI6NTEsInRleHQiOiIgICJ9LHsicGF0aCI6InBhY2thZ2UtbWFuYWdlci50ZXN0LnRzIiwibGluZSI6NTIsInRleHQiOiJiZWZvcmVFYWNoKCgpID0+IHsifSx7InBhdGgiOiJwYWNrYWdlLW1hbmFnZXIudGVzdC50cyIsImxpbmUiOjUzLCJ0ZXh0IjoiICBwcmV2aW91c09mZmxpbmVFbnYgPSBwcm9jZXNzLmVudi5QSV9PRkZMSU5FOyJ9LHsicGF0aCI6InBhY2thZ2UtbWFuYWdlci50ZXN0LnRzIiwibGluZSI6NTQsInRleHQiOiIgIGRlbGV0ZSBwcm9jZXNzLmVudi5QSV9PRkZMSU5FOyJ9LHsicGF0aCI6InBhY2thZ2UtbWFuYWdlci50ZXN0LnRzIiwibGluZSI6NTUsInRleHQiOiIgIHRlbXBEaXIgPSBqb2luKHRtcGRpcigpLCBgcG0tdGVzdC0ke0RhdGUubm93KCl9LSR7TWF0aC5yYW5kb20oKS50b1N0cmluZygzNikuc2xpY2UoMil9YCk7In0seyJwYXRoIjoicGFja2FnZS1tYW5hZ2VyLnRlc3QudHMiLCJsaW5lIjo1NiwidGV4dCI6IiAgbWtkaXJTeW5jKHRlbXBEaXIsIHsgcmVjdXJzaXZlOiB0cnVlIH0pOyJ9LHsicGF0aCI6InBhY2thZ2UtbWFuYWdlci50ZXN0LnRzIiwibGluZSI6NTcsInRleHQiOiIgIGFnZW50RGlyID0gam9pbih0ZW1wRGlyLCBcImFnZW50XCIpOyJ9LHsicGF0aCI6InBhY2thZ2UtbWFuYWdlci50ZXN0LnRzIiwibGluZSI6NTgsInRleHQiOiIgIG1rZGlyU3luYyhhZ2VudERpciwgeyByZWN1cnNpdmU6IHRydWUgfSk7In0seyJwYXRoIjoicGFja2FnZS1tYW5hZ2VyLnRlc3QudHMiLCJsaW5lIjo1OSwidGV4dCI6IiAgIn0seyJwYXRoIjoicGFja2FnZS1tYW5hZ2VyLnRlc3QudHMiLCJsaW5lIjo2MCwidGV4dCI6IiAgc2V0dGluZ3NNYW5hZ2VyID0gU2V0dGluZ3NNYW5hZ2VyLmluTWVtb3J5KCk7In0seyJwYXRoIjoicGFja2FnZS1tYW5hZ2VyLnRlc3QudHMiLCJsaW5lIjo2MSwidGV4dCI6IiAgcGFja2FnZU1hbmFnZXIgPSBuZXcgRGVmYXVsdFBhY2thZ2VNYW5hZ2VyKHsifSx7InBhdGgiOiJwYWNrYWdlLW1hbmFnZXIudGVzdC50cyIsImxpbmUiOjYyLCJ0ZXh0IjoiICBjd2Q6IHRlbXBEaXIsIn0seyJwYXRoIjoicGFja2FnZS1tYW5hZ2VyLnRlc3QudHMiLCJsaW5lIjo2MywidGV4dCI6IiAgYWdlbnREaXIsIn0seyJwYXRoIjoicGFja2FnZS1tYW5hZ2VyLnRlc3QudHMiLCJsaW5lIjo2NCwidGV4dCI6IiAgc2V0dGluZ3NNYW5hZ2VyLCJ9LHsicGF0aCI6InBhY2thZ2UtbWFuYWdlci50ZXN0LnRzIiwibGluZSI6NjUsInRleHQiOiIgIH0pOyJ9LHsicGF0aCI6InBhY2thZ2UtbWFuYWdlci50ZXN0LnRzIiwibGluZSI6NjYsInRleHQiOiIgIH0pOyJ9LHsicGF0aCI6InBhY2thZ2UtbWFuYWdlci50ZXN0LnRzIiwibGluZSI6NjcsInRleHQiOiIgICJ9LHsicGF0aCI6InBhY2thZ2UtbWFuYWdlci50ZXN0LnRzIiwibGluZSI6NjgsInRleHQiOiIgIGFmdGVyRWFjaCgoKSA9PiB7In0seyJwYXRoIjoicGFja2FnZS1tYW5hZ2VyLnRlc3QudHMiLCJsaW5lIjo2OSwidGV4dCI6IiAgaWYgKHByZXZpb3VzT2ZmbGluZUVudiA9PT0gdW5kZWZpbmVkKSB7In0seyJwYXRoIjoicGFja2FnZS1tYW5hZ2VyLnRlc3QudHMiLCJsaW5lIjo3MCwidGV4dCI6IiAgZGVsZXRlIHByb2Nlc3MuZW52LlBJX09GRkxJTkU7In0seyJwYXRoIjoicGFja2FnZS1tYW5hZ2VyLnRlc3QudHMiLCJsaW5lIjo3MSwidGV4dCI6IiAgfSBlbHNlIHsifSx7InBhdGgiOiJwYWNrYWdlLW1hbmFnZXIudGVzdC50cyIsImxpbmUiOjcyLCJ0ZXh0IjoiICBwcm9jZXNzLmVudi5QSV9PRkZMSU5FID0gcHJldmlvdXNPZmZsaW5lRW52OyJ9LHsicGF0aCI6InBhY2thZ2UtbWFuYWdlci50ZXN0LnRzIiwibGluZSI6NzMsInRleHQiOiIgIH0ifSx7InBhdGgiOiJwYWNrYWdlLW1hbmFnZXIudGVzdC50cyIsImxpbmUiOjc0LCJ0ZXh0IjoiICB2aS5yZXN0b3JlQWxsTW9ja3MoKTsifSx7InBhdGgiOiJwYWNrYWdlLW1hbmFnZXIudGVzdC50cyIsImxpbmUiOjc1LCJ0ZXh0IjoiICB2aS51bnN0dWJBbGxHbG9iYWxzKCk7In0seyJwYXRoIjoicGFja2FnZS1tYW5hZ2VyLnRlc3QudHMiLCJsaW5lIjo3NiwidGV4dCI6IiAgcm1TeW5jKHRlbXBEaXIsIHsgcmVjdXJzaXZlOiB0cnVlLCBmb3JjZTogdHJ1ZSB9KTsifSx7InBhdGgiOiJwYWNrYWdlLW1hbmFnZXIudGVzdC50cyIsImxpbmUiOjc3LCJ0ZXh0IjoiICB9KTsifSx7InBhdGgiOiJwYWNrYWdlLW1hbmFnZXIudGVzdC50cyIsImxpbmUiOjc4LCJ0ZXh0IjoiICAifSx7InBhdGgiOiJwYWNrYWdlLW1hbmFnZXIudGVzdC50cyIsImxpbmUiOjc5LCJ0ZXh0IjoiICBkZXNjcmliZShcInJlc29sdmVcIiwgKCkgPT4geyJ9LHsicGF0aCI6InBhY2thZ2UtbWFuYWdlci50ZXN0LnRzIiwibGluZSI6ODAsInRleHQiOiIgIGl0KFwic2hvdWxkIHJldHVybiBubyBwYWNrYWdlLXNvdXJjZWQgcGF0aHMgd2hlbiBubyBzb3VyY2VzIGNvbmZpZ3VyZWRcIiwgYXN5bmMgKCkgPT4geyJ9LHsicGF0aCI6InBhY2thZ2UtbWFuYWdlci50ZXN0LnRzIiwibGluZSI6ODEsInRleHQiOiIgIGNvbnN0IHJlc3VsdCA9IGF3YWl0IHBhY2thZ2VNYW5hZ2VyLnJlc29sdmUoKTsifSx7InBhdGgiOiJwYWNrYWdlLW1hbmFnZXIudGVzdC50cyIsImxpbmUiOjgyLCJ0ZXh0IjoiICBleHBlY3QocmVzdWx0LmV4dGVuc2lvbnMpLnRvRXF1YWwoW10pOyJ9XX0sImlzRXJyb3IiOmZhbHNlLCJ0aW1lc3RhbXAiOjE3Nzc1NjQyODg3NjF9fSx7InR5cGUiOiJtZXNzYWdlIiwiaWQiOiJhM2E2NGYzZSIsInBhcmVudElkIjoiODg0YjU1MzEiLCJ0aW1lc3RhbXAiOiIyMDI2LTA0LTMwVDE1OjUxOjQwLjU3OFoiLCJtZXNzYWdlIjp7InJvbGUiOiJhc3Npc3RhbnQiLCJjb250ZW50IjpbeyJ0eXBlIjoidGhpbmtpbmciLCJ0aGlua2luZyI6IiBJIHNlZS4gVGhlIHRlc3Qgc3ltbGlua3MgYHNoYXJlZFNraWxsc0RpcmAgdG8gYm90aCBgYWdlbnREaXIvc2tpbGxzYCAodXNlciBzY29wZSkgYW5kIGB0ZW1wRGlyLy5waS9za2lsbHNgIChwcm9qZWN0IHNjb3BlKS4gVGhlIHRlc3QgZXhwZWN0cyBvbmx5IDEgc2tpbGwgYmVjYXVzZSB0aGUgY2Fub25pY2FsaXphdGlvbiBzaG91bGQgZGVkdXBlIHRoZW0gc2luY2UgdGhleSBwb2ludCB0byB0aGUgc2FtZSBwaHlzaWNhbCBmaWxlLlxuXG5MZXQgbWUgY2hlY2sgdGhlIHRlc3QgYWdhaW4gYW5kIHVuZGVyc3RhbmQgdGhlIGlzc3VlOlxuXG4xLiBUaGUgdGVzdCBzeW1saW5rcyBhIHNoYXJlZCBza2lsbHMgZGlyZWN0b3J5IHRvIGJvdGggdXNlciAoYGFnZW50RGlyL3NraWxsc2ApIGFuZCBwcm9qZWN0IChgdGVtcERpci8ucGkvc2tpbGxzYClcbjIuIFRoZSBza2lsbCBpcyBkaXNjb3ZlcmVkIHR3aWNlIHZpYSBhdXRvLWRpc2NvdmVyeVxuMy4gVGhlIGB0b1Jlc29sdmVkUGF0aHNgIG1ldGhvZCBzaG91bGQgZGVkdXBlIGJ5IGNhbm9uaWNhbCBwYXRoXG5cblRoZSBpc3N1ZSBpcyB0aGF0IHRoZSBza2lsbHMgYXJlIGJlaW5nIGRpc2NvdmVyZWQgZnJvbTpcbjEuIGB1c2VyRGlycy5za2lsbHNgICh3aGljaCBpcyBgYWdlbnREaXIvc2tpbGxzYCAtPiBzeW1saW5rcyB0byBgc2hhcmVkU2tpbGxzRGlyYCkgIFxuMi4gYHByb2plY3REaXJzLnNraWxsc2AgKHdoaWNoIGlzIGB0ZW1wRGlyLy5waS9za2lsbHNgIC0+IHN5bWxpbmtzIHRvIGBzaGFyZWRTa2lsbHNEaXJgKVxuXG5Cb3RoIHNob3VsZCByZXNvbHZlIHRvIHRoZSBzYW1lIGNhbm9uaWNhbCBwYXRoIGFuZCBiZSBkZWR1cGVkIGJ5IGB0b1Jlc29sdmVkUGF0aHNgLiBMZXQgbWUgY2hlY2sgaWYgdGhlcmUncyBhbiBpc3N1ZSB3aXRoIHRoZSBwYXRoIGNhbm9uaWNhbGl6YXRpb24gb3IgaWYgc29tZXRoaW5nIGVsc2UgaXMgZ29pbmcgb24uIExldCBtZSBsb29rIG1vcmUgY2FyZWZ1bGx5IGF0IHRoZSB0ZXN0IGFuZCB1bmRlcnN0YW5kIHdoYXQncyBoYXBwZW5pbmcuIFRoZSB0ZXN0IGlzIGF0IGxpbmUgMTYxIGFuZCB0aGUgYXNzZXJ0aW9uIGV4cGVjdHMgMSBza2lsbCBidXQgZ2V0cyAyLlxuXG5XYWl0LCBJIHRoaW5rIEkgc2VlIHRoZSBpc3N1ZS4gVGhlIHRlc3QgY3JlYXRlczpcbi0gYGFnZW50RGlyYCBhdCBgam9pbih0ZW1wRGlyLCBcImFnZW50XCIpYCBcbi0gQnV0IHRoZW4gdGhlIHByb2plY3QgLnBpIGlzIGF0IGBqb2luKHRlbXBEaXIsIFwiLnBpXCIpYFxuXG5BbmQgaXQgc3ltbGlua3MgYHNoYXJlZFNraWxsc0RpcmAgdG8gYm90aCBgYWdlbnREaXIvc2tpbGxzYCBhbmQgYHRlbXBEaXIvLnBpL3NraWxsc2AuXG5cbkJ1dCB3YWl0IC0gdGhlIHVzZXIgYC5hZ2VudHNgIGRpcmVjdG9yeSB3b3VsZCBhbHNvIGJlIGNoZWNrZWQgc2luY2UgYHRlbXBEaXJgIGlzIHVzZWQgYXMgdGhlIGhvbWUgZGlyZWN0b3J5IGluIHRoZSB0ZXN0IGVudmlyb25tZW50LiBMZXQgbWUgY2hlY2sgaWYgdGhhdCdzIHRoZSBjYXNlLi4uXG5cbkFjdHVhbGx5IG5vLCBsb29raW5nIGF0IHRoZSB0ZXN0IHNldHVwLCBgcHJvY2Vzcy5lbnYuSE9NRWAgaXMgbm90IGJlaW5nIG1vZGlmaWVkIGluIHRoaXMgdGVzdCwgc28gdGhlIHVzZXIncyBgLmFnZW50c2AgZGlyZWN0b3J5IHdvdWxkIGJlIHRoZSByZWFsIGhvbWUgZGlyZWN0b3J5LCBub3QgdGhlIHRlbXAgZGlyZWN0b3J5LlxuXG5MZXQgbWUgdHJhY2UgdGhyb3VnaCB3aGF0J3MgaGFwcGVuaW5nOlxuMS4gVXNlciBza2lsbHMgZnJvbSBgYWdlbnREaXIvc2tpbGxzYCAod2hpY2ggaXMgYHRlbXBEaXIvYWdlbnQvc2tpbGxzYCBzeW1saW5rZWQgdG8gYHNoYXJlZFNraWxsc0RpcmApIFxuXG5cbjIuIFByb2plY3Qgc2tpbGxzIGZyb20gYHRlbXBEaXIvLnBpL3NraWxsc2AgKGFsc28gc3ltbGlua2VkIHRvIGBzaGFyZWRTa2lsbHNEaXJgKVxuXG5Cb3RoIHBhdGhzIHNob3VsZCBjYW5vbmljYWxpemUgdG8gdGhlIHNhbWUgdW5kZXJseWluZyBwYXRoIGFuZCBiZSBkZWR1cGxpY2F0ZWQuIFRoZSBkZWR1cGxpY2F0aW9uIGhhcHBlbnMgaW4gYHRvUmVzb2x2ZWRQYXRoc2AgdXNpbmcgYGNhbm9uaWNhbGl6ZVBhdGhgLCB3aGljaCBjYWxscyBgcmVhbHBhdGhTeW5jYC4gSSBuZWVkIHRvIHZlcmlmeSB0aGUgZXhhY3QgcGF0aHMgYmVpbmcgZ2VuZXJhdGVkIC0gYHVzZXJEaXJzLnNraWxsc2AgcmVzb2x2ZXMgdG8gYGFnZW50RGlyL3NraWxsc2Agd2hpY2ggaXMgYCR7dGVtcERpcn0vYWdlbnQvc2tpbGxzYCwgd2hpbGUgdGhlIHByb2plY3Qgc2tpbGxzIHBhdGggaXMgYCR7dGVtcERpcn0vLnBpL3NraWxsc2AuXG5cblRoZXNlIHN5bWxpbmsgdG8gdGhlIHNhbWUgYHNoYXJlZFNraWxsc0RpcmAsIHNvIHRoZXkgc2hvdWxkIGNhbm9uaWNhbGl6ZSB0byBpZGVudGljYWwgcGF0aHMgYW5kIHRyaWdnZXIgZGVkdXBsaWNhdGlvbi4gSG93ZXZlciwgdGhlIHRlc3QgaXMgZmFpbGluZyB3aXRoIDIgc2tpbGxzIGluc3RlYWQgb2YgMSwgd2hpY2ggc3VnZ2VzdHMgdGhlIGRlZHVwbGljYXRpb24gaXNuJ3Qgd29ya2luZyBhcyBleHBlY3RlZC4gTG9va2luZyBhdCBob3cgdGhlIHNraWxscyBhcmUgYmVpbmcgYWRkZWQsIHRoZSBsb2dpYyBwcm9jZXNzZXMgdXNlciBza2lsbHMgZnJvbSBgLnBpL2FnZW50L3NraWxsc2AgZmlyc3QsIHRoZW4gY2hlY2tzIHRoZSBgLmFnZW50cy9za2lsbHNgIGRpcmVjdG9yeSBzZXBhcmF0ZWx5LlxuXG5UaGUgaXNzdWUgaXMgdGhhdCB3aGVuIEkgaXRlcmF0ZSB0aHJvdWdoIGBwcm9qZWN0QWdlbnRzU2tpbGxEaXJzYCwgSSdtIGNhbGxpbmcgYGNvbGxlY3RBdXRvU2tpbGxFbnRyaWVzYCBvbiBlYWNoIGRpcmVjdG9yeSBhbmQgYWRkaW5nIHRoZW0gaW5kaXZpZHVhbGx5LCBidXQgdGhlIGRlZHVwbGljYXRpb24gdmlhIGBjYW5vbmljYWxpemVQYXRoYCBzaG91bGQgaGFwcGVuIGxhdGVyIGluIGB0b1Jlc29sdmVkUGF0aHNgLiBTaW5jZSBib3RoIHRoZSB1c2VyIGFuZCBwcm9qZWN0IHBhdGhzIHJlc29sdmUgdG8gdGhlIHNhbWUgY2Fub25pY2FsIGxvY2F0aW9uLCB0aGV5IHNob3VsZCBiZSBjb2xsYXBzZWQgaW50byBhIHNpbmdsZSBlbnRyeS4gSSBuZWVkIHRvIHRyYWNlIHRocm91Z2ggdGhlIGFjdHVhbCB0ZXN0IGNhc2UgdG8gdW5kZXJzdGFuZCB3aHkgdGhlIGRlZHVwbGljYXRpb24gaXNuJ3QgY2F0Y2hpbmcgdGhpcyBkdXBsaWNhdGlvbi5cblxuVGhlIHRlc3Qgc3ltbGlua3MgYHNoYXJlZFNraWxsc0RpcmAgdG8gYm90aCBgYWdlbnREaXIvc2tpbGxzYCBhbmQgYHRlbXBEaXIvLnBpL3NraWxsc2AsIHdoaWNoIG1lYW5zIHRoZSBza2lsbCBnZXRzIGRpc2NvdmVyZWQgdHdpY2XigJRvbmNlIGZyb20gdGhlIHVzZXIgZGlyZWN0b3J5IGFuZCBvbmNlIGZyb20gdGhlIHByb2plY3QgZGlyZWN0b3J5LiBCb3RoIHBhdGhzIHNob3VsZCBjYW5vbmljYWxpemUgdG8gdGhlIHNhbWUgdW5kZXJseWluZyBmaWxlLCBzbyB0aGUgZGVkdXBsaWNhdGlvbiBsb2dpYyBzaG91bGQgaGFuZGxlIGl0LiBJIHNob3VsZCBydW4gdGhlIHNwZWNpZmljIHRlc3QgaW4gaXNvbGF0aW9uIHRvIHNlZSBpZiB0aGVyZSdzIHNvbWV0aGluZyBlbHNlIGdvaW5nIG9uLlxuXG5BY3R1YWxseSwgbG9va2luZyBhdCB0aGUgdGVzdCByZXN1bHRzIG1vcmUgY2FyZWZ1bGx5LCB0aGVyZSBhcmUgOTkgdGVzdHMgdG90YWwgYnV0IG9ubHkgOTggcGFzc2VkLCB3aGljaCBzdWdnZXN0cyB0aGlzIGlzIGEgZ2VudWluZSBpc3N1ZSB3aXRoIG15IGNoYW5nZXMuIFRoZSBuZXcgYXV0by1kaXNjb3ZlcnkgbWV0YWRhdGEgdGVzdHMgYXJlIGFsbCBwYXNzaW5nLCBzbyB0aGUgcHJvYmxlbSBsaWtlbHkgbGllcyBlbHNld2hlcmUgaW4gaG93IHRoZSBkZWR1cGxpY2F0aW9uIGlzIHdvcmtpbmcuXG5cbldoZW4gSSBsb29wIHRocm91Z2ggYHByb2plY3RBZ2VudHNTa2lsbERpcnNgLCBJIG1pZ2h0IGJlIGNyZWF0aW5nIHNlcGFyYXRlIG1ldGFkYXRhIG9iamVjdHMgZm9yIGVhY2ggZGlyZWN0b3J5LCB3aGljaCBjb3VsZCBpbnRlcmZlcmUgd2l0aCB0aGUgY2Fub25pY2FsaXphdGlvbiBwcm9jZXNzLiBJIHNob3VsZCBhZGQgdGhlIHNraWxsIHBhdGhzIHdpdGggdGhlaXIgbWV0YWRhdGEgdG8gdGhlIGFjY3VtdWxhdG9yIGFuZCBsZXQgYHRvUmVzb2x2ZWRQYXRoc2AgaGFuZGxlIHRoZSBkZWR1cGxpY2F0aW9uIGJ5IGNhbm9uaWNhbGl6aW5nIHRoZSBwYXRocy4gVGhlIHRlc3QgZmFpbHVyZSBtaWdodCBiZSBjYXVzZWQgYnkgdGhlIGBiYXNlRGlyYCBpbiBgbWV0YWRhdGFgIGRpZmZlcmluZyBiZXR3ZWVuIGVudHJpZXMsIG9yIHBlcmhhcHMgdGhlcmUncyBhbiBpc3N1ZSB3aXRoIGhvdyB0aGUgcGF0aHMgYXJlIGJlaW5nIHJlc29sdmVkLiBJIHNob3VsZCBydW4gdGhlIHRlc3QgaW4gaXNvbGF0aW9uIHRvIHNlZSBpZiBpdCBwYXNzZXMgb24gaXRzIG93biwgb3IgaWYgdGhlIGZhaWx1cmUgb25seSBvY2N1cnMgd2hlbiBydW5uaW5nIHRoZSBmdWxsIHRlc3Qgc3VpdGUuIFRoZSBwcm9ibGVtIGNvdWxkIGJlIHRoYXQgdGhlIEhPTUUgZGlyZWN0b3J5IGlzIGxlYWtpbmcgYmV0d2VlbiB0ZXN0c+KAlGlmIGEgcHJldmlvdXMgdGVzdCBzZXRzIEhPTUUgdG8gYHRlbXBEaXJgLCB0aGVuIGB+Ly5hZ2VudHMvc2tpbGxzYCB3b3VsZCByZXNvbHZlIHRvIGB0ZW1wRGlyLy5hZ2VudHMvc2tpbGxzYCwgd2hpY2ggbWlnaHQgZXhpc3QgZnJvbSBhbm90aGVyIHRlc3QgY2FzZS4gSSBuZWVkIHRvIGNoZWNrIGhvdyBgZ2V0SG9tZURpcigpYCBpcyBpbXBsZW1lbnRlZCB0byB1bmRlcnN0YW5kIGlmIGl0J3MgY2FjaGluZyB0aGUgSE9NRSB2YWx1ZSBvciByZWFkaW5nIGl0IGZyZXNoIGVhY2ggdGltZS5cblxuTG9va2luZyBhdCB0aGUgaW1wbGVtZW50YXRpb24sIGBnZXRIb21lRGlyKClgIGNoZWNrcyBgcHJvY2Vzcy5lbnYuSE9NRWAgZmlyc3QgYmVmb3JlIGZhbGxpbmcgYmFjayB0byBgb3MuaG9tZWRpcigpYC4gU28gaWYgYSB0ZXN0IHNldHMgYHByb2Nlc3MuZW52LkhPTUVgIGFuZCBkb2Vzbid0IGNsZWFuIGl0IHVwIHByb3Blcmx5LCBzdWJzZXF1ZW50IHRlc3RzIHdvdWxkIHVzZSB0aGF0IHZhbHVlIGluc3RlYWQgb2YgdGhlIHJlYWwgaG9tZSBkaXJlY3RvcnkuIFRoaXMgY291bGQgZXhwbGFpbiB3aHkgdGhlIHNraWxsIGlzIGJlaW5nIGRpc2NvdmVyZWQgZnJvbSBhbiB1bmV4cGVjdGVkIGxvY2F0aW9u4oCUdGhlIGAuYWdlbnRzL3NraWxsc2AgZGlyZWN0b3J5IGZyb20gYSBwcmV2aW91cyB0ZXN0J3MgdGVtcCBmb2xkZXIgaXMgYmVpbmcgcGlja2VkIHVwIGJlY2F1c2UgSE9NRSB3YXNuJ3QgcmVzZXQuIFRoZSBkZWR1cGxpY2F0aW9uIGxvZ2ljIG9ubHkgcmVtb3ZlcyBleGFjdCBjYW5vbmljYWwgcGF0aCBkdXBsaWNhdGVzLCBzbyBpZiB0aGUgc2FtZSBza2lsbCBmaWxlIGV4aXN0cyBpbiB0d28gZGlmZmVyZW50IGxvY2F0aW9ucyAodGhlIHJlYWwgaG9tZSBkaXJlY3RvcnkgYW5kIGEgdGVtcCBkaXJlY3RvcnkgZnJvbSBhIHByZXZpb3VzIHRlc3QpLCBib3RoIHdvdWxkIGJlIGtlcHQuXG5cbkxvb2tpbmcgYXQgdGhlIGB0b1Jlc29sdmVkUGF0aHNgIG1ldGhvZCwgSSBjYW4gc2VlIGl0IGNyZWF0ZXMgYSBTZXQgb2Ygc2VlbiBjYW5vbmljYWwgcGF0aHMgYW5kIGZpbHRlcnMgb3V0IGR1cGxpY2F0ZXMuIFRoZSBpc3N1ZSBpcyB0aGF0IG15IGNoYW5nZXMgbWlnaHQgYmUgY3JlYXRpbmcgbXVsdGlwbGUgZW50cmllcyB0aGF0IGRvbid0IGdldCBjYXVnaHQgYnkgdGhpcyBkZWR1cGxpY2F0aW9uLiBJIHNob3VsZCBydW4gdGhlIHNwZWNpZmljIHRlc3QgaW4gaXNvbGF0aW9uIHRvIHNlZSBpZiBpdCBwYXNzZXMgb24gaXRzIG93biwgd2hpY2ggd291bGQgY29uZmlybSB3aGV0aGVyIHRoZSBwcm9ibGVtIGlzIHRlc3QgcG9sbHV0aW9uIG9yIGFuIGFjdHVhbCBidWcgaW4gdGhlIiwidGhpbmtpbmdTaWduYXR1cmUiOiJyZWFzb25pbmcifSx7InR5cGUiOiJ0b29sQ2FsbCIsImlkIjoiZnVuY3Rpb25zLmJhc2g6MTMiLCJuYW1lIjoiYmFzaCIsImFyZ3VtZW50cyI6eyJjb21tYW5kIjoiY2QgcGFja2FnZXMvY29kaW5nLWFnZW50ICYmIG5weCB0c3ggLi4vLi4vbm9kZV9tb2R1bGVzL3ZpdGVzdC9kaXN0L2NsaS5qcyAtLXJ1biB0ZXN0L3BhY2thZ2UtbWFuYWdlci50ZXN0LnRzIC10IFwic2hvdWxkIHJlc29sdmUgc3ltbGlua2VkIHVzZXIgYW5kIHByb2plY3QgcmVzb3VyY2VzIG9uY2VcIiAyPiYxIn19XSwiYXBpIjoib3BlbmFpLWNvbXBsZXRpb25zIiwicHJvdmlkZXIiOiJzeW50aGV0aWMiLCJtb2RlbCI6ImhmOm1vb25zaG90YWkvS2ltaS1LMi41IiwidXNhZ2UiOnsiaW5wdXQiOjE2NDcsIm91dHB1dCI6MTM2NSwiY2FjaGVSZWFkIjo0Njc4NCwiY2FjaGVXcml0ZSI6MCwidG90YWxUb2tlbnMiOjQ5Nzk2LCJjb3N0Ijp7ImlucHV0IjowLjAwMDc0MTE1MDAwMDAwMDAwMDEsIm91dHB1dCI6MC4wMDQ2NDEsImNhY2hlUmVhZCI6MC4wMjEwNTI4LCJjYWNoZVdyaXRlIjowLCJ0b3RhbCI6MC4wMjY0MzQ5NX19LCJzdG9wUmVhc29uIjoidG9vbFVzZSIsInRpbWVzdGFtcCI6MTc3NzU2NDI4ODc2MiwicmVzcG9uc2VJZCI6ImNoYXRjbXBsLWEyNDdhMGI3NTY1NGRkNzIifX0seyJ0eXBlIjoibWVzc2FnZSIsImlkIjoiOTE1YmUyYjEiLCJwYXJlbnRJZCI6ImEzYTY0ZjNlIiwidGltZXN0YW1wIjoiMjAyNi0wNC0zMFQxNTo1MTo0MS41MTJaIiwibWVzc2FnZSI6eyJyb2xlIjoidG9vbFJlc3VsdCIsInRvb2xDYWxsSWQiOiJmdW5jdGlvbnMuYmFzaDoxMyIsInRvb2xOYW1lIjoiYmFzaCIsImNvbnRlbnQiOlt7InR5cGUiOiJ0ZXh0IiwidGV4dCI6IlxuIFJVTiAgdjMuMi40IC9Vc2Vycy9hbGlvdWRpYWxsby9jb2RlL3NyYy9naXRodWIuY29tL2FsaW91L3BpLW1vbm8vcGFja2FnZXMvY29kaW5nLWFnZW50XG5cbiDina8gdGVzdC9wYWNrYWdlLW1hbmFnZXIudGVzdC50cyAoOTkgdGVzdHMgfCAxIGZhaWxlZCB8IDk4IHNraXBwZWQpIDEybXNcbiAgIOKGkyBEZWZhdWx0UGFja2FnZU1hbmFnZXIgPiByZXNvbHZlID4gc2hvdWxkIHJldHVybiBubyBwYWNrYWdlLXNvdXJjZWQgcGF0aHMgd2hlbiBubyBzb3VyY2VzIGNvbmZpZ3VyZWRcbiAgIOKGkyBEZWZhdWx0UGFja2FnZU1hbmFnZXIgPiByZXNvbHZlID4gc2hvdWxkIHJlc29sdmUgbG9jYWwgZXh0ZW5zaW9uIHBhdGhzIGZyb20gc2V0dGluZ3NcbiAgIOKGkyBEZWZhdWx0UGFja2FnZU1hbmFnZXIgPiByZXNvbHZlID4gc2hvdWxkIHJlc29sdmUgc2tpbGwgcGF0aHMgZnJvbSBzZXR0aW5nc1xuICAg4oaTIERlZmF1bHRQYWNrYWdlTWFuYWdlciA+IHJlc29sdmUgPiBzaG91bGQgYXV0by1kaXNjb3ZlciByb290IG1hcmtkb3duIHNraWxscyBmcm9tIC5waSBza2lsbCBkaXJzXG4gICDihpMgRGVmYXVsdFBhY2thZ2VNYW5hZ2VyID4gcmVzb2x2ZSA+IHNob3VsZCByZXNvbHZlIHByb2plY3QgcGF0aHMgcmVsYXRpdmUgdG8gLnBpXG4gICDihpMgRGVmYXVsdFBhY2thZ2VNYW5hZ2VyID4gcmVzb2x2ZSA+IHNob3VsZCBhdXRvLWRpc2NvdmVyIHVzZXIgcHJvbXB0cyB3aXRoIG92ZXJyaWRlc1xuICAgw5cgRGVmYXVsdFBhY2thZ2VNYW5hZ2VyID4gcmVzb2x2ZSA+IHNob3VsZCByZXNvbHZlIHN5bWxpbmtlZCB1c2VyIGFuZCBwcm9qZWN0IHJlc291cmNlcyBvbmNlIDExbXNcbiAgICAg4oaSIGV4cGVjdGVkIHsgZXh0ZW5zaW9uczogMSwgc2tpbGxzOiAyLCDigKYoMikgfSB0byBkZWVwbHkgZXF1YWwgeyBleHRlbnNpb25zOiAxLCBza2lsbHM6IDEsIOKApigyKSB9XG4gICDihpMgRGVmYXVsdFBhY2thZ2VNYW5hZ2VyID4gcmVzb2x2ZSA+IHNob3VsZCBhdXRvLWRpc2NvdmVyIHByb2plY3QgcHJvbXB0cyB3aXRoIG92ZXJyaWRlc1xuICAg4oaTIERlZmF1bHRQYWNrYWdlTWFuYWdlciA+IHJlc29sdmUgPiBzaG91bGQgcmVzb2x2ZSBkaXJlY3Rvcnkgd2l0aCBwYWNrYWdlLmpzb24gcGkuZXh0ZW5zaW9ucyBpbiBleHRlbnNpb25zIHNldHRpbmdcbiAgIOKGkyBEZWZhdWx0UGFja2FnZU1hbmFnZXIgPiBhdXRvLWRpc2NvdmVyZWQgc2tpbGwgbWV0YWRhdGEgPiBzaG91bGQgdXNlIHRoZSBhZ2VudCBkaXIgYXMgYmFzZURpciBmb3IgdXNlciAucGkvYWdlbnQgc2tpbGxzXG4gICDihpMgRGVmYXVsdFBhY2thZ2VNYW5hZ2VyID4gYXV0by1kaXNjb3ZlcmVkIHNraWxsIG1ldGFkYXRhID4gc2hvdWxkIHVzZSB0aGUgcHJvamVjdCAucGkgZGlyIGFzIGJhc2VEaXIgZm9yIHByb2plY3QgLnBpIHNraWxsc1xuICAg4oaTIERlZmF1bHRQYWNrYWdlTWFuYWdlciA+IGF1dG8tZGlzY292ZXJlZCBza2lsbCBtZXRhZGF0YSA+IHNob3VsZCB1c2Ugfi8uYWdlbnRzIGFzIGJhc2VEaXIgZm9yIHVzZXIgLmFnZW50cyBza2lsbHNcbiAgIOKGkyBEZWZhdWx0UGFja2FnZU1hbmFnZXIgPiBhdXRvLWRpc2NvdmVyZWQgc2tpbGwgbWV0YWRhdGEgPiBzaG91bGQgdXNlIGVhY2ggcHJvamVjdCAuYWdlbnRzIGRpciBhcyBiYXNlRGlyIGZvciBwcm9qZWN0IC5hZ2VudHMgc2tpbGxzXG4gICDihpMgRGVmYXVsdFBhY2thZ2VNYW5hZ2VyID4gLmFnZW50cy9za2lsbHMgYXV0by1kaXNjb3ZlcnkgPiBzaG91bGQgc2NhbiAuYWdlbnRzL3NraWxscyBmcm9tIGN3ZCB1cCB0byBnaXQgcmVwbyByb290XG4gICDihpMgRGVmYXVsdFBhY2thZ2VNYW5hZ2VyID4gLmFnZW50cy9za2lsbHMgYXV0by1kaXNjb3ZlcnkgPiBzaG91bGQgc2NhbiAuYWdlbnRzL3NraWxscyB1cCB0byBmaWxlc3lzdGVtIHJvb3Qgd2hlbiBub3QgaW4gYSBnaXQgcmVwb1xuICAg4oaTIERlZmF1bHRQYWNrYWdlTWFuYWdlciA+IC5hZ2VudHMvc2tpbGxzIGF1dG8tZGlzY292ZXJ5ID4gc2hvdWxkIGlnbm9yZSByb290IG1hcmtkb3duIGZpbGVzIGluIC5hZ2VudHMvc2tpbGxzXG4gICDihpMgRGVmYXVsdFBhY2thZ2VNYW5hZ2VyID4gLmFnZW50cy9za2lsbHMgYXV0by1kaXNjb3ZlcnkgPiBzaG91bGQga2VlcCB+Ly5hZ2VudHMvc2tpbGxzIHVzZXItc2NvcGVkIHdoZW4gY3dkIGlzIHVuZGVyIGhvbWUgaW4gYSBub24tZ2l0IGRpcmVjdG9yeVxuICAg4oaTIERlZmF1bHRQYWNrYWdlTWFuYWdlciA+IC5hZ2VudHMvc2tpbGxzIGF1dG8tZGlzY292ZXJ5ID4gc2hvdWxkIGRlZHVwZSB1c2VyIHNraWxsIGVudHJpZXMgd2hlbiB+Ly5waS9hZ2VudC9za2lsbHMgaXMgYSBzeW1saW5rIHRvIH4vLmFnZW50cy9za2lsbHNcbiAgIOKGkyBEZWZhdWx0UGFja2FnZU1hbmFnZXIgPiBpZ25vcmUgZmlsZXMgPiBzaG91bGQgcmVzcGVjdCAuZ2l0aWdub3JlIGluIHNraWxsIGRpcmVjdG9yaWVzXG4gICDihpMgRGVmYXVsdFBhY2thZ2VNYW5hZ2VyID4gaWdub3JlIGZpbGVzID4gc2hvdWxkIG5vdCBhcHBseSBwYXJlbnQgLmdpdGlnbm9yZSB0byAucGkgYXV0by1kaXNjb3ZlcnlcbiAgIOKGkyBEZWZhdWx0UGFja2FnZU1hbmFnZXIgPiByZXNvbHZlRXh0ZW5zaW9uU291cmNlcyA+IHNob3VsZCByZXNvbHZlIGxvY2FsIHBhdGhzXG4gICDihpMgRGVmYXVsdFBhY2thZ2VNYW5hZ2VyID4gcmVzb2x2ZUV4dGVuc2lvblNvdXJjZXMgPiBzaG91bGQgaGFuZGxlIGRpcmVjdG9yaWVzIHdpdGggcGkgbWFuaWZlc3RcbiAgIOKGkyBEZWZhdWx0UGFja2FnZU1hbmFnZXIgPiByZXNvbHZlRXh0ZW5zaW9uU291cmNlcyA+IHNob3VsZCBoYW5kbGUgZGlyZWN0b3JpZXMgd2l0aCBhdXRvLWRpc2NvdmVyeSBsYXlvdXRcbiAgIOKGkyBEZWZhdWx0UGFja2FnZU1hbmFnZXIgPiByZXNvbHZlRXh0ZW5zaW9uU291cmNlcyA+IHNob3VsZCBzdG9wIHJlY3Vyc2luZyB3aGVuIGEgcGFja2FnZSBza2lsbCBkaXJlY3RvcnkgY29udGFpbnMgU0tJTEwubWRcbiAgIOKGkyBEZWZhdWx0UGFja2FnZU1hbmFnZXIgPiBwcm9ncmVzcyBjYWxsYmFjayA+IHNob3VsZCBlbWl0IHByb2dyZXNzIGV2ZW50c1xuICAg4oaTIERlZmF1bHRQYWNrYWdlTWFuYWdlciA+IHdpbmRvd3MgY29tbWFuZCBzcGF3bmluZyA+IHNob3VsZCBhdm9pZCB0aGUgc2hlbGwgZm9yIGdpdCBzbyBXaW5kb3dzIHBhdGhzIHdpdGggc3BhY2VzIHN0YXkgc2luZ2xlIGFyZ3VtZW50c1xuICAg4oaTIERlZmF1bHRQYWNrYWdlTWFuYWdlciA+IG5wbUNvbW1hbmQgPiBzaG91bGQgdXNlIG5wbUNvbW1hbmQgYXJndiBmb3IgbnBtIGluc3RhbGxzXG4gICDihpMgRGVmYXVsdFBhY2thZ2VNYW5hZ2VyID4gbnBtQ29tbWFuZCA+IHNob3VsZCBpbnN0YWxsIGdpdCBwYWNrYWdlIGRlcGVuZGVuY2llcyB3aXRoIC0tb21pdD1kZXZcbiAgIOKGkyBEZWZhdWx0UGFja2FnZU1hbmFnZXIgPiBucG1Db21tYW5kID4gc2hvdWxkIHVzZSBwbGFpbiBpbnN0YWxsIGZvciBnaXQgcGFja2FnZSBkZXBlbmRlbmNpZXMgd2hlbiBucG1Db21tYW5kIGlzIGNvbmZpZ3VyZWRcbiAgIOKGkyBEZWZhdWx0UGFja2FnZU1hbmFnZXIgPiBucG1Db21tYW5kID4gc2hvdWxkIHVwZGF0ZSBnaXQgcGFja2FnZSBkZXBlbmRlbmNpZXMgd2l0aCAtLW9taXQ9ZGV2XG4gICDihpMgRGVmYXVsdFBhY2thZ2VNYW5hZ2VyID4gbnBtQ29tbWFuZCA+IHNob3VsZCB1c2UgcGxhaW4gaW5zdGFsbCB0aHJvdWdoIG5wbUNvbW1hbmQgYXJndiB3aGVuIHVwZGF0aW5nIGdpdCBwYWNrYWdlIGRlcGVuZGVuY2llc1xuICAg4oaTIERlZmF1bHRQYWNrYWdlTWFuYWdlciA+IG5wbUNvbW1hbmQgPiBzaG91bGQgdXNlIG5wbUNvbW1hbmQgYXJndiBmb3IgbnBtIHJvb3QgbG9va3VwIGFuZCBpbnZhbGlkYXRlIGNhY2hlZCByb290IHdoZW4gbnBtQ29tbWFuZCBjaGFuZ2VzXG4gICDihpMgRGVmYXVsdFBhY2thZ2VNYW5hZ2VyID4gc291cmNlIHBhcnNpbmcgPiBzaG91bGQgZW1pdCBwcm9ncmVzcyBldmVudHMgb24gaW5zdGFsbCBhdHRlbXB0XG4gICDihpMgRGVmYXVsdFBhY2thZ2VNYW5hZ2VyID4gc291cmNlIHBhcnNpbmcgPiBzaG91bGQgcmVjb2duaXplIGdpdGh1YiBVUkxzIHdpdGhvdXQgZ2l0OiBwcmVmaXhcbiAgIOKGkyBEZWZhdWx0UGFja2FnZU1hbmFnZXIgPiBzb3VyY2UgcGFyc2luZyA+IHNob3VsZCBwYXJzZSBwYWNrYWdlIHNvdXJjZSB0eXBlcyBmcm9tIGRvY3MgZXhhbXBsZXNcbiAgIOKGkyBEZWZhdWx0UGFja2FnZU1hbmFnZXIgPiBzb3VyY2UgcGFyc2luZyA+IHNob3VsZCBuZXZlciBwYXJzZSBkb3QtcmVsYXRpdmUgcGF0aHMgYXMgZ2l0XG4gICDihpMgRGVmYXVsdFBhY2thZ2VNYW5hZ2VyID4gc2V0dGluZ3Mgc291cmNlIG5vcm1hbGl6YXRpb24gPiBzaG91bGQgc3RvcmUgZ2xvYmFsIGxvY2FsIHBhY2thZ2VzIHJlbGF0aXZlIHRvIGFnZW50IHNldHRpbmdzIGJhc2VcbiAgIOKGkyBEZWZhdWx0UGFja2FnZU1hbmFnZXIgPiBzZXR0aW5ncyBzb3VyY2Ugbm9ybWFsaXphdGlvbiA+IHNob3VsZCBzdG9yZSBwcm9qZWN0IGxvY2FsIHBhY2thZ2VzIHJlbGF0aXZlIHRvIC5waSBzZXR0aW5ncyBiYXNlXG4gICDihpMgRGVmYXVsdFBhY2thZ2VNYW5hZ2VyID4gc2V0dGluZ3Mgc291cmNlIG5vcm1hbGl6YXRpb24gPiBzaG91bGQgcmVtb3ZlIGxvY2FsIHBhY2thZ2UgZW50cmllcyB1c2luZyBlcXVpdmFsZW50IHBhdGggZm9ybXNcbiAgIOKGkyBEZWZhdWx0UGFja2FnZU1hbmFnZXIgPiBIVFRQUyBnaXQgVVJMIHBhcnNpbmcgKG9sZCBiZWhhdmlvcikgPiBzaG91bGQgcGFyc2UgSFRUUFMgR2l0SHViIFVSTHMgY29ycmVjdGx5XG4gICDihpMgRGVmYXVsdFBhY2thZ2VNYW5hZ2VyID4gSFRUUFMgZ2l0IFVSTCBwYXJzaW5nIChvbGQgYmVoYXZpb3IpID4gc2hvdWxkIHBhcnNlIEhUVFBTIFVSTHMgd2l0aCBnaXQ6IHByZWZpeFxuICAg4oaTIERlZmF1bHRQYWNrYWdlTWFuYWdlciA+IEhUVFBTIGdpdCBVUkwgcGFyc2luZyAob2xkIGJlaGF2aW9yKSA+IHNob3VsZCBwYXJzZSBIVFRQUyBVUkxzIHdpdGggcmVmXG4gICDihpMgRGVmYXVsdFBhY2thZ2VNYW5hZ2VyID4gSFRUUFMgZ2l0IFVSTCBwYXJzaW5nIChvbGQgYmVoYXZpb3IpID4gc2hvdWxkIHBhcnNlIGhvc3QvcGF0aCBzaG9ydGhhbmQgb25seSB3aXRoIGdpdDogcHJlZml4XG4gICDihpMgRGVmYXVsdFBhY2thZ2VNYW5hZ2VyID4gSFRUUFMgZ2l0IFVSTCBwYXJzaW5nIChvbGQgYmVoYXZpb3IpID4gc2hvdWxkIHRyZWF0IGhvc3QvcGF0aCBzaG9ydGhhbmQgYXMgbG9jYWwgd2l0aG91dCBnaXQ6IHByZWZpeFxuICAg4oaTIERlZmF1bHRQYWNrYWdlTWFuYWdlciA+IEhUVFBTIGdpdCBVUkwgcGFyc2luZyAob2xkIGJlaGF2aW9yKSA+IHNob3VsZCBwYXJzZSBIVFRQUyBVUkxzIHdpdGggLmdpdCBzdWZmaXhcbiAgIOKGkyBEZWZhdWx0UGFja2FnZU1hbmFnZXIgPiBIVFRQUyBnaXQgVVJMIHBhcnNpbmcgKG9sZCBiZWhhdmlvcikgPiBzaG91bGQgcGFyc2UgR2l0TGFiIEhUVFBTIFVSTHNcbiAgIOKGkyBEZWZhdWx0UGFja2FnZU1hbmFnZXIgPiBIVFRQUyBnaXQgVVJMIHBhcnNpbmcgKG9sZCBiZWhhdmlvcikgPiBzaG91bGQgcGFyc2UgQml0YnVja2V0IEhUVFBTIFVSTHNcbiAgIOKGkyBEZWZhdWx0UGFja2FnZU1hbmFnZXIgPiBIVFRQUyBnaXQgVVJMIHBhcnNpbmcgKG9sZCBiZWhhdmlvcikgPiBzaG91bGQgcGFyc2UgQ29kZWJlcmcgSFRUUFMgVVJMc1xuICAg4oaTIERlZmF1bHRQYWNrYWdlTWFuYWdlciA+IEhUVFBTIGdpdCBVUkwgcGFyc2luZyAob2xkIGJlaGF2aW9yKSA+IHNob3VsZCBnZW5lcmF0ZSBjb3JyZWN0IHBhY2thZ2UgaWRlbnRpdHkgZm9yIHByb3RvY29sIGFuZCBnaXQ6LXByZWZpeGVkIFVSTHNcbiAgIOKGkyBEZWZhdWx0UGFja2FnZU1hbmFnZXIgPiBIVFRQUyBnaXQgVVJMIHBhcnNpbmcgKG9sZCBiZWhhdmlvcikgPiBzaG91bGQgZGVkdXBsaWNhdGUgZ2l0IFVSTHMgd2l0aCBkaWZmZXJlbnQgc3VwcG9ydGVkIGZvcm1hdHNcbiAgIOKGkyBEZWZhdWx0UGFja2FnZU1hbmFnZXIgPiBIVFRQUyBnaXQgVVJMIHBhcnNpbmcgKG9sZCBiZWhhdmlvcikgPiBzaG91bGQgaGFuZGxlIEhUVFBTIFVSTHMgd2l0aCByZWZzIGluIHJlc29sdmVcbiAgIOKGkyBEZWZhdWx0UGFja2FnZU1hbmFnZXIgPiBwYXR0ZXJuIGZpbHRlcmluZyBpbiB0b3AtbGV2ZWwgYXJyYXlzID4gc2hvdWxkIGV4Y2x1ZGUgZXh0ZW5zaW9ucyB3aXRoICEgcGF0dGVyblxuICAg4oaTIERlZmF1bHRQYWNrYWdlTWFuYWdlciA+IHBhdHRlcm4gZmlsdGVyaW5nIGluIHRvcC1sZXZlbCBhcnJheXMgPiBzaG91bGQgZmlsdGVyIHRoZW1lcyB3aXRoIGdsb2IgcGF0dGVybnNcbiAgIOKGkyBEZWZhdWx0UGFja2FnZU1hbmFnZXIgPiBwYXR0ZXJuIGZpbHRlcmluZyBpbiB0b3AtbGV2ZWwgYXJyYXlzID4gc2hvdWxkIGZpbHRlciBwcm9tcHRzIHdpdGggZXhjbHVzaW9uIHBhdHRlcm5cbiAgIOKGkyBEZWZhdWx0UGFja2FnZU1hbmFnZXIgPiBwYXR0ZXJuIGZpbHRlcmluZyBpbiB0b3AtbGV2ZWwgYXJyYXlzID4gc2hvdWxkIGZpbHRlciBza2lsbHMgd2l0aCBleGNsdXNpb24gcGF0dGVyblxuICAg4oaTIERlZmF1bHRQYWNrYWdlTWFuYWdlciA+IHBhdHRlcm4gZmlsdGVyaW5nIGluIHRvcC1sZXZlbCBhcnJheXMgPiBzaG91bGQgd29yayB3aXRob3V0IHBhdHRlcm5zIChiYWNrd2FyZCBjb21wYXRpYmxlKVxuICAg4oaTIERlZmF1bHRQYWNrYWdlTWFuYWdlciA+IHBhdHRlcm4gZmlsdGVyaW5nIGluIHBpIG1hbmlmZXN0ID4gc2hvdWxkIHN1cHBvcnQgZ2xvYiBwYXR0ZXJucyBpbiBtYW5pZmVzdCBleHRlbnNpb25zXG4gICDihpMgRGVmYXVsdFBhY2thZ2VNYW5hZ2VyID4gcGF0dGVybiBmaWx0ZXJpbmcgaW4gcGkgbWFuaWZlc3QgPiBzaG91bGQgc3VwcG9ydCBnbG9iIHBhdHRlcm5zIGluIG1hbmlmZXN0IHNraWxsc1xuICAg4oaTIERlZmF1bHRQYWNrYWdlTWFuYWdlciA+IHBhdHRlcm4gZmlsdGVyaW5nIGluIHBpIG1hbmlmZXN0ID4gc2hvdWxkIGV4cGFuZCBwb3NpdGl2ZSBnbG9iIG1hbmlmZXN0IGVudHJpZXMgYmVmb3JlIGNvbGxlY3Rpbmcgc2tpbGxzXG4gICDihpMgRGVmYXVsdFBhY2thZ2VNYW5hZ2VyID4gcGF0dGVybiBmaWx0ZXJpbmcgaW4gcGFja2FnZSBmaWx0ZXJzID4gc2hvdWxkIGFwcGx5IHVzZXIgZmlsdGVycyBvbiB0b3Agb2YgbWFuaWZlc3QgZmlsdGVycyAobm90IHJlcGxhY2UpXG4gICDihpMgRGVmYXVsdFBhY2thZ2VNYW5hZ2VyID4gcGF0dGVybiBmaWx0ZXJpbmcgaW4gcGFja2FnZSBmaWx0ZXJzID4gc2hvdWxkIGV4Y2x1ZGUgZXh0ZW5zaW9ucyBmcm9tIHBhY2thZ2Ugd2l0aCAhIHBhdHRlcm5cbiAgIOKGkyBEZWZhdWx0UGFja2FnZU1hbmFnZXIgPiBwYXR0ZXJuIGZpbHRlcmluZyBpbiBwYWNrYWdlIGZpbHRlcnMgPiBzaG91bGQgZmlsdGVyIHRoZW1lcyBmcm9tIHBhY2thZ2VcbiAgIOKGkyBEZWZhdWx0UGFja2FnZU1hbmFnZXIgPiBwYXR0ZXJuIGZpbHRlcmluZyBpbiBwYWNrYWdlIGZpbHRlcnMgPiBzaG91bGQgY29tYmluZSBpbmNsdWRlIGFuZCBleGNsdWRlIHBhdHRlcm5zXG4gICDihpMgRGVmYXVsdFBhY2thZ2VNYW5hZ2VyID4gcGF0dGVybiBmaWx0ZXJpbmcgaW4gcGFja2FnZSBmaWx0ZXJzID4gc2hvdWxkIHdvcmsgd2l0aCBkaXJlY3QgcGF0aHMgKG5vIHBhdHRlcm5zKVxuICAg4oaTIERlZmF1bHRQYWNrYWdlTWFuYWdlciA+IGZvcmNlLWluY2x1ZGUgcGF0dGVybnMgPiBzaG91bGQgZm9yY2UtaW5jbHVkZSBleHRlbnNpb25zIHdpdGggKyBwYXR0ZXJuIGFmdGVyIGV4Y2x1c2lvblxuICAg4oaTIERlZmF1bHRQYWNrYWdlTWFuYWdlciA+IGZvcmNlLWluY2x1ZGUgcGF0dGVybnMgPiBzaG91bGQgZm9yY2UtaW5jbHVkZSBvdmVycmlkZXMgZXhjbHVkZSBpbiBwYWNrYWdlIGZpbHRlcnNcbiAgIOKGkyBEZWZhdWx0UGFja2FnZU1hbmFnZXIgPiBmb3JjZS1pbmNsdWRlIHBhdHRlcm5zID4gc2hvdWxkIGZvcmNlLWluY2x1ZGUgbXVsdGlwbGUgcmVzb3VyY2VzXG4gICDihpMgRGVmYXVsdFBhY2thZ2VNYW5hZ2VyID4gZm9yY2UtaW5jbHVkZSBwYXR0ZXJucyA+IHNob3VsZCBmb3JjZS1pbmNsdWRlIGFmdGVyIHNwZWNpZmljIGV4Y2x1c2lvblxuICAg4oaTIERlZmF1bHRQYWNrYWdlTWFuYWdlciA+IGZvcmNlLWluY2x1ZGUgcGF0dGVybnMgPiBzaG91bGQgaGFuZGxlIGZvcmNlLWluY2x1ZGUgaW4gbWFuaWZlc3QgcGF0dGVybnNcbiAgIOKGkyBEZWZhdWx0UGFja2FnZU1hbmFnZXIgPiBmb3JjZS1pbmNsdWRlIHBhdHRlcm5zID4gc2hvdWxkIGZvcmNlLWluY2x1ZGUgdGhlbWVzXG4gICDihpMgRGVmYXVsdFBhY2thZ2VNYW5hZ2VyID4gZm9yY2UtaW5jbHVkZSBwYXR0ZXJucyA+IHNob3VsZCBmb3JjZS1pbmNsdWRlIHByb21wdHNcbiAgIOKGkyBEZWZhdWx0UGFja2FnZU1hbmFnZXIgPiBmb3JjZS1leGNsdWRlIHBhdHRlcm5zID4gc2hvdWxkIGZvcmNlLWV4Y2x1ZGUgdG9wLWxldmVsIHJlc291cmNlc1xuICAg4oaTIERlZmF1bHRQYWNrYWdlTWFuYWdlciA+IGZvcmNlLWV4Y2x1ZGUgcGF0dGVybnMgPiBzaG91bGQgZm9yY2UtZXhjbHVkZSBpbiBwYWNrYWdlIGZpbHRlcnNcbiAgIOKGkyBEZWZhdWx0UGFja2FnZU1hbmFnZXIgPiBwYWNrYWdlIGRlZHVwbGljYXRpb24gPiBzaG91bGQgZGVkdXBlIHNhbWUgbG9jYWwgcGFja2FnZSBpbiBnbG9iYWwgYW5kIHByb2plY3QgKHByb2plY3Qgd2lucylcbiAgIOKGkyBEZWZhdWx0UGFja2FnZU1hbmFnZXIgPiBwYWNrYWdlIGRlZHVwbGljYXRpb24gPiBzaG91bGQga2VlcCBib3RoIGlmIGRpZmZlcmVudCBwYWNrYWdlc1xuICAg4oaTIERlZmF1bHRQYWNrYWdlTWFuYWdlciA+IHBhY2thZ2UgZGVkdXBsaWNhdGlvbiA+IHNob3VsZCBkZWR1cGUgU1NIIGFuZCBIVFRQUyBVUkxzIGZvciBzYW1lIHJlcG9cbiAgIOKGkyBEZWZhdWx0UGFja2FnZU1hbmFnZXIgPiBwYWNrYWdlIGRlZHVwbGljYXRpb24gPiBzaG91bGQgZGVkdXBlIFNTSCBhbmQgSFRUUFMgd2l0aCByZWZzXG4gICDihpMgRGVmYXVsdFBhY2thZ2VNYW5hZ2VyID4gcGFja2FnZSBkZWR1cGxpY2F0aW9uID4gc2hvdWxkIGRlZHVwZSBTU0ggVVJMIHdpdGggc3NoOi8vIHByb3RvY29sIGFuZCBnaXRAIGZvcm1hdFxuICAg4oaTIERlZmF1bHRQYWNrYWdlTWFuYWdlciA+IHBhY2thZ2UgZGVkdXBsaWNhdGlvbiA+IHNob3VsZCBkZWR1cGUgYWxsIHN1cHBvcnRlZCBVUkwgZm9ybWF0cyBmb3Igc2FtZSByZXBvXG4gICDihpMgRGVmYXVsdFBhY2thZ2VNYW5hZ2VyID4gcGFja2FnZSBkZWR1cGxpY2F0aW9uID4gc2hvdWxkIGtlZXAgZGlmZmVyZW50IHJlcG9zIHNlcGFyYXRlIChIVFRQUyB2cyBTU0gpXG4gICDihpMgRGVmYXVsdFBhY2thZ2VNYW5hZ2VyID4gbXVsdGktZmlsZSBleHRlbnNpb24gZGlzY292ZXJ5IChpc3N1ZSAjMTEwMikgPiBzaG91bGQgb25seSBsb2FkIGluZGV4LnRzIGZyb20gc3ViZGlyZWN0b3JpZXMsIG5vdCBoZWxwZXIgbW9kdWxlc1xuICAg4oaTIERlZmF1bHRQYWNrYWdlTWFuYWdlciA+IG11bHRpLWZpbGUgZXh0ZW5zaW9uIGRpc2NvdmVyeSAoaXNzdWUgIzExMDIpID4gc2hvdWxkIHJlc3BlY3QgcGFja2FnZS5qc29uIHBpLmV4dGVuc2lvbnMgbWFuaWZlc3QgaW4gc3ViZGlyZWN0b3JpZXNcbiAgIOKGkyBEZWZhdWx0UGFja2FnZU1hbmFnZXIgPiBtdWx0aS1maWxlIGV4dGVuc2lvbiBkaXNjb3ZlcnkgKGlzc3VlICMxMTAyKSA+IHNob3VsZCBoYW5kbGUgbWl4ZWQgdG9wLWxldmVsIGZpbGVzIGFuZCBzdWJkaXJlY3Rvcmllc1xuICAg4oaTIERlZmF1bHRQYWNrYWdlTWFuYWdlciA+IG11bHRpLWZpbGUgZXh0ZW5zaW9uIGRpc2NvdmVyeSAoaXNzdWUgIzExMDIpID4gc2hvdWxkIHNraXAgc3ViZGlyZWN0b3JpZXMgd2l0aG91dCBpbmRleC50cyBvciBtYW5pZmVzdFxuICAg4oaTIERlZmF1bHRQYWNrYWdlTWFuYWdlciA+IG9mZmxpbmUgbW9kZSBhbmQgbmV0d29yayB0aW1lb3V0cyA+IHNob3VsZCB1cGRhdGUgcHJvamVjdCBucG0gcGFja2FnZXMgdXNpbmcgQGxhdGVzdCB3aGVuIG5ld2VyIHZlcnNpb24gaXMgYXZhaWxhYmxlXG4gICDihpMgRGVmYXVsdFBhY2thZ2VNYW5hZ2VyID4gb2ZmbGluZSBtb2RlIGFuZCBuZXR3b3JrIHRpbWVvdXRzID4gc2hvdWxkIHNraXAgcHJvamVjdCBucG0gdXBkYXRlIHdoZW4gaW5zdGFsbGVkIHZlcnNpb24gbWF0Y2hlcyBsYXRlc3RcbiAgIOKGkyBEZWZhdWx0UGFja2FnZU1hbmFnZXIgPiBvZmZsaW5lIG1vZGUgYW5kIG5ldHdvcmsgdGltZW91dHMgPiBzaG91bGQgYmF0Y2ggbnBtIHVwZGF0ZXMgcGVyIHNjb3BlIGFuZCBydW4gZ2l0IHVwZGF0ZXMgaW4gcGFyYWxsZWwgd2hpbGUgc2tpcHBpbmcgcGlubmVkIGFuZCBjdXJyZW50IHBhY2thZ2VzXG4gICDihpMgRGVmYXVsdFBhY2thZ2VNYW5hZ2VyID4gb2ZmbGluZSBtb2RlIGFuZCBuZXR3b3JrIHRpbWVvdXRzID4gc2hvdWxkIHN1Z2dlc3QgbnBtIHNvdXJjZSBwcmVmaXhlcyBmb3IgdXBkYXRlIGxvb2t1cHNcbiAgIOKGkyBEZWZhdWx0UGFja2FnZU1hbmFnZXIgPiBvZmZsaW5lIG1vZGUgYW5kIG5ldHdvcmsgdGltZW91dHMgPiBzaG91bGQgc3VnZ2VzdCBnaXQgc291cmNlIHByZWZpeGVzIGZvciB1cGRhdGUgbG9va3Vwc1xuICAg4oaTIERlZmF1bHRQYWNrYWdlTWFuYWdlciA+IG9mZmxpbmUgbW9kZSBhbmQgbmV0d29yayB0aW1lb3V0cyA+IHNob3VsZCBza2lwIGluc3RhbGxpbmcgbWlzc2luZyBwYWNrYWdlIHNvdXJjZXMgd2hlbiBvZmZsaW5lXG4gICDihpMgRGVmYXVsdFBhY2thZ2VNYW5hZ2VyID4gb2ZmbGluZSBtb2RlIGFuZCBuZXR3b3JrIHRpbWVvdXRzID4gc2hvdWxkIHNraXAgcmVmcmVzaGluZyB0ZW1wb3JhcnkgZ2l0IHNvdXJjZXMgd2hlbiBvZmZsaW5lXG4gICDihpMgRGVmYXVsdFBhY2thZ2VNYW5hZ2VyID4gb2ZmbGluZSBtb2RlIGFuZCBuZXR3b3JrIHRpbWVvdXRzID4gc2hvdWxkIG5vdCBydW4gbnBtIHZpZXcgZHVyaW5nIHJlc29sdmUgZm9yIGluc3RhbGxlZCB1bnBpbm5lZCBwYWNrYWdlc1xuICAg4oaTIERlZmF1bHRQYWNrYWdlTWFuYWdlciA+IG9mZmxpbmUgbW9kZSBhbmQgbmV0d29yayB0aW1lb3V0cyA+IHNob3VsZCByZWluc3RhbGwgcGlubmVkIG5wbSBwYWNrYWdlcyB3aGVuIGluc3RhbGxlZCB2ZXJzaW9uIGRvZXMgbm90IG1hdGNoXG4gICDihpMgRGVmYXVsdFBhY2thZ2VNYW5hZ2VyID4gb2ZmbGluZSBtb2RlIGFuZCBuZXR3b3JrIHRpbWVvdXRzID4gc2hvdWxkIG5vdCBjaGVjayBwYWNrYWdlIHVwZGF0ZXMgd2hlbiBvZmZsaW5lXG4gICDihpMgRGVmYXVsdFBhY2thZ2VNYW5hZ2VyID4gb2ZmbGluZSBtb2RlIGFuZCBuZXR3b3JrIHRpbWVvdXRzID4gc2hvdWxkIHJlcG9ydCB1cGRhdGVzIGZvciBpbnN0YWxsZWQgdW5waW5uZWQgbnBtIHBhY2thZ2VzXG4gICDihpMgRGVmYXVsdFBhY2thZ2VNYW5hZ2VyID4gb2ZmbGluZSBtb2RlIGFuZCBuZXR3b3JrIHRpbWVvdXRzID4gc2hvdWxkIHNraXAgcGlubmVkIHBhY2thZ2VzIHdoZW4gY2hlY2tpbmcgZm9yIHVwZGF0ZXNcbiAgIOKGkyBEZWZhdWx0UGFja2FnZU1hbmFnZXIgPiBvZmZsaW5lIG1vZGUgYW5kIG5ldHdvcmsgdGltZW91dHMgPiBzaG91bGQgdXNlIG5wbSB2aWV3IHRvIGZldGNoIGxhdGVzdCB2ZXJzaW9uXG4gICDihpMgRGVmYXVsdFBhY2thZ2VNYW5hZ2VyID4gb2ZmbGluZSBtb2RlIGFuZCBuZXR3b3JrIHRpbWVvdXRzID4gc2hvdWxkIHVzZSBucG1Db21tYW5kIGFyZ3YgZm9yIG5wbSB1cGRhdGUgY2hlY2tzXG4gICDihpMgRGVmYXVsdFBhY2thZ2VNYW5hZ2VyID4gb2ZmbGluZSBtb2RlIGFuZCBuZXR3b3JrIHRpbWVvdXRzID4gc2hvdWxkIHdhaXQgZm9yIGNsb3NlIGJlZm9yZSByZXNvbHZpbmcgY2FwdHVyZWQgc3Rkb3V0XG5cbuKOr+KOr+KOr+KOr+KOr+KOr+KOryBGYWlsZWQgVGVzdHMgMSDijq/ijq/ijq/ijq/ijq/ijq/ijq9cblxuIEZBSUwgIHRlc3QvcGFja2FnZS1tYW5hZ2VyLnRlc3QudHMgPiBEZWZhdWx0UGFja2FnZU1hbmFnZXIgPiByZXNvbHZlID4gc2hvdWxkIHJlc29sdmUgc3ltbGlua2VkIHVzZXIgYW5kIHByb2plY3QgcmVzb3VyY2VzIG9uY2VcbkFzc2VydGlvbkVycm9yOiBleHBlY3RlZCB7IGV4dGVuc2lvbnM6IDEsIHNraWxsczogMiwg4oCmKDIpIH0gdG8gZGVlcGx5IGVxdWFsIHsgZXh0ZW5zaW9uczogMSwgc2tpbGxzOiAxLCDigKYoMikgfVxuXG5cdTAwMWJbMzJtLSBFeHBlY3RlZFx1MDAxYlszOW1cblx1MDAxYlszMW0rIFJlY2VpdmVkXHUwMDFiWzM5bVxuXG5cdTAwMWJbMm0gIHtcdTAwMWJbMjJtXG5cdTAwMWJbMm0gICAgXCJleHRlbnNpb25zXCI6IDEsXHUwMDFiWzIybVxuXHUwMDFiWzJtICAgIFwicHJvbXB0c1wiOiAxLFx1MDAxYlsyMm1cblx1MDAxYlszMm0tICAgXCJza2lsbHNcIjogMSxcdTAwMWJbMzltXG5cdTAwMWJbMzFtKyAgIFwic2tpbGxzXCI6IDIsXHUwMDFiWzM5bVxuXHUwMDFiWzJtICAgIFwidGhlbWVzXCI6IDEsXHUwMDFiWzIybVxuXHUwMDFiWzJtICB9XHUwMDFiWzIybVxuXG4g4p2vIHRlc3QvcGFja2FnZS1tYW5hZ2VyLnRlc3QudHM6MjAzOjdcbiAgICAyMDF8ICAgICBwcm9tcHRzOiByZXN1bHQucHJvbXB0cy5sZW5ndGgsXG4gICAgMjAyfCAgICAgdGhlbWVzOiByZXN1bHQudGhlbWVzLmxlbmd0aCxcbiAgICAyMDN8ICAgIH0pLnRvRXF1YWwoe1xuICAgICAgIHwgICAgICAgXlxuICAgIDIwNHwgICAgIGV4dGVuc2lvbnM6IDEsXG4gICAgMjA1fCAgICAgc2tpbGxzOiAxLFxuXG7ijq/ijq/ijq/ijq/ijq/ijq/ijq/ijq/ijq/ijq/ijq/ijq/ijq/ijq/ijq/ijq/ijq/ijq/ijq/ijq/ijq/ijq/ijq/ijq9bMS8xXeKOr1xuXG5cbiBUZXN0IEZpbGVzICAxIGZhaWxlZCAoMSlcbiAgICAgIFRlc3RzICAxIGZhaWxlZCB8IDk4IHNraXBwZWQgKDk5KVxuICAgU3RhcnQgYXQgIDE3OjUxOjQxXG4gICBEdXJhdGlvbiAgMzAybXMgKHRyYW5zZm9ybSA5MW1zLCBzZXR1cCAwbXMsIGNvbGxlY3QgMTI4bXMsIHRlc3RzIDEybXMsIGVudmlyb25tZW50IDBtcywgcHJlcGFyZSAyOW1zKVxuXG5cblxuQ29tbWFuZCBleGl0ZWQgd2l0aCBjb2RlIDEifV0sImRldGFpbHMiOnt9LCJpc0Vycm9yIjp0cnVlLCJ0aW1lc3RhbXAiOjE3Nzc1NjQzMDE1MTJ9fSx7InR5cGUiOiJtZXNzYWdlIiwiaWQiOiJmNThkOThmMCIsInBhcmVudElkIjoiOTE1YmUyYjEiLCJ0aW1lc3RhbXAiOiIyMDI2LTA0LTMwVDE1OjUyOjAyLjA1OFoiLCJtZXNzYWdlIjp7InJvbGUiOiJhc3Npc3RhbnQiLCJjb250ZW50IjpbeyJ0eXBlIjoidGhpbmtpbmciLCJ0aGlua2luZyI6IiBUaGUgdGVzdCBmYWlsdXJlIGlzIGJlY2F1c2Ugd2l0aCB0aGUgZml4LCB0aGUgYGJhc2VEaXJgIGlzIGRpZmZlcmVudCBmb3IgdXNlciBgLnBpL2FnZW50L3NraWxsc2AgYW5kIHVzZXIgYC5hZ2VudHMvc2tpbGxzYC4gQnV0IGluIHRoZSBzeW1saW5rIHRlc3QgY2FzZSwgYH4vLnBpL2FnZW50L3NraWxsc2AgaXMgYSBzeW1saW5rIHRvIGB+Ly5hZ2VudHMvc2tpbGxzYC4gXG5cblRoZSBgdG9SZXNvbHZlZFBhdGhzYCBmdW5jdGlvbiB1c2VzIGBjYW5vbmljYWxpemVQYXRoYCB3aGljaCBjYWxscyBgcmVhbHBhdGhTeW5jYCB0byByZXNvbHZlIHN5bWxpbmtzLiBTbyBib3RoIHNraWxscyBnZXQgdGhlIHNhbWUgY2Fub25pY2FsIHBhdGgsIGJ1dCBvbmUgaXMgZnJvbSB0aGUgYC5waWAgZGlzY292ZXJ5IGFuZCBvbmUgaXMgZnJvbSB0aGUgYC5hZ2VudHNgIGRpc2NvdmVyeS4gU2luY2UgdGhleSBub3cgaGF2ZSBkaWZmZXJlbnQgYGJhc2VEaXJgIHZhbHVlcywgdGhleSBoYXZlIGRpZmZlcmVudCBtZXRhZGF0YSBhbmQgYXJlbid0IGJlaW5nIGRlZHVwbGljYXRlZC5cblxuV2FpdCwgbG9va2luZyBhdCB0aGUgZGVkdXBsaWNhdGlvbiBsb2dpYyBpbiBgdG9SZXNvbHZlZFBhdGhzYDpcblxuYGBgdHNcbmNvbnN0IHNlZW4gPSBuZXcgU2V0PHN0cmluZz4oKTtcbnJldHVybiByZXNvbHZlZC5maWx0ZXIoKGVudHJ5KSA9PiB7XG4gICAgY29uc3QgY2Fub25pY2FsUGF0aCA9IGNhbm9uaWNhbGl6ZVBhdGgoZW50cnkucGF0aCk7XG4gICAgaWYgKHNlZW4uaGFzKGNhbm9uaWNhbFBhdGgpKSByZXR1cm4gZmFsc2U7XG4gICAgc2Vlbi5hZGQoY2Fub25pY2FsUGF0aCk7XG4gICAgcmV0dXJuIHRydWU7XG59KTtcbmBgYFxuXG5UaGUgZGVkdXBsaWNhdGlvbiB1c2VzIGBjYW5vbmljYWxpemVQYXRoYCBvbiB0aGUgYHBhdGhgLCBzbyBpZiBib3RoIHBvaW50IHRvIHRoZSBzYW1lIGNhbm9uaWNhbCBwYXRoLCBvbmUgc2hvdWxkIGJlIGZpbHRlcmVkIG91dC4gQnV0IHRoZSB0ZXN0IHNob3dzIDIgc2tpbGxzIGluc3RlYWQgb2YgMS5cblxuTGV0IG1lIGNoZWNrIGlmIHRoZXJlJ3MgYW4gaXNzdWUgd2l0aCB0aGUgY2Fub25pY2FsaXphdGlvbiBvciBpZiB0aGUgc2tpbGwgaXMgc29tZWhvdyBiZWluZyBhZGRlZCB0d2ljZSB3aXRoIGRpZmZlcmVudCBwYXRocy4gVGhlIGlzc3VlIGlzIHByb2JhYmx5IHRoYXQgdGhlIHN5bWxpbmsgcmVzb2x2ZXMgdG8gdGhlIHRhcmdldCwgc28gYm90aCBza2lsbHMgcG9pbnQgdG8gdGhlIHNhbWUgY2Fub25pY2FsIHBhdGggYW5kIHNob3VsZCBiZSBkZWR1cGVkLlxuXG5XYWl0LCBJIHNlZSB0aGUgaXNzdWUgbm93LiBUaGUgcHJvYmxlbSBpcyB0aGF0IHdoZW4gYH4vLnBpL2FnZW50L3NraWxsc2AgaXMgYSBzeW1saW5rIHRvIGB+Ly5hZ2VudHMvc2tpbGxzYCwgdGhlIHNraWxscyBhcmUgZGlzY292ZXJlZDpcbjEuIEZyb20gYC5waS9hZ2VudC9za2lsbHNgIHZpYSBgY29sbGVjdEF1dG9Ta2lsbEVudHJpZXModXNlckRpcnMuc2tpbGxzLCBcInBpXCIpYCAtIHRoaXMgcmV0dXJucyB0aGUgcGF0aHMgYXMgc2VlbiB0aHJvdWdoIHRoZSBzeW1saW5rXG4yLiBGcm9tIGAuYWdlbnRzL3NraWxsc2AgdmlhIGBjb2xsZWN0QXV0b1NraWxsRW50cmllcyh1c2VyQWdlbnRzU2tpbGxzRGlyLCBcImFnZW50c1wiKWAgLSB0aGlzIHJldHVybnMgdGhlIHJlYWwgcGF0aHNcblxuU28gb25lIHBhdGggaXMgbGlrZSBgL3RlbXAvYWdlbnQvc2tpbGxzL3NoYXJlZC1za2lsbC9TS0lMTC5tZGAgKHdoaWNoIGlzIGEgc3ltbGluayBwYXRoKSBhbmQgdGhlIG90aGVyIGlzIGAvdGVtcC9zaGFyZWQtcmVzb3VyY2VzL3NraWxscy9zaGFyZWQtc2tpbGwvU0tJTEwubWRgICh0aGUgcmVhbCBwYXRoKS5cblxuV2hlbiBjYW5vbmljYWxpemVkLCBib3RoIHNob3VsZCByZXNvbHZlIHRvIHRoZSBzYW1lIHJlYWwgcGF0aC4gU28gdGhlIGRlZHVwIHNob3VsZCB3b3JrLiBCdXQgaXQncyBub3QuXG5cbkxldCBtZSBsb29rIGF0IHRoaXMgbW9yZSBjYXJlZnVsbHkuIFRoZSBzeW1saW5rIGlzIGBhZ2VudERpci9za2lsbHMgLT4gc2hhcmVkRGlyL3NraWxsc2AsIGFuZCBgdXNlckFnZW50c1NraWxsc0RpciA9IGpvaW4oZ2V0SG9tZURpcigpLCBcIi5hZ2VudHNcIiwgXCJza2lsbHNcIilgLiBJbiB0aGUgdGVzdCwgYHRlbXBEaXJgIGlzIHNldCBhcyB0aGUgaG9tZSBkaXJlY3RvcnksIHNvIGB1c2VyQWdlbnRzU2tpbGxzRGlyID0gam9pbih0ZW1wRGlyLCBcIi5hZ2VudHNcIiwgXCJza2lsbHNcIilgLlxuXG5cbkknbSBpbnZlc3RpZ2F0aW5nIHRoZSB0ZXN0IHNldHVwLiBUaGUgcHJldmlvdXMgaG9tZSBkaXJlY3RvcnkgaXMgc3RvcmVkIGJlZm9yZSBydW5uaW5nIHRlc3RzLCBhbmQgdGhlbiByZXN0b3JlZCBhZnRlcndhcmQuIFRoZSBzeW1saW5rIHRlc3QgZG9lc24ndCBtYW5pcHVsYXRlIHRoZSBob21lIGRpcmVjdG9yeSwgd2hpY2ggbWVhbnMgYGdldEhvbWVEaXIoKWAgcmV0dXJucyB0aGUgYWN0dWFsIGhvbWUgZGlyZWN0b3J5LCBub3QgdGhlIHRlc3QncyB0ZW1wIGRpcmVjdG9yeS4gVGhpcyBjb3VsZCBiZSBjYXVzaW5nIGEgZGlzY3JlcGFuY3kgaW4gaG93IHBhdGhzIGFyZSByZXNvbHZlZCBiZXR3ZWVuIHRoZSB0d28gZGlzY292ZXJ5IG1ldGhvZHMuXG5cblRoZSB0ZXN0IGlzIHNwZWNpZmljYWxseSBjaGVja2luZyB0aGF0IHdoZW4gYH4vLnBpL2FnZW50L3NraWxsc2AgaXMgc3ltbGlua2VkIHRvIGB+Ly5hZ2VudHMvc2tpbGxzYCwgdGhlIGRlZHVwbGljYXRpb24gd29ya3MgY29ycmVjdGx5LiBIb3dldmVyLCB3aXRoIHRoZSBuZXcgZml4LCB0aGUgbWV0YWRhdGEgZGlmZmVycyBiZXR3ZWVuIHRoZSB0d28gc291cmNlczogb25lIHVzZXMgYGFnZW50RGlyYCBhcyB0aGUgYmFzZURpciwgd2hpbGUgdGhlIG90aGVyIHVzZXMgYGpvaW4oZ2V0SG9tZURpcigpLCBcIi5hZ2VudHNcIilgLiBTaW5jZSB0aGVzZSBiYXNlRGlyIHZhbHVlcyBhcmUgZGlmZmVyZW50LCB0aGUgYGdyb3VwS2V5YCBpcyBkaWZmZXJlbnQsIGFuZCB0aGUgcmVzb3VyY2VzIGFyZSBiZWluZyB0cmVhdGVkIGFzIHNlcGFyYXRlIGVudGl0aWVzLlxuXG5UaGUgY29yZSBpc3N1ZSBpcyB0aGF0IHRoZSBzeW1saW5rIHRlc3QgaXMgZGVzaWduZWQgdG8gdmVyaWZ5IGRlZHVwbGljYXRpb24gd2hlbiBib3RoIGRpcmVjdG9yaWVzIHBvaW50IHRvIHRoZSBzYW1lIGxvY2F0aW9uLiBTaW5jZSB0aGUgbmV3IGltcGxlbWVudGF0aW9uIHVzZXMgZGlmZmVyZW50IGJhc2VEaXIgdmFsdWVzIGZvciBgLnBpYCBhbmQgYC5hZ2VudHNgIHNvdXJjZXMsIHRoZSBjYW5vbmljYWwgcGF0aCBkZWR1cGxpY2F0aW9uIHNob3VsZCBzdGlsbCB3b3Jr4oCUYnV0IG9ubHkgaWYgYm90aCBwYXRocyByZXNvbHZlIHRvIHRoZSBzYW1lIGNhbm9uaWNhbCBsb2NhdGlvbi4gSSBuZWVkIHRvIGV4YW1pbmUgdGhlIGFjdHVhbCB0ZXN0IGZhaWx1cmUgdG8gdW5kZXJzdGFuZCB3aGF0J3MgaGFwcGVuaW5nIHdpdGggdGhlIGNhbm9uaWNhbGl6YXRpb24uXG5cblRoZSB0ZXN0IGV4cGVjdHMgZXhhY3RseSAxIHNraWxsIHdoZW4gc3ltbGlua3MgYXJlIGluIHVzZSwgYW5kIHRoZSBpbXBsZW1lbnRhdGlvbiBzaG91bGQgaGFuZGxlIHRoaXMgYnkgY2Fub25pY2FsaXppbmcgcGF0aHMgdG8gdGhlaXIgcmVhbCBsb2NhdGlvbnMuIElmIGB+Ly5waS9hZ2VudC9za2lsbHNgIHN5bWxpbmtzIHRvIGB+Ly5hZ2VudHMvc2tpbGxzYCwgYm90aCBkaXNjb3ZlcnkgbWV0aG9kcyBzaG91bGQgcmVzb2x2ZSB0byB0aGUgc2FtZSBjYW5vbmljYWwgcGF0aCBhbmQgYmUgZGVkdXBsaWNhdGVkLiBUaGUgZmFjdCB0aGF0IHdlJ3JlIGdldHRpbmcgMiBza2lsbHMgc3VnZ2VzdHMgdGhlIGNhbm9uaWNhbGl6YXRpb24gaXNuJ3Qgd29ya2luZyBhcyBleHBlY3RlZCwgb3IgdGhlIGJhc2VEaXIgZGlmZmVyZW5jZXMgYXJlIHByZXZlbnRpbmcgcHJvcGVyIGRlZHVwbGljYXRpb24gZGVzcGl0ZSBpZGVudGljYWwgY2Fub25pY2FsIHBhdGhzLlxuXG5Mb29raW5nIGF0IHRoZSB0ZXN0IHNldHVwIG1vcmUgY2FyZWZ1bGx5OiB0aGUgc2hhcmVkIGRpcmVjdG9yeSBpcyBjcmVhdGVkIGF0IGB0ZW1wRGlyL3NoYXJlZC1yZXNvdXJjZXNgLCB0aGVuIHN5bWxpbmtlZCBpbnRvIGJvdGggdGhlIGFnZW50IGRpcmVjdG9yeSBhbmQgdGhlIHByb2plY3QgZGlyZWN0b3J5LiBUaGlzIG1lYW5zIHdlIGhhdmUgdXNlci1zY29wZWQgc2tpbGxzIGZyb20gYH4vLnBpL2FnZW50L3NraWxsc2AgYW5kIHByb2plY3Qtc2NvcGVkIHNraWxscyBmcm9tIHRoZSBwcm9qZWN0J3MgYC5waWAgZGlyZWN0b3J5LiBUaGUgdXNlciBhZ2VudHMgZGlyZWN0b3J5IGlzIGEgc2VwYXJhdGUgcGF0aCBlbnRpcmVseSwgc28gdGhlIHNraWxsIHRoZXJlIHdvdWxkIGhhdmUgYSBkaWZmZXJlbnQgYmFzZSBkaXJlY3RvcnkgYW5kIHdvdWxkbid0IGJlIGRlZHVwbGljYXRlZCB3aXRoIHRoZSBvdGhlcnMuIEhvd2V2ZXIsIHNpbmNlIHdlIG9ubHkgaGF2ZSBvbmUgdXNlciBhZ2VudCBkaXJlY3RvcnkgYW5kIG9uZSBwcm9qZWN0IGRpcmVjdG9yeSwgdGhlIHRvdGFsIHNob3VsZCBzdGlsbCBiZSAxIHNraWxsLCBub3QgMi5cblxuTGV0IG1lIGV4YW1pbmUgdGhlIGFjdHVhbCB0ZXN0IHN0cnVjdHVyZSB0byB1bmRlcnN0YW5kIHdoZXJlIHRoZSBleHRyYSBza2lsbCBpcyBjb21pbmcgZnJvbS4gSSBuZWVkIHRvIHNlZSBob3cgdGhlIHRlbXBvcmFyeSBkaXJlY3RvcmllcyBhbmQgYWdlbnQgZGlyZWN0b3J5IGFyZSBiZWluZyBzZXQgdXAuIFRoZSB0ZXN0IGNyZWF0ZXMgc3ltbGlua3MgdG8gc2hhcmVkIHJlc291cmNlIGRpcmVjdG9yaWVzIGFjcm9zcyBtdWx0aXBsZSBsb2NhdGlvbnMuIFdoZW4gdGhlIHBhY2thZ2UgbWFuYWdlciBkaXNjb3ZlcnMgc2tpbGxzLCBpdCBmaW5kcyB0aGUgc2FtZSBza2lsbCB0aHJvdWdoIHR3byBkaWZmZXJlbnQgcGF0aHM6IG9uY2UgdmlhIHRoZSBzeW1saW5rIGF0IGBhZ2VudERpci9za2lsbHMvc2hhcmVkLXNraWxsL1NLSUxMLm1kYCAod2hpY2ggcmVzb2x2ZXMgdG8gdGhlIGFjdHVhbCBwYXRoKSwgYW5kIG9uY2UgZGlyZWN0bHkgdGhyb3VnaCB0aGUgYHVzZXJBZ2VudHNTa2lsbHNEaXJgIGRpc2NvdmVyeSBtZWNoYW5pc20uIFRoaXMgZHVwbGljYXRlIGRpc2NvdmVyeSBpcyB3aHkgdGhlIHRlc3Qgc2hvd3MgMiBza2lsbHMgaW5zdGVhZCBvZiB0aGUgZXhwZWN0ZWQgMS5cblxuVGhlIGlzc3VlIHN0ZW1zIGZyb20gdGhlIGNoYW5nZSBJIG1hZGUgdG8gc3BsaXQgdGhlIHVzZXIgc2tpbGxzIGRpc2NvdmVyeSBpbnRvIHR3byBzZXBhcmF0ZSBjYWxsc+KAlG9uZSBmb3IgdGhlIGFnZW50IGRpcmVjdG9yeSBhbmQgb25lIGZvciB0aGUgYWdlbnRzIGRpcmVjdG9yeS4gUHJldmlvdXNseSwgdGhlIGAuYWdlbnRzYCBza2lsbHMgd2VyZSBtZXJnZWQgd2l0aCB0aGUgYC5waWAgc2tpbGxzIGFuZCBhc3NpZ25lZCB0aGUgc2FtZSBgYmFzZURpcmAsIGJ1dCBub3cgdGhleSdyZSBkaXNjb3ZlcmVkIHNlcGFyYXRlbHkgd2l0aCBkaWZmZXJlbnQgYmFzZSBkaXJlY3Rvcmllcy4gVGhpcyBjYXVzZXMgdGhlIGRlZHVwbGljYXRpb24gbG9naWMgdG8gZmFpbCBiZWNhdXNlIGl0IHNlZXMgdGhlbSBhcyBkaXN0aW5jdCBwYXRocyBiZWZvcmUgY2Fub25pY2FsaXphdGlvbiByZXNvbHZlcyB0aGVtIHRvIHRoZSBzYW1lIGxvY2F0aW9uLiBUaGUgcm9vdCBjYXVzZSBpcyB0aGF0IHRoZSB0ZXN0IGV4cGVjdHMgdGhlIGRlZHVwbGljYXRpb24gdG8gaGFwcGVuLCBidXQgbXkgY2hhbmdlIGJyb2tlIHRoYXQgZXhwZWN0YXRpb24gYnkgY3JlYXRpbmcgc2VwYXJhdGUgZGlzY292ZXJ5IHBhdGhzLlxuXG5UaGUgcmVhbCBxdWVzdGlvbiBpcyB3aGV0aGVyIHRoZSBkZWR1cGxpY2F0aW9uIGlzIGFjdHVhbGx5IHdvcmtpbmcuIFRoZSBjYW5vbmljYWxpemF0aW9uIHNob3VsZCByZXNvbHZlIHN5bWxpbmtzIHRvIHRoZWlyIHJlYWwgcGF0aHMsIHNvIGJvdGggdGhlIGAucGlgIHN5bWxpbmsgYW5kIHRoZSBkaXJlY3QgYC5hZ2VudHNgIGRpc2NvdmVyeSBzaG91bGQgcG9pbnQgdG8gdGhlIHNhbWUgY2Fub25pY2FsIGxvY2F0aW9uLiBCdXQgdGhlIHRlc3QgZmFpbHVyZSBzaG93cyAyIHNraWxscyBpbnN0ZWFkIG9mIDEsIHdoaWNoIHN1Z2dlc3RzIHRoZSBjYW5vbmljYWxpemF0aW9uIGlzbid0IGhhcHBlbmluZyBvciBpc24ndCB3b3JraW5nIGFzIGV4cGVjdGVkLiBJIG5lZWQgdG8gdmVyaWZ5IHdoZXRoZXIgdGhlIHBhdGhzIGFyZSBhY3R1YWxseSBiZWluZyBjYW5vbmljYWxpemVkIGJlZm9yZSBkZWR1cGxpY2F0aW9uIG9jY3Vycywgb3IgaWYgdGhlcmUncyBzb21ldGhpbmcgcHJldmVudGluZyB0aGUgZGVkdXBsaWNhdGlvbiBmcm9tIHdvcmtpbmcgY29ycmVjdGx5LlxuXG5Mb29raW5nIGF0IHRoZSBkaXNjb3ZlcnkgcHJvY2Vzczogd2hlbiBzY2FubmluZyBgLnBpL3NraWxsc2AsIHRoZSBzeW1saW5rIGdldHMgcmVzb2x2ZWQgdGhyb3VnaCBgcmVhZGRpclN5bmNgLCBhbmQgd2hlbiBzY2FubmluZyBgLmFnZW50cy9za2lsbHNgIGRpcmVjdGx5LCB0aGUgcmVhbCBwYXRoIGlzIHVzZWQuIEJvdGggcGF0aHMgc2hvdWxkIGNhbm9uaWNhbGl6ZSB0byB0aGUgc2FtZSBsb2NhdGlvbi4gVGhlIGRlZHVwbGljYXRpb24gbG9naWMgaW4gYHRvUmVzb2x2ZWRQYXRoc2Agc2hvdWxkIHRoZW4gbWVyZ2UgdGhlbSwga2VlcGluZyBvbmx5IHRoZSBmaXJzdCBvY2N1cnJlbmNlIGJhc2VkIG9uIGNhbm9uaWNhbCBwYXRoLiBUaGUgZmFjdCB0aGF0IGl0IGRvZXNuJ3Qgc3VnZ2VzdHMgZWl0aGVyIHRoZSBjYW5vbmljYWxpemF0aW9uIGlzIGZhaWxpbmcgb3IgdGhlIG1ldGFkYXRhIGhhbmRsaW5nIGlzIGludGVyZmVyaW5nIHdpdGggdGhlIGRlZHVwIHByb2Nlc3MuIHVzZXMgdGhlIGV4YWN0IHBhdGggd2l0aG91dCByZXNvbHZpbmcgc3ltbGlua3MuIFNvIHRoZSBwYXRoIGZyb20gYC5waWAgZGlzY292ZXJ5IGlzIGAvdGVtcC9hZ2VudC9za2lsbHMvc2hhcmVkLXNraWxsL1NLSUxMLm1kYCAocmVsYXRpdmUgdG8gdGhlIHN5bWxpbmspLCBhbmQgdGhlIHBhdGggZnJvbSBgLmFnZW50c2AgZGlzY292ZXJ5IGlzIGAvdGVtcC9zaGFyZWQtcmVzb3VyY2VzL3NraWxscy9zaGFyZWQtc2tpbGwvU0tJTEwubWRgLiBXaGVuIGNhbm9uaWNhbGl6ZWQsIGJvdGggc2hvdWxkIHBvaW50IHRvIGAvdGVtcC9zaGFyZWQtcmVzb3VyY2VzL3NraWxscy9zaGFyZWQtc2tpbGwvU0tJTEwubWRgIGFuZCBnZXQgZGVkdXBsaWNhdGVkLiBCdXQgdGhhdCBpc24ndCBoYXBwZW5pbmcuIExvb2tpbmcgYXQgdGhlIGBjYW5vbmljYWxpemVQYXRoYCBmdW5jdGlvbiwgaXQgdXNlcyBgcmVhbHBhdGhTeW5jYCB3aGljaCBzaG91bGQgZm9sbG93IHN5bWxpbmtzLiBJZiBib3RoIHBhdGhzIHJlc29sdmUgdG8gdGhlIHNhbWUgY2Fub25pY2FsIGxvY2F0aW9uLCB0aGV5IHNob3VsZCBiZSBkZWR1cGxpY2F0ZWQuIFlldCB0aGUgdGVzdCBpcyBmYWlsaW5nIHdpdGggMiBza2lsbHMsIHNvIHNvbWV0aGluZyBpcyBwcmV2ZW50aW5nIHRoZSBkZWR1cGxpY2F0aW9uIGZyb20gd29ya2luZyBhcyIsInRoaW5raW5nU2lnbmF0dXJlIjoicmVhc29uaW5nIn0seyJ0eXBlIjoidGV4dCIsInRleHQiOiIgTG9va2luZyBhdCB0aGUgZmFpbGluZyB0ZXN0LCBJIHNlZSB0aGUgaXNzdWUuIFdoZW4gYH4vLnBpL2FnZW50L3NraWxsc2AgaXMgYSBzeW1saW5rIHRvIGB+Ly5hZ2VudHMvc2tpbGxzYCwgdGhlIHNhbWUgc2tpbGwgaXMgZGlzY292ZXJlZCB0d2ljZTpcbjEuIFZpYSBgLnBpL2FnZW50L3NraWxsc2Agd2l0aCBgYmFzZURpciA9IGFnZW50RGlyYFxuMi4gVmlhIGAuYWdlbnRzL3NraWxsc2Agd2l0aCBgYmFzZURpciA9IH4vLmFnZW50c2BcblxuVGhlc2UgaGF2ZSBkaWZmZXJlbnQgbWV0YWRhdGEgbm93LCBidXQgdGhleSBzaG91bGQgc3RpbGwgYmUgZGVkdXBsaWNhdGVkIGJ5IGNhbm9uaWNhbCBwYXRoLiBUaGUgaXNzdWUgaXMgdGhhdCBteSBjaGFuZ2UgY2F1c2VkIGFuIGV4dHJhIGVudHJ5LiBMZXQgbWUgdHJhY2UgdGhyb3VnaCB0aGUgY29kZSBtb3JlIGNhcmVmdWxseS5cblxuVGhlIHRlc3QgY3JlYXRlczpcbi0gYHNoYXJlZERpci9za2lsbHMvc2hhcmVkLXNraWxsL1NLSUxMLm1kYFxuLSBTeW1saW5rIGBhZ2VudERpci9za2lsbHMgLT4gc2hhcmVkRGlyL3NraWxsc2AgIFxuLSBTeW1saW5rIGB0ZW1wRGlyLy5waS9za2lsbHMgLT4gc2hhcmVkRGlyL3NraWxsc2BcblxuV2l0aCB0aGUgZml4OlxuLSBVc2VyIGAucGlgIHNraWxscyBhcmUgZGlzY292ZXJlZCB3aXRoIGBiYXNlRGlyID0gYWdlbnREaXJgXG4tIFVzZXIgYC5hZ2VudHNgIHNraWxscyBhcmUgZGlzY292ZXJlZCB3aXRoIGBiYXNlRGlyID0gfi8uYWdlbnRzYCBcblxuQnV0IGluIHRoaXMgdGVzdCwgYEhPTUVgIGlzIG5vdCBtb2RpZmllZCwgc28gYH4vLmFnZW50c2AgaXMgb3V0c2lkZSB0aGUgdGVtcCBkaXJlY3RvcnkuIExldCBtZSBjaGVjayBpZiB0aGUgYHVzZXJBZ2VudHNTa2lsbHNEaXJgIGlzIGV2ZW4gZmluZGluZyBhbnl0aGluZyBpbiB0aGlzIHRlc3QuLi5cblxuQWN0dWFsbHksIGxvb2tpbmcgbW9yZSBjYXJlZnVsbHkgYXQgdGhlIHRlc3Q6IGl0IHNldHMgdXAgc3ltbGlua3MgZm9yIHVzZXIgYW5kIHByb2plY3QgYC5waWAgZGlyZWN0b3JpZXMsIGJ1dCBkb2Vzbid0IHRvdWNoIGB+Ly5hZ2VudHNgLiBUaGUgZXh0cmEgc2tpbGwgbWlnaHQgYmUgY29taW5nIGZyb20gc29tZXdoZXJlIGVsc2UuXG5cbkxldCBtZSBkZWJ1ZyBieSBjaGVja2luZyB3aGF0IHBhdGhzIGFyZSBiZWluZyBkaXNjb3ZlcmVkIn0seyJ0eXBlIjoidG9vbENhbGwiLCJpZCI6ImZ1bmN0aW9ucy5iYXNoOjE0IiwibmFtZSI6ImJhc2giLCJhcmd1bWVudHMiOnsiY29tbWFuZCI6ImNkIHBhY2thZ2VzL2NvZGluZy1hZ2VudCAmJiBucHggdHN4IC1lIFwiXG5pbXBvcnQgeyBta2RpclN5bmMsIHdyaXRlRmlsZVN5bmMsIHN5bWxpbmtTeW5jLCBybVN5bmMgfSBmcm9tICdub2RlOmZzJztcbmltcG9ydCB7IHRtcGRpciB9IGZyb20gJ25vZGU6b3MnO1xuaW1wb3J0IHsgam9pbiB9IGZyb20gJ25vZGU6cGF0aCc7XG5pbXBvcnQgeyBEZWZhdWx0UGFja2FnZU1hbmFnZXIgfSBmcm9tICcuL3NyYy9jb3JlL3BhY2thZ2UtbWFuYWdlci5qcyc7XG5pbXBvcnQgeyBTZXR0aW5nc01hbmFnZXIgfSBmcm9tICcuL3NyYy9jb3JlL3NldHRpbmdzLW1hbmFnZXIuanMnO1xuXG5jb25zdCB0ZW1wRGlyID0gam9pbih0bXBkaXIoKSwgJ3Rlc3QtJyArIERhdGUubm93KCkpO1xubWtkaXJTeW5jKHRlbXBEaXIsIHsgcmVjdXJzaXZlOiB0cnVlIH0pO1xuXG5jb25zdCBzaGFyZWREaXIgPSBqb2luKHRlbXBEaXIsICdzaGFyZWQtcmVzb3VyY2VzJyk7XG5jb25zdCBzaGFyZWRTa2lsbHNEaXIgPSBqb2luKHNoYXJlZERpciwgJ3NraWxscycpO1xubWtkaXJTeW5jKHNoYXJlZFNraWxsc0RpciwgeyByZWN1cnNpdmU6IHRydWUgfSk7XG5ta2RpclN5bmMoam9pbihzaGFyZWRTa2lsbHNEaXIsICdzaGFyZWQtc2tpbGwnKSwgeyByZWN1cnNpdmU6IHRydWUgfSk7XG53cml0ZUZpbGVTeW5jKGpvaW4oc2hhcmVkU2tpbGxzRGlyLCAnc2hhcmVkLXNraWxsJywgJ1NLSUxMLm1kJyksICctLS1cXG5uYW1lOiB0ZXN0XFxuLS0tXFxuJyk7XG5cbmNvbnN0IGFnZW50RGlyID0gam9pbih0ZW1wRGlyLCAnYWdlbnQnKTtcbm1rZGlyU3luYyhhZ2VudERpciwgeyByZWN1cnNpdmU6IHRydWUgfSk7XG5zeW1saW5rU3luYyhzaGFyZWRTa2lsbHNEaXIsIGpvaW4oYWdlbnREaXIsICdza2lsbHMnKSwgJ2RpcicpO1xuXG5jb25zdCBwcm9qZWN0UGlEaXIgPSBqb2luKHRlbXBEaXIsICcucGknKTtcbm1rZGlyU3luYyhwcm9qZWN0UGlEaXIsIHsgcmVjdXJzaXZlOiB0cnVlIH0pO1xuc3ltbGlua1N5bmMoc2hhcmVkU2tpbGxzRGlyLCBqb2luKHByb2plY3RQaURpciwgJ3NraWxscycpLCAnZGlyJyk7XG5cbmNvbnN0IHNldHRpbmdzTWFuYWdlciA9IFNldHRpbmdzTWFuYWdlci5pbk1lbW9yeSgpO1xuY29uc3QgcG0gPSBuZXcgRGVmYXVsdFBhY2thZ2VNYW5hZ2VyKHsgY3dkOiB0ZW1wRGlyLCBhZ2VudERpciwgc2V0dGluZ3NNYW5hZ2VyIH0pO1xuXG5jb25zdCByZXN1bHQgPSBhd2FpdCBwbS5yZXNvbHZlKCk7XG5jb25zb2xlLmxvZygnU2tpbGxzIGZvdW5kOicsIHJlc3VsdC5za2lsbHMubGVuZ3RoKTtcbmZvciAoY29uc3QgcyBvZiByZXN1bHQuc2tpbGxzKSB7XG4gIGNvbnNvbGUubG9nKCcgIFBhdGg6Jywgcy5wYXRoKTtcbiAgY29uc29sZS5sb2coJyAgQmFzZURpcjonLCBzLm1ldGFkYXRhLmJhc2VEaXIpO1xuICBjb25zb2xlLmxvZygnICBTY29wZTonLCBzLm1ldGFkYXRhLnNjb3BlKTtcbiAgY29uc29sZS5sb2coJyAgLS0tJyk7XG59XG5cbnJtU3luYyh0ZW1wRGlyLCB7IHJlY3Vyc2l2ZTogdHJ1ZSwgZm9yY2U6IHRydWUgfSk7XG5cIiAyPiYxIn19XSwiYXBpIjoib3BlbmFpLWNvbXBsZXRpb25zIiwicHJvdmlkZXIiOiJzeW50aGV0aWMiLCJtb2RlbCI6ImhmOm1vb25zaG90YWkvS2ltaS1LMi41IiwidXNhZ2UiOnsiaW5wdXQiOjI4NzgsIm91dHB1dCI6MjM1MywiY2FjaGVSZWFkIjo0ODM4NCwiY2FjaGVXcml0ZSI6MCwidG90YWxUb2tlbnMiOjUzNjE1LCJjb3N0Ijp7ImlucHV0IjowLjAwMTI5NTEwMDAwMDAwMDAwMDIsIm91dHB1dCI6MC4wMDgwMDAyLCJjYWNoZVJlYWQiOjAuMDIxNzcyODAwMDAwMDAwMDAyLCJjYWNoZVdyaXRlIjowLCJ0b3RhbCI6MC4wMzEwNjgxfX0sInN0b3BSZWFzb24iOiJ0b29sVXNlIiwidGltZXN0YW1wIjoxNzc3NTY0MzAxNTEzLCJyZXNwb25zZUlkIjoiY2hhdGNtcGwtOGQxN2JkOWRmNDVlNDdiOSJ9fSx7InR5cGUiOiJtZXNzYWdlIiwiaWQiOiI1ODVlMThhNSIsInBhcmVudElkIjoiZjU4ZDk4ZjAiLCJ0aW1lc3RhbXAiOiIyMDI2LTA0LTMwVDE1OjUyOjAyLjI5M1oiLCJtZXNzYWdlIjp7InJvbGUiOiJ0b29sUmVzdWx0IiwidG9vbENhbGxJZCI6ImZ1bmN0aW9ucy5iYXNoOjE0IiwidG9vbE5hbWUiOiJiYXNoIiwiY29udGVudCI6W3sidHlwZSI6InRleHQiLCJ0ZXh0Ijoibm9kZTppbnRlcm5hbC9wcm9jZXNzL3Byb21pc2VzOjM5NFxuICAgIHRyaWdnZXJVbmNhdWdodEV4Y2VwdGlvbihlcnIsIHRydWUgLyogZnJvbVByb21pc2UgKi8pO1xuICAgIF5cblxuRXJyb3I6IFRyYW5zZm9ybSBmYWlsZWQgd2l0aCAxIGVycm9yOlxuL2V2YWwudHM6Mjg6MTU6IEVSUk9SOiBUb3AtbGV2ZWwgYXdhaXQgaXMgY3VycmVudGx5IG5vdCBzdXBwb3J0ZWQgd2l0aCB0aGUgXCJjanNcIiBvdXRwdXQgZm9ybWF0XG4gICAgYXQgZmFpbHVyZUVycm9yV2l0aExvZyAoL1VzZXJzL2FsaW91ZGlhbGxvL2NvZGUvc3JjL2dpdGh1Yi5jb20vYWxpb3UvcGktbW9uby9ub2RlX21vZHVsZXMvZXNidWlsZC9saWIvbWFpbi5qczoxNzQ4OjE1KVxuICAgIGF0IC9Vc2Vycy9hbGlvdWRpYWxsby9jb2RlL3NyYy9naXRodWIuY29tL2FsaW91L3BpLW1vbm8vbm9kZV9tb2R1bGVzL2VzYnVpbGQvbGliL21haW4uanM6MTAxNzo1MFxuICAgIGF0IHJlc3BvbnNlQ2FsbGJhY2tzLjxjb21wdXRlZD4gKC9Vc2Vycy9hbGlvdWRpYWxsby9jb2RlL3NyYy9naXRodWIuY29tL2FsaW91L3BpLW1vbm8vbm9kZV9tb2R1bGVzL2VzYnVpbGQvbGliL21haW4uanM6ODg0OjkpXG4gICAgYXQgaGFuZGxlSW5jb21pbmdQYWNrZXQgKC9Vc2Vycy9hbGlvdWRpYWxsby9jb2RlL3NyYy9naXRodWIuY29tL2FsaW91L3BpLW1vbm8vbm9kZV9tb2R1bGVzL2VzYnVpbGQvbGliL21haW4uanM6OTM5OjEyKVxuICAgIGF0IFNvY2tldC5yZWFkRnJvbVN0ZG91dCAoL1VzZXJzL2FsaW91ZGlhbGxvL2NvZGUvc3JjL2dpdGh1Yi5jb20vYWxpb3UvcGktbW9uby9ub2RlX21vZHVsZXMvZXNidWlsZC9saWIvbWFpbi5qczo4NjI6NylcbiAgICBhdCBTb2NrZXQuZW1pdCAobm9kZTpldmVudHM6NTE5OjI4KVxuICAgIGF0IGFkZENodW5rIChub2RlOmludGVybmFsL3N0cmVhbXMvcmVhZGFibGU6NTYxOjEyKVxuICAgIGF0IHJlYWRhYmxlQWRkQ2h1bmtQdXNoQnl0ZU1vZGUgKG5vZGU6aW50ZXJuYWwvc3RyZWFtcy9yZWFkYWJsZTo1MTI6MylcbiAgICBhdCBSZWFkYWJsZS5wdXNoIChub2RlOmludGVybmFsL3N0cmVhbXMvcmVhZGFibGU6MzkyOjUpXG4gICAgYXQgUGlwZS5vblN0cmVhbVJlYWQgKG5vZGU6aW50ZXJuYWwvc3RyZWFtX2Jhc2VfY29tbW9uczoxODk6MjMpIHtcbiAgZXJyb3JzOiBbXG4gICAge1xuICAgICAgZGV0YWlsOiB1bmRlZmluZWQsXG4gICAgICBpZDogJycsXG4gICAgICBsb2NhdGlvbjoge1xuICAgICAgICBjb2x1bW46IDE1LFxuICAgICAgICBmaWxlOiAnL2V2YWwudHMnLFxuICAgICAgICBsZW5ndGg6IDUsXG4gICAgICAgIGxpbmU6IDI4LFxuICAgICAgICBsaW5lVGV4dDogJ2NvbnN0IHJlc3VsdCA9IGF3YWl0IHBtLnJlc29sdmUoKTsnLFxuICAgICAgICBuYW1lc3BhY2U6ICcnLFxuICAgICAgICBzdWdnZXN0aW9uOiAnJ1xuICAgICAgfSxcbiAgICAgIG5vdGVzOiBbXSxcbiAgICAgIHBsdWdpbk5hbWU6ICcnLFxuICAgICAgdGV4dDogJ1RvcC1sZXZlbCBhd2FpdCBpcyBjdXJyZW50bHkgbm90IHN1cHBvcnRlZCB3aXRoIHRoZSBcImNqc1wiIG91dHB1dCBmb3JtYXQnXG4gICAgfVxuICBdLFxuICB3YXJuaW5nczogW11cbn1cblxuTm9kZS5qcyB2MjIuMjIuMFxuXG5cbkNvbW1hbmQgZXhpdGVkIHdpdGggY29kZSAxIn1dLCJkZXRhaWxzIjp7fSwiaXNFcnJvciI6dHJ1ZSwidGltZXN0YW1wIjoxNzc3NTY0MzIyMjkzfX0seyJ0eXBlIjoibWVzc2FnZSIsImlkIjoiNjYxMWEzMjEiLCJwYXJlbnRJZCI6IjU4NWUxOGE1IiwidGltZXN0YW1wIjoiMjAyNi0wNC0zMFQxNTo1MjowNi42NDhaIiwibWVzc2FnZSI6eyJyb2xlIjoiYXNzaXN0YW50IiwiY29udGVudCI6W3sidHlwZSI6InRoaW5raW5nIiwidGhpbmtpbmciOiIgTGV0IG1lIHdyaXRlIGEgcHJvcGVyIHRlc3Qgc2NyaXB0IGluc3RlYWQgb2YgdXNpbmcgdHN4IGlubGluZSIsInRoaW5raW5nU2lnbmF0dXJlIjoicmVhc29uaW5nIn0seyJ0eXBlIjoidG9vbENhbGwiLCJpZCI6ImZ1bmN0aW9ucy53cml0ZToxNSIsIm5hbWUiOiJ3cml0ZSIsImFyZ3VtZW50cyI6eyJwYXRoIjoiL3RtcC9kZWJ1Zy1zeW1saW5rLnRzIiwiY29udGVudCI6ImltcG9ydCB7IG1rZGlyU3luYywgd3JpdGVGaWxlU3luYywgc3ltbGlua1N5bmMsIHJtU3luYyB9IGZyb20gJ25vZGU6ZnMnO1xuaW1wb3J0IHsgdG1wZGlyIH0gZnJvbSAnbm9kZTpvcyc7XG5pbXBvcnQgeyBqb2luIH0gZnJvbSAnbm9kZTpwYXRoJztcbmltcG9ydCB7IERlZmF1bHRQYWNrYWdlTWFuYWdlciB9IGZyb20gJy4vcGFja2FnZXMvY29kaW5nLWFnZW50L3NyYy9jb3JlL3BhY2thZ2UtbWFuYWdlci5qcyc7XG5pbXBvcnQgeyBTZXR0aW5nc01hbmFnZXIgfSBmcm9tICcuL3BhY2thZ2VzL2NvZGluZy1hZ2VudC9zcmMvY29yZS9zZXR0aW5ncy1tYW5hZ2VyLmpzJztcblxuYXN5bmMgZnVuY3Rpb24gbWFpbigpIHtcbiAgY29uc3QgdGVtcERpciA9IGpvaW4odG1wZGlyKCksICd0ZXN0LScgKyBEYXRlLm5vdygpKTtcbiAgbWtkaXJTeW5jKHRlbXBEaXIsIHsgcmVjdXJzaXZlOiB0cnVlIH0pO1xuXG4gIGNvbnN0IHNoYXJlZERpciA9IGpvaW4odGVtcERpciwgJ3NoYXJlZC1yZXNvdXJjZXMnKTtcbiAgY29uc3Qgc2hhcmVkU2tpbGxzRGlyID0gam9pbihzaGFyZWREaXIsICdza2lsbHMnKTtcbiAgbWtkaXJTeW5jKHNoYXJlZFNraWxsc0RpciwgeyByZWN1cnNpdmU6IHRydWUgfSk7XG4gIG1rZGlyU3luYyhqb2luKHNoYXJlZFNraWxsc0RpciwgJ3NoYXJlZC1za2lsbCcpLCB7IHJlY3Vyc2l2ZTogdHJ1ZSB9KTtcbiAgd3JpdGVGaWxlU3luYyhqb2luKHNoYXJlZFNraWxsc0RpciwgJ3NoYXJlZC1za2lsbCcsICdTS0lMTC5tZCcpLCAnLS0tXFxubmFtZTogdGVzdFxcbi0tLVxcbicpO1xuXG4gIGNvbnN0IGFnZW50RGlyID0gam9pbih0ZW1wRGlyLCAnYWdlbnQnKTtcbiAgbWtkaXJTeW5jKGFnZW50RGlyLCB7IHJlY3Vyc2l2ZTogdHJ1ZSB9KTtcbiAgc3ltbGlua1N5bmMoc2hhcmVkU2tpbGxzRGlyLCBqb2luKGFnZW50RGlyLCAnc2tpbGxzJyksICdkaXInKTtcblxuICBjb25zdCBwcm9qZWN0UGlEaXIgPSBqb2luKHRlbXBEaXIsICcucGknKTtcbiAgbWtkaXJTeW5jKHByb2plY3RQaURpciwgeyByZWN1cnNpdmU6IHRydWUgfSk7XG4gIHN5bWxpbmtTeW5jKHNoYXJlZFNraWxsc0Rpciwgam9pbihwcm9qZWN0UGlEaXIsICdza2lsbHMnKSwgJ2RpcicpO1xuXG4gIGNvbnN0IHNldHRpbmdzTWFuYWdlciA9IFNldHRpbmdzTWFuYWdlci5pbk1lbW9yeSgpO1xuICBjb25zdCBwbSA9IG5ldyBEZWZhdWx0UGFja2FnZU1hbmFnZXIoeyBjd2Q6IHRlbXBEaXIsIGFnZW50RGlyLCBzZXR0aW5nc01hbmFnZXIgfSk7XG5cbiAgY29uc3QgcmVzdWx0ID0gYXdhaXQgcG0ucmVzb2x2ZSgpO1xuICBjb25zb2xlLmxvZygnU2tpbGxzIGZvdW5kOicsIHJlc3VsdC5za2lsbHMubGVuZ3RoKTtcbiAgZm9yIChjb25zdCBzIG9mIHJlc3VsdC5za2lsbHMpIHtcbiAgICBjb25zb2xlLmxvZygnICBQYXRoOicsIHMucGF0aCk7XG4gICAgY29uc29sZS5sb2coJyAgQmFzZURpcjonLCBzLm1ldGFkYXRhLmJhc2VEaXIpO1xuICAgIGNvbnNvbGUubG9nKCcgIFNjb3BlOicsIHMubWV0YWRhdGEuc2NvcGUpO1xuICAgIGNvbnNvbGUubG9nKCcgIC0tLScpO1xuICB9XG5cbiAgcm1TeW5jKHRlbXBEaXIsIHsgcmVjdXJzaXZlOiB0cnVlLCBmb3JjZTogdHJ1ZSB9KTtcbn1cblxubWFpbigpO1xuIn19XSwiYXBpIjoib3BlbmFpLWNvbXBsZXRpb25zIiwicHJvdmlkZXIiOiJzeW50aGV0aWMiLCJtb2RlbCI6ImhmOm1vb25zaG90YWkvS2ltaS1LMi41IiwidXNhZ2UiOnsiaW5wdXQiOjEyNzUsIm91dHB1dCI6NTA0LCJjYWNoZVJlYWQiOjUxMjAwLCJjYWNoZVdyaXRlIjowLCJ0b3RhbFRva2VucyI6NTI5NzksImNvc3QiOnsiaW5wdXQiOjAuMDAwNTczNzUsIm91dHB1dCI6MC4wMDE3MTM2LCJjYWNoZVJlYWQiOjAuMDIzMDQsImNhY2hlV3JpdGUiOjAsInRvdGFsIjowLjAyNTMyNzM1MDAwMDAwMDAwMn19LCJzdG9wUmVhc29uIjoidG9vbFVzZSIsInRpbWVzdGFtcCI6MTc3NzU2NDMyMjI5NCwicmVzcG9uc2VJZCI6ImNoYXRjbXBsLWI4MWZkMGU1MDM3NTg0MDQifX0seyJ0eXBlIjoibWVzc2FnZSIsImlkIjoiNzU3Njg2MDQiLCJwYXJlbnRJZCI6IjY2MTFhMzIxIiwidGltZXN0YW1wIjoiMjAyNi0wNC0zMFQxNTo1MjowNi42NTNaIiwibWVzc2FnZSI6eyJyb2xlIjoidG9vbFJlc3VsdCIsInRvb2xDYWxsSWQiOiJmdW5jdGlvbnMud3JpdGU6MTUiLCJ0b29sTmFtZSI6IndyaXRlIiwiY29udGVudCI6W3sidHlwZSI6InRleHQiLCJ0ZXh0IjoiU3VjY2Vzc2Z1bGx5IHdyb3RlIDE1ODUgYnl0ZXMgdG8gL3RtcC9kZWJ1Zy1zeW1saW5rLnRzIn1dLCJpc0Vycm9yIjpmYWxzZSwidGltZXN0YW1wIjoxNzc3NTY0MzI2NjUzfX0seyJ0eXBlIjoibWVzc2FnZSIsImlkIjoiYmQ0OThkYmMiLCJwYXJlbnRJZCI6Ijc1NzY4NjA0IiwidGltZXN0YW1wIjoiMjAyNi0wNC0zMFQxNTo1MjowOS41NThaIiwibWVzc2FnZSI6eyJyb2xlIjoiYXNzaXN0YW50IiwiY29udGVudCI6W3sidHlwZSI6InRvb2xDYWxsIiwiaWQiOiJmdW5jdGlvbnMuYmFzaDoxNiIsIm5hbWUiOiJiYXNoIiwiYXJndW1lbnRzIjp7ImNvbW1hbmQiOiJjZCAvVXNlcnMvYWxpb3VkaWFsbG8vY29kZS9zcmMvZ2l0aHViLmNvbS9hbGlvdS9waS1tb25vICYmIG5weCB0c3ggL3RtcC9kZWJ1Zy1zeW1saW5rLnRzIDI+JjEifX1dLCJhcGkiOiJvcGVuYWktY29tcGxldGlvbnMiLCJwcm92aWRlciI6InN5bnRoZXRpYyIsIm1vZGVsIjoiaGY6bW9vbnNob3RhaS9LaW1pLUsyLjUiLCJ1c2FnZSI6eyJpbnB1dCI6NTc5LCJvdXRwdXQiOjUxLCJjYWNoZVJlYWQiOjUyNDE2LCJjYWNoZVdyaXRlIjowLCJ0b3RhbFRva2VucyI6NTMwNDYsImNvc3QiOnsiaW5wdXQiOjAuMDAwMjYwNTUsIm91dHB1dCI6MC4wMDAxNzM0LCJjYWNoZVJlYWQiOjAuMDIzNTg3MjAwMDAwMDAwMDAzLCJjYWNoZVdyaXRlIjowLCJ0b3RhbCI6MC4wMjQwMjExNX19LCJzdG9wUmVhc29uIjoidG9vbFVzZSIsInRpbWVzdGFtcCI6MTc3NzU2NDMyNjY1NCwicmVzcG9uc2VJZCI6ImNoYXRjbXBsLWI5MmY4YWJhOTMzYTVmYzAifX0seyJ0eXBlIjoibWVzc2FnZSIsImlkIjoiMTQ1YzU5NzUiLCJwYXJlbnRJZCI6ImJkNDk4ZGJjIiwidGltZXN0YW1wIjoiMjAyNi0wNC0zMFQxNTo1MjowOS44ODZaIiwibWVzc2FnZSI6eyJyb2xlIjoidG9vbFJlc3VsdCIsInRvb2xDYWxsSWQiOiJmdW5jdGlvbnMuYmFzaDoxNiIsInRvb2xOYW1lIjoiYmFzaCIsImNvbnRlbnQiOlt7InR5cGUiOiJ0ZXh0IiwidGV4dCI6Im5vZGU6aW50ZXJuYWwvbW9kdWxlcy9janMvbG9hZGVyOjEzODNcbiAgY29uc3QgZXJyID0gbmV3IEVycm9yKG1lc3NhZ2UpO1xuICAgICAgICAgICAgICBeXG5cbkVycm9yOiBDYW5ub3QgZmluZCBtb2R1bGUgJy4vcGFja2FnZXMvY29kaW5nLWFnZW50L3NyYy9jb3JlL3BhY2thZ2UtbWFuYWdlci5qcydcblJlcXVpcmUgc3RhY2s6XG4tIC9wcml2YXRlL3RtcC9kZWJ1Zy1zeW1saW5rLnRzXG4gICAgYXQgbm9kZTppbnRlcm5hbC9tb2R1bGVzL2Nqcy9sb2FkZXI6MTM4MzoxNVxuICAgIGF0IG5leHRSZXNvbHZlU2ltcGxlICgvVXNlcnMvYWxpb3VkaWFsbG8vY29kZS9zcmMvZ2l0aHViLmNvbS9hbGlvdS9waS1tb25vL25vZGVfbW9kdWxlcy90c3gvZGlzdC9yZWdpc3Rlci1ENDZmdnNWXy5janM6NDoxMDA0KVxuICAgIGF0IC9Vc2Vycy9hbGlvdWRpYWxsby9jb2RlL3NyYy9naXRodWIuY29tL2FsaW91L3BpLW1vbm8vbm9kZV9tb2R1bGVzL3RzeC9kaXN0L3JlZ2lzdGVyLUQ0NmZ2c1ZfLmNqczozOjI2MzBcbiAgICBhdCAvVXNlcnMvYWxpb3VkaWFsbG8vY29kZS9zcmMvZ2l0aHViLmNvbS9hbGlvdS9waS1tb25vL25vZGVfbW9kdWxlcy90c3gvZGlzdC9yZWdpc3Rlci1ENDZmdnNWXy5janM6MzoxNTQyXG4gICAgYXQgcmVzb2x2ZVRzUGF0aHMgKC9Vc2Vycy9hbGlvdWRpYWxsby9jb2RlL3NyYy9naXRodWIuY29tL2FsaW91L3BpLW1vbm8vbm9kZV9tb2R1bGVzL3RzeC9kaXN0L3JlZ2lzdGVyLUQ0NmZ2c1ZfLmNqczo0Ojc2MClcbiAgICBhdCAvVXNlcnMvYWxpb3VkaWFsbG8vY29kZS9zcmMvZ2l0aHViLmNvbS9hbGlvdS9waS1tb25vL25vZGVfbW9kdWxlcy90c3gvZGlzdC9yZWdpc3Rlci1ENDZmdnNWXy5janM6NDoxMTAyXG4gICAgYXQgbS5fcmVzb2x2ZUZpbGVuYW1lIChmaWxlOi8vL1VzZXJzL2FsaW91ZGlhbGxvL2NvZGUvc3JjL2dpdGh1Yi5jb20vYWxpb3UvcGktbW9uby9ub2RlX21vZHVsZXMvdHN4L2Rpc3QvcmVnaXN0ZXItQjdqcnRMVE8ubWpzOjE6Nzg5KVxuICAgIGF0IGRlZmF1bHRSZXNvbHZlSW1wbCAobm9kZTppbnRlcm5hbC9tb2R1bGVzL2Nqcy9sb2FkZXI6MTAyNToxOSlcbiAgICBhdCByZXNvbHZlRm9yQ0pTV2l0aEhvb2tzIChub2RlOmludGVybmFsL21vZHVsZXMvY2pzL2xvYWRlcjoxMDMwOjIyKVxuICAgIGF0IEZ1bmN0aW9uLl9sb2FkIChub2RlOmludGVybmFsL21vZHVsZXMvY2pzL2xvYWRlcjoxMTkyOjM3KSB7XG4gIGNvZGU6ICdNT0RVTEVfTk9UX0ZPVU5EJyxcbiAgcmVxdWlyZVN0YWNrOiBbICcvcHJpdmF0ZS90bXAvZGVidWctc3ltbGluay50cycgXVxufVxuXG5Ob2RlLmpzIHYyMi4yMi4wXG5cblxuQ29tbWFuZCBleGl0ZWQgd2l0aCBjb2RlIDEifV0sImRldGFpbHMiOnt9LCJpc0Vycm9yIjp0cnVlLCJ0aW1lc3RhbXAiOjE3Nzc1NjQzMjk4ODZ9fSx7InR5cGUiOiJtZXNzYWdlIiwiaWQiOiIwZDJkYjk3YSIsInBhcmVudElkIjoiMTQ1YzU5NzUiLCJ0aW1lc3RhbXAiOiIyMDI2LTA0LTMwVDE1OjUyOjE0LjQ4MFoiLCJtZXNzYWdlIjp7InJvbGUiOiJhc3Npc3RhbnQiLCJjb250ZW50IjpbeyJ0eXBlIjoidGhpbmtpbmciLCJ0aGlua2luZyI6IiBMZXQgbWUgY2hlY2sgaWYgdGhlIGB+Ly5hZ2VudHMvc2tpbGxzYCBpcyBiZWluZyBkaXNjb3ZlcmVkIGluIHRoaXMgdGVzdC4gTG9va2luZyBhdCB0aGUgdGVzdCBhZ2FpbjpcblxuYGBgdHNcbmNvbnN0IHNoYXJlZERpciA9IGpvaW4odGVtcERpciwgXCJzaGFyZWQtcmVzb3VyY2VzXCIpO1xuY29uc3Qgc2hhcmVkU2tpbGxzRGlyID0gam9pbihzaGFyZWREaXIsIFwic2tpbGxzXCIpO1xubWtkaXJTeW5jKHNoYXJlZFNraWxsc0RpciwgeyByZWN1cnNpdmU6IHRydWUgfSk7XG5ta2RpclN5bmMoam9pbihzaGFyZWRTa2lsbHNEaXIsIFwic2hhcmVkLXNraWxsXCIpLCB7IHJlY3Vyc2l2ZTogdHJ1ZSB9KTtcbndyaXRlRmlsZVN5bmMoXG4gIGpvaW4oc2hhcmVkU2tpbGxzRGlyLCBcInNoYXJlZC1za2lsbFwiLCBcIlNLSUxMLm1kXCIpLFxuICBgLS0tXG5uYW1lOiBzaGFyZWQtc2tpbGxcbmRlc2NyaXB0aW9uOiBTaGFyZWQgc2tpbGxcbi0tLVxuICBDb250ZW50YCxcbik7XG5cbm1rZGlyU3luYyhqb2luKGFnZW50RGlyKSwgeyByZWN1cnNpdmU6IHRydWUgfSk7XG5ta2RpclN5bmMoam9pbih0ZW1wRGlyLCBcIi5waVwiKSwgeyByZWN1cnNpdmU6IHRydWUgfSk7XG5zeW1saW5rU3luYyhzaGFyZWRFeHRlbnNpb25zRGlyLCBqb2luKGFnZW50RGlyLCBcImV4dGVuc2lvbnNcIiksIFwiZGlyXCIpO1xuc3ltbGlua1N5bmMoc2hhcmVkU2tpbGxzRGlyLCBqb2luKGFnZW50RGlyLCBcInNraWxsc1wiKSwgXCJkaXJcIik7XG5zeW1saW5rU3luYyhzaGFyZWRQcm9tcHRzRGlyLCBqb2luKGFnZW50RGlyLCBcInByb21wdHNcIiksIFwiZGlyXCIpO1xuc3ltbGlua1N5bmMoc2hhcmVkVGhlbWVzRGlyLCBqb2luKGFnZW50RGlyLCBcInRoZW1lc1wiKSwgXCJkaXJcIik7XG5zeW1saW5rU3luYyhzaGFyZWRFeHRlbnNpb25zRGlyLCBqb2luKHRlbXBEaXIsIFwiLnBpXCIsIFwiZXh0ZW5zaW9uc1wiKSwgXCJkaXJcIik7XG5zeW1saW5rU3luYyhzaGFyZWRTa2lsbHNEaXIsIGpvaW4odGVtcERpciwgXCIucGlcIiwgXCJza2lsbHNcIiksIFwiZGlyXCIpO1xuc3ltbGlua1N5bmMoc2hhcmVkUHJvbXB0c0Rpciwgam9pbih0ZW1wRGlyLCBcIi5waVwiLCBcInByb21wdHNcIiksIFwiZGlyXCIpO1xuc3ltbGlua1N5bmMoc2hhcmVkVGhlbWVzRGlyLCBqb2luKHRlbXBEaXIsIFwiLnBpXCIsIFwidGhlbWVzXCIpLCBcImRpclwiKTtcbmBgYFxuXG5UaGUgdGVzdCBjcmVhdGVzOlxuLSBVc2VyOiBgYWdlbnREaXIvc2tpbGxzIC0+IHNoYXJlZERpci9za2lsbHNgXG4tIFByb2plY3Q6IGB0ZW1wRGlyLy5waS9za2lsbHMgLT4gc2hhcmVkRGlyL3NraWxsc2BcblxuVGhlIHRlc3QgZG9lc24ndCB0b3VjaCBgfi8uYWdlbnRzL3NraWxsc2AgKEhPTUUgaXMgdW5jaGFuZ2VkIGZyb20gdGhlIE9TKS5cblxuV2FpdCwgbG9va2luZyBtb3JlIGNhcmVmdWxseSBhdCBteSBjb2RlIGNoYW5nZS4gSW4gYGFkZEF1dG9EaXNjb3ZlcmVkUmVzb3VyY2VzYDpcblxuYGBgdHNcbi8vIFVzZXIgc2tpbGxzIGZyb20gfi8ucGkvYWdlbnQvXG5hZGRSZXNvdXJjZXMoXG4gIFwic2tpbGxzXCIsXG4gIGNvbGxlY3RBdXRvU2tpbGxFbnRyaWVzKHVzZXJEaXJzLnNraWxscywgXCJwaVwiKSxcbiAgdXNlck1ldGFkYXRhLFxuICB1c2VyT3ZlcnJpZGVzLnNraWxscyxcbiAgZ2xvYmFsQmFzZURpcixcbik7XG5cbi8vIFVzZXIgc2tpbGxzIGZyb20gfi8uYWdlbnRzLyAod2l0aCBpdHMgb3duIGJhc2VEaXIpXG5jb25zdCB1c2VyQWdlbnRzQmFzZURpciA9IGRpcm5hbWUodXNlckFnZW50c1NraWxsc0Rpcik7XG5jb25zdCB1c2VyQWdlbnRzTWV0YWRhdGE6IFBhdGhNZXRhZGF0YSA9IHtcbiAgLi4udXNlck1ldGFkYXRhLFxuICBiYXNlRGlyOiB1c2VyQWdlbnRzQmFzZURpcixcbn07XG5hZGRSZXNvdXJjZXMoXG4gIFwic2tpbGxzXCIsXG4gIGNvbGxlY3RBdXRvU2tpbGxFbnRyaWVzKHVzZXJBZ2VudHNTa2lsbHNEaXIsIFwiYWdlbnRzXCIpLFxuICB1c2VyQWdlbnRzTWV0YWRhdGEsXG4gIHVzZXJPdmVycmlkZXMuc2tpbGxzLFxuICB1c2VyQWdlbnRzQmFzZURpcixcbik7XG5gYGBcblxuSSBuZWVkIHRvIGNoZWNrIGlmIGB1c2VyQWdlbnRzU2tpbGxzRGlyYCBleGlzdHMgYmVmb3JlIGNhbGxpbmcgYGNvbGxlY3RBdXRvU2tpbGxFbnRyaWVzYC4gSWYgaXQgZG9lc24ndCBleGlzdCwgYGNvbGxlY3RBdXRvU2tpbGxFbnRyaWVzYCBzaG91bGQgcmV0dXJuIGFuIGVtcHR5IGFycmF5LCBidXQgbWF5YmUgdGhlcmUncyBhbiBpc3N1ZSB3aXRoIGhvdyBpdCdzIGJlaW5nIGhhbmRsZWQuXG5cbkxldCBtZSBjaGVjayB0aGUgYGNvbGxlY3RBdXRvU2tpbGxFbnRyaWVzYCBmdW5jdGlvbjoiLCJ0aGlua2luZ1NpZ25hdHVyZSI6InJlYXNvbmluZyJ9LHsidHlwZSI6InRleHQiLCJ0ZXh0IjoiIExldCBtZSBjaGVjayB3aGF0IGBjb2xsZWN0QXV0b1NraWxsRW50cmllc2AgZG9lcyB3aXRoIGEgbm9uLWV4aXN0ZW50IGRpcmVjdG9yeSJ9LHsidHlwZSI6InRvb2xDYWxsIiwiaWQiOiJmdW5jdGlvbnMuZ3JlcDoxNyIsIm5hbWUiOiJncmVwIiwiYXJndW1lbnRzIjp7InBhdHRlcm4iOiJmdW5jdGlvbiBjb2xsZWN0QXV0b1NraWxsRW50cmllcyIsInBhdGgiOiJwYWNrYWdlcy9jb2RpbmctYWdlbnQvc3JjL2NvcmUvcGFja2FnZS1tYW5hZ2VyLnRzIiwiY29udGV4dCI6NX19XSwiYXBpIjoib3BlbmFpLWNvbXBsZXRpb25zIiwicHJvdmlkZXIiOiJzeW50aGV0aWMiLCJtb2RlbCI6ImhmOm1vb25zaG90YWkvS2ltaS1LMi41IiwidXNhZ2UiOnsiaW5wdXQiOjUyNSwib3V0cHV0Ijo2MjMsImNhY2hlUmVhZCI6NTI5NjAsImNhY2hlV3JpdGUiOjAsInRvdGFsVG9rZW5zIjo1NDEwOCwiY29zdCI6eyJpbnB1dCI6MC4wMDAyMzYyNTAwMDAwMDAwMDAwMiwib3V0cHV0IjowLjAwMjExODIsImNhY2hlUmVhZCI6MC4wMjM4MzIwMDAwMDAwMDAwMDIsImNhY2hlV3JpdGUiOjAsInRvdGFsIjowLjAyNjE4NjQ1MDAwMDAwMDAwM319LCJzdG9wUmVhc29uIjoidG9vbFVzZSIsInRpbWVzdGFtcCI6MTc3NzU2NDMyOTg4NywicmVzcG9uc2VJZCI6ImNoYXRjbXBsLWI3Y2ExMTIxNjQ1NDI4MjMifX0seyJ0eXBlIjoibWVzc2FnZSIsImlkIjoiNDI3YjI2NDciLCJwYXJlbnRJZCI6IjBkMmRiOTdhIiwidGltZXN0YW1wIjoiMjAyNi0wNC0zMFQxNTo1MjoxNC40ODZaIiwibWVzc2FnZSI6eyJyb2xlIjoidG9vbFJlc3VsdCIsInRvb2xDYWxsSWQiOiJmdW5jdGlvbnMuZ3JlcDoxNyIsInRvb2xOYW1lIjoiZ3JlcCIsImNvbnRlbnQiOlt7InR5cGUiOiJ0ZXh0IiwidGV4dCI6InBhY2thZ2UtbWFuYWdlci50czozOTg6ICAgfVxucGFja2FnZS1tYW5hZ2VyLnRzOjM5OTogICBcbnBhY2thZ2UtbWFuYWdlci50czo0MDA6ICAgcmV0dXJuIGVudHJpZXM7XG5wYWNrYWdlLW1hbmFnZXIudHM6NDAxOiAgIH1cbnBhY2thZ2UtbWFuYWdlci50czo0MDI6ICAgXG5wYWNrYWdlLW1hbmFnZXIudHM6NDAzOiBmdW5jdGlvbiBjb2xsZWN0QXV0b1NraWxsRW50cmllcyhkaXI6IHN0cmluZywgbW9kZTogU2tpbGxEaXNjb3ZlcnlNb2RlKTogc3RyaW5nW10ge1xucGFja2FnZS1tYW5hZ2VyLnRzOjQwNDogICByZXR1cm4gY29sbGVjdFNraWxsRW50cmllcyhkaXIsIG1vZGUpO1xucGFja2FnZS1tYW5hZ2VyLnRzOjQwNTogICB9XG5wYWNrYWdlLW1hbmFnZXIudHM6NDA2OiAgIFxucGFja2FnZS1tYW5hZ2VyLnRzOjQwNzogICBmdW5jdGlvbiBmaW5kR2l0UmVwb1Jvb3Qoc3RhcnREaXI6IHN0cmluZyk6IHN0cmluZyB8IG51bGwge1xucGFja2FnZS1tYW5hZ2VyLnRzOjQwODogICBsZXQgZGlyID0gcmVzb2x2ZShzdGFydERpcik7In1dLCJkZXRhaWxzIjp7Im1hdGNoQ291bnQiOjEsIm1hdGNoZXMiOlt7InBhdGgiOiJwYWNrYWdlLW1hbmFnZXIudHMiLCJsaW5lIjozOTgsInRleHQiOiIgIH0ifSx7InBhdGgiOiJwYWNrYWdlLW1hbmFnZXIudHMiLCJsaW5lIjozOTksInRleHQiOiIgICJ9LHsicGF0aCI6InBhY2thZ2UtbWFuYWdlci50cyIsImxpbmUiOjQwMCwidGV4dCI6IiAgcmV0dXJuIGVudHJpZXM7In0seyJwYXRoIjoicGFja2FnZS1tYW5hZ2VyLnRzIiwibGluZSI6NDAxLCJ0ZXh0IjoiICB9In0seyJwYXRoIjoicGFja2FnZS1tYW5hZ2VyLnRzIiwibGluZSI6NDAyLCJ0ZXh0IjoiICAifSx7InBhdGgiOiJwYWNrYWdlLW1hbmFnZXIudHMiLCJsaW5lIjo0MDMsInRleHQiOiJmdW5jdGlvbiBjb2xsZWN0QXV0b1NraWxsRW50cmllcyhkaXI6IHN0cmluZywgbW9kZTogU2tpbGxEaXNjb3ZlcnlNb2RlKTogc3RyaW5nW10geyJ9LHsicGF0aCI6InBhY2thZ2UtbWFuYWdlci50cyIsImxpbmUiOjQwNCwidGV4dCI6IiAgcmV0dXJuIGNvbGxlY3RTa2lsbEVudHJpZXMoZGlyLCBtb2RlKTsifSx7InBhdGgiOiJwYWNrYWdlLW1hbmFnZXIudHMiLCJsaW5lIjo0MDUsInRleHQiOiIgIH0ifSx7InBhdGgiOiJwYWNrYWdlLW1hbmFnZXIudHMiLCJsaW5lIjo0MDYsInRleHQiOiIgICJ9LHsicGF0aCI6InBhY2thZ2UtbWFuYWdlci50cyIsImxpbmUiOjQwNywidGV4dCI6IiAgZnVuY3Rpb24gZmluZEdpdFJlcG9Sb290KHN0YXJ0RGlyOiBzdHJpbmcpOiBzdHJpbmcgfCBudWxsIHsifSx7InBhdGgiOiJwYWNrYWdlLW1hbmFnZXIudHMiLCJsaW5lIjo0MDgsInRleHQiOiIgIGxldCBkaXIgPSByZXNvbHZlKHN0YXJ0RGlyKTsifV19LCJpc0Vycm9yIjpmYWxzZSwidGltZXN0YW1wIjoxNzc3NTY0MzM0NDg2fX0seyJ0eXBlIjoibWVzc2FnZSIsImlkIjoiOGUzODlhMGUiLCJwYXJlbnRJZCI6IjQyN2IyNjQ3IiwidGltZXN0YW1wIjoiMjAyNi0wNC0zMFQxNTo1MjoxNy4zMjFaIiwibWVzc2FnZSI6eyJyb2xlIjoiYXNzaXN0YW50IiwiY29udGVudCI6W3sidHlwZSI6InRvb2xDYWxsIiwiaWQiOiJmdW5jdGlvbnMuZ3JlcDoxOCIsIm5hbWUiOiJncmVwIiwiYXJndW1lbnRzIjp7InBhdHRlcm4iOiJmdW5jdGlvbiBjb2xsZWN0U2tpbGxFbnRyaWVzIiwicGF0aCI6InBhY2thZ2VzL2NvZGluZy1hZ2VudC9zcmMvY29yZS9wYWNrYWdlLW1hbmFnZXIudHMiLCJjb250ZXh0IjoxMH19XSwiYXBpIjoib3BlbmFpLWNvbXBsZXRpb25zIiwicHJvdmlkZXIiOiJzeW50aGV0aWMiLCJtb2RlbCI6ImhmOm1vb25zaG90YWkvS2ltaS1LMi41IiwidXNhZ2UiOnsiaW5wdXQiOjI0OSwib3V0cHV0Ijo0MCwiY2FjaGVSZWFkIjo1MzQ0MCwiY2FjaGVXcml0ZSI6MCwidG90YWxUb2tlbnMiOjUzNzI5LCJjb3N0Ijp7ImlucHV0IjowLjAwMDExMjA1MDAwMDAwMDAwMDAxLCJvdXRwdXQiOjAuMDAwMTM2LCJjYWNoZVJlYWQiOjAuMDI0MDQ4MDAwMDAwMDAwMDAzLCJjYWNoZVdyaXRlIjowLCJ0b3RhbCI6MC4wMjQyOTYwNTAwMDAwMDAwMDN9fSwic3RvcFJlYXNvbiI6InRvb2xVc2UiLCJ0aW1lc3RhbXAiOjE3Nzc1NjQzMzQ0ODcsInJlc3BvbnNlSWQiOiJjaGF0Y21wbC05ZjMxOGE4OTMxODZlZDY5In19LHsidHlwZSI6Im1lc3NhZ2UiLCJpZCI6IjMzNWEyM2U1IiwicGFyZW50SWQiOiI4ZTM4OWEwZSIsInRpbWVzdGFtcCI6IjIwMjYtMDQtMzBUMTU6NTI6MTcuMzI1WiIsIm1lc3NhZ2UiOnsicm9sZSI6InRvb2xSZXN1bHQiLCJ0b29sQ2FsbElkIjoiZnVuY3Rpb25zLmdyZXA6MTgiLCJ0b29sTmFtZSI6ImdyZXAiLCJjb250ZW50IjpbeyJ0eXBlIjoidGV4dCIsInRleHQiOiJwYWNrYWdlLW1hbmFnZXIudHM6MzE5OiAgIH1cbnBhY2thZ2UtbWFuYWdlci50czozMjA6ICAgfSBjYXRjaCB7XG5wYWNrYWdlLW1hbmFnZXIudHM6MzIxOiAgIC8vIElnbm9yZSBlcnJvcnNcbnBhY2thZ2UtbWFuYWdlci50czozMjI6ICAgfVxucGFja2FnZS1tYW5hZ2VyLnRzOjMyMzogICBcbnBhY2thZ2UtbWFuYWdlci50czozMjQ6ICAgcmV0dXJuIGZpbGVzO1xucGFja2FnZS1tYW5hZ2VyLnRzOjMyNTogICB9XG5wYWNrYWdlLW1hbmFnZXIudHM6MzI2OiAgIFxucGFja2FnZS1tYW5hZ2VyLnRzOjMyNzogICB0eXBlIFNraWxsRGlzY292ZXJ5TW9kZSA9IFwicGlcIiB8IFwiYWdlbnRzXCI7XG5wYWNrYWdlLW1hbmFnZXIudHM6MzI4OiAgIFxucGFja2FnZS1tYW5hZ2VyLnRzOjMyOTogZnVuY3Rpb24gY29sbGVjdFNraWxsRW50cmllcyhcbnBhY2thZ2UtbWFuYWdlci50czozMzA6ICAgZGlyOiBzdHJpbmcsXG5wYWNrYWdlLW1hbmFnZXIudHM6MzMxOiAgIG1vZGU6IFNraWxsRGlzY292ZXJ5TW9kZSxcbnBhY2thZ2UtbWFuYWdlci50czozMzI6ICAgaWdub3JlTWF0Y2hlcj86IElnbm9yZU1hdGNoZXIsXG5wYWNrYWdlLW1hbmFnZXIudHM6MzMzOiAgIHJvb3REaXI/OiBzdHJpbmcsXG5wYWNrYWdlLW1hbmFnZXIudHM6MzM0OiAgICk6IHN0cmluZ1tdIHtcbnBhY2thZ2UtbWFuYWdlci50czozMzU6ICAgY29uc3QgZW50cmllczogc3RyaW5nW10gPSBbXTtcbnBhY2thZ2UtbWFuYWdlci50czozMzY6ICAgaWYgKCFleGlzdHNTeW5jKGRpcikpIHJldHVybiBlbnRyaWVzO1xucGFja2FnZS1tYW5hZ2VyLnRzOjMzNzogICBcbnBhY2thZ2UtbWFuYWdlci50czozMzg6ICAgY29uc3Qgcm9vdCA9IHJvb3REaXIgPz8gZGlyO1xucGFja2FnZS1tYW5hZ2VyLnRzOjMzOTogICBjb25zdCBpZyA9IGlnbm9yZU1hdGNoZXIgPz8gaWdub3JlKCk7In1dLCJkZXRhaWxzIjp7Im1hdGNoQ291bnQiOjEsIm1hdGNoZXMiOlt7InBhdGgiOiJwYWNrYWdlLW1hbmFnZXIudHMiLCJsaW5lIjozMTksInRleHQiOiIgIH0ifSx7InBhdGgiOiJwYWNrYWdlLW1hbmFnZXIudHMiLCJsaW5lIjozMjAsInRleHQiOiIgIH0gY2F0Y2ggeyJ9LHsicGF0aCI6InBhY2thZ2UtbWFuYWdlci50cyIsImxpbmUiOjMyMSwidGV4dCI6IiAgLy8gSWdub3JlIGVycm9ycyJ9LHsicGF0aCI6InBhY2thZ2UtbWFuYWdlci50cyIsImxpbmUiOjMyMiwidGV4dCI6IiAgfSJ9LHsicGF0aCI6InBhY2thZ2UtbWFuYWdlci50cyIsImxpbmUiOjMyMywidGV4dCI6IiAgIn0seyJwYXRoIjoicGFja2FnZS1tYW5hZ2VyLnRzIiwibGluZSI6MzI0LCJ0ZXh0IjoiICByZXR1cm4gZmlsZXM7In0seyJwYXRoIjoicGFja2FnZS1tYW5hZ2VyLnRzIiwibGluZSI6MzI1LCJ0ZXh0IjoiICB9In0seyJwYXRoIjoicGFja2FnZS1tYW5hZ2VyLnRzIiwibGluZSI6MzI2LCJ0ZXh0IjoiICAifSx7InBhdGgiOiJwYWNrYWdlLW1hbmFnZXIudHMiLCJsaW5lIjozMjcsInRleHQiOiIgIHR5cGUgU2tpbGxEaXNjb3ZlcnlNb2RlID0gXCJwaVwiIHwgXCJhZ2VudHNcIjsifSx7InBhdGgiOiJwYWNrYWdlLW1hbmFnZXIudHMiLCJsaW5lIjozMjgsInRleHQiOiIgICJ9LHsicGF0aCI6InBhY2thZ2UtbWFuYWdlci50cyIsImxpbmUiOjMyOSwidGV4dCI6ImZ1bmN0aW9uIGNvbGxlY3RTa2lsbEVudHJpZXMoIn0seyJwYXRoIjoicGFja2FnZS1tYW5hZ2VyLnRzIiwibGluZSI6MzMwLCJ0ZXh0IjoiICBkaXI6IHN0cmluZywifSx7InBhdGgiOiJwYWNrYWdlLW1hbmFnZXIudHMiLCJsaW5lIjozMzEsInRleHQiOiIgIG1vZGU6IFNraWxsRGlzY292ZXJ5TW9kZSwifSx7InBhdGgiOiJwYWNrYWdlLW1hbmFnZXIudHMiLCJsaW5lIjozMzIsInRleHQiOiIgIGlnbm9yZU1hdGNoZXI/OiBJZ25vcmVNYXRjaGVyLCJ9LHsicGF0aCI6InBhY2thZ2UtbWFuYWdlci50cyIsImxpbmUiOjMzMywidGV4dCI6IiAgcm9vdERpcj86IHN0cmluZywifSx7InBhdGgiOiJwYWNrYWdlLW1hbmFnZXIudHMiLCJsaW5lIjozMzQsInRleHQiOiIgICk6IHN0cmluZ1tdIHsifSx7InBhdGgiOiJwYWNrYWdlLW1hbmFnZXIudHMiLCJsaW5lIjozMzUsInRleHQiOiIgIGNvbnN0IGVudHJpZXM6IHN0cmluZ1tdID0gW107In0seyJwYXRoIjoicGFja2FnZS1tYW5hZ2VyLnRzIiwibGluZSI6MzM2LCJ0ZXh0IjoiICBpZiAoIWV4aXN0c1N5bmMoZGlyKSkgcmV0dXJuIGVudHJpZXM7In0seyJwYXRoIjoicGFja2FnZS1tYW5hZ2VyLnRzIiwibGluZSI6MzM3LCJ0ZXh0IjoiICAifSx7InBhdGgiOiJwYWNrYWdlLW1hbmFnZXIudHMiLCJsaW5lIjozMzgsInRleHQiOiIgIGNvbnN0IHJvb3QgPSByb290RGlyID8/IGRpcjsifSx7InBhdGgiOiJwYWNrYWdlLW1hbmFnZXIudHMiLCJsaW5lIjozMzksInRleHQiOiIgIGNvbnN0IGlnID0gaWdub3JlTWF0Y2hlciA/PyBpZ25vcmUoKTsifV19LCJpc0Vycm9yIjpmYWxzZSwidGltZXN0YW1wIjoxNzc3NTY0MzM3MzI1fX0seyJ0eXBlIjoibWVzc2FnZSIsImlkIjoiZGFkMzk1ZmYiLCJwYXJlbnRJZCI6IjMzNWEyM2U1IiwidGltZXN0YW1wIjoiMjAyNi0wNC0zMFQxNTo1MjoyOS44MDdaIiwibWVzc2FnZSI6eyJyb2xlIjoiYXNzaXN0YW50IiwiY29udGVudCI6W3sidHlwZSI6InRoaW5raW5nIiwidGhpbmtpbmciOiIgTG9va2luZyBhdCB0aGUgY29kZSwgYGNvbGxlY3RTa2lsbEVudHJpZXNgIHJldHVybnMgZW1wdHkgYXJyYXkgaWYgYCFleGlzdHNTeW5jKGRpcilgLiBTbyBmb3IgYC5hZ2VudHNgIGRpcmVjdG9yaWVzIHRoYXQgZG9uJ3QgZXhpc3QsIGl0IHJldHVybnMgZW1wdHkuXG5cbk5vdyBsZXQgbWUgdHJhY2UgdGhyb3VnaCB0aGUgaXNzdWUgbW9yZSBjYXJlZnVsbHkuIFRoZSB0ZXN0IGNyZWF0ZXM6XG4tIGBhZ2VudERpci9za2lsbHNgIHN5bWxpbmtlZCB0byBzaGFyZWQgc2tpbGxzXG4tIGB0ZW1wRGlyLy5waS9za2lsbHNgIHN5bWxpbmtlZCB0byBzaGFyZWQgc2tpbGxzXG5cbldpdGggbXkgZml4LCBJIG5vdyBoYXZlOlxuMS4gVXNlciBgLnBpYCBza2lsbHMgZGlzY292ZXJlZCB3aXRoIGBiYXNlRGlyID0gYWdlbnREaXJgXG4yLiBVc2VyIGAuYWdlbnRzYCBza2lsbHMgZGlzY292ZXJlZCB3aXRoIGBiYXNlRGlyID0gfi8uYWdlbnRzYFxuXG5CdXQgc2luY2UgYH4vLmFnZW50cy9za2lsbHNgIGRvZXNuJ3QgZXhpc3QgaW4gdGhpcyB0ZXN0LCBpdCBzaG91bGQgcmV0dXJuIGVtcHR5LlxuXG5UaGUgaXNzdWUgbXVzdCBiZSBzb21ldGhpbmcgZWxzZS4gTGV0IG1lIGNoZWNrIGlmIHRoZXJlJ3MgYC5hZ2VudHNgIGRpcmVjdG9yeSBiZWluZyBwaWNrZWQgdXAgZnJvbSB0aGUgcmVhbCBob21lIGRpcmVjdG9yeSBkdXJpbmcgdGVzdCBydW5zLlxuXG5BY3R1YWxseSB3YWl0LCBsb29raW5nIGF0IHRoZSB0ZXN0IGFnYWluOlxuXG5gYGB0c1xuc3ltbGlua1N5bmMoc2hhcmVkU2tpbGxzRGlyLCBqb2luKGFnZW50RGlyLCBcInNraWxsc1wiKSwgXCJkaXJcIik7XG5gYGBcblxuVGhpcyBjcmVhdGVzIGEgc3ltbGluayBhdCBgYWdlbnREaXIvc2tpbGxzYCBwb2ludGluZyB0byBgc2hhcmVkRGlyL3NraWxsc2AuXG5cbkFuZDpcbmBgYHRzXG5zeW1saW5rU3luYyhzaGFyZWRTa2lsbHNEaXIsIGpvaW4odGVtcERpciwgXCIucGlcIiwgXCJza2lsbHNcIiksIFwiZGlyXCIpO1xuYGBgXG5cblRoaXMgY3JlYXRlcyBhIHN5bWxpbmsgYXQgYHRlbXBEaXIvLnBpL3NraWxsc2AgcG9pbnRpbmcgdG8gYHNoYXJlZERpci9za2lsbHNgLlxuXG5XaXRoIG15IGZpeDpcbjEuIGBjb2xsZWN0QXV0b1NraWxsRW50cmllcyh1c2VyRGlycy5za2lsbHMsIFwicGlcIilgIGNvbGxlY3RzIGZyb20gYGFnZW50RGlyL3NraWxsc2AgKHdoaWNoIGlzIGEgc3ltbGluaykgLT4gZmluZHMgYHNoYXJlZC1za2lsbC9TS0lMTC5tZGBcbjIuIGBjb2xsZWN0QXV0b1NraWxsRW50cmllcyh1c2VyQWdlbnRzU2tpbGxzRGlyLCBcImFnZW50c1wiKWAgY29sbGVjdHMgZnJvbSBgfi8uYWdlbnRzL3NraWxsc2AgKHJlYWwgaG9tZSBkaXIpIC0+IHByb2JhYmx5IGVtcHR5IGluIHRoaXMgdGVzdFxuXG5TbyB3aGVyZSBkb2VzIHRoZSBzZWNvbmQgc2tpbGwgY29tZSBmcm9tP1xuXG5PaCB3YWl0ISBJIHRoaW5rIEkgc2VlIGl0LiBUaGUgdGVzdCBzZXRzIHVwIHN5bWxpbmtzIGJ1dCB0aGUgY2Fub25pY2FsaXphdGlvbiBoYXBwZW5zIGluIGB0b1Jlc29sdmVkUGF0aHNgLiBMZXQgbWUgY2hlY2sgaWYgdGhlIHByb2plY3Qgc2lkZSBpcyBhbHNvIGNvbnRyaWJ1dGluZy4uLlxuIFxuSSBzZWUgbm93IHRoYXQgcHJvamVjdCBza2lsbHMgYXJlIGRpc2NvdmVyZWQgdGhyb3VnaCB0d28gcG90ZW50aWFsIHBhdGhzOlxuLSBUaGUgc3RhbmRhcmQgYC5waWAgZGlyZWN0b3J5XG4tIFBvdGVudGlhbGx5IHRocm91Z2ggYC5hZ2VudHNgIGRpcmVjdG9yaWVzXG5cblRoaXMgbWVhbnMgdGhlIHNoYXJlZCBza2lsbCBtaWdodCBiZSBhcHBlYXJpbmcgdGhyb3VnaCBtdWx0aXBsZSBkaXNjb3ZlcnkgbWVjaGFuaXNtcy4gVGhlIHByb2plY3Qgc2tpbGxzIGRpc2NvdmVyeSBjb3VsZCBiZSB0cmlnZ2VyaW5nIG11bHRpcGxlIGVudHJpZXMsIGVzcGVjaWFsbHkgd2l0aCB0aGUgc3ltbGluayBzdHJ1Y3R1cmUgaW4gcGxhY2UuXG5cblRoZSBjYW5vbmljYWxpemF0aW9uIHByb2Nlc3MgaW4gYHRvUmVzb2x2ZWRQYXRoc2AgaXMgc3VwcG9zZWQgdG8gZGVkdXBsaWNhdGUgc2tpbGxzLCBidXQgc29tZXRoaW5nIGluIG15IHJlY2VudCBjaGFuZ2VzIG1pZ2h0IGJlIGludGVyZmVyaW5nIHdpdGggdGhpcyBuYXR1cmFsIGRlZHVwbGljYXRpb24gcHJvY2Vzcy5cblxuVGhlIGNvcmUgaXNzdWUgc2VlbXMgdG8gYmUgdGhhdCBkaWZmZXJlbnQgZGlzY292ZXJ5IHBhdGhzIGFyZSBjcmVhdGluZyBtdWx0aXBsZSBlbnRyaWVzIGZvciB3aGF0IHNob3VsZCBiZSB0aGUgc2FtZSBza2lsbC4gSSdsbCBuZWVkIHRvIHRyYWNlIGV4YWN0bHkgaG93IHRoZXNlIHBhdGhzIGFyZSBiZWluZyBnZW5lcmF0ZWQgYW5kIHdoeSB0aGV5J3JlIG5vdCBiZWluZyBjb2xsYXBzZWQgaW50byBhIHNpbmdsZSBlbnRyeS5cblxuVGhlIHVzZXIgYW5kIHByb2plY3QgcGF0aHMgaGF2ZSBkaXN0aW5jdCBtZXRhZGF0YSAtIGRpZmZlcmVudCBzY29wZXMgYW5kIGJhc2UgZGlyZWN0b3JpZXMuIEV2ZW4gdGhvdWdoIHRoZXkgcmVwcmVzZW50IHRoZSBzYW1lIHVuZGVybHlpbmcgZmlsZSwgdGhleSdyZSB0cmVhdGVkIGFzIHNlcGFyYXRlIHJlc291cmNlcy4gVGhpcyBtZWFucyB0aGUgZGVkdXBsaWNhdGlvbiBsb2dpYyBtaWdodCBuZWVkIHRvIGJlIG1vcmUgc29waGlzdGljYXRlZCwgcG90ZW50aWFsbHkgdXNpbmcgY2Fub25pY2FsIHBhdGhzIG9yIGRlZXBlciBjb250ZW50IGNvbXBhcmlzb24uXG5cblRoZSBzcGVjaWZpYyB0ZXN0IHNldHVwIHdpdGggYSBzaGFyZWQgc2tpbGwgc3ltbGlua2VkIGFjcm9zcyBib3RoIHVzZXIgYW5kIHByb2plY3QgZGlyZWN0b3JpZXMgaXMgcmV2ZWFsaW5nIGEgbnVhbmNlZCBlZGdlIGNhc2UgaW4gcmVzb3VyY2UgcmVzb2x1dGlvbi4gVGhlIHRlc3QgZXhwbGljaXRseSBleHBlY3RzIG9ubHkgb25lIHNraWxsLCBidXQgdGhlIGN1cnJlbnQgaW1wbGVtZW50YXRpb24gaXMgcmV0dXJuaW5nIHR3byBkaXN0aW5jdCBlbnRyaWVzLlxuXG5JIG5lZWQgdG8gY2FyZWZ1bGx5IGV4YW1pbmUgaG93IHRoZSBkZWR1cGxpY2F0aW9uIG1lY2hhbmlzbSBoYW5kbGVzIHRoZXNlIHN5bWxpbmtlZCBzY2VuYXJpb3MsIGVuc3VyaW5nIHRoYXQgaWRlbnRpY2FsIGNvbnRlbnQgcGF0aHMgYXJlIHJlY29nbml6ZWQgYW5kIG1lcmdlZCBhcHByb3ByaWF0ZWx5LlxuXG5UaGUgUFIncyBndWlkYW5jZSBzdWdnZXN0cyBwcmVzZXJ2aW5nIHJvb3QgcHJvdmVuYW5jZSB0aHJvdWdoIGJhc2VEaXIgd2hpbGUgbWFpbnRhaW5pbmcgdGhlIHNvdXJjZTogXCJhdXRvXCIgYXBwcm9hY2guIEhvd2V2ZXIsIHRoZSBjdXJyZW50IGltcGxlbWVudGF0aW9uIHNlZW1zIHRvIGJlIGNyZWF0aW5nIGR1cGxpY2F0ZSBlbnRyaWVzIHdoZXJlIHRoZSB0ZXN0IGV4cGVjdHMgYSBzaW5nbGUsIHVuaWZpZWQgc2tpbGwuXG5cblRoZSBjaGFsbGVuZ2UgbGllcyBpbiByZWNvbmNpbGluZyB0aGUgc3ltbGlua2VkIHBhdGhzIC0gdGhlIGNhbm9uaWNhbCBwYXRoIGZvciBib3RoIHVzZXIgYW5kIHByb2plY3Qgc2tpbGxzIHBvaW50cyB0byB0aGUgc2FtZSB1bmRlcmx5aW5nIGZpbGUsIHlldCB0aGV5J3JlIGJlaW5nIHRyZWF0ZWQgYXMgc2VwYXJhdGUgZW50aXRpZXMuIFRoaXMgc3VnZ2VzdHMgYSBwb3RlbnRpYWwgZmxhdyBpbiBob3cgdGhlIGN1cnJlbnQgZGVkdXBsaWNhdGlvbiBsb2dpYyBoYW5kbGVzIHN5bWxpbmtlZCByZXNvdXJjZXMuXG5cbkknbGwgbmVlZCB0byBpbnZlc3RpZ2F0ZSBob3cgdG8gbW9kaWZ5IHRoZSByZXNvdXJjZSBjb2xsZWN0aW9uIHRvIHJlY29nbml6ZSB0aGVzZSBwYXRocyBhcyBlcXVpdmFsZW50IHdoaWxlIHN0aWxsIHJlc3BlY3RpbmcgdGhlIGludGVuZGVkIGdyb3VwaW5nIG1lY2hhbmlzbS4gVGhlIGdvYWwgaXMgdG8gZW5zdXJlIHRoYXQgc3ltbGlua2VkIHNraWxscyBhcmUgcHJvcGVybHkgY29uc29saWRhdGVkIHdpdGhvdXQgbG9zaW5nIHRoZSBzZW1hbnRpYyBkaXN0aW5jdGlvbiBiZXR3ZWVuIHVzZXIgYW5kIHByb2plY3QgY29udGV4dHMuXG5cblRoZSBjb3JlIGlzc3VlIGFwcGVhcnMgdG8gYmUgaW4gdGhlIHBhdGggcmVzb2x1dGlvbiBhbmQgcmVzb3VyY2UgZ3JvdXBpbmcgbG9naWMsIHdoZXJlIHRoZSBjYW5vbmljYWxpemF0aW9uIHByb2Nlc3MgbWlnaHQgYmUgaW50ZXJmZXJpbmcgd2l0aCB0aGUgZXhwZWN0ZWQgc2tpbGwgY29uc29saWRhdGlvbiBiZWhhdmlvci4gSSBzZWUgdGhlIHRlc3QncyBpbnRlbnQgdG8gdmVyaWZ5IHN5bWxpbmsgZGVkdXBsaWNhdGlvbiB3b3JrcyBjb3JyZWN0bHkuIFRoZSBjb3JlIGlzc3VlIHN0ZW1zIGZyb20gYSBjaGFuZ2UgaW4gaG93IHNraWxsIHBhdGhzIGFyZSBwcm9jZXNzZWQuIFByZXZpb3VzbHksIGJvdGggdXNlciBhbmQgcHJvamVjdCBwYXRocyBzaGFyZWQgaWRlbnRpY2FsIG1ldGFkYXRhLCB3aGljaCBhbGxvd2VkIGNhbm9uaWNhbCBwYXRoIGRlZHVwbGljYXRpb24uIFRoZSByZWNlbnQgbW9kaWZpY2F0aW9uIGludHJvZHVjZWQgZGlzdGluY3QgYmFzZSBkaXJlY3RvcmllcywgZGlzcnVwdGluZyB0aGUgZGVkdXBsaWNhdGlvbiBtZWNoYW5pc20uIFRoaXMgbWVhbnMgc3ltbGlua2VkIHJlc291cmNlcyBub3cgYXBwZWFyIGFzIHNlcGFyYXRlIGVudHJpZXMsIGJyZWFraW5nIHRoZSB0ZXN0J3Mgb3JpZ2luYWwgZXhwZWN0YXRpb24gb2Ygc2luZ2xlIHJlcHJlc2VudGF0aW9uLlxuXG5UaGUgdGVzdCBleHBsaWNpdGx5IGNoZWNrcyB0aGF0IHdoZW4gYSBza2lsbCBpcyBzeW1saW5rZWQgZnJvbSBib3RoIHVzZXIgYW5kIHByb2plY3QgZGlyZWN0b3JpZXMsIG9ubHkgb25lIGNhbm9uaWNhbCBpbnN0YW5jZSBzaG91bGQgZXhpc3QuIEJ5IGFsdGVyaW5nIHRoZSBiYXNlRGlyIG1ldGFkYXRhLCBJJ3ZlIGluYWR2ZXJ0ZW50bHkgaW50cm9kdWNlZCBhIHJlZ3Jlc3Npb24gd2hlcmUgdGhlc2UgcGF0aHMgYXJlIG5vIGxvbmdlciByZWNvZ25pemVkIGFzIGVxdWl2YWxlbnQgZHVyaW5nIHRoZSBkZWR1cGxpY2F0aW9uIHByb2Nlc3MuXG5cblRoZSByZWNvbW1lbmRlZCBzb2x1dGlvbiBpbnZvbHZlcyByZXN0cnVjdHVyaW5nIGhvdyBza2lsbHMgYXJlIGFkZGVkLCBlbnN1cmluZyBjb25zaXN0ZW50IG1ldGFkYXRhIHRyZWF0bWVudCB3aGlsZSBwcmVzZXJ2aW5nIHRoZSB1bmlxdWUgYmFzZURpciBmb3IgZWFjaCBwYXRoLiBUaGlzIHJlcXVpcmVzIGNhcmVmdWwgbW9kaWZpY2F0aW9uIG9mIHRoZSBhZGRSZXNvdXJjZXMgZnVuY3Rpb24gdG8gaGFuZGxlIGJvdGggcGF0aCBjb2xsZWN0aW9uIGFuZCBtZXRhZGF0YSBhc3NpZ25tZW50IHdpdGhvdXQgY3JlYXRpbmcgZHVwbGljYXRlIGVudHJpZXMuXG5cbkknbGwgY3JlYXRlIGEgc3RhbmRhbG9uZSBzY3JpcHQgdG8gaW52ZXN0aWdhdGUgdGhlIGFjdHVhbCBydW50aW1lIGJlaGF2aW9yIGFuZCB2ZXJpZnkgdGhlIGlzc3VlJ3Mgcm9vdCBjYXVzZS4gVGhlIHNjcmlwdCB3aWxsIGhlbHAgaXNvbGF0ZSB0aGUgc3BlY2lmaWMgY29uZGl0aW9ucyB0cmlnZ2VyaW5nIHRoZSB1bmV4cGVjdGVkIHNraWxsIGR1cGxpY2F0aW9uIiwidGhpbmtpbmdTaWduYXR1cmUiOiJyZWFzb25pbmcifSx7InR5cGUiOiJ0ZXh0IiwidGV4dCI6IiBMZXQgbWUgY2hlY2sgdGhlIGFjdHVhbCBwYXRocyBiZWluZyBkaXNjb3ZlcmVkOiJ9LHsidHlwZSI6InRvb2xDYWxsIiwiaWQiOiJmdW5jdGlvbnMud3JpdGU6MTkiLCJuYW1lIjoid3JpdGUiLCJhcmd1bWVudHMiOnsicGF0aCI6InBhY2thZ2VzL2NvZGluZy1hZ2VudC90ZXN0L2RlYnVnLXN5bWxpbmsudGVzdC50cyIsImNvbnRlbnQiOiJpbXBvcnQgeyBta2RpclN5bmMsIHdyaXRlRmlsZVN5bmMsIHN5bWxpbmtTeW5jLCBybVN5bmMsIGV4aXN0c1N5bmMgfSBmcm9tICdub2RlOmZzJztcbmltcG9ydCB7IHRtcGRpciB9IGZyb20gJ25vZGU6b3MnO1xuaW1wb3J0IHsgam9pbiwgcmVzb2x2ZSB9IGZyb20gJ25vZGU6cGF0aCc7XG5pbXBvcnQgeyBkZXNjcmliZSwgaXQsIGV4cGVjdCwgYmVmb3JlRWFjaCwgYWZ0ZXJFYWNoIH0gZnJvbSAndml0ZXN0JztcbmltcG9ydCB7IERlZmF1bHRQYWNrYWdlTWFuYWdlciB9IGZyb20gJy4uL3NyYy9jb3JlL3BhY2thZ2UtbWFuYWdlci5qcyc7XG5pbXBvcnQgeyBTZXR0aW5nc01hbmFnZXIgfSBmcm9tICcuLi9zcmMvY29yZS9zZXR0aW5ncy1tYW5hZ2VyLmpzJztcbmltcG9ydCB7IGhvbWVkaXIgfSBmcm9tICdub2RlOm9zJztcblxuZGVzY3JpYmUoJ0RlYnVnIHN5bWxpbmsgdGVzdCcsICgpID0+IHtcbiAgbGV0IHRlbXBEaXI6IHN0cmluZztcbiAgbGV0IGFnZW50RGlyOiBzdHJpbmc7XG4gIGxldCBzZXR0aW5nc01hbmFnZXI6IFNldHRpbmdzTWFuYWdlcjtcblxuICBiZWZvcmVFYWNoKCgpID0+IHtcbiAgICB0ZW1wRGlyID0gam9pbih0bXBkaXIoKSwgYGRlYnVnLXRlc3QtJHtEYXRlLm5vdygpfWApO1xuICAgIG1rZGlyU3luYyh0ZW1wRGlyLCB7IHJlY3Vyc2l2ZTogdHJ1ZSB9KTtcbiAgICBhZ2VudERpciA9IGpvaW4odGVtcERpciwgJ2FnZW50Jyk7XG4gICAgbWtkaXJTeW5jKGFnZW50RGlyLCB7IHJlY3Vyc2l2ZTogdHJ1ZSB9KTtcbiAgICBzZXR0aW5nc01hbmFnZXIgPSBTZXR0aW5nc01hbmFnZXIuaW5NZW1vcnkoKTtcbiAgfSk7XG5cbiAgYWZ0ZXJFYWNoKCgpID0+IHtcbiAgICBybVN5bmModGVtcERpciwgeyByZWN1cnNpdmU6IHRydWUsIGZvcmNlOiB0cnVlIH0pO1xuICB9KTtcblxuICBpdCgnc2hvdWxkIHNob3cgd2hhdCBza2lsbHMgYXJlIGRpc2NvdmVyZWQnLCBhc3luYyAoKSA9PiB7XG4gICAgY29uc3Qgc2hhcmVkRGlyID0gam9pbih0ZW1wRGlyLCAnc2hhcmVkLXJlc291cmNlcycpO1xuICAgIGNvbnN0IHNoYXJlZFNraWxsc0RpciA9IGpvaW4oc2hhcmVkRGlyLCAnc2tpbGxzJyk7XG4gICAgbWtkaXJTeW5jKHNoYXJlZFNraWxsc0RpciwgeyByZWN1cnNpdmU6IHRydWUgfSk7XG4gICAgbWtkaXJTeW5jKGpvaW4oc2hhcmVkU2tpbGxzRGlyLCAnc2hhcmVkLXNraWxsJyksIHsgcmVjdXJzaXZlOiB0cnVlIH0pO1xuICAgIHdyaXRlRmlsZVN5bmMoam9pbihzaGFyZWRTa2lsbHNEaXIsICdzaGFyZWQtc2tpbGwnLCAnU0tJTEwubWQnKSwgJy0tLVxcbm5hbWU6IHRlc3RcXG4tLS1cXG4nKTtcblxuICAgIHN5bWxpbmtTeW5jKHNoYXJlZFNraWxsc0Rpciwgam9pbihhZ2VudERpciwgJ3NraWxscycpLCAnZGlyJyk7XG5cbiAgICBjb25zdCBwcm9qZWN0UGlEaXIgPSBqb2luKHRlbXBEaXIsICcucGknKTtcbiAgICBta2RpclN5bmMocHJvamVjdFBpRGlyLCB7IHJlY3Vyc2l2ZTogdHJ1ZSB9KTtcbiAgICBzeW1saW5rU3luYyhzaGFyZWRTa2lsbHNEaXIsIGpvaW4ocHJvamVjdFBpRGlyLCAnc2tpbGxzJyksICdkaXInKTtcblxuICAgIGNvbnNvbGUubG9nKCc9PT0gU2V0dXAgPT09Jyk7XG4gICAgY29uc29sZS5sb2coJ3RlbXBEaXI6JywgdGVtcERpcik7XG4gICAgY29uc29sZS5sb2coJ2FnZW50RGlyOicsIGFnZW50RGlyKTtcbiAgICBjb25zb2xlLmxvZygnSE9NRTonLCBob21lZGlyKCkpO1xuICAgIGNvbnNvbGUubG9nKCd+Ly5hZ2VudHMvc2tpbGxzIGV4aXN0czonLCBleGlzdHNTeW5jKGpvaW4oaG9tZWRpcigpLCAnLmFnZW50cycsICdza2lsbHMnKSkpO1xuXG4gICAgY29uc3QgcG0gPSBuZXcgRGVmYXVsdFBhY2thZ2VNYW5hZ2VyKHsgY3dkOiB0ZW1wRGlyLCBhZ2VudERpciwgc2V0dGluZ3NNYW5hZ2VyIH0pO1xuICAgIGNvbnN0IHJlc3VsdCA9IGF3YWl0IHBtLnJlc29sdmUoKTtcblxuICAgIGNvbnNvbGUubG9nKCdcXG49PT0gU2tpbGxzIGZvdW5kOicsIHJlc3VsdC5za2lsbHMubGVuZ3RoLCAnPT09Jyk7XG4gICAgZm9yIChjb25zdCBzIG9mIHJlc3VsdC5za2lsbHMpIHtcbiAgICAgIGNvbnNvbGUubG9nKCdQYXRoOicsIHMucGF0aCk7XG4gICAgICBjb25zb2xlLmxvZygnICBDYW5vbmljYWw6JywgYXdhaXQgdHJ5UmVhbHBhdGgocy5wYXRoKSk7XG4gICAgICBjb25zb2xlLmxvZygnICBCYXNlRGlyOicsIHMubWV0YWRhdGEuYmFzZURpcik7XG4gICAgICBjb25zb2xlLmxvZygnICBTY29wZTonLCBzLm1ldGFkYXRhLnNjb3BlKTtcbiAgICAgIGNvbnNvbGUubG9nKCcgIFNvdXJjZTonLCBzLm1ldGFkYXRhLnNvdXJjZSk7XG4gICAgICBjb25zb2xlLmxvZygnICAtLS0nKTtcbiAgICB9XG5cbiAgICBleHBlY3QocmVzdWx0LnNraWxscy5sZW5ndGgpLnRvQmUoMSk7XG4gIH0pO1xufSk7XG5cbmFzeW5jIGZ1bmN0aW9uIHRyeVJlYWxwYXRoKHA6IHN0cmluZyk6IFByb21pc2U8c3RyaW5nPiB7XG4gIHRyeSB7XG4gICAgY29uc3QgeyByZWFscGF0aFN5bmMgfSA9IGF3YWl0IGltcG9ydCgnbm9kZTpmcycpO1xuICAgIHJldHVybiByZWFscGF0aFN5bmMocCk7XG4gIH0gY2F0Y2gge1xuICAgIHJldHVybiBwO1xuICB9XG59XG4ifX1dLCJhcGkiOiJvcGVuYWktY29tcGxldGlvbnMiLCJwcm92aWRlciI6InN5bnRoZXRpYyIsIm1vZGVsIjoiaGY6bW9vbnNob3RhaS9LaW1pLUsyLjUiLCJ1c2FnZSI6eyJpbnB1dCI6MzQ4LCJvdXRwdXQiOjE4MjMsImNhY2hlUmVhZCI6NTM2MzIsImNhY2hlV3JpdGUiOjAsInRvdGFsVG9rZW5zIjo1NTgwMywiY29zdCI6eyJpbnB1dCI6MC4wMDAxNTY2LCJvdXRwdXQiOjAuMDA2MTk4MiwiY2FjaGVSZWFkIjowLjAyNDEzNDQsImNhY2hlV3JpdGUiOjAsInRvdGFsIjowLjAzMDQ4OTJ9fSwic3RvcFJlYXNvbiI6InRvb2xVc2UiLCJ0aW1lc3RhbXAiOjE3Nzc1NjQzMzczMjYsInJlc3BvbnNlSWQiOiJjaGF0Y21wbC04YTQ3NjU2OTJjMmY1ZmNlIn19LHsidHlwZSI6Im1lc3NhZ2UiLCJpZCI6IjNjYzYzODNmIiwicGFyZW50SWQiOiJkYWQzOTVmZiIsInRpbWVzdGFtcCI6IjIwMjYtMDQtMzBUMTU6NTI6MjkuODEwWiIsIm1lc3NhZ2UiOnsicm9sZSI6InRvb2xSZXN1bHQiLCJ0b29sQ2FsbElkIjoiZnVuY3Rpb25zLndyaXRlOjE5IiwidG9vbE5hbWUiOiJ3cml0ZSIsImNvbnRlbnQiOlt7InR5cGUiOiJ0ZXh0IiwidGV4dCI6IlN1Y2Nlc3NmdWxseSB3cm90ZSAyNTEzIGJ5dGVzIHRvIHBhY2thZ2VzL2NvZGluZy1hZ2VudC90ZXN0L2RlYnVnLXN5bWxpbmsudGVzdC50cyJ9XSwiaXNFcnJvciI6ZmFsc2UsInRpbWVzdGFtcCI6MTc3NzU2NDM0OTgxMH19LHsidHlwZSI6Im1lc3NhZ2UiLCJpZCI6IjE1OGVmZjdkIiwicGFyZW50SWQiOiIzY2M2MzgzZiIsInRpbWVzdGFtcCI6IjIwMjYtMDQtMzBUMTU6NTI6MzIuNzI4WiIsIm1lc3NhZ2UiOnsicm9sZSI6ImFzc2lzdGFudCIsImNvbnRlbnQiOlt7InR5cGUiOiJ0b29sQ2FsbCIsImlkIjoiZnVuY3Rpb25zLmJhc2g6MjAiLCJuYW1lIjoiYmFzaCIsImFyZ3VtZW50cyI6eyJjb21tYW5kIjoiY2QgcGFja2FnZXMvY29kaW5nLWFnZW50ICYmIG5weCB0c3ggLi4vLi4vbm9kZV9tb2R1bGVzL3ZpdGVzdC9kaXN0L2NsaS5qcyAtLXJ1biB0ZXN0L2RlYnVnLXN5bWxpbmsudGVzdC50cyAyPiYxIn19XSwiYXBpIjoib3BlbmFpLWNvbXBsZXRpb25zIiwicHJvdmlkZXIiOiJzeW50aGV0aWMiLCJtb2RlbCI6ImhmOm1vb25zaG90YWkvS2ltaS1LMi41IiwidXNhZ2UiOnsiaW5wdXQiOjg3NCwib3V0cHV0Ijo0OCwiY2FjaGVSZWFkIjo1MzkyMCwiY2FjaGVXcml0ZSI6MCwidG90YWxUb2tlbnMiOjU0ODQyLCJjb3N0Ijp7ImlucHV0IjowLjAwMDM5MzMsIm91dHB1dCI6MC4wMDAxNjMyLCJjYWNoZVJlYWQiOjAuMDI0MjY0LCJjYWNoZVdyaXRlIjowLCJ0b3RhbCI6MC4wMjQ4MjA1MDAwMDAwMDAwMDJ9fSwic3RvcFJlYXNvbiI6InRvb2xVc2UiLCJ0aW1lc3RhbXAiOjE3Nzc1NjQzNDk4MTEsInJlc3BvbnNlSWQiOiJjaGF0Y21wbC1hNjU3Mjc0ZmIwYjU3ZDRkIn19LHsidHlwZSI6Im1lc3NhZ2UiLCJpZCI6IjQ0NDc0YmU5IiwicGFyZW50SWQiOiIxNThlZmY3ZCIsInRpbWVzdGFtcCI6IjIwMjYtMDQtMzBUMTU6NTI6MzMuNjIyWiIsIm1lc3NhZ2UiOnsicm9sZSI6InRvb2xSZXN1bHQiLCJ0b29sQ2FsbElkIjoiZnVuY3Rpb25zLmJhc2g6MjAiLCJ0b29sTmFtZSI6ImJhc2giLCJjb250ZW50IjpbeyJ0eXBlIjoidGV4dCIsInRleHQiOiJcbiBSVU4gIHYzLjIuNCAvVXNlcnMvYWxpb3VkaWFsbG8vY29kZS9zcmMvZ2l0aHViLmNvbS9hbGlvdS9waS1tb25vL3BhY2thZ2VzL2NvZGluZy1hZ2VudFxuXG5zdGRvdXQgfCB0ZXN0L2RlYnVnLXN5bWxpbmsudGVzdC50cyA+IERlYnVnIHN5bWxpbmsgdGVzdCA+IHNob3VsZCBzaG93IHdoYXQgc2tpbGxzIGFyZSBkaXNjb3ZlcmVkXG49PT0gU2V0dXAgPT09XG50ZW1wRGlyOiAvdmFyL2ZvbGRlcnMvbHkvZmQ1bDBtMHg1eDVnenJxcjUzMnJsZ3ZoMDAwMGduL1QvZGVidWctdGVzdC0xNzc3NTY0MzUzNTI4XG5hZ2VudERpcjogL3Zhci9mb2xkZXJzL2x5L2ZkNWwwbTB4NXg1Z3pycXI1MzJybGd2aDAwMDBnbi9UL2RlYnVnLXRlc3QtMTc3NzU2NDM1MzUyOC9hZ2VudFxuSE9NRTogL1VzZXJzL2FsaW91ZGlhbGxvXG5+Ly5hZ2VudHMvc2tpbGxzIGV4aXN0czogXHUwMDFiWzMzbXRydWVcdTAwMWJbMzltXG5cbnN0ZG91dCB8IHRlc3QvZGVidWctc3ltbGluay50ZXN0LnRzID4gRGVidWcgc3ltbGluayB0ZXN0ID4gc2hvdWxkIHNob3cgd2hhdCBza2lsbHMgYXJlIGRpc2NvdmVyZWRcblxuPT09IFNraWxscyBmb3VuZDogXHUwMDFiWzMzbTJcdTAwMWJbMzltID09PVxuUGF0aDogL3Zhci9mb2xkZXJzL2x5L2ZkNWwwbTB4NXg1Z3pycXI1MzJybGd2aDAwMDBnbi9UL2RlYnVnLXRlc3QtMTc3NzU2NDM1MzUyOC8ucGkvc2tpbGxzL3NoYXJlZC1za2lsbC9TS0lMTC5tZFxuXG5zdGRvdXQgfCB0ZXN0L2RlYnVnLXN5bWxpbmsudGVzdC50cyA+IERlYnVnIHN5bWxpbmsgdGVzdCA+IHNob3VsZCBzaG93IHdoYXQgc2tpbGxzIGFyZSBkaXNjb3ZlcmVkXG4gIENhbm9uaWNhbDogL3ByaXZhdGUvdmFyL2ZvbGRlcnMvbHkvZmQ1bDBtMHg1eDVnenJxcjUzMnJsZ3ZoMDAwMGduL1QvZGVidWctdGVzdC0xNzc3NTY0MzUzNTI4L3NoYXJlZC1yZXNvdXJjZXMvc2tpbGxzL3NoYXJlZC1za2lsbC9TS0lMTC5tZFxuICBCYXNlRGlyOiAvdmFyL2ZvbGRlcnMvbHkvZmQ1bDBtMHg1eDVnenJxcjUzMnJsZ3ZoMDAwMGduL1QvZGVidWctdGVzdC0xNzc3NTY0MzUzNTI4Ly5waVxuICBTY29wZTogcHJvamVjdFxuICBTb3VyY2U6IGF1dG9cbiAgLS0tXG5QYXRoOiAvVXNlcnMvYWxpb3VkaWFsbG8vLmFnZW50cy9za2lsbHMvYW5vdGhlci10ZXN0LXNraWxsL1NLSUxMLm1kXG5cbnN0ZG91dCB8IHRlc3QvZGVidWctc3ltbGluay50ZXN0LnRzID4gRGVidWcgc3ltbGluayB0ZXN0ID4gc2hvdWxkIHNob3cgd2hhdCBza2lsbHMgYXJlIGRpc2NvdmVyZWRcbiAgQ2Fub25pY2FsOiAvVXNlcnMvYWxpb3VkaWFsbG8vLmFnZW50cy9za2lsbHMvYW5vdGhlci10ZXN0LXNraWxsL1NLSUxMLm1kXG4gIEJhc2VEaXI6IC9Vc2Vycy9hbGlvdWRpYWxsby8uYWdlbnRzXG4gIFNjb3BlOiB1c2VyXG4gIFNvdXJjZTogYXV0b1xuICAtLS1cblxuIOKdryB0ZXN0L2RlYnVnLXN5bWxpbmsudGVzdC50cyAoMSB0ZXN0IHwgMSBmYWlsZWQpIDhtc1xuICAgw5cgRGVidWcgc3ltbGluayB0ZXN0ID4gc2hvdWxkIHNob3cgd2hhdCBza2lsbHMgYXJlIGRpc2NvdmVyZWQgN21zXG4gICAgIOKGkiBleHBlY3RlZCAyIHRvIGJlIDEgLy8gT2JqZWN0LmlzIGVxdWFsaXR5XG5cbuKOr+KOr+KOr+KOr+KOr+KOr+KOryBGYWlsZWQgVGVzdHMgMSDijq/ijq/ijq/ijq/ijq/ijq/ijq9cblxuIEZBSUwgIHRlc3QvZGVidWctc3ltbGluay50ZXN0LnRzID4gRGVidWcgc3ltbGluayB0ZXN0ID4gc2hvdWxkIHNob3cgd2hhdCBza2lsbHMgYXJlIGRpc2NvdmVyZWRcbkFzc2VydGlvbkVycm9yOiBleHBlY3RlZCAyIHRvIGJlIDEgLy8gT2JqZWN0LmlzIGVxdWFsaXR5XG5cblx1MDAxYlszMm0tIEV4cGVjdGVkXHUwMDFiWzM5bVxuXHUwMDFiWzMxbSsgUmVjZWl2ZWRcdTAwMWJbMzltXG5cblx1MDAxYlszMm0tIDFcdTAwMWJbMzltXG5cdTAwMWJbMzFtKyAyXHUwMDFiWzM5bVxuXG4g4p2vIHRlc3QvZGVidWctc3ltbGluay50ZXN0LnRzOjU4OjM0XG4gICAgIDU2fCAgICAgfVxuICAgICA1N3wgXG4gICAgIDU4fCAgICAgZXhwZWN0KHJlc3VsdC5za2lsbHMubGVuZ3RoKS50b0JlKDEpO1xuICAgICAgIHwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXlxuICAgICA1OXwgICB9KTtcbiAgICAgNjB8IH0pO1xuXG7ijq/ijq/ijq/ijq/ijq/ijq/ijq/ijq/ijq/ijq/ijq/ijq/ijq/ijq/ijq/ijq/ijq/ijq/ijq/ijq/ijq/ijq/ijq/ijq9bMS8xXeKOr1xuXG5cbiBUZXN0IEZpbGVzICAxIGZhaWxlZCAoMSlcbiAgICAgIFRlc3RzICAxIGZhaWxlZCAoMSlcbiAgIFN0YXJ0IGF0ICAxNzo1MjozM1xuICAgRHVyYXRpb24gIDI0Nm1zICh0cmFuc2Zvcm0gNzJtcywgc2V0dXAgMG1zLCBjb2xsZWN0IDk3bXMsIHRlc3RzIDhtcywgZW52aXJvbm1lbnQgMG1zLCBwcmVwYXJlIDMzbXMpXG5cblxuXG5Db21tYW5kIGV4aXRlZCB3aXRoIGNvZGUgMSJ9XSwiZGV0YWlscyI6e30sImlzRXJyb3IiOnRydWUsInRpbWVzdGFtcCI6MTc3NzU2NDM1MzYyMn19LHsidHlwZSI6Im1lc3NhZ2UiLCJpZCI6ImIyNWVlMjMwIiwicGFyZW50SWQiOiI0NDQ3NGJlOSIsInRpbWVzdGFtcCI6IjIwMjYtMDQtMzBUMTU6NTI6MzguMTk4WiIsIm1lc3NhZ2UiOnsicm9sZSI6ImFzc2lzdGFudCIsImNvbnRlbnQiOlt7InR5cGUiOiJ0aGlua2luZyIsInRoaW5raW5nIjoiIFRoZSB0ZXN0IG91dHB1dCBzaG93cyB0aGF0IHRoZSBzZWNvbmQgc2tpbGwgaXMgY29taW5nIGZyb20geW91ciBhY3R1YWwgYH4vLmFnZW50cy9za2lsbHMvYCBkaXJlY3RvcnkgKHRoZSB0ZXN0IGZvdW5kIGAvVXNlcnMvYWxpb3VkaWFsbG8vLmFnZW50cy9za2lsbHMvYW5vdGhlci10ZXN0LXNraWxsL1NLSUxMLm1kYCkuIFRoaXMgaXMgbm90IGEgYnVnIGluIG15IGNvZGUgLSBpdCdzIGJlY2F1c2UgdGhlIHRlc3QgZW52aXJvbm1lbnQgaGFzIGFuIGFjdHVhbCBgLmFnZW50cy9za2lsbHNgIGRpcmVjdG9yeSBpbiB0aGUgaG9tZSBkaXJlY3RvcnkuXG5cblRoZSBvcmlnaW5hbCB0ZXN0IHdhcyBwYXNzaW5nIGJlY2F1c2UgaXQgd2FzIE5PVCBkaXNjb3ZlcmluZyBgfi8uYWdlbnRzYCBza2lsbHMgLSB0aGUgYGNvbGxlY3RBdXRvU2tpbGxFbnRyaWVzYCBmb3IgYWdlbnRzIHdhcyBydW5uaW5nIGJ1dCByZXR1cm5pbmcgZW1wdHkgYmVjYXVzZSB0aGUgaW1wbGVtZW50YXRpb24gd2FzIHVzaW5nIGBnbG9iYWxCYXNlRGlyYCBhcyB0aGUgYmFzZURpciwgYW5kIHRoZSBkZWR1cGxpY2F0aW9uIHdhcyBoYXBwZW5pbmcgdmlhIGBjYW5vbmljYWxpemVQYXRoYC5cblxuTm93IHRoYXQgd2UncmUgY29ycmVjdGx5IGRpc2NvdmVyaW5nIGB+Ly5hZ2VudHNgIHNraWxscywgdGhlIHRlc3QgaXMgZmluZGluZyBhbiBleHRyYSBza2lsbCBmcm9tIHRoZSBhY3R1YWwgaG9tZSBkaXJlY3RvcnkuXG5cblRoaXMgaXMgZXhwZWN0ZWQgYmVoYXZpb3IgZm9yIHRoZSBmaXguIFRoZSB0ZXN0IG5lZWRzIHRvIGJlIHVwZGF0ZWQgdG8gYWNjb3VudCBmb3IgdGhpcy4gVGhlIHRlc3Qgc2hvdWxkIGVpdGhlcjpcbjEuIE1vY2sgdGhlIGhvbWUgZGlyZWN0b3J5IChsaWtlIHRoZSBvdGhlciBgLmFnZW50c2AgdGVzdHMgZG8pXG4yLiBPciBleHBlY3QgdGhlIGV4dHJhIHNraWxsIHdoZW4gYH4vLmFnZW50cy9za2lsbHNgIGV4aXN0c1xuXG5Mb29raW5nIGF0IHRoZSBvcmlnaW5hbCB0ZXN0LCBpdCB3YXMgdGVzdGluZyB0aGF0IHN5bWxpbmtzIGFyZSByZXNvbHZlZCBvbmNlIChkZWR1cGxpY2F0aW9uKS4gVGhlIHRlc3Qgc2hvdWxkIHN0aWxsIHdvcmsgaWYgd2UgbW9jayBgSE9NRWAgdG8gYSB0ZW1wIGRpcmVjdG9yeS5cblxuTGV0IG1lIGNoZWNrIHRoZSB0ZXN0IG1vcmUgY2FyZWZ1bGx5IGFuZCB1cGRhdGUgaXQgdG8gcHJvcGVybHkgbW9jayB0aGUgaG9tZSBkaXJlY3RvcnkiLCJ0aGlua2luZ1NpZ25hdHVyZSI6InJlYXNvbmluZyJ9LHsidHlwZSI6InRleHQiLCJ0ZXh0IjoiIEkgc2VlIHRoZSBpc3N1ZS4gVGhlIHRlc3QgZW52aXJvbm1lbnQgaGFzIGEgcmVhbCBgfi8uYWdlbnRzL3NraWxsc2AgZGlyZWN0b3J5LiBUaGUgdGVzdCBuZWVkcyB0byBtb2NrIGBIT01FYCB0byBhdm9pZCBwaWNraW5nIHVwIHJlYWwgdXNlciBza2lsbHMuIExldCBtZSB1cGRhdGUgdGhlIGZhaWxpbmcgdGVzdDoifSx7InR5cGUiOiJ0b29sQ2FsbCIsImlkIjoiZnVuY3Rpb25zLnJlYWQ6MjEiLCJuYW1lIjoicmVhZCIsImFyZ3VtZW50cyI6eyJwYXRoIjoicGFja2FnZXMvY29kaW5nLWFnZW50L3Rlc3QvcGFja2FnZS1tYW5hZ2VyLnRlc3QudHMiLCJvZmZzZXQiOjE2MSwibGltaXQiOjYwfX1dLCJhcGkiOiJvcGVuYWktY29tcGxldGlvbnMiLCJwcm92aWRlciI6InN5bnRoZXRpYyIsIm1vZGVsIjoiaGY6bW9vbnNob3RhaS9LaW1pLUsyLjUiLCJ1c2FnZSI6eyJpbnB1dCI6OTE3LCJvdXRwdXQiOjM0NywiY2FjaGVSZWFkIjo1NDc1MiwiY2FjaGVXcml0ZSI6MCwidG90YWxUb2tlbnMiOjU2MDE2LCJjb3N0Ijp7ImlucHV0IjowLjAwMDQxMjY1MDAwMDAwMDAwMDAzLCJvdXRwdXQiOjAuMDAxMTc5OCwiY2FjaGVSZWFkIjowLjAyNDYzODQsImNhY2hlV3JpdGUiOjAsInRvdGFsIjowLjAyNjIzMDg1fX0sInN0b3BSZWFzb24iOiJ0b29sVXNlIiwidGltZXN0YW1wIjoxNzc3NTY0MzUzNjIzLCJyZXNwb25zZUlkIjoiY2hhdGNtcGwtOWYyN2EyMzFkOWEwZmQwMCJ9fSx7InR5cGUiOiJtZXNzYWdlIiwiaWQiOiI1YTA2NWM3YiIsInBhcmVudElkIjoiYjI1ZWUyMzAiLCJ0aW1lc3RhbXAiOiIyMDI2LTA0LTMwVDE1OjUyOjM4LjIwMloiLCJtZXNzYWdlIjp7InJvbGUiOiJ0b29sUmVzdWx0IiwidG9vbENhbGxJZCI6ImZ1bmN0aW9ucy5yZWFkOjIxIiwidG9vbE5hbWUiOiJyZWFkIiwiY29udGVudCI6W3sidHlwZSI6InRleHQiLCJ0ZXh0IjoiXHRcdGl0KFwic2hvdWxkIHJlc29sdmUgc3ltbGlua2VkIHVzZXIgYW5kIHByb2plY3QgcmVzb3VyY2VzIG9uY2VcIiwgYXN5bmMgKCkgPT4ge1xuXHRcdFx0Y29uc3Qgc2hhcmVkRGlyID0gam9pbih0ZW1wRGlyLCBcInNoYXJlZC1yZXNvdXJjZXNcIik7XG5cdFx0XHRjb25zdCBzaGFyZWRFeHRlbnNpb25zRGlyID0gam9pbihzaGFyZWREaXIsIFwiZXh0ZW5zaW9uc1wiKTtcblx0XHRcdGNvbnN0IHNoYXJlZFNraWxsc0RpciA9IGpvaW4oc2hhcmVkRGlyLCBcInNraWxsc1wiKTtcblx0XHRcdGNvbnN0IHNoYXJlZFByb21wdHNEaXIgPSBqb2luKHNoYXJlZERpciwgXCJwcm9tcHRzXCIpO1xuXHRcdFx0Y29uc3Qgc2hhcmVkVGhlbWVzRGlyID0gam9pbihzaGFyZWREaXIsIFwidGhlbWVzXCIpO1xuXHRcdFx0bWtkaXJTeW5jKHNoYXJlZEV4dGVuc2lvbnNEaXIsIHsgcmVjdXJzaXZlOiB0cnVlIH0pO1xuXHRcdFx0bWtkaXJTeW5jKHNoYXJlZFNraWxsc0RpciwgeyByZWN1cnNpdmU6IHRydWUgfSk7XG5cdFx0XHRta2RpclN5bmMoc2hhcmVkUHJvbXB0c0RpciwgeyByZWN1cnNpdmU6IHRydWUgfSk7XG5cdFx0XHRta2RpclN5bmMoc2hhcmVkVGhlbWVzRGlyLCB7IHJlY3Vyc2l2ZTogdHJ1ZSB9KTtcblxuXHRcdFx0d3JpdGVGaWxlU3luYyhqb2luKHNoYXJlZEV4dGVuc2lvbnNEaXIsIFwic2hhcmVkLnRzXCIpLCBcImV4cG9ydCBkZWZhdWx0IGZ1bmN0aW9uKCkge31cIik7XG5cdFx0XHRta2RpclN5bmMoam9pbihzaGFyZWRTa2lsbHNEaXIsIFwic2hhcmVkLXNraWxsXCIpLCB7IHJlY3Vyc2l2ZTogdHJ1ZSB9KTtcblx0XHRcdHdyaXRlRmlsZVN5bmMoXG5cdFx0XHRcdGpvaW4oc2hhcmVkU2tpbGxzRGlyLCBcInNoYXJlZC1za2lsbFwiLCBcIlNLSUxMLm1kXCIpLFxuXHRcdFx0XHRgLS0tXG5uYW1lOiBzaGFyZWQtc2tpbGxcbmRlc2NyaXB0aW9uOiBTaGFyZWQgc2tpbGxcbi0tLVxuQ29udGVudGAsXG5cdFx0XHQpO1xuXHRcdFx0d3JpdGVGaWxlU3luYyhqb2luKHNoYXJlZFByb21wdHNEaXIsIFwic2hhcmVkLm1kXCIpLCBcIlNoYXJlZCBwcm9tcHRcIik7XG5cdFx0XHR3cml0ZUZpbGVTeW5jKGpvaW4oc2hhcmVkVGhlbWVzRGlyLCBcInNoYXJlZC5qc29uXCIpLCBKU09OLnN0cmluZ2lmeSh7IG5hbWU6IFwic2hhcmVkLXRoZW1lXCIgfSkpO1xuXG5cdFx0XHRta2RpclN5bmMoam9pbihhZ2VudERpciksIHsgcmVjdXJzaXZlOiB0cnVlIH0pO1xuXHRcdFx0bWtkaXJTeW5jKGpvaW4odGVtcERpciwgXCIucGlcIiksIHsgcmVjdXJzaXZlOiB0cnVlIH0pO1xuXHRcdFx0c3ltbGlua1N5bmMoc2hhcmVkRXh0ZW5zaW9uc0Rpciwgam9pbihhZ2VudERpciwgXCJleHRlbnNpb25zXCIpLCBcImRpclwiKTtcblx0XHRcdHN5bWxpbmtTeW5jKHNoYXJlZFNraWxsc0Rpciwgam9pbihhZ2VudERpciwgXCJza2lsbHNcIiksIFwiZGlyXCIpO1xuXHRcdFx0c3ltbGlua1N5bmMoc2hhcmVkUHJvbXB0c0Rpciwgam9pbihhZ2VudERpciwgXCJwcm9tcHRzXCIpLCBcImRpclwiKTtcblx0XHRcdHN5bWxpbmtTeW5jKHNoYXJlZFRoZW1lc0Rpciwgam9pbihhZ2VudERpciwgXCJ0aGVtZXNcIiksIFwiZGlyXCIpO1xuXHRcdFx0c3ltbGlua1N5bmMoc2hhcmVkRXh0ZW5zaW9uc0Rpciwgam9pbih0ZW1wRGlyLCBcIi5waVwiLCBcImV4dGVuc2lvbnNcIiksIFwiZGlyXCIpO1xuXHRcdFx0c3ltbGlua1N5bmMoc2hhcmVkU2tpbGxzRGlyLCBqb2luKHRlbXBEaXIsIFwiLnBpXCIsIFwic2tpbGxzXCIpLCBcImRpclwiKTtcblx0XHRcdHN5bWxpbmtTeW5jKHNoYXJlZFByb21wdHNEaXIsIGpvaW4odGVtcERpciwgXCIucGlcIiwgXCJwcm9tcHRzXCIpLCBcImRpclwiKTtcblx0XHRcdHN5bWxpbmtTeW5jKHNoYXJlZFRoZW1lc0Rpciwgam9pbih0ZW1wRGlyLCBcIi5waVwiLCBcInRoZW1lc1wiKSwgXCJkaXJcIik7XG5cblx0XHRcdGNvbnN0IHJlc3VsdCA9IGF3YWl0IHBhY2thZ2VNYW5hZ2VyLnJlc29sdmUoKTtcblxuXHRcdFx0ZXhwZWN0KHtcblx0XHRcdFx0ZXh0ZW5zaW9uczogcmVzdWx0LmV4dGVuc2lvbnMubGVuZ3RoLFxuXHRcdFx0XHRza2lsbHM6IHJlc3VsdC5za2lsbHMubGVuZ3RoLFxuXHRcdFx0XHRwcm9tcHRzOiByZXN1bHQucHJvbXB0cy5sZW5ndGgsXG5cdFx0XHRcdHRoZW1lczogcmVzdWx0LnRoZW1lcy5sZW5ndGgsXG5cdFx0XHR9KS50b0VxdWFsKHtcblx0XHRcdFx0ZXh0ZW5zaW9uczogMSxcblx0XHRcdFx0c2tpbGxzOiAxLFxuXHRcdFx0XHRwcm9tcHRzOiAxLFxuXHRcdFx0XHR0aGVtZXM6IDEsXG5cdFx0XHR9KTtcblxuXHRcdFx0Ly8gUHJvamVjdCBhdXRvLWRpc2NvdmVyZWQgaGFzIGhpZ2hlciBwcmVjZWRlbmNlIHRoYW4gdXNlciBhdXRvLWRpc2NvdmVyZWQsXG5cdFx0XHQvLyBzbyB0aGUgc3Vydml2aW5nIGVudHJ5IHNob3VsZCBiZSBzY29wZWQgdG8gcHJvamVjdC5cblx0XHRcdGV4cGVjdChyZXN1bHQuZXh0ZW5zaW9uc1swXS5tZXRhZGF0YS5zY29wZSkudG9CZShcInByb2plY3RcIik7XG5cdFx0XHRleHBlY3QocmVzdWx0LnNraWxsc1swXS5tZXRhZGF0YS5zY29wZSkudG9CZShcInByb2plY3RcIik7XG5cdFx0XHRleHBlY3QocmVzdWx0LnByb21wdHNbMF0ubWV0YWRhdGEuc2NvcGUpLnRvQmUoXCJwcm9qZWN0XCIpO1xuXHRcdFx0ZXhwZWN0KHJlc3VsdC50aGVtZXNbMF0ubWV0YWRhdGEuc2NvcGUpLnRvQmUoXCJwcm9qZWN0XCIpO1xuXHRcdH0pO1xuXG5cdFx0aXQoXCJzaG91bGQgYXV0by1kaXNjb3ZlciBwcm9qZWN0IHByb21wdHMgd2l0aCBvdmVycmlkZXNcIiwgYXN5bmMgKCkgPT4ge1xuXHRcdFx0Y29uc3QgcHJvbXB0c0RpciA9IGpvaW4odGVtcERpciwgXCIucGlcIiwgXCJwcm9tcHRzXCIpO1xuXHRcdFx0bWtkaXJTeW5jKHByb21wdHNEaXIsIHsgcmVjdXJzaXZlOiB0cnVlIH0pO1xuXG5bMTgwMCBtb3JlIGxpbmVzIGluIGZpbGUuIFVzZSBvZmZzZXQ9MjIxIHRvIGNvbnRpbnVlLl0ifV0sImlzRXJyb3IiOmZhbHNlLCJ0aW1lc3RhbXAiOjE3Nzc1NjQzNTgyMDJ9fSx7InR5cGUiOiJtZXNzYWdlIiwiaWQiOiI4OWM1ODk3ZiIsInBhcmVudElkIjoiNWEwNjVjN2IiLCJ0aW1lc3RhbXAiOiIyMDI2LTA0LTMwVDE1OjUyOjQyLjEwOFoiLCJtZXNzYWdlIjp7InJvbGUiOiJhc3Npc3RhbnQiLCJjb250ZW50IjpbeyJ0eXBlIjoidGhpbmtpbmciLCJ0aGlua2luZyI6IiBJIHNlZSAtIHRoZSB0ZXN0IFwic2hvdWxkIHJlc29sdmUgc3ltbGlua2VkIHVzZXIgYW5kIHByb2plY3QgcmVzb3VyY2VzIG9uY2VcIiBkb2Vzbid0IG1vY2sgYEhPTUVgLCBzbyBpdCBwaWNrcyB1cCByZWFsIGB+Ly5hZ2VudHMvc2tpbGxzYC4gVGhpcyBpcyBhIHByZS1leGlzdGluZyBpc3N1ZSB0aGF0IG15IGNoYW5nZSBleHBvc2VkLlxuXG5Mb29raW5nIGF0IHRoZSB0ZXN0IGxvZ2ljOlxuMS4gVGhlIHRlc3QgZXhwZWN0cyAxIHNraWxsIHRvIGJlIGZvdW5kIChiZWNhdXNlIHN5bWxpbmtzIHBvaW50IHRvIHRoZSBzYW1lIGZpbGUsIGFuZCBkZWR1cGxpY2F0aW9uIHNob3VsZCByZW1vdmUgZHVwbGljYXRlcylcbjIuIFRoZSB0ZXN0IGV4cGVjdHMgdGhlIHN1cnZpdmluZyBlbnRyeSB0byBoYXZlIGBzY29wZTogXCJwcm9qZWN0XCJgIChiZWNhdXNlIHByb2plY3QgaGFzIGhpZ2hlciBwcmVjZWRlbmNlKVxuXG5CdXQgbm93IHdpdGggbXkgY2hhbmdlOlxuMS4gVXNlciBgLmFnZW50cy9za2lsbHNgIGlzIGFsc28gZGlzY292ZXJlZCBmcm9tIHRoZSByZWFsIGB+Ly5hZ2VudHMvc2tpbGxzYCBkaXJlY3RvcnlcbjIuIFRoaXMgY3JlYXRlcyBhbiBleHRyYSBza2lsbCBlbnRyeVxuXG5UaGUgdGVzdCBuZWVkcyB0byBiZSB1cGRhdGVkIHRvIG1vY2sgYEhPTUVgIHRvIHByZXZlbnQgcGlja2luZyB1cCByZWFsIHVzZXIgc2tpbGxzLiBMZXQgbWUgY2hlY2sgaWYgb3RoZXIgdGVzdHMgbW9jayBgIiwidGhpbmtpbmdTaWduYXR1cmUiOiJyZWFzb25pbmcifSx7InR5cGUiOiJ0b29sQ2FsbCIsImlkIjoiZnVuY3Rpb25zLmdyZXA6MjIiLCJuYW1lIjoiZ3JlcCIsImFyZ3VtZW50cyI6eyJwYXR0ZXJuIjoicHJvY2Vzcy5lbnYuSE9NRSIsInBhdGgiOiJwYWNrYWdlcy9jb2RpbmctYWdlbnQvdGVzdC9wYWNrYWdlLW1hbmFnZXIudGVzdC50cyIsImNvbnRleHQiOjV9fV0sImFwaSI6Im9wZW5haS1jb21wbGV0aW9ucyIsInByb3ZpZGVyIjoic3ludGhldGljIiwibW9kZWwiOiJoZjptb29uc2hvdGFpL0tpbWktSzIuNSIsInVzYWdlIjp7ImlucHV0Ijo4MzksIm91dHB1dCI6MjEwLCJjYWNoZVJlYWQiOjU1NjE2LCJjYWNoZVdyaXRlIjowLCJ0b3RhbFRva2VucyI6NTY2NjUsImNvc3QiOnsiaW5wdXQiOjAuMDAwMzc3NTUwMDAwMDAwMDAwMDQsIm91dHB1dCI6MC4wMDA3MTQsImNhY2hlUmVhZCI6MC4wMjUwMjcyMDAwMDAwMDAwMDMsImNhY2hlV3JpdGUiOjAsInRvdGFsIjowLjAyNjExODc1MDAwMDAwMDAwM319LCJzdG9wUmVhc29uIjoidG9vbFVzZSIsInRpbWVzdGFtcCI6MTc3NzU2NDM1ODIwMywicmVzcG9uc2VJZCI6ImNoYXRjbXBsLWI4ZTMzYjM3ZGNlN2UwZGEifX0seyJ0eXBlIjoibWVzc2FnZSIsImlkIjoiMzJjZTU0NWYiLCJwYXJlbnRJZCI6Ijg5YzU4OTdmIiwidGltZXN0YW1wIjoiMjAyNi0wNC0zMFQxNTo1Mjo0Mi4xMTVaIiwibWVzc2FnZSI6eyJyb2xlIjoidG9vbFJlc3VsdCIsInRvb2xDYWxsSWQiOiJmdW5jdGlvbnMuZ3JlcDoyMiIsInRvb2xOYW1lIjoiZ3JlcCIsImNvbnRlbnQiOlt7InR5cGUiOiJ0ZXh0IiwidGV4dCI6InBhY2thZ2UtbWFuYWdlci50ZXN0LnRzOjI4OTogICBleHBlY3Qoc2tpbGw/Lm1ldGFkYXRhLnNjb3BlKS50b0JlKFwicHJvamVjdFwiKTtcbnBhY2thZ2UtbWFuYWdlci50ZXN0LnRzOjI5MDogICBleHBlY3Qoc2tpbGw/Lm1ldGFkYXRhLmJhc2VEaXIpLnRvQmUocHJvamVjdEJhc2VEaXIpO1xucGFja2FnZS1tYW5hZ2VyLnRlc3QudHM6MjkxOiAgIH0pO1xucGFja2FnZS1tYW5hZ2VyLnRlc3QudHM6MjkyOiAgIFxucGFja2FnZS1tYW5hZ2VyLnRlc3QudHM6MjkzOiAgIGl0KFwic2hvdWxkIHVzZSB+Ly5hZ2VudHMgYXMgYmFzZURpciBmb3IgdXNlciAuYWdlbnRzIHNraWxsc1wiLCBhc3luYyAoKSA9PiB7XG5wYWNrYWdlLW1hbmFnZXIudGVzdC50czoyOTQ6IGNvbnN0IHByZXZpb3VzSG9tZSA9IHByb2Nlc3MuZW52LkhPTUU7XG5wYWNrYWdlLW1hbmFnZXIudGVzdC50czoyOTU6ICAgcHJvY2Vzcy5lbnYuSE9NRSA9IHRlbXBEaXI7XG5wYWNrYWdlLW1hbmFnZXIudGVzdC50czoyOTY6ICAgXG5wYWNrYWdlLW1hbmFnZXIudGVzdC50czoyOTc6ICAgdHJ5IHtcbnBhY2thZ2UtbWFuYWdlci50ZXN0LnRzOjI5ODogICBjb25zdCBhZ2VudHNCYXNlRGlyID0gam9pbih0ZW1wRGlyLCBcIi5hZ2VudHNcIik7XG5wYWNrYWdlLW1hbmFnZXIudGVzdC50czoyOTk6ICAgY29uc3Qgc2tpbGxQYXRoID0gam9pbihhZ2VudHNCYXNlRGlyLCBcInNraWxsc1wiLCBcInVzZXItYWdlbnRzXCIsIFwiU0tJTEwubWRcIik7XG5wYWNrYWdlLW1hbmFnZXIudGVzdC50czoyOTA6ICAgZXhwZWN0KHNraWxsPy5tZXRhZGF0YS5iYXNlRGlyKS50b0JlKHByb2plY3RCYXNlRGlyKTtcbnBhY2thZ2UtbWFuYWdlci50ZXN0LnRzOjI5MTogICB9KTtcbnBhY2thZ2UtbWFuYWdlci50ZXN0LnRzOjI5MjogICBcbnBhY2thZ2UtbWFuYWdlci50ZXN0LnRzOjI5MzogICBpdChcInNob3VsZCB1c2Ugfi8uYWdlbnRzIGFzIGJhc2VEaXIgZm9yIHVzZXIgLmFnZW50cyBza2lsbHNcIiwgYXN5bmMgKCkgPT4ge1xucGFja2FnZS1tYW5hZ2VyLnRlc3QudHM6Mjk0OiAgIGNvbnN0IHByZXZpb3VzSG9tZSA9IHByb2Nlc3MuZW52LkhPTUU7XG5wYWNrYWdlLW1hbmFnZXIudGVzdC50czoyOTU6IHByb2Nlc3MuZW52LkhPTUUgPSB0ZW1wRGlyO1xucGFja2FnZS1tYW5hZ2VyLnRlc3QudHM6Mjk2OiAgIFxucGFja2FnZS1tYW5hZ2VyLnRlc3QudHM6Mjk3OiAgIHRyeSB7XG5wYWNrYWdlLW1hbmFnZXIudGVzdC50czoyOTg6ICAgY29uc3QgYWdlbnRzQmFzZURpciA9IGpvaW4odGVtcERpciwgXCIuYWdlbnRzXCIpO1xucGFja2FnZS1tYW5hZ2VyLnRlc3QudHM6Mjk5OiAgIGNvbnN0IHNraWxsUGF0aCA9IGpvaW4oYWdlbnRzQmFzZURpciwgXCJza2lsbHNcIiwgXCJ1c2VyLWFnZW50c1wiLCBcIlNLSUxMLm1kXCIpO1xucGFja2FnZS1tYW5hZ2VyLnRlc3QudHM6MzAwOiAgIG1rZGlyU3luYyhqb2luKGFnZW50c0Jhc2VEaXIsIFwic2tpbGxzXCIsIFwidXNlci1hZ2VudHNcIiksIHsgcmVjdXJzaXZlOiB0cnVlIH0pO1xucGFja2FnZS1tYW5hZ2VyLnRlc3QudHM6MzA2OiAgIGV4cGVjdChza2lsbD8ubWV0YWRhdGEuc291cmNlKS50b0JlKFwiYXV0b1wiKTtcbnBhY2thZ2UtbWFuYWdlci50ZXN0LnRzOjMwNzogICBleHBlY3Qoc2tpbGw/Lm1ldGFkYXRhLnNjb3BlKS50b0JlKFwidXNlclwiKTtcbnBhY2thZ2UtbWFuYWdlci50ZXN0LnRzOjMwODogICBleHBlY3Qoc2tpbGw/Lm1ldGFkYXRhLmJhc2VEaXIpLnRvQmUoYWdlbnRzQmFzZURpcik7XG5wYWNrYWdlLW1hbmFnZXIudGVzdC50czozMDk6ICAgfSBmaW5hbGx5IHtcbnBhY2thZ2UtbWFuYWdlci50ZXN0LnRzOjMxMDogICBpZiAocHJldmlvdXNIb21lID09PSB1bmRlZmluZWQpIHtcbnBhY2thZ2UtbWFuYWdlci50ZXN0LnRzOjMxMTogZGVsZXRlIHByb2Nlc3MuZW52LkhPTUU7XG5wYWNrYWdlLW1hbmFnZXIudGVzdC50czozMTI6ICAgfSBlbHNlIHtcbnBhY2thZ2UtbWFuYWdlci50ZXN0LnRzOjMxMzogICBwcm9jZXNzLmVudi5IT01FID0gcHJldmlvdXNIb21lO1xucGFja2FnZS1tYW5hZ2VyLnRlc3QudHM6MzE0OiAgIH1cbnBhY2thZ2UtbWFuYWdlci50ZXN0LnRzOjMxNTogICB9XG5wYWNrYWdlLW1hbmFnZXIudGVzdC50czozMTY6ICAgfSk7XG5wYWNrYWdlLW1hbmFnZXIudGVzdC50czozMDg6ICAgZXhwZWN0KHNraWxsPy5tZXRhZGF0YS5iYXNlRGlyKS50b0JlKGFnZW50c0Jhc2VEaXIpO1xucGFja2FnZS1tYW5hZ2VyLnRlc3QudHM6MzA5OiAgIH0gZmluYWxseSB7XG5wYWNrYWdlLW1hbmFnZXIudGVzdC50czozMTA6ICAgaWYgKHByZXZpb3VzSG9tZSA9PT0gdW5kZWZpbmVkKSB7XG5wYWNrYWdlLW1hbmFnZXIudGVzdC50czozMTE6ICAgZGVsZXRlIHByb2Nlc3MuZW52LkhPTUU7XG5wYWNrYWdlLW1hbmFnZXIudGVzdC50czozMTI6ICAgfSBlbHNlIHtcbnBhY2thZ2UtbWFuYWdlci50ZXN0LnRzOjMxMzogcHJvY2Vzcy5lbnYuSE9NRSA9IHByZXZpb3VzSG9tZTtcbnBhY2thZ2UtbWFuYWdlci50ZXN0LnRzOjMxNDogICB9XG5wYWNrYWdlLW1hbmFnZXIudGVzdC50czozMTU6ICAgfVxucGFja2FnZS1tYW5hZ2VyLnRlc3QudHM6MzE2OiAgIH0pO1xucGFja2FnZS1tYW5hZ2VyLnRlc3QudHM6MzE3OiAgIFxucGFja2FnZS1tYW5hZ2VyLnRlc3QudHM6MzE4OiAgIGl0KFwic2hvdWxkIHVzZSBlYWNoIHByb2plY3QgLmFnZW50cyBkaXIgYXMgYmFzZURpciBmb3IgcHJvamVjdCAuYWdlbnRzIHNraWxsc1wiLCBhc3luYyAoKSA9PiB7XG5wYWNrYWdlLW1hbmFnZXIudGVzdC50czo0MjQ6ICAgZXhwZWN0KHJlc3VsdC5za2lsbHMuc29tZSgocikgPT4gci5wYXRoID09PSByb290U2tpbGwpKS50b0JlKGZhbHNlKTtcbnBhY2thZ2UtbWFuYWdlci50ZXN0LnRzOjQyNTogICBleHBlY3QocmVzdWx0LnNraWxscy5zb21lKChyKSA9PiByLnBhdGggPT09IG5lc3RlZFNraWxsICYmIHIuZW5hYmxlZCkpLnRvQmUodHJ1ZSk7XG5wYWNrYWdlLW1hbmFnZXIudGVzdC50czo0MjY6ICAgfSk7XG5wYWNrYWdlLW1hbmFnZXIudGVzdC50czo0Mjc6ICAgXG5wYWNrYWdlLW1hbmFnZXIudGVzdC50czo0Mjg6ICAgaXQoXCJzaG91bGQga2VlcCB+Ly5hZ2VudHMvc2tpbGxzIHVzZXItc2NvcGVkIHdoZW4gY3dkIGlzIHVuZGVyIGhvbWUgaW4gYSBub24tZ2l0IGRpcmVjdG9yeVwiLCBhc3luYyAoKSA9PiB7XG5wYWNrYWdlLW1hbmFnZXIudGVzdC50czo0Mjk6IGNvbnN0IHByZXZpb3VzSG9tZSA9IHByb2Nlc3MuZW52LkhPTUU7XG5wYWNrYWdlLW1hbmFnZXIudGVzdC50czo0MzA6ICAgcHJvY2Vzcy5lbnYuSE9NRSA9IHRlbXBEaXI7XG5wYWNrYWdlLW1hbmFnZXIudGVzdC50czo0MzE6ICAgXG5wYWNrYWdlLW1hbmFnZXIudGVzdC50czo0MzI6ICAgdHJ5IHtcbnBhY2thZ2UtbWFuYWdlci50ZXN0LnRzOjQzMzogICBjb25zdCBjd2QgPSBqb2luKHRlbXBEaXIsIFwic2NyYXRjaFwiLCBcIm5lc3RlZFwiKTtcbnBhY2thZ2UtbWFuYWdlci50ZXN0LnRzOjQzNDogICBjb25zdCBsb2NhbEFnZW50RGlyID0gam9pbih0ZW1wRGlyLCBcIi5waVwiLCBcImFnZW50XCIpO1xucGFja2FnZS1tYW5hZ2VyLnRlc3QudHM6NDI1OiAgIGV4cGVjdChyZXN1bHQuc2tpbGxzLnNvbWUoKHIpID0+IHIucGF0aCA9PT0gbmVzdGVkU2tpbGwgJiYgci5lbmFibGVkKSkudG9CZSh0cnVlKTtcbnBhY2thZ2UtbWFuYWdlci50ZXN0LnRzOjQyNjogICB9KTtcbnBhY2thZ2UtbWFuYWdlci50ZXN0LnRzOjQyNzogICBcbnBhY2thZ2UtbWFuYWdlci50ZXN0LnRzOjQyODogICBpdChcInNob3VsZCBrZWVwIH4vLmFnZW50cy9za2lsbHMgdXNlci1zY29wZWQgd2hlbiBjd2QgaXMgdW5kZXIgaG9tZSBpbiBhIG5vbi1naXQgZGlyZWN0b3J5XCIsIGFzeW5jICgpID0+IHtcbnBhY2thZ2UtbWFuYWdlci50ZXN0LnRzOjQyOTogICBjb25zdCBwcmV2aW91c0hvbWUgPSBwcm9jZXNzLmVudi5IT01FO1xucGFja2FnZS1tYW5hZ2VyLnRlc3QudHM6NDMwOiBwcm9jZXNzLmVudi5IT01FID0gdGVtcERpcjtcbnBhY2thZ2UtbWFuYWdlci50ZXN0LnRzOjQzMTogICBcbnBhY2thZ2UtbWFuYWdlci50ZXN0LnRzOjQzMjogICB0cnkge1xucGFja2FnZS1tYW5hZ2VyLnRlc3QudHM6NDMzOiAgIGNvbnN0IGN3ZCA9IGpvaW4odGVtcERpciwgXCJzY3JhdGNoXCIsIFwibmVzdGVkXCIpO1xucGFja2FnZS1tYW5hZ2VyLnRlc3QudHM6NDM0OiAgIGNvbnN0IGxvY2FsQWdlbnREaXIgPSBqb2luKHRlbXBEaXIsIFwiLnBpXCIsIFwiYWdlbnRcIik7XG5wYWNrYWdlLW1hbmFnZXIudGVzdC50czo0MzU6ICAgY29uc3QgbG9jYWxTZXR0aW5nc01hbmFnZXIgPSBTZXR0aW5nc01hbmFnZXIuaW5NZW1vcnkoKTtcbnBhY2thZ2UtbWFuYWdlci50ZXN0LnRzOjQ1MjogICBleHBlY3QobWF0Y2hpbmdTa2lsbHNbMF0/LmVuYWJsZWQpLnRvQmUodHJ1ZSk7XG5wYWNrYWdlLW1hbmFnZXIudGVzdC50czo0NTM6ICAgZXhwZWN0KG1hdGNoaW5nU2tpbGxzWzBdPy5tZXRhZGF0YS5zY29wZSkudG9CZShcInVzZXJcIik7XG5wYWNrYWdlLW1hbmFnZXIudGVzdC50czo0NTQ6ICAgZXhwZWN0KG1hdGNoaW5nU2tpbGxzWzBdPy5tZXRhZGF0YS5zb3VyY2UpLnRvQmUoXCJhdXRvXCIpO1xucGFja2FnZS1tYW5hZ2VyLnRlc3QudHM6NDU1OiAgIH0gZmluYWxseSB7XG5wYWNrYWdlLW1hbmFnZXIudGVzdC50czo0NTY6ICAgaWYgKHByZXZpb3VzSG9tZSA9PT0gdW5kZWZpbmVkKSB7XG5wYWNrYWdlLW1hbmFnZXIudGVzdC50czo0NTc6IGRlbGV0ZSBwcm9jZXNzLmVudi5IT01FO1xucGFja2FnZS1tYW5hZ2VyLnRlc3QudHM6NDU4OiAgIH0gZWxzZSB7XG5wYWNrYWdlLW1hbmFnZXIudGVzdC50czo0NTk6ICAgcHJvY2Vzcy5lbnYuSE9NRSA9IHByZXZpb3VzSG9tZTtcbnBhY2thZ2UtbWFuYWdlci50ZXN0LnRzOjQ2MDogICB9XG5wYWNrYWdlLW1hbmFnZXIudGVzdC50czo0NjE6ICAgfVxucGFja2FnZS1tYW5hZ2VyLnRlc3QudHM6NDYyOiAgIH0pO1xucGFja2FnZS1tYW5hZ2VyLnRlc3QudHM6NDU0OiAgIGV4cGVjdChtYXRjaGluZ1NraWxsc1swXT8ubWV0YWRhdGEuc291cmNlKS50b0JlKFwiYXV0b1wiKTtcbnBhY2thZ2UtbWFuYWdlci50ZXN0LnRzOjQ1NTogICB9IGZpbmFsbHkge1xucGFja2FnZS1tYW5hZ2VyLnRlc3QudHM6NDU2OiAgIGlmIChwcmV2aW91c0hvbWUgPT09IHVuZGVmaW5lZCkge1xucGFja2FnZS1tYW5hZ2VyLnRlc3QudHM6NDU3OiAgIGRlbGV0ZSBwcm9jZXNzLmVudi5IT01FO1xucGFja2FnZS1tYW5hZ2VyLnRlc3QudHM6NDU4OiAgIH0gZWxzZSB7XG5wYWNrYWdlLW1hbmFnZXIudGVzdC50czo0NTk6IHByb2Nlc3MuZW52LkhPTUUgPSBwcmV2aW91c0hvbWU7XG5wYWNrYWdlLW1hbmFnZXIudGVzdC50czo0NjA6ICAgfVxucGFja2FnZS1tYW5hZ2VyLnRlc3QudHM6NDYxOiAgIH1cbnBhY2thZ2UtbWFuYWdlci50ZXN0LnRzOjQ2MjogICB9KTtcbnBhY2thZ2UtbWFuYWdlci50ZXN0LnRzOjQ2MzogICBcbnBhY2thZ2UtbWFuYWdlci50ZXN0LnRzOjQ2NDogICBpdChcInNob3VsZCBkZWR1cGUgdXNlciBza2lsbCBlbnRyaWVzIHdoZW4gfi8ucGkvYWdlbnQvc2tpbGxzIGlzIGEgc3ltbGluayB0byB+Ly5hZ2VudHMvc2tpbGxzXCIsIGFzeW5jICgpID0+IHtcbnBhY2thZ2UtbWFuYWdlci50ZXN0LnRzOjQ2MDogICB9XG5wYWNrYWdlLW1hbmFnZXIudGVzdC50czo0NjE6ICAgfVxucGFja2FnZS1tYW5hZ2VyLnRlc3QudHM6NDYyOiAgIH0pO1xucGFja2FnZS1tYW5hZ2VyLnRlc3QudHM6NDYzOiAgIFxucGFja2FnZS1tYW5hZ2VyLnRlc3QudHM6NDY0OiAgIGl0KFwic2hvdWxkIGRlZHVwZSB1c2VyIHNraWxsIGVudHJpZXMgd2hlbiB+Ly5waS9hZ2VudC9za2lsbHMgaXMgYSBzeW1saW5rIHRvIH4vLmFnZW50cy9za2lsbHNcIiwgYXN5bmMgKCkgPT4ge1xucGFja2FnZS1tYW5hZ2VyLnRlc3QudHM6NDY1OiBjb25zdCBwcmV2aW91c0hvbWUgPSBwcm9jZXNzLmVudi5IT01FO1xucGFja2FnZS1tYW5hZ2VyLnRlc3QudHM6NDY2OiAgIHByb2Nlc3MuZW52LkhPTUUgPSB0ZW1wRGlyO1xucGFja2FnZS1tYW5hZ2VyLnRlc3QudHM6NDY3OiAgIFxucGFja2FnZS1tYW5hZ2VyLnRlc3QudHM6NDY4OiAgIHRyeSB7XG5wYWNrYWdlLW1hbmFnZXIudGVzdC50czo0Njk6ICAgY29uc3QgYWdlbnRTa2lsbHNEaXIgPSBqb2luKGFnZW50RGlyLCBcInNraWxsc1wiKTtcbnBhY2thZ2UtbWFuYWdlci50ZXN0LnRzOjQ3MDogICBjb25zdCBhZ2VudHNTa2lsbHNEaXIgPSBqb2luKHRlbXBEaXIsIFwiLmFnZW50c1wiLCBcInNraWxsc1wiKTtcbnBhY2thZ2UtbWFuYWdlci50ZXN0LnRzOjQ2MTogICB9XG5wYWNrYWdlLW1hbmFnZXIudGVzdC50czo0NjI6ICAgfSk7XG5wYWNrYWdlLW1hbmFnZXIudGVzdC50czo0NjM6ICAgXG5wYWNrYWdlLW1hbmFnZXIudGVzdC50czo0NjQ6ICAgaXQoXCJzaG91bGQgZGVkdXBlIHVzZXIgc2tpbGwgZW50cmllcyB3aGVuIH4vLnBpL2FnZW50L3NraWxscyBpcyBhIHN5bWxpbmsgdG8gfi8uYWdlbnRzL3NraWxsc1wiLCBhc3luYyAoKSA9PiB7XG5wYWNrYWdlLW1hbmFnZXIudGVzdC50czo0NjU6ICAgY29uc3QgcHJldmlvdXNIb21lID0gcHJvY2Vzcy5lbnYuSE9NRTtcbnBhY2thZ2UtbWFuYWdlci50ZXN0LnRzOjQ2NjogcHJvY2Vzcy5lbnYuSE9NRSA9IHRlbXBEaXI7XG5wYWNrYWdlLW1hbmFnZXIudGVzdC50czo0Njc6ICAgXG5wYWNrYWdlLW1hbmFnZXIudGVzdC50czo0Njg6ICAgdHJ5IHtcbnBhY2thZ2UtbWFuYWdlci50ZXN0LnRzOjQ2OTogICBjb25zdCBhZ2VudFNraWxsc0RpciA9IGpvaW4oYWdlbnREaXIsIFwic2tpbGxzXCIpO1xucGFja2FnZS1tYW5hZ2VyLnRlc3QudHM6NDcwOiAgIGNvbnN0IGFnZW50c1NraWxsc0RpciA9IGpvaW4odGVtcERpciwgXCIuYWdlbnRzXCIsIFwic2tpbGxzXCIpO1xucGFja2FnZS1tYW5hZ2VyLnRlc3QudHM6NDcxOiAgIG1rZGlyU3luYyhhZ2VudHNTa2lsbHNEaXIsIHsgcmVjdXJzaXZlOiB0cnVlIH0pO1xucGFja2FnZS1tYW5hZ2VyLnRlc3QudHM6NDgxOiAgIGNvbnN0IGZvb1NraWxscyA9IHJlc3VsdC5za2lsbHMuZmlsdGVyKChyKSA9PiBwYXRoRW5kc1dpdGgoci5wYXRoLCBcImZvby9TS0lMTC5tZFwiKSk7XG5wYWNrYWdlLW1hbmFnZXIudGVzdC50czo0ODI6ICAgXG5wYWNrYWdlLW1hbmFnZXIudGVzdC50czo0ODM6ICAgZXhwZWN0KGZvb1NraWxscykudG9IYXZlTGVuZ3RoKDEpO1xucGFja2FnZS1tYW5hZ2VyLnRlc3QudHM6NDg0OiAgIH0gZmluYWxseSB7XG5wYWNrYWdlLW1hbmFnZXIudGVzdC50czo0ODU6ICAgaWYgKHByZXZpb3VzSG9tZSA9PT0gdW5kZWZpbmVkKSB7XG5wYWNrYWdlLW1hbmFnZXIudGVzdC50czo0ODY6IGRlbGV0ZSBwcm9jZXNzLmVudi5IT01FO1xucGFja2FnZS1tYW5hZ2VyLnRlc3QudHM6NDg3OiAgIH0gZWxzZSB7XG5wYWNrYWdlLW1hbmFnZXIudGVzdC50czo0ODg6ICAgcHJvY2Vzcy5lbnYuSE9NRSA9IHByZXZpb3VzSG9tZTtcbnBhY2thZ2UtbWFuYWdlci50ZXN0LnRzOjQ4OTogICB9XG5wYWNrYWdlLW1hbmFnZXIudGVzdC50czo0OTA6ICAgfVxucGFja2FnZS1tYW5hZ2VyLnRlc3QudHM6NDkxOiAgIH0pO1xucGFja2FnZS1tYW5hZ2VyLnRlc3QudHM6NDgzOiAgIGV4cGVjdChmb29Ta2lsbHMpLnRvSGF2ZUxlbmd0aCgxKTtcbnBhY2thZ2UtbWFuYWdlci50ZXN0LnRzOjQ4NDogICB9IGZpbmFsbHkge1xucGFja2FnZS1tYW5hZ2VyLnRlc3QudHM6NDg1OiAgIGlmIChwcmV2aW91c0hvbWUgPT09IHVuZGVmaW5lZCkge1xucGFja2FnZS1tYW5hZ2VyLnRlc3QudHM6NDg2OiAgIGRlbGV0ZSBwcm9jZXNzLmVudi5IT01FO1xucGFja2FnZS1tYW5hZ2VyLnRlc3QudHM6NDg3OiAgIH0gZWxzZSB7XG5wYWNrYWdlLW1hbmFnZXIudGVzdC50czo0ODg6IHByb2Nlc3MuZW52LkhPTUUgPSBwcmV2aW91c0hvbWU7XG5wYWNrYWdlLW1hbmFnZXIudGVzdC50czo0ODk6ICAgfVxucGFja2FnZS1tYW5hZ2VyLnRlc3QudHM6NDkwOiAgIH1cbnBhY2thZ2UtbWFuYWdlci50ZXN0LnRzOjQ5MTogICB9KTtcbnBhY2thZ2UtbWFuYWdlci50ZXN0LnRzOjQ5MjogICB9KTtcbnBhY2thZ2UtbWFuYWdlci50ZXN0LnRzOjQ5MzogICAifV0sImRldGFpbHMiOnsibWF0Y2hDb3VudCI6MTIsIm1hdGNoZXMiOlt7InBhdGgiOiJwYWNrYWdlLW1hbmFnZXIudGVzdC50cyIsImxpbmUiOjI4OSwidGV4dCI6IiAgZXhwZWN0KHNraWxsPy5tZXRhZGF0YS5zY29wZSkudG9CZShcInByb2plY3RcIik7In0seyJwYXRoIjoicGFja2FnZS1tYW5hZ2VyLnRlc3QudHMiLCJsaW5lIjoyOTAsInRleHQiOiIgIGV4cGVjdChza2lsbD8ubWV0YWRhdGEuYmFzZURpcikudG9CZShwcm9qZWN0QmFzZURpcik7In0seyJwYXRoIjoicGFja2FnZS1tYW5hZ2VyLnRlc3QudHMiLCJsaW5lIjoyOTEsInRleHQiOiIgIH0pOyJ9LHsicGF0aCI6InBhY2thZ2UtbWFuYWdlci50ZXN0LnRzIiwibGluZSI6MjkyLCJ0ZXh0IjoiICAifSx7InBhdGgiOiJwYWNrYWdlLW1hbmFnZXIudGVzdC50cyIsImxpbmUiOjI5MywidGV4dCI6IiAgaXQoXCJzaG91bGQgdXNlIH4vLmFnZW50cyBhcyBiYXNlRGlyIGZvciB1c2VyIC5hZ2VudHMgc2tpbGxzXCIsIGFzeW5jICgpID0+IHsifSx7InBhdGgiOiJwYWNrYWdlLW1hbmFnZXIudGVzdC50cyIsImxpbmUiOjI5NCwidGV4dCI6ImNvbnN0IHByZXZpb3VzSG9tZSA9IHByb2Nlc3MuZW52LkhPTUU7In0seyJwYXRoIjoicGFja2FnZS1tYW5hZ2VyLnRlc3QudHMiLCJsaW5lIjoyOTUsInRleHQiOiIgIHByb2Nlc3MuZW52LkhPTUUgPSB0ZW1wRGlyOyJ9LHsicGF0aCI6InBhY2thZ2UtbWFuYWdlci50ZXN0LnRzIiwibGluZSI6Mjk2LCJ0ZXh0IjoiICAifSx7InBhdGgiOiJwYWNrYWdlLW1hbmFnZXIudGVzdC50cyIsImxpbmUiOjI5NywidGV4dCI6IiAgdHJ5IHsifSx7InBhdGgiOiJwYWNrYWdlLW1hbmFnZXIudGVzdC50cyIsImxpbmUiOjI5OCwidGV4dCI6IiAgY29uc3QgYWdlbnRzQmFzZURpciA9IGpvaW4odGVtcERpciwgXCIuYWdlbnRzXCIpOyJ9LHsicGF0aCI6InBhY2thZ2UtbWFuYWdlci50ZXN0LnRzIiwibGluZSI6Mjk5LCJ0ZXh0IjoiICBjb25zdCBza2lsbFBhdGggPSBqb2luKGFnZW50c0Jhc2VEaXIsIFwic2tpbGxzXCIsIFwidXNlci1hZ2VudHNcIiwgXCJTS0lMTC5tZFwiKTsifSx7InBhdGgiOiJwYWNrYWdlLW1hbmFnZXIudGVzdC50cyIsImxpbmUiOjI5MCwidGV4dCI6IiAgZXhwZWN0KHNraWxsPy5tZXRhZGF0YS5iYXNlRGlyKS50b0JlKHByb2plY3RCYXNlRGlyKTsifSx7InBhdGgiOiJwYWNrYWdlLW1hbmFnZXIudGVzdC50cyIsImxpbmUiOjI5MSwidGV4dCI6IiAgfSk7In0seyJwYXRoIjoicGFja2FnZS1tYW5hZ2VyLnRlc3QudHMiLCJsaW5lIjoyOTIsInRleHQiOiIgICJ9LHsicGF0aCI6InBhY2thZ2UtbWFuYWdlci50ZXN0LnRzIiwibGluZSI6MjkzLCJ0ZXh0IjoiICBpdChcInNob3VsZCB1c2Ugfi8uYWdlbnRzIGFzIGJhc2VEaXIgZm9yIHVzZXIgLmFnZW50cyBza2lsbHNcIiwgYXN5bmMgKCkgPT4geyJ9LHsicGF0aCI6InBhY2thZ2UtbWFuYWdlci50ZXN0LnRzIiwibGluZSI6Mjk0LCJ0ZXh0IjoiICBjb25zdCBwcmV2aW91c0hvbWUgPSBwcm9jZXNzLmVudi5IT01FOyJ9LHsicGF0aCI6InBhY2thZ2UtbWFuYWdlci50ZXN0LnRzIiwibGluZSI6Mjk1LCJ0ZXh0IjoicHJvY2Vzcy5lbnYuSE9NRSA9IHRlbXBEaXI7In0seyJwYXRoIjoicGFja2FnZS1tYW5hZ2VyLnRlc3QudHMiLCJsaW5lIjoyOTYsInRleHQiOiIgICJ9LHsicGF0aCI6InBhY2thZ2UtbWFuYWdlci50ZXN0LnRzIiwibGluZSI6Mjk3LCJ0ZXh0IjoiICB0cnkgeyJ9LHsicGF0aCI6InBhY2thZ2UtbWFuYWdlci50ZXN0LnRzIiwibGluZSI6Mjk4LCJ0ZXh0IjoiICBjb25zdCBhZ2VudHNCYXNlRGlyID0gam9pbih0ZW1wRGlyLCBcIi5hZ2VudHNcIik7In0seyJwYXRoIjoicGFja2FnZS1tYW5hZ2VyLnRlc3QudHMiLCJsaW5lIjoyOTksInRleHQiOiIgIGNvbnN0IHNraWxsUGF0aCA9IGpvaW4oYWdlbnRzQmFzZURpciwgXCJza2lsbHNcIiwgXCJ1c2VyLWFnZW50c1wiLCBcIlNLSUxMLm1kXCIpOyJ9LHsicGF0aCI6InBhY2thZ2UtbWFuYWdlci50ZXN0LnRzIiwibGluZSI6MzAwLCJ0ZXh0IjoiICBta2RpclN5bmMoam9pbihhZ2VudHNCYXNlRGlyLCBcInNraWxsc1wiLCBcInVzZXItYWdlbnRzXCIpLCB7IHJlY3Vyc2l2ZTogdHJ1ZSB9KTsifSx7InBhdGgiOiJwYWNrYWdlLW1hbmFnZXIudGVzdC50cyIsImxpbmUiOjMwNiwidGV4dCI6IiAgZXhwZWN0KHNraWxsPy5tZXRhZGF0YS5zb3VyY2UpLnRvQmUoXCJhdXRvXCIpOyJ9LHsicGF0aCI6InBhY2thZ2UtbWFuYWdlci50ZXN0LnRzIiwibGluZSI6MzA3LCJ0ZXh0IjoiICBleHBlY3Qoc2tpbGw/Lm1ldGFkYXRhLnNjb3BlKS50b0JlKFwidXNlclwiKTsifSx7InBhdGgiOiJwYWNrYWdlLW1hbmFnZXIudGVzdC50cyIsImxpbmUiOjMwOCwidGV4dCI6IiAgZXhwZWN0KHNraWxsPy5tZXRhZGF0YS5iYXNlRGlyKS50b0JlKGFnZW50c0Jhc2VEaXIpOyJ9LHsicGF0aCI6InBhY2thZ2UtbWFuYWdlci50ZXN0LnRzIiwibGluZSI6MzA5LCJ0ZXh0IjoiICB9IGZpbmFsbHkgeyJ9LHsicGF0aCI6InBhY2thZ2UtbWFuYWdlci50ZXN0LnRzIiwibGluZSI6MzEwLCJ0ZXh0IjoiICBpZiAocHJldmlvdXNIb21lID09PSB1bmRlZmluZWQpIHsifSx7InBhdGgiOiJwYWNrYWdlLW1hbmFnZXIudGVzdC50cyIsImxpbmUiOjMxMSwidGV4dCI6ImRlbGV0ZSBwcm9jZXNzLmVudi5IT01FOyJ9LHsicGF0aCI6InBhY2thZ2UtbWFuYWdlci50ZXN0LnRzIiwibGluZSI6MzEyLCJ0ZXh0IjoiICB9IGVsc2UgeyJ9LHsicGF0aCI6InBhY2thZ2UtbWFuYWdlci50ZXN0LnRzIiwibGluZSI6MzEzLCJ0ZXh0IjoiICBwcm9jZXNzLmVudi5IT01FID0gcHJldmlvdXNIb21lOyJ9LHsicGF0aCI6InBhY2thZ2UtbWFuYWdlci50ZXN0LnRzIiwibGluZSI6MzE0LCJ0ZXh0IjoiICB9In0seyJwYXRoIjoicGFja2FnZS1tYW5hZ2VyLnRlc3QudHMiLCJsaW5lIjozMTUsInRleHQiOiIgIH0ifSx7InBhdGgiOiJwYWNrYWdlLW1hbmFnZXIudGVzdC50cyIsImxpbmUiOjMxNiwidGV4dCI6IiAgfSk7In0seyJwYXRoIjoicGFja2FnZS1tYW5hZ2VyLnRlc3QudHMiLCJsaW5lIjozMDgsInRleHQiOiIgIGV4cGVjdChza2lsbD8ubWV0YWRhdGEuYmFzZURpcikudG9CZShhZ2VudHNCYXNlRGlyKTsifSx7InBhdGgiOiJwYWNrYWdlLW1hbmFnZXIudGVzdC50cyIsImxpbmUiOjMwOSwidGV4dCI6IiAgfSBmaW5hbGx5IHsifSx7InBhdGgiOiJwYWNrYWdlLW1hbmFnZXIudGVzdC50cyIsImxpbmUiOjMxMCwidGV4dCI6IiAgaWYgKHByZXZpb3VzSG9tZSA9PT0gdW5kZWZpbmVkKSB7In0seyJwYXRoIjoicGFja2FnZS1tYW5hZ2VyLnRlc3QudHMiLCJsaW5lIjozMTEsInRleHQiOiIgIGRlbGV0ZSBwcm9jZXNzLmVudi5IT01FOyJ9LHsicGF0aCI6InBhY2thZ2UtbWFuYWdlci50ZXN0LnRzIiwibGluZSI6MzEyLCJ0ZXh0IjoiICB9IGVsc2UgeyJ9LHsicGF0aCI6InBhY2thZ2UtbWFuYWdlci50ZXN0LnRzIiwibGluZSI6MzEzLCJ0ZXh0IjoicHJvY2Vzcy5lbnYuSE9NRSA9IHByZXZpb3VzSG9tZTsifSx7InBhdGgiOiJwYWNrYWdlLW1hbmFnZXIudGVzdC50cyIsImxpbmUiOjMxNCwidGV4dCI6IiAgfSJ9LHsicGF0aCI6InBhY2thZ2UtbWFuYWdlci50ZXN0LnRzIiwibGluZSI6MzE1LCJ0ZXh0IjoiICB9In0seyJwYXRoIjoicGFja2FnZS1tYW5hZ2VyLnRlc3QudHMiLCJsaW5lIjozMTYsInRleHQiOiIgIH0pOyJ9LHsicGF0aCI6InBhY2thZ2UtbWFuYWdlci50ZXN0LnRzIiwibGluZSI6MzE3LCJ0ZXh0IjoiICAifSx7InBhdGgiOiJwYWNrYWdlLW1hbmFnZXIudGVzdC50cyIsImxpbmUiOjMxOCwidGV4dCI6IiAgaXQoXCJzaG91bGQgdXNlIGVhY2ggcHJvamVjdCAuYWdlbnRzIGRpciBhcyBiYXNlRGlyIGZvciBwcm9qZWN0IC5hZ2VudHMgc2tpbGxzXCIsIGFzeW5jICgpID0+IHsifSx7InBhdGgiOiJwYWNrYWdlLW1hbmFnZXIudGVzdC50cyIsImxpbmUiOjQyNCwidGV4dCI6IiAgZXhwZWN0KHJlc3VsdC5za2lsbHMuc29tZSgocikgPT4gci5wYXRoID09PSByb290U2tpbGwpKS50b0JlKGZhbHNlKTsifSx7InBhdGgiOiJwYWNrYWdlLW1hbmFnZXIudGVzdC50cyIsImxpbmUiOjQyNSwidGV4dCI6IiAgZXhwZWN0KHJlc3VsdC5za2lsbHMuc29tZSgocikgPT4gci5wYXRoID09PSBuZXN0ZWRTa2lsbCAmJiByLmVuYWJsZWQpKS50b0JlKHRydWUpOyJ9LHsicGF0aCI6InBhY2thZ2UtbWFuYWdlci50ZXN0LnRzIiwibGluZSI6NDI2LCJ0ZXh0IjoiICB9KTsifSx7InBhdGgiOiJwYWNrYWdlLW1hbmFnZXIudGVzdC50cyIsImxpbmUiOjQyNywidGV4dCI6IiAgIn0seyJwYXRoIjoicGFja2FnZS1tYW5hZ2VyLnRlc3QudHMiLCJsaW5lIjo0MjgsInRleHQiOiIgIGl0KFwic2hvdWxkIGtlZXAgfi8uYWdlbnRzL3NraWxscyB1c2VyLXNjb3BlZCB3aGVuIGN3ZCBpcyB1bmRlciBob21lIGluIGEgbm9uLWdpdCBkaXJlY3RvcnlcIiwgYXN5bmMgKCkgPT4geyJ9LHsicGF0aCI6InBhY2thZ2UtbWFuYWdlci50ZXN0LnRzIiwibGluZSI6NDI5LCJ0ZXh0IjoiY29uc3QgcHJldmlvdXNIb21lID0gcHJvY2Vzcy5lbnYuSE9NRTsifSx7InBhdGgiOiJwYWNrYWdlLW1hbmFnZXIudGVzdC50cyIsImxpbmUiOjQzMCwidGV4dCI6IiAgcHJvY2Vzcy5lbnYuSE9NRSA9IHRlbXBEaXI7In0seyJwYXRoIjoicGFja2FnZS1tYW5hZ2VyLnRlc3QudHMiLCJsaW5lIjo0MzEsInRleHQiOiIgICJ9LHsicGF0aCI6InBhY2thZ2UtbWFuYWdlci50ZXN0LnRzIiwibGluZSI6NDMyLCJ0ZXh0IjoiICB0cnkgeyJ9LHsicGF0aCI6InBhY2thZ2UtbWFuYWdlci50ZXN0LnRzIiwibGluZSI6NDMzLCJ0ZXh0IjoiICBjb25zdCBjd2QgPSBqb2luKHRlbXBEaXIsIFwic2NyYXRjaFwiLCBcIm5lc3RlZFwiKTsifSx7InBhdGgiOiJwYWNrYWdlLW1hbmFnZXIudGVzdC50cyIsImxpbmUiOjQzNCwidGV4dCI6IiAgY29uc3QgbG9jYWxBZ2VudERpciA9IGpvaW4odGVtcERpciwgXCIucGlcIiwgXCJhZ2VudFwiKTsifSx7InBhdGgiOiJwYWNrYWdlLW1hbmFnZXIudGVzdC50cyIsImxpbmUiOjQyNSwidGV4dCI6IiAgZXhwZWN0KHJlc3VsdC5za2lsbHMuc29tZSgocikgPT4gci5wYXRoID09PSBuZXN0ZWRTa2lsbCAmJiByLmVuYWJsZWQpKS50b0JlKHRydWUpOyJ9LHsicGF0aCI6InBhY2thZ2UtbWFuYWdlci50ZXN0LnRzIiwibGluZSI6NDI2LCJ0ZXh0IjoiICB9KTsifSx7InBhdGgiOiJwYWNrYWdlLW1hbmFnZXIudGVzdC50cyIsImxpbmUiOjQyNywidGV4dCI6IiAgIn0seyJwYXRoIjoicGFja2FnZS1tYW5hZ2VyLnRlc3QudHMiLCJsaW5lIjo0MjgsInRleHQiOiIgIGl0KFwic2hvdWxkIGtlZXAgfi8uYWdlbnRzL3NraWxscyB1c2VyLXNjb3BlZCB3aGVuIGN3ZCBpcyB1bmRlciBob21lIGluIGEgbm9uLWdpdCBkaXJlY3RvcnlcIiwgYXN5bmMgKCkgPT4geyJ9LHsicGF0aCI6InBhY2thZ2UtbWFuYWdlci50ZXN0LnRzIiwibGluZSI6NDI5LCJ0ZXh0IjoiICBjb25zdCBwcmV2aW91c0hvbWUgPSBwcm9jZXNzLmVudi5IT01FOyJ9LHsicGF0aCI6InBhY2thZ2UtbWFuYWdlci50ZXN0LnRzIiwibGluZSI6NDMwLCJ0ZXh0IjoicHJvY2Vzcy5lbnYuSE9NRSA9IHRlbXBEaXI7In0seyJwYXRoIjoicGFja2FnZS1tYW5hZ2VyLnRlc3QudHMiLCJsaW5lIjo0MzEsInRleHQiOiIgICJ9LHsicGF0aCI6InBhY2thZ2UtbWFuYWdlci50ZXN0LnRzIiwibGluZSI6NDMyLCJ0ZXh0IjoiICB0cnkgeyJ9LHsicGF0aCI6InBhY2thZ2UtbWFuYWdlci50ZXN0LnRzIiwibGluZSI6NDMzLCJ0ZXh0IjoiICBjb25zdCBjd2QgPSBqb2luKHRlbXBEaXIsIFwic2NyYXRjaFwiLCBcIm5lc3RlZFwiKTsifSx7InBhdGgiOiJwYWNrYWdlLW1hbmFnZXIudGVzdC50cyIsImxpbmUiOjQzNCwidGV4dCI6IiAgY29uc3QgbG9jYWxBZ2VudERpciA9IGpvaW4odGVtcERpciwgXCIucGlcIiwgXCJhZ2VudFwiKTsifSx7InBhdGgiOiJwYWNrYWdlLW1hbmFnZXIudGVzdC50cyIsImxpbmUiOjQzNSwidGV4dCI6IiAgY29uc3QgbG9jYWxTZXR0aW5nc01hbmFnZXIgPSBTZXR0aW5nc01hbmFnZXIuaW5NZW1vcnkoKTsifSx7InBhdGgiOiJwYWNrYWdlLW1hbmFnZXIudGVzdC50cyIsImxpbmUiOjQ1MiwidGV4dCI6IiAgZXhwZWN0KG1hdGNoaW5nU2tpbGxzWzBdPy5lbmFibGVkKS50b0JlKHRydWUpOyJ9LHsicGF0aCI6InBhY2thZ2UtbWFuYWdlci50ZXN0LnRzIiwibGluZSI6NDUzLCJ0ZXh0IjoiICBleHBlY3QobWF0Y2hpbmdTa2lsbHNbMF0/Lm1ldGFkYXRhLnNjb3BlKS50b0JlKFwidXNlclwiKTsifSx7InBhdGgiOiJwYWNrYWdlLW1hbmFnZXIudGVzdC50cyIsImxpbmUiOjQ1NCwidGV4dCI6IiAgZXhwZWN0KG1hdGNoaW5nU2tpbGxzWzBdPy5tZXRhZGF0YS5zb3VyY2UpLnRvQmUoXCJhdXRvXCIpOyJ9LHsicGF0aCI6InBhY2thZ2UtbWFuYWdlci50ZXN0LnRzIiwibGluZSI6NDU1LCJ0ZXh0IjoiICB9IGZpbmFsbHkgeyJ9LHsicGF0aCI6InBhY2thZ2UtbWFuYWdlci50ZXN0LnRzIiwibGluZSI6NDU2LCJ0ZXh0IjoiICBpZiAocHJldmlvdXNIb21lID09PSB1bmRlZmluZWQpIHsifSx7InBhdGgiOiJwYWNrYWdlLW1hbmFnZXIudGVzdC50cyIsImxpbmUiOjQ1NywidGV4dCI6ImRlbGV0ZSBwcm9jZXNzLmVudi5IT01FOyJ9LHsicGF0aCI6InBhY2thZ2UtbWFuYWdlci50ZXN0LnRzIiwibGluZSI6NDU4LCJ0ZXh0IjoiICB9IGVsc2UgeyJ9LHsicGF0aCI6InBhY2thZ2UtbWFuYWdlci50ZXN0LnRzIiwibGluZSI6NDU5LCJ0ZXh0IjoiICBwcm9jZXNzLmVudi5IT01FID0gcHJldmlvdXNIb21lOyJ9LHsicGF0aCI6InBhY2thZ2UtbWFuYWdlci50ZXN0LnRzIiwibGluZSI6NDYwLCJ0ZXh0IjoiICB9In0seyJwYXRoIjoicGFja2FnZS1tYW5hZ2VyLnRlc3QudHMiLCJsaW5lIjo0NjEsInRleHQiOiIgIH0ifSx7InBhdGgiOiJwYWNrYWdlLW1hbmFnZXIudGVzdC50cyIsImxpbmUiOjQ2MiwidGV4dCI6IiAgfSk7In0seyJwYXRoIjoicGFja2FnZS1tYW5hZ2VyLnRlc3QudHMiLCJsaW5lIjo0NTQsInRleHQiOiIgIGV4cGVjdChtYXRjaGluZ1NraWxsc1swXT8ubWV0YWRhdGEuc291cmNlKS50b0JlKFwiYXV0b1wiKTsifSx7InBhdGgiOiJwYWNrYWdlLW1hbmFnZXIudGVzdC50cyIsImxpbmUiOjQ1NSwidGV4dCI6IiAgfSBmaW5hbGx5IHsifSx7InBhdGgiOiJwYWNrYWdlLW1hbmFnZXIudGVzdC50cyIsImxpbmUiOjQ1NiwidGV4dCI6IiAgaWYgKHByZXZpb3VzSG9tZSA9PT0gdW5kZWZpbmVkKSB7In0seyJwYXRoIjoicGFja2FnZS1tYW5hZ2VyLnRlc3QudHMiLCJsaW5lIjo0NTcsInRleHQiOiIgIGRlbGV0ZSBwcm9jZXNzLmVudi5IT01FOyJ9LHsicGF0aCI6InBhY2thZ2UtbWFuYWdlci50ZXN0LnRzIiwibGluZSI6NDU4LCJ0ZXh0IjoiICB9IGVsc2UgeyJ9LHsicGF0aCI6InBhY2thZ2UtbWFuYWdlci50ZXN0LnRzIiwibGluZSI6NDU5LCJ0ZXh0IjoicHJvY2Vzcy5lbnYuSE9NRSA9IHByZXZpb3VzSG9tZTsifSx7InBhdGgiOiJwYWNrYWdlLW1hbmFnZXIudGVzdC50cyIsImxpbmUiOjQ2MCwidGV4dCI6IiAgfSJ9LHsicGF0aCI6InBhY2thZ2UtbWFuYWdlci50ZXN0LnRzIiwibGluZSI6NDYxLCJ0ZXh0IjoiICB9In0seyJwYXRoIjoicGFja2FnZS1tYW5hZ2VyLnRlc3QudHMiLCJsaW5lIjo0NjIsInRleHQiOiIgIH0pOyJ9LHsicGF0aCI6InBhY2thZ2UtbWFuYWdlci50ZXN0LnRzIiwibGluZSI6NDYzLCJ0ZXh0IjoiICAifSx7InBhdGgiOiJwYWNrYWdlLW1hbmFnZXIudGVzdC50cyIsImxpbmUiOjQ2NCwidGV4dCI6IiAgaXQoXCJzaG91bGQgZGVkdXBlIHVzZXIgc2tpbGwgZW50cmllcyB3aGVuIH4vLnBpL2FnZW50L3NraWxscyBpcyBhIHN5bWxpbmsgdG8gfi8uYWdlbnRzL3NraWxsc1wiLCBhc3luYyAoKSA9PiB7In0seyJwYXRoIjoicGFja2FnZS1tYW5hZ2VyLnRlc3QudHMiLCJsaW5lIjo0NjAsInRleHQiOiIgIH0ifSx7InBhdGgiOiJwYWNrYWdlLW1hbmFnZXIudGVzdC50cyIsImxpbmUiOjQ2MSwidGV4dCI6IiAgfSJ9LHsicGF0aCI6InBhY2thZ2UtbWFuYWdlci50ZXN0LnRzIiwibGluZSI6NDYyLCJ0ZXh0IjoiICB9KTsifSx7InBhdGgiOiJwYWNrYWdlLW1hbmFnZXIudGVzdC50cyIsImxpbmUiOjQ2MywidGV4dCI6IiAgIn0seyJwYXRoIjoicGFja2FnZS1tYW5hZ2VyLnRlc3QudHMiLCJsaW5lIjo0NjQsInRleHQiOiIgIGl0KFwic2hvdWxkIGRlZHVwZSB1c2VyIHNraWxsIGVudHJpZXMgd2hlbiB+Ly5waS9hZ2VudC9za2lsbHMgaXMgYSBzeW1saW5rIHRvIH4vLmFnZW50cy9za2lsbHNcIiwgYXN5bmMgKCkgPT4geyJ9LHsicGF0aCI6InBhY2thZ2UtbWFuYWdlci50ZXN0LnRzIiwibGluZSI6NDY1LCJ0ZXh0IjoiY29uc3QgcHJldmlvdXNIb21lID0gcHJvY2Vzcy5lbnYuSE9NRTsifSx7InBhdGgiOiJwYWNrYWdlLW1hbmFnZXIudGVzdC50cyIsImxpbmUiOjQ2NiwidGV4dCI6IiAgcHJvY2Vzcy5lbnYuSE9NRSA9IHRlbXBEaXI7In0seyJwYXRoIjoicGFja2FnZS1tYW5hZ2VyLnRlc3QudHMiLCJsaW5lIjo0NjcsInRleHQiOiIgICJ9LHsicGF0aCI6InBhY2thZ2UtbWFuYWdlci50ZXN0LnRzIiwibGluZSI6NDY4LCJ0ZXh0IjoiICB0cnkgeyJ9LHsicGF0aCI6InBhY2thZ2UtbWFuYWdlci50ZXN0LnRzIiwibGluZSI6NDY5LCJ0ZXh0IjoiICBjb25zdCBhZ2VudFNraWxsc0RpciA9IGpvaW4oYWdlbnREaXIsIFwic2tpbGxzXCIpOyJ9LHsicGF0aCI6InBhY2thZ2UtbWFuYWdlci50ZXN0LnRzIiwibGluZSI6NDcwLCJ0ZXh0IjoiICBjb25zdCBhZ2VudHNTa2lsbHNEaXIgPSBqb2luKHRlbXBEaXIsIFwiLmFnZW50c1wiLCBcInNraWxsc1wiKTsifSx7InBhdGgiOiJwYWNrYWdlLW1hbmFnZXIudGVzdC50cyIsImxpbmUiOjQ2MSwidGV4dCI6IiAgfSJ9LHsicGF0aCI6InBhY2thZ2UtbWFuYWdlci50ZXN0LnRzIiwibGluZSI6NDYyLCJ0ZXh0IjoiICB9KTsifSx7InBhdGgiOiJwYWNrYWdlLW1hbmFnZXIudGVzdC50cyIsImxpbmUiOjQ2MywidGV4dCI6IiAgIn0seyJwYXRoIjoicGFja2FnZS1tYW5hZ2VyLnRlc3QudHMiLCJsaW5lIjo0NjQsInRleHQiOiIgIGl0KFwic2hvdWxkIGRlZHVwZSB1c2VyIHNraWxsIGVudHJpZXMgd2hlbiB+Ly5waS9hZ2VudC9za2lsbHMgaXMgYSBzeW1saW5rIHRvIH4vLmFnZW50cy9za2lsbHNcIiwgYXN5bmMgKCkgPT4geyJ9LHsicGF0aCI6InBhY2thZ2UtbWFuYWdlci50ZXN0LnRzIiwibGluZSI6NDY1LCJ0ZXh0IjoiICBjb25zdCBwcmV2aW91c0hvbWUgPSBwcm9jZXNzLmVudi5IT01FOyJ9LHsicGF0aCI6InBhY2thZ2UtbWFuYWdlci50ZXN0LnRzIiwibGluZSI6NDY2LCJ0ZXh0IjoicHJvY2Vzcy5lbnYuSE9NRSA9IHRlbXBEaXI7In0seyJwYXRoIjoicGFja2FnZS1tYW5hZ2VyLnRlc3QudHMiLCJsaW5lIjo0NjcsInRleHQiOiIgICJ9LHsicGF0aCI6InBhY2thZ2UtbWFuYWdlci50ZXN0LnRzIiwibGluZSI6NDY4LCJ0ZXh0IjoiICB0cnkgeyJ9LHsicGF0aCI6InBhY2thZ2UtbWFuYWdlci50ZXN0LnRzIiwibGluZSI6NDY5LCJ0ZXh0IjoiICBjb25zdCBhZ2VudFNraWxsc0RpciA9IGpvaW4oYWdlbnREaXIsIFwic2tpbGxzXCIpOyJ9LHsicGF0aCI6InBhY2thZ2UtbWFuYWdlci50ZXN0LnRzIiwibGluZSI6NDcwLCJ0ZXh0IjoiICBjb25zdCBhZ2VudHNTa2lsbHNEaXIgPSBqb2luKHRlbXBEaXIsIFwiLmFnZW50c1wiLCBcInNraWxsc1wiKTsifSx7InBhdGgiOiJwYWNrYWdlLW1hbmFnZXIudGVzdC50cyIsImxpbmUiOjQ3MSwidGV4dCI6IiAgbWtkaXJTeW5jKGFnZW50c1NraWxsc0RpciwgeyByZWN1cnNpdmU6IHRydWUgfSk7In0seyJwYXRoIjoicGFja2FnZS1tYW5hZ2VyLnRlc3QudHMiLCJsaW5lIjo0ODEsInRleHQiOiIgIGNvbnN0IGZvb1NraWxscyA9IHJlc3VsdC5za2lsbHMuZmlsdGVyKChyKSA9PiBwYXRoRW5kc1dpdGgoci5wYXRoLCBcImZvby9TS0lMTC5tZFwiKSk7In0seyJwYXRoIjoicGFja2FnZS1tYW5hZ2VyLnRlc3QudHMiLCJsaW5lIjo0ODIsInRleHQiOiIgICJ9LHsicGF0aCI6InBhY2thZ2UtbWFuYWdlci50ZXN0LnRzIiwibGluZSI6NDgzLCJ0ZXh0IjoiICBleHBlY3QoZm9vU2tpbGxzKS50b0hhdmVMZW5ndGgoMSk7In0seyJwYXRoIjoicGFja2FnZS1tYW5hZ2VyLnRlc3QudHMiLCJsaW5lIjo0ODQsInRleHQiOiIgIH0gZmluYWxseSB7In0seyJwYXRoIjoicGFja2FnZS1tYW5hZ2VyLnRlc3QudHMiLCJsaW5lIjo0ODUsInRleHQiOiIgIGlmIChwcmV2aW91c0hvbWUgPT09IHVuZGVmaW5lZCkgeyJ9LHsicGF0aCI6InBhY2thZ2UtbWFuYWdlci50ZXN0LnRzIiwibGluZSI6NDg2LCJ0ZXh0IjoiZGVsZXRlIHByb2Nlc3MuZW52LkhPTUU7In0seyJwYXRoIjoicGFja2FnZS1tYW5hZ2VyLnRlc3QudHMiLCJsaW5lIjo0ODcsInRleHQiOiIgIH0gZWxzZSB7In0seyJwYXRoIjoicGFja2FnZS1tYW5hZ2VyLnRlc3QudHMiLCJsaW5lIjo0ODgsInRleHQiOiIgIHByb2Nlc3MuZW52LkhPTUUgPSBwcmV2aW91c0hvbWU7In0seyJwYXRoIjoicGFja2FnZS1tYW5hZ2VyLnRlc3QudHMiLCJsaW5lIjo0ODksInRleHQiOiIgIH0ifSx7InBhdGgiOiJwYWNrYWdlLW1hbmFnZXIudGVzdC50cyIsImxpbmUiOjQ5MCwidGV4dCI6IiAgfSJ9LHsicGF0aCI6InBhY2thZ2UtbWFuYWdlci50ZXN0LnRzIiwibGluZSI6NDkxLCJ0ZXh0IjoiICB9KTsifSx7InBhdGgiOiJwYWNrYWdlLW1hbmFnZXIudGVzdC50cyIsImxpbmUiOjQ4MywidGV4dCI6IiAgZXhwZWN0KGZvb1NraWxscykudG9IYXZlTGVuZ3RoKDEpOyJ9LHsicGF0aCI6InBhY2thZ2UtbWFuYWdlci50ZXN0LnRzIiwibGluZSI6NDg0LCJ0ZXh0IjoiICB9IGZpbmFsbHkgeyJ9LHsicGF0aCI6InBhY2thZ2UtbWFuYWdlci50ZXN0LnRzIiwibGluZSI6NDg1LCJ0ZXh0IjoiICBpZiAocHJldmlvdXNIb21lID09PSB1bmRlZmluZWQpIHsifSx7InBhdGgiOiJwYWNrYWdlLW1hbmFnZXIudGVzdC50cyIsImxpbmUiOjQ4NiwidGV4dCI6IiAgZGVsZXRlIHByb2Nlc3MuZW52LkhPTUU7In0seyJwYXRoIjoicGFja2FnZS1tYW5hZ2VyLnRlc3QudHMiLCJsaW5lIjo0ODcsInRleHQiOiIgIH0gZWxzZSB7In0seyJwYXRoIjoicGFja2FnZS1tYW5hZ2VyLnRlc3QudHMiLCJsaW5lIjo0ODgsInRleHQiOiJwcm9jZXNzLmVudi5IT01FID0gcHJldmlvdXNIb21lOyJ9LHsicGF0aCI6InBhY2thZ2UtbWFuYWdlci50ZXN0LnRzIiwibGluZSI6NDg5LCJ0ZXh0IjoiICB9In0seyJwYXRoIjoicGFja2FnZS1tYW5hZ2VyLnRlc3QudHMiLCJsaW5lIjo0OTAsInRleHQiOiIgIH0ifSx7InBhdGgiOiJwYWNrYWdlLW1hbmFnZXIudGVzdC50cyIsImxpbmUiOjQ5MSwidGV4dCI6IiAgfSk7In0seyJwYXRoIjoicGFja2FnZS1tYW5hZ2VyLnRlc3QudHMiLCJsaW5lIjo0OTIsInRleHQiOiIgIH0pOyJ9LHsicGF0aCI6InBhY2thZ2UtbWFuYWdlci50ZXN0LnRzIiwibGluZSI6NDkzLCJ0ZXh0IjoiICAifV19LCJpc0Vycm9yIjpmYWxzZSwidGltZXN0YW1wIjoxNzc3NTY0MzYyMTE1fX0seyJ0eXBlIjoibWVzc2FnZSIsImlkIjoiOTA4N2I2OGMiLCJwYXJlbnRJZCI6IjMyY2U1NDVmIiwidGltZXN0YW1wIjoiMjAyNi0wNC0zMFQxNTo1Mjo1My40MTBaIiwibWVzc2FnZSI6eyJyb2xlIjoiYXNzaXN0YW50IiwiY29udGVudCI6W3sidHlwZSI6InRoaW5raW5nIiwidGhpbmtpbmciOiIgSSBzZWUgdGhlIHBhdHRlcm4uIFRoZSB0ZXN0IHRoYXQgaXMgZmFpbGluZyAoXCJzaG91bGQgcmVzb2x2ZSBzeW1saW5rZWQgdXNlciBhbmQgcHJvamVjdCByZXNvdXJjZXMgb25jZVwiKSBuZWVkcyB0byBhbHNvIHNldCBgcHJvY2Vzcy5lbnYuSE9NRWAgdG8gYHRlbXBEaXJgIHRvIGF2b2lkIHBpY2tpbmcgdXAgdGhlIHJlYWwgdXNlcidzIGB+Ly5hZ2VudHMvc2tpbGxzYCBkaXJlY3RvcnkuXG5cblRoZSB0ZXN0IGF0IGxpbmUgMTYxIG5lZWRzIHRvIGJlIHVwZGF0ZWQgdG8gdGVtcG9yYXJpbHkgc2V0IGBIT01FYCB0byBgdGVtcERpcmAgbGlrZSB0aGUgb3RoZXIgdGVzdHMgZG8uIFRoaXMgaXMgYSBwcmUtZXhpc3RpbmcgaXNzdWUgdGhhdCB3YXMgbWFza2VkIGJlY2F1c2UgcHJldmlvdXNseSBgfi8uYWdlbnRzYCBza2lsbHMgd2VyZSBnZXR0aW5nIHRoZSBzYW1lIG1ldGFkYXRhIGFzIGB+Ly5waS9hZ2VudGAgc2tpbGxzIGFuZCB3ZXJlIGJlaW5nIGRlZHVwbGljYXRlZCBieSB0aGUgY2Fub25pY2FsIHBhdGggY2hlY2suXG5cbk5vdyB3aXRoIHRoZSBmaXgsIHRoZXkgaGF2ZSBkaWZmZXJlbnQgbWV0YWRhdGEgYW5kIGFyZSB0cmVhdGVkIGFzIHNlcGFyYXRlIGVudHJpZXMuIFRoaXMgaXMgdGhlIGNvcnJlY3QgYmVoYXZpb3IgLSBidXQgdGhlIHRlc3QgbmVlZHMgdG8gYmUgdXBkYXRlZCB0byBub3QgcGljayB1cCByZWFsIHVzZXIgc2tpbGxzLiIsInRoaW5raW5nU2lnbmF0dXJlIjoicmVhc29uaW5nIn0seyJ0eXBlIjoidG9vbENhbGwiLCJpZCI6ImZ1bmN0aW9ucy5lZGl0OjIzIiwibmFtZSI6ImVkaXQiLCJhcmd1bWVudHMiOnsicGF0aCI6InBhY2thZ2VzL2NvZGluZy1hZ2VudC90ZXN0L3BhY2thZ2UtbWFuYWdlci50ZXN0LnRzIiwiZWRpdHMiOlt7Im9sZFRleHQiOiJcdGl0KFwic2hvdWxkIHJlc29sdmUgc3ltbGlua2VkIHVzZXIgYW5kIHByb2plY3QgcmVzb3VyY2VzIG9uY2VcIiwgYXN5bmMgKCkgPT4ge1xuXHRcdGNvbnN0IHNoYXJlZERpciA9IGpvaW4odGVtcERpciwgXCJzaGFyZWQtcmVzb3VyY2VzXCIpO1xuXHRcdGNvbnN0IHNoYXJlZEV4dGVuc2lvbnNEaXIgPSBqb2luKHNoYXJlZERpciwgXCJleHRlbnNpb25zXCIpO1xuXHRcdGNvbnN0IHNoYXJlZFNraWxsc0RpciA9IGpvaW4oc2hhcmVkRGlyLCBcInNraWxsc1wiKTtcblx0XHRjb25zdCBzaGFyZWRQcm9tcHRzRGlyID0gam9pbihzaGFyZWREaXIsIFwicHJvbXB0c1wiKTtcblx0XHRjb25zdCBzaGFyZWRUaGVtZXNEaXIgPSBqb2luKHNoYXJlZERpciwgXCJ0aGVtZXNcIik7XG5cdFx0bWtkaXJTeW5jKHNoYXJlZEV4dGVuc2lvbnNEaXIsIHsgcmVjdXJzaXZlOiB0cnVlIH0pO1xuXHRcdG1rZGlyU3luYyhzaGFyZWRTa2lsbHNEaXIsIHsgcmVjdXJzaXZlOiB0cnVlIH0pO1xuXHRcdG1rZGlyU3luYyhzaGFyZWRQcm9tcHRzRGlyLCB7IHJlY3Vyc2l2ZTogdHJ1ZSB9KTtcblx0XHRta2RpclN5bmMoc2hhcmVkVGhlbWVzRGlyLCB7IHJlY3Vyc2l2ZTogdHJ1ZSB9KTtcblxuXHRcdHdyaXRlRmlsZVN5bmMoam9pbihzaGFyZWRFeHRlbnNpb25zRGlyLCBcInNoYXJlZC50c1wiKSwgXCJleHBvcnQgZGVmYXVsdCBmdW5jdGlvbigpIHt9XCIpO1xuXHRcdG1rZGlyU3luYyhqb2luKHNoYXJlZFNraWxsc0RpciwgXCJzaGFyZWQtc2tpbGxcIiksIHsgcmVjdXJzaXZlOiB0cnVlIH0pO1xuXHRcdHdyaXRlRmlsZVN5bmMoXG5cdFx0XHRqb2luKHNoYXJlZFNraWxsc0RpciwgXCJzaGFyZWQtc2tpbGxcIiwgXCJTS0lMTC5tZFwiKSxcblx0XHRcdGAtLS1cbm5hbWU6IHNoYXJlZC1za2lsbFxuZGVzY3JpcHRpb246IFNoYXJlZCBza2lsbFxuLS0tXG5Db250ZW50YCxcblx0XHQpO1xuXHRcdHdyaXRlRmlsZVN5bmMoam9pbihzaGFyZWRQcm9tcHRzRGlyLCBcInNoYXJlZC5tZFwiKSwgXCJTaGFyZWQgcHJvbXB0XCIpO1xuXHRcdHdyaXRlRmlsZVN5bmMoam9pbihzaGFyZWRUaGVtZXNEaXIsIFwic2hhcmVkLmpzb25cIiksIEpTT04uc3RyaW5naWZ5KHsgbmFtZTogXCJzaGFyZWQtdGhlbWVcIiB9KSk7XG5cblx0XHRta2RpclN5bmMoam9pbihhZ2VudERpciksIHsgcmVjdXJzaXZlOiB0cnVlIH0pO1xuXHRcdG1rZGlyU3luYyhqb2luKHRlbXBEaXIsIFwiLnBpXCIpLCB7IHJlY3Vyc2l2ZTogdHJ1ZSB9KTtcblx0XHRzeW1saW5rU3luYyhzaGFyZWRFeHRlbnNpb25zRGlyLCBqb2luKGFnZW50RGlyLCBcImV4dGVuc2lvbnNcIiksIFwiZGlyXCIpO1xuXHRcdHN5bWxpbmtTeW5jKHNoYXJlZFNraWxsc0Rpciwgam9pbihhZ2VudERpciwgXCJza2lsbHNcIiksIFwiZGlyXCIpO1xuXHRcdHN5bWxpbmtTeW5jKHNoYXJlZFByb21wdHNEaXIsIGpvaW4oYWdlbnREaXIsIFwicHJvbXB0c1wiKSwgXCJkaXJcIik7XG5cdFx0c3ltbGlua1N5bmMoc2hhcmVkVGhlbWVzRGlyLCBqb2luKGFnZW50RGlyLCBcInRoZW1lc1wiKSwgXCJkaXJcIik7XG5cdFx0c3ltbGlua1N5bmMoc2hhcmVkRXh0ZW5zaW9uc0Rpciwgam9pbih0ZW1wRGlyLCBcIi5waVwiLCBcImV4dGVuc2lvbnNcIiksIFwiZGlyXCIpO1xuXHRcdHN5bWxpbmtTeW5jKHNoYXJlZFNraWxsc0Rpciwgam9pbih0ZW1wRGlyLCBcIi5waVwiLCBcInNraWxsc1wiKSwgXCJkaXJcIik7XG5cdFx0c3ltbGlua1N5bmMoc2hhcmVkUHJvbXB0c0Rpciwgam9pbih0ZW1wRGlyLCBcIi5waVwiLCBcInByb21wdHNcIiksIFwiZGlyXCIpO1xuXHRcdHN5bWxpbmtTeW5jKHNoYXJlZFRoZW1lc0Rpciwgam9pbih0ZW1wRGlyLCBcIi5waVwiLCBcInRoZW1lc1wiKSwgXCJkaXJcIik7XG5cblx0XHRjb25zdCByZXN1bHQgPSBhd2FpdCBwYWNrYWdlTWFuYWdlci5yZXNvbHZlKCk7XG5cblx0XHRleHBlY3Qoe1xuXHRcdFx0ZXh0ZW5zaW9uczogcmVzdWx0LmV4dGVuc2lvbnMubGVuZ3RoLFxuXHRcdFx0c2tpbGxzOiByZXN1bHQuc2tpbGxzLmxlbmd0aCxcblx0XHRcdHByb21wdHM6IHJlc3VsdC5wcm9tcHRzLmxlbmd0aCxcblx0XHRcdHRoZW1lczogcmVzdWx0LnRoZW1lcy5sZW5ndGgsXG5cdFx0fSkudG9FcXVhbCh7XG5cdFx0XHRleHRlbnNpb25zOiAxLFxuXHRcdFx0c2tpbGxzOiAxLFxuXHRcdFx0cHJvbXB0czogMSxcblx0XHRcdHRoZW1lczogMSxcblx0XHR9KTtcblxuXHRcdC8vIFByb2plY3QgYXV0by1kaXNjb3ZlcmVkIGhhcyBoaWdoZXIgcHJlY2VkZW5jZSB0aGFuIHVzZXIgYXV0by1kaXNjb3ZlcmVkLFxuXHRcdC8vIHNvIHRoZSBzdXJ2aXZpbmcgZW50cnkgc2hvdWxkIGJlIHNjb3BlZCB0byBwcm9qZWN0LlxuXHRcdGV4cGVjdChyZXN1bHQuZXh0ZW5zaW9uc1swXS5tZXRhZGF0YS5zY29wZSkudG9CZShcInByb2plY3RcIik7XG5cdFx0ZXhwZWN0KHJlc3VsdC5za2lsbHNbMF0ubWV0YWRhdGEuc2NvcGUpLnRvQmUoXCJwcm9qZWN0XCIpO1xuXHRcdGV4cGVjdChyZXN1bHQucHJvbXB0c1swXS5tZXRhZGF0YS5zY29wZSkudG9CZShcInByb2plY3RcIik7XG5cdFx0ZXhwZWN0KHJlc3VsdC50aGVtZXNbMF0ubWV0YWRhdGEuc2NvcGUpLnRvQmUoXCJwcm9qZWN0XCIpO1xuXHR9KTsiLCJuZXdUZXh0IjoiXHRpdChcInNob3VsZCByZXNvbHZlIHN5bWxpbmtlZCB1c2VyIGFuZCBwcm9qZWN0IHJlc291cmNlcyBvbmNlXCIsIGFzeW5jICgpID0+IHtcblx0XHRjb25zdCBwcmV2aW91c0hvbWUgPSBwcm9jZXNzLmVudi5IT01FO1xuXHRcdHByb2Nlc3MuZW52LkhPTUUgPSB0ZW1wRGlyO1xuXG5cdFx0dHJ5IHtcblx0XHRcdGNvbnN0IHNoYXJlZERpciA9IGpvaW4odGVtcERpciwgXCJzaGFyZWQtcmVzb3VyY2VzXCIpO1xuXHRcdFx0Y29uc3Qgc2hhcmVkRXh0ZW5zaW9uc0RpciA9IGpvaW4oc2hhcmVkRGlyLCBcImV4dGVuc2lvbnNcIik7XG5cdFx0XHRjb25zdCBzaGFyZWRTa2lsbHNEaXIgPSBqb2luKHNoYXJlZERpciwgXCJza2lsbHNcIik7XG5cdFx0XHRjb25zdCBzaGFyZWRQcm9tcHRzRGlyID0gam9pbihzaGFyZWREaXIsIFwicHJvbXB0c1wiKTtcblx0XHRcdGNvbnN0IHNoYXJlZFRoZW1lc0RpciA9IGpvaW4oc2hhcmVkRGlyLCBcInRoZW1lc1wiKTtcblx0XHRcdG1rZGlyU3luYyhzaGFyZWRFeHRlbnNpb25zRGlyLCB7IHJlY3Vyc2l2ZTogdHJ1ZSB9KTtcblx0XHRcdG1rZGlyU3luYyhzaGFyZWRTa2lsbHNEaXIsIHsgcmVjdXJzaXZlOiB0cnVlIH0pO1xuXHRcdFx0bWtkaXJTeW5jKHNoYXJlZFByb21wdHNEaXIsIHsgcmVjdXJzaXZlOiB0cnVlIH0pO1xuXHRcdFx0bWtkaXJTeW5jKHNoYXJlZFRoZW1lc0RpciwgeyByZWN1cnNpdmU6IHRydWUgfSk7XG5cblx0XHRcdHdyaXRlRmlsZVN5bmMoam9pbihzaGFyZWRFeHRlbnNpb25zRGlyLCBcInNoYXJlZC50c1wiKSwgXCJleHBvcnQgZGVmYXVsdCBmdW5jdGlvbigpIHt9XCIpO1xuXHRcdFx0bWtkaXJTeW5jKGpvaW4oc2hhcmVkU2tpbGxzRGlyLCBcInNoYXJlZC1za2lsbFwiKSwgeyByZWN1cnNpdmU6IHRydWUgfSk7XG5cdFx0XHR3cml0ZUZpbGVTeW5jKFxuXHRcdFx0XHRqb2luKHNoYXJlZFNraWxsc0RpciwgXCJzaGFyZWQtc2tpbGxcIiwgXCJTS0lMTC5tZFwiKSxcblx0XHRcdFx0YC0tLVxubmFtZTogc2hhcmVkLXNraWxsXG5kZXNjcmlwdGlvbjogU2hhcmVkIHNraWxsXG4tLS1cbkNvbnRlbnRgLFxuXHRcdFx0KTtcblx0XHRcdHdyaXRlRmlsZVN5bmMoam9pbihzaGFyZWRQcm9tcHRzRGlyLCBcInNoYXJlZC5tZFwiKSwgXCJTaGFyZWQgcHJvbXB0XCIpO1xuXHRcdFx0d3JpdGVGaWxlU3luYyhqb2luKHNoYXJlZFRoZW1lc0RpciwgXCJzaGFyZWQuanNvblwiKSwgSlNPTi5zdHJpbmdpZnkoeyBuYW1lOiBcInNoYXJlZC10aGVtZVwiIH0pKTtcblxuXHRcdFx0bWtkaXJTeW5jKGpvaW4oYWdlbnREaXIpLCB7IHJlY3Vyc2l2ZTogdHJ1ZSB9KTtcblx0XHRcdG1rZGlyU3luYyhqb2luKHRlbXBEaXIsIFwiLnBpXCIpLCB7IHJlY3Vyc2l2ZTogdHJ1ZSB9KTtcblx0XHRcdHN5bWxpbmtTeW5jKHNoYXJlZEV4dGVuc2lvbnNEaXIsIGpvaW4oYWdlbnREaXIsIFwiZXh0ZW5zaW9uc1wiKSwgXCJkaXJcIik7XG5cdFx0XHRzeW1saW5rU3luYyhzaGFyZWRTa2lsbHNEaXIsIGpvaW4oYWdlbnREaXIsIFwic2tpbGxzXCIpLCBcImRpclwiKTtcblx0XHRcdHN5bWxpbmtTeW5jKHNoYXJlZFByb21wdHNEaXIsIGpvaW4oYWdlbnREaXIsIFwicHJvbXB0c1wiKSwgXCJkaXJcIik7XG5cdFx0XHRzeW1saW5rU3luYyhzaGFyZWRUaGVtZXNEaXIsIGpvaW4oYWdlbnREaXIsIFwidGhlbWVzXCIpLCBcImRpclwiKTtcblx0XHRcdHN5bWxpbmtTeW5jKHNoYXJlZEV4dGVuc2lvbnNEaXIsIGpvaW4odGVtcERpciwgXCIucGlcIiwgXCJleHRlbnNpb25zXCIpLCBcImRpclwiKTtcblx0XHRcdHN5bWxpbmtTeW5jKHNoYXJlZFNraWxsc0Rpciwgam9pbih0ZW1wRGlyLCBcIi5waVwiLCBcInNraWxsc1wiKSwgXCJkaXJcIik7XG5cdFx0XHRzeW1saW5rU3luYyhzaGFyZWRQcm9tcHRzRGlyLCBqb2luKHRlbXBEaXIsIFwiLnBpXCIsIFwicHJvbXB0c1wiKSwgXCJkaXJcIik7XG5cdFx0XHRzeW1saW5rU3luYyhzaGFyZWRUaGVtZXNEaXIsIGpvaW4odGVtcERpciwgXCIucGlcIiwgXCJ0aGVtZXNcIiksIFwiZGlyXCIpO1xuXG5cdFx0XHRjb25zdCByZXN1bHQgPSBhd2FpdCBwYWNrYWdlTWFuYWdlci5yZXNvbHZlKCk7XG5cblx0XHRcdGV4cGVjdCh7XG5cdFx0XHRcdGV4dGVuc2lvbnM6IHJlc3VsdC5leHRlbnNpb25zLmxlbmd0aCxcblx0XHRcdFx0c2tpbGxzOiByZXN1bHQuc2tpbGxzLmxlbmd0aCxcblx0XHRcdFx0cHJvbXB0czogcmVzdWx0LnByb21wdHMubGVuZ3RoLFxuXHRcdFx0XHR0aGVtZXM6IHJlc3VsdC50aGVtZXMubGVuZ3RoLFxuXHRcdFx0fSkudG9FcXVhbCh7XG5cdFx0XHRcdGV4dGVuc2lvbnM6IDEsXG5cdFx0XHRcdHNraWxsczogMSxcblx0XHRcdFx0cHJvbXB0czogMSxcblx0XHRcdFx0dGhlbWVzOiAxLFxuXHRcdFx0fSk7XG5cblx0XHRcdC8vIFByb2plY3QgYXV0by1kaXNjb3ZlcmVkIGhhcyBoaWdoZXIgcHJlY2VkZW5jZSB0aGFuIHVzZXIgYXV0by1kaXNjb3ZlcmVkLFxuXHRcdFx0Ly8gc28gdGhlIHN1cnZpdmluZyBlbnRyeSBzaG91bGQgYmUgc2NvcGVkIHRvIHByb2plY3QuXG5cdFx0XHRleHBlY3QocmVzdWx0LmV4dGVuc2lvbnNbMF0ubWV0YWRhdGEuc2NvcGUpLnRvQmUoXCJwcm9qZWN0XCIpO1xuXHRcdFx0ZXhwZWN0KHJlc3VsdC5za2lsbHNbMF0ubWV0YWRhdGEuc2NvcGUpLnRvQmUoXCJwcm9qZWN0XCIpO1xuXHRcdFx0ZXhwZWN0KHJlc3VsdC5wcm9tcHRzWzBdLm1ldGFkYXRhLnNjb3BlKS50b0JlKFwicHJvamVjdFwiKTtcblx0XHRcdGV4cGVjdChyZXN1bHQudGhlbWVzWzBdLm1ldGFkYXRhLnNjb3BlKS50b0JlKFwicHJvamVjdFwiKTtcblx0XHR9IGZpbmFsbHkge1xuXHRcdFx0aWYgKHByZXZpb3VzSG9tZSA9PT0gdW5kZWZpbmVkKSB7XG5cdFx0XHRcdGRlbGV0ZSBwcm9jZXNzLmVudi5IT01FO1xuXHRcdFx0fSBlbHNlIHtcblx0XHRcdFx0cHJvY2Vzcy5lbnYuSE9NRSA9IHByZXZpb3VzSG9tZTtcblx0XHRcdH1cblx0XHR9XG5cdH0pOyJ9XX19XSwiYXBpIjoib3BlbmFpLWNvbXBsZXRpb25zIiwicHJvdmlkZXIiOiJzeW50aGV0aWMiLCJtb2RlbCI6ImhmOm1vb25zaG90YWkvS2ltaS1LMi41IiwidXNhZ2UiOnsiaW5wdXQiOjIxMTksIm91dHB1dCI6MTg3MywiY2FjaGVSZWFkIjo1NjQxNiwiY2FjaGVXcml0ZSI6MCwidG90YWxUb2tlbnMiOjYwNDA4LCJjb3N0Ijp7ImlucHV0IjowLjAwMDk1MzU1MDAwMDAwMDAwMDEsIm91dHB1dCI6MC4wMDYzNjgyLCJjYWNoZVJlYWQiOjAuMDI1Mzg3MjAwMDAwMDAwMDAyLCJjYWNoZVdyaXRlIjowLCJ0b3RhbCI6MC4wMzI3MDg5NX19LCJzdG9wUmVhc29uIjoidG9vbFVzZSIsInRpbWVzdGFtcCI6MTc3NzU2NDM2MjExNiwicmVzcG9uc2VJZCI6ImNoYXRjbXBsLWFmNTZiYWNhZThiMmYyMjAifX0seyJ0eXBlIjoibWVzc2FnZSIsImlkIjoiYmFhZDBkNGEiLCJwYXJlbnRJZCI6IjkwODdiNjhjIiwidGltZXN0YW1wIjoiMjAyNi0wNC0zMFQxNTo1Mjo1My40MTZaIiwibWVzc2FnZSI6eyJyb2xlIjoidG9vbFJlc3VsdCIsInRvb2xDYWxsSWQiOiJmdW5jdGlvbnMuZWRpdDoyMyIsInRvb2xOYW1lIjoiZWRpdCIsImNvbnRlbnQiOlt7InR5cGUiOiJ0ZXh0IiwidGV4dCI6IkNvdWxkIG5vdCBmaW5kIHRoZSBleGFjdCB0ZXh0IGluIHBhY2thZ2VzL2NvZGluZy1hZ2VudC90ZXN0L3BhY2thZ2UtbWFuYWdlci50ZXN0LnRzLiBUaGUgb2xkIHRleHQgbXVzdCBtYXRjaCBleGFjdGx5IGluY2x1ZGluZyBhbGwgd2hpdGVzcGFjZSBhbmQgbmV3bGluZXMuIn1dLCJkZXRhaWxzIjp7fSwiaXNFcnJvciI6dHJ1ZSwidGltZXN0YW1wIjoxNzc3NTY0MzczNDE1fX0seyJ0eXBlIjoibWVzc2FnZSIsImlkIjoiYjBmM2ZlNmMiLCJwYXJlbnRJZCI6ImJhYWQwZDRhIiwidGltZXN0YW1wIjoiMjAyNi0wNC0zMFQxNTo1Mjo1Ni4zNDdaIiwibWVzc2FnZSI6eyJyb2xlIjoiYXNzaXN0YW50IiwiY29udGVudCI6W3sidHlwZSI6InRvb2xDYWxsIiwiaWQiOiJmdW5jdGlvbnMucmVhZDoyNCIsIm5hbWUiOiJyZWFkIiwiYXJndW1lbnRzIjp7InBhdGgiOiJwYWNrYWdlcy9jb2RpbmctYWdlbnQvdGVzdC9wYWNrYWdlLW1hbmFnZXIudGVzdC50cyIsIm9mZnNldCI6MTYxLCJsaW1pdCI6NTV9fV0sImFwaSI6Im9wZW5haS1jb21wbGV0aW9ucyIsInByb3ZpZGVyIjoic3ludGhldGljIiwibW9kZWwiOiJoZjptb29uc2hvdGFpL0tpbWktSzIuNSIsInVzYWdlIjp7ImlucHV0IjoxODAxLCJvdXRwdXQiOjM2LCJjYWNoZVJlYWQiOjU4NDk2LCJjYWNoZVdyaXRlIjowLCJ0b3RhbFRva2VucyI6NjAzMzMsImNvc3QiOnsiaW5wdXQiOjAuMDAwODEwNDUwMDAwMDAwMDAwMSwib3V0cHV0IjowLjAwMDEyMjQsImNhY2hlUmVhZCI6MC4wMjYzMjMyLCJjYWNoZVdyaXRlIjowLCJ0b3RhbCI6MC4wMjcyNTYwNX19LCJzdG9wUmVhc29uIjoidG9vbFVzZSIsInRpbWVzdGFtcCI6MTc3NzU2NDM3MzQxNywicmVzcG9uc2VJZCI6ImNoYXRjbXBsLWFjMjc3ZDNmMTQwYTM5NmMifX0seyJ0eXBlIjoibWVzc2FnZSIsImlkIjoiMzExMTYxN2MiLCJwYXJlbnRJZCI6ImIwZjNmZTZjIiwidGltZXN0YW1wIjoiMjAyNi0wNC0zMFQxNTo1Mjo1Ni4zNTFaIiwibWVzc2FnZSI6eyJyb2xlIjoidG9vbFJlc3VsdCIsInRvb2xDYWxsSWQiOiJmdW5jdGlvbnMucmVhZDoyNCIsInRvb2xOYW1lIjoicmVhZCIsImNvbnRlbnQiOlt7InR5cGUiOiJ0ZXh0IiwidGV4dCI6Ilx0XHRpdChcInNob3VsZCByZXNvbHZlIHN5bWxpbmtlZCB1c2VyIGFuZCBwcm9qZWN0IHJlc291cmNlcyBvbmNlXCIsIGFzeW5jICgpID0+IHtcblx0XHRcdGNvbnN0IHNoYXJlZERpciA9IGpvaW4odGVtcERpciwgXCJzaGFyZWQtcmVzb3VyY2VzXCIpO1xuXHRcdFx0Y29uc3Qgc2hhcmVkRXh0ZW5zaW9uc0RpciA9IGpvaW4oc2hhcmVkRGlyLCBcImV4dGVuc2lvbnNcIik7XG5cdFx0XHRjb25zdCBzaGFyZWRTa2lsbHNEaXIgPSBqb2luKHNoYXJlZERpciwgXCJza2lsbHNcIik7XG5cdFx0XHRjb25zdCBzaGFyZWRQcm9tcHRzRGlyID0gam9pbihzaGFyZWREaXIsIFwicHJvbXB0c1wiKTtcblx0XHRcdGNvbnN0IHNoYXJlZFRoZW1lc0RpciA9IGpvaW4oc2hhcmVkRGlyLCBcInRoZW1lc1wiKTtcblx0XHRcdG1rZGlyU3luYyhzaGFyZWRFeHRlbnNpb25zRGlyLCB7IHJlY3Vyc2l2ZTogdHJ1ZSB9KTtcblx0XHRcdG1rZGlyU3luYyhzaGFyZWRTa2lsbHNEaXIsIHsgcmVjdXJzaXZlOiB0cnVlIH0pO1xuXHRcdFx0bWtkaXJTeW5jKHNoYXJlZFByb21wdHNEaXIsIHsgcmVjdXJzaXZlOiB0cnVlIH0pO1xuXHRcdFx0bWtkaXJTeW5jKHNoYXJlZFRoZW1lc0RpciwgeyByZWN1cnNpdmU6IHRydWUgfSk7XG5cblx0XHRcdHdyaXRlRmlsZVN5bmMoam9pbihzaGFyZWRFeHRlbnNpb25zRGlyLCBcInNoYXJlZC50c1wiKSwgXCJleHBvcnQgZGVmYXVsdCBmdW5jdGlvbigpIHt9XCIpO1xuXHRcdFx0bWtkaXJTeW5jKGpvaW4oc2hhcmVkU2tpbGxzRGlyLCBcInNoYXJlZC1za2lsbFwiKSwgeyByZWN1cnNpdmU6IHRydWUgfSk7XG5cdFx0XHR3cml0ZUZpbGVTeW5jKFxuXHRcdFx0XHRqb2luKHNoYXJlZFNraWxsc0RpciwgXCJzaGFyZWQtc2tpbGxcIiwgXCJTS0lMTC5tZFwiKSxcblx0XHRcdFx0YC0tLVxubmFtZTogc2hhcmVkLXNraWxsXG5kZXNjcmlwdGlvbjogU2hhcmVkIHNraWxsXG4tLS1cbkNvbnRlbnRgLFxuXHRcdFx0KTtcblx0XHRcdHdyaXRlRmlsZVN5bmMoam9pbihzaGFyZWRQcm9tcHRzRGlyLCBcInNoYXJlZC5tZFwiKSwgXCJTaGFyZWQgcHJvbXB0XCIpO1xuXHRcdFx0d3JpdGVGaWxlU3luYyhqb2luKHNoYXJlZFRoZW1lc0RpciwgXCJzaGFyZWQuanNvblwiKSwgSlNPTi5zdHJpbmdpZnkoeyBuYW1lOiBcInNoYXJlZC10aGVtZVwiIH0pKTtcblxuXHRcdFx0bWtkaXJTeW5jKGpvaW4oYWdlbnREaXIpLCB7IHJlY3Vyc2l2ZTogdHJ1ZSB9KTtcblx0XHRcdG1rZGlyU3luYyhqb2luKHRlbXBEaXIsIFwiLnBpXCIpLCB7IHJlY3Vyc2l2ZTogdHJ1ZSB9KTtcblx0XHRcdHN5bWxpbmtTeW5jKHNoYXJlZEV4dGVuc2lvbnNEaXIsIGpvaW4oYWdlbnREaXIsIFwiZXh0ZW5zaW9uc1wiKSwgXCJkaXJcIik7XG5cdFx0XHRzeW1saW5rU3luYyhzaGFyZWRTa2lsbHNEaXIsIGpvaW4oYWdlbnREaXIsIFwic2tpbGxzXCIpLCBcImRpclwiKTtcblx0XHRcdHN5bWxpbmtTeW5jKHNoYXJlZFByb21wdHNEaXIsIGpvaW4oYWdlbnREaXIsIFwicHJvbXB0c1wiKSwgXCJkaXJcIik7XG5cdFx0XHRzeW1saW5rU3luYyhzaGFyZWRUaGVtZXNEaXIsIGpvaW4oYWdlbnREaXIsIFwidGhlbWVzXCIpLCBcImRpclwiKTtcblx0XHRcdHN5bWxpbmtTeW5jKHNoYXJlZEV4dGVuc2lvbnNEaXIsIGpvaW4odGVtcERpciwgXCIucGlcIiwgXCJleHRlbnNpb25zXCIpLCBcImRpclwiKTtcblx0XHRcdHN5bWxpbmtTeW5jKHNoYXJlZFNraWxsc0Rpciwgam9pbih0ZW1wRGlyLCBcIi5waVwiLCBcInNraWxsc1wiKSwgXCJkaXJcIik7XG5cdFx0XHRzeW1saW5rU3luYyhzaGFyZWRQcm9tcHRzRGlyLCBqb2luKHRlbXBEaXIsIFwiLnBpXCIsIFwicHJvbXB0c1wiKSwgXCJkaXJcIik7XG5cdFx0XHRzeW1saW5rU3luYyhzaGFyZWRUaGVtZXNEaXIsIGpvaW4odGVtcERpciwgXCIucGlcIiwgXCJ0aGVtZXNcIiksIFwiZGlyXCIpO1xuXG5cdFx0XHRjb25zdCByZXN1bHQgPSBhd2FpdCBwYWNrYWdlTWFuYWdlci5yZXNvbHZlKCk7XG5cblx0XHRcdGV4cGVjdCh7XG5cdFx0XHRcdGV4dGVuc2lvbnM6IHJlc3VsdC5leHRlbnNpb25zLmxlbmd0aCxcblx0XHRcdFx0c2tpbGxzOiByZXN1bHQuc2tpbGxzLmxlbmd0aCxcblx0XHRcdFx0cHJvbXB0czogcmVzdWx0LnByb21wdHMubGVuZ3RoLFxuXHRcdFx0XHR0aGVtZXM6IHJlc3VsdC50aGVtZXMubGVuZ3RoLFxuXHRcdFx0fSkudG9FcXVhbCh7XG5cdFx0XHRcdGV4dGVuc2lvbnM6IDEsXG5cdFx0XHRcdHNraWxsczogMSxcblx0XHRcdFx0cHJvbXB0czogMSxcblx0XHRcdFx0dGhlbWVzOiAxLFxuXHRcdFx0fSk7XG5cblx0XHRcdC8vIFByb2plY3QgYXV0by1kaXNjb3ZlcmVkIGhhcyBoaWdoZXIgcHJlY2VkZW5jZSB0aGFuIHVzZXIgYXV0by1kaXNjb3ZlcmVkLFxuXHRcdFx0Ly8gc28gdGhlIHN1cnZpdmluZyBlbnRyeSBzaG91bGQgYmUgc2NvcGVkIHRvIHByb2plY3QuXG5cdFx0XHRleHBlY3QocmVzdWx0LmV4dGVuc2lvbnNbMF0ubWV0YWRhdGEuc2NvcGUpLnRvQmUoXCJwcm9qZWN0XCIpO1xuXHRcdFx0ZXhwZWN0KHJlc3VsdC5za2lsbHNbMF0ubWV0YWRhdGEuc2NvcGUpLnRvQmUoXCJwcm9qZWN0XCIpO1xuXHRcdFx0ZXhwZWN0KHJlc3VsdC5wcm9tcHRzWzBdLm1ldGFkYXRhLnNjb3BlKS50b0JlKFwicHJvamVjdFwiKTtcblx0XHRcdGV4cGVjdChyZXN1bHQudGhlbWVzWzBdLm1ldGFkYXRhLnNjb3BlKS50b0JlKFwicHJvamVjdFwiKTtcblxuWzE4MDUgbW9yZSBsaW5lcyBpbiBmaWxlLiBVc2Ugb2Zmc2V0PTIxNiB0byBjb250aW51ZS5dIn1dLCJpc0Vycm9yIjpmYWxzZSwidGltZXN0YW1wIjoxNzc3NTY0Mzc2MzUxfX0seyJ0eXBlIjoibWVzc2FnZSIsImlkIjoiNjE4YTZmZDIiLCJwYXJlbnRJZCI6IjMxMTE2MTdjIiwidGltZXN0YW1wIjoiMjAyNi0wNC0zMFQxNTo1Mjo1OS4zMTVaIiwibWVzc2FnZSI6eyJyb2xlIjoiYXNzaXN0YW50IiwiY29udGVudCI6W3sidHlwZSI6InRoaW5raW5nIiwidGhpbmtpbmciOiIgSSBzZWUgLSB0aGUgaXNzdWUgaXMgdGFicyB2cyBzcGFjZXMuIExldCBtZSBsb29rIGF0IHRoZSByYXcgZmlsZToiLCJ0aGlua2luZ1NpZ25hdHVyZSI6InJlYXNvbmluZyJ9LHsidHlwZSI6InRvb2xDYWxsIiwiaWQiOiJmdW5jdGlvbnMuYmFzaDoyNSIsIm5hbWUiOiJiYXNoIiwiYXJndW1lbnRzIjp7ImNvbW1hbmQiOiJjZCBwYWNrYWdlcy9jb2RpbmctYWdlbnQgJiYgaGVhZCAtYyAxMDAwMCB0ZXN0L3BhY2thZ2UtbWFuYWdlci50ZXN0LnRzIHwgdGFpbCAtYyAyMDAwIHwgY2F0IC1BIHwgaGVhZCAtMTAwIn19XSwiYXBpIjoib3BlbmFpLWNvbXBsZXRpb25zIiwicHJvdmlkZXIiOiJzeW50aGV0aWMiLCJtb2RlbCI6ImhmOm1vb25zaG90YWkvS2ltaS1LMi41IiwidXNhZ2UiOnsiaW5wdXQiOjczNywib3V0cHV0Ijo2NywiY2FjaGVSZWFkIjo2MDI1NiwiY2FjaGVXcml0ZSI6MCwidG90YWxUb2tlbnMiOjYxMDYwLCJjb3N0Ijp7ImlucHV0IjowLjAwMDMzMTY1LCJvdXRwdXQiOjAuMDAwMjI3OCwiY2FjaGVSZWFkIjowLjAyNzExNTIwMDAwMDAwMDAwMiwiY2FjaGVXcml0ZSI6MCwidG90YWwiOjAuMDI3Njc0NjUwMDAwMDAwMDAyfX0sInN0b3BSZWFzb24iOiJ0b29sVXNlIiwidGltZXN0YW1wIjoxNzc3NTY0Mzc2MzUzLCJyZXNwb25zZUlkIjoiY2hhdGNtcGwtODMwYWY4ZTczZGM1OWMzNyJ9fSx7InR5cGUiOiJtZXNzYWdlIiwiaWQiOiIwMDJlMDc4ZCIsInBhcmVudElkIjoiNjE4YTZmZDIiLCJ0aW1lc3RhbXAiOiIyMDI2LTA0LTMwVDE1OjUyOjU5LjMzOFoiLCJtZXNzYWdlIjp7InJvbGUiOiJ0b29sUmVzdWx0IiwidG9vbENhbGxJZCI6ImZ1bmN0aW9ucy5iYXNoOjI1IiwidG9vbE5hbWUiOiJiYXNoIiwiY29udGVudCI6W3sidHlwZSI6InRleHQiLCJ0ZXh0Ijoib3VsZCBhdXRvLWRpc2NvdmVyIHByb2plY3QgcHJvbXB0cyB3aXRoIG92ZXJyaWRlc1wiLCBhc3luYyAoKSA9PiB7JFxuXkleSV5JY29uc3QgcHJvbXB0c0RpciA9IGpvaW4odGVtcERpciwgXCIucGlcIiwgXCJwcm9tcHRzXCIpOyRcbl5JXkleSW1rZGlyU3luYyhwcm9tcHRzRGlyLCB7IHJlY3Vyc2l2ZTogdHJ1ZSB9KTskXG5eSV5JXkljb25zdCBwcm9tcHRQYXRoID0gam9pbihwcm9tcHRzRGlyLCBcImlzLm1kXCIpOyRcbl5JXkleSXdyaXRlRmlsZVN5bmMocHJvbXB0UGF0aCwgXCJJcyBwcm9tcHRcIik7JFxuJFxuXkleSV5Jc2V0dGluZ3NNYW5hZ2VyLnNldFByb2plY3RQcm9tcHRUZW1wbGF0ZVBhdGhzKFtcIiFwcm9tcHRzL2lzLm1kXCJdKTskXG4kXG5eSV5JXkljb25zdCByZXN1bHQgPSBhd2FpdCBwYWNrYWdlTWFuYWdlci5yZXNvbHZlKCk7JFxuXkleSV5JZXhwZWN0KHJlc3VsdC5wcm9tcHRzLnNvbWUoKHIpID0+IHIucGF0aCA9PT0gcHJvbXB0UGF0aCAmJiAhci5lbmFibGVkKSkudG9CZSh0cnVlKTskXG5eSV5JfSk7JFxuJFxuXkleSWl0KFwic2hvdWxkIHJlc29sdmUgZGlyZWN0b3J5IHdpdGggcGFja2FnZS5qc29uIHBpLmV4dGVuc2lvbnMgaW4gZXh0ZW5zaW9ucyBzZXR0aW5nXCIsIGFzeW5jICgpID0+IHskXG5eSV5JXkkvLyBDcmVhdGUgYSBwYWNrYWdlIHdpdGggcGkuZXh0ZW5zaW9ucyBpbiBwYWNrYWdlLmpzb24kXG5eSV5JXkljb25zdCBwa2dEaXIgPSBqb2luKHRlbXBEaXIsIFwibXktZXh0ZW5zaW9ucy1wa2dcIik7JFxuXkleSV5JbWtkaXJTeW5jKGpvaW4ocGtnRGlyLCBcImV4dGVuc2lvbnNcIiksIHsgcmVjdXJzaXZlOiB0cnVlIH0pOyRcbl5JXkleSXdyaXRlRmlsZVN5bmMoJFxuXkleSV5JXklqb2luKHBrZ0RpciwgXCJwYWNrYWdlLmpzb25cIiksJFxuXkleSV5JXklKU09OLnN0cmluZ2lmeSh7JFxuXkleSV5JXkleSW5hbWU6IFwibXktZXh0ZW5zaW9ucy1wa2dcIiwkXG5eSV5JXkleSV5JcGk6IHskXG5eSV5JXkleSV5JXklleHRlbnNpb25zOiBbXCIuL2V4dGVuc2lvbnMvY2xpcC50c1wiLCBcIi4vZXh0ZW5zaW9ucy9jb3N0LnRzXCJdLCRcbl5JXkleSV5JXkl9LCRcbl5JXkleSV5JfSksJFxuXkleSV5JKTskXG5eSV5JXkl3cml0ZUZpbGVTeW5jKGpvaW4ocGtnRGlyLCBcImV4dGVuc2lvbnNcIiwgXCJjbGlwLnRzXCIpLCBcImV4cG9ydCBkZWZhdWx0IGZ1bmN0aW9uKCkge31cIik7JFxuXkleSV5Jd3JpdGVGaWxlU3luYyhqb2luKHBrZ0RpciwgXCJleHRlbnNpb25zXCIsIFwiY29zdC50c1wiKSwgXCJleHBvcnQgZGVmYXVsdCBmdW5jdGlvbigpIHt9XCIpOyRcbl5JXkleSXdyaXRlRmlsZVN5bmMoam9pbihwa2dEaXIsIFwiZXh0ZW5zaW9uc1wiLCBcImhlbHBlci50c1wiKSwgXCJleHBvcnQgY29uc3QgeCA9IDE7XCIpOyAvLyBOb3QgaW4gbWFuaWZlc3QsIHNob3VsZG4ndCBiZSBsb2FkZWQkXG4kXG5eSV5JXkkvLyBBZGQgdGhlIGRpcmVjdG9yeSB0byBleHRlbnNpb25zIHNldHRpbmcgKG5vdCBwYWNrYWdlcyBzZXR0aW5nKSRcbl5JXkleSXNldHRpbmdzTWFuYWdlci5zZXRFeHRlbnNpb25QYXRocyhbcGtnRGlyXSk7JFxuJFxuXkleSV5JY29uc3QgcmVzdWx0ID0gYXdhaXQgcGFja2FnZU1hbmFnZXIucmVzb2x2ZSgpOyRcbiRcbl5JXkleSS8vIFNob3VsZCBmaW5kIHRoZSBleHRlbnNpb25zIGRlY2xhcmVkIGluIHBhY2thZ2UuanNvbiBwaS5leHRlbnNpb25zJFxuXkleSV5JZXhwZWN0KHJlc3VsdC5leHRlbnNpb25zLnNvbWUoKHIpID0+IHIucGF0aCA9PT0gam9pbihwa2dEaXIsIFwiZXh0ZW5zaW9uc1wiLCBcImNsaXAudHNcIikgJiYgci5lbmFibGVkKSkudG9CZSgkXG5eSV5JXkleSXRydWUsJFxuXkleSV5JKTskXG5eSV5JXklleHBlY3QocmVzdWx0LmV4dGVuc2lvbnMuc29tZSgocikgPT4gci5wYXRoID09PSBqb2luKHBrZ0RpciwgXCJleHRlbnNpb25zXCIsIFwiY29zdC50c1wiKSAmJiByLmVuYWJsZWQpKS50b0JlKCRcbl5JXkleSV5JdHJ1ZSwkXG5eSV5JXkkpOyRcbiRcbl5JXkleSS8vIFNob3VsZCBOT1QgZmluZCBoZWxwZXIudHMgKG5vdCBkZWNsYXJlZCBpbiBtYW5pZmVzdCkkXG5eSV5JXklleHBlY3QocmVzdWx0LmV4dGVuc2lvbnMuc29tZSgocikgPT4gcGF0aEVuZHNXaXRoKHIucGF0aCwgXCJoZWxwZXIudHNcIikpKS50b0JlKGZhbHNlKTskXG5eSV5JfSk7JFxuXkl9KTskXG4kXG5eSWRlc2NyaWJlKFwiYXV0by1kaXNjb3ZlcmVkIHNraWxsIG1ldGFkYXRhXCIsICgpID0+IHskXG5eSV5JaXQoXCJzaG91bGQgdXNlIHRoZSBhZ2VudCBkaXIgYXMgYiJ9XSwiZGV0YWlscyI6eyJfZHVyYXRpb25NcyI6MjJ9LCJpc0Vycm9yIjpmYWxzZSwidGltZXN0YW1wIjoxNzc3NTY0Mzc5MzM4fX0seyJ0eXBlIjoibWVzc2FnZSIsImlkIjoiNTgwNDg0YTIiLCJwYXJlbnRJZCI6IjAwMmUwNzhkIiwidGltZXN0YW1wIjoiMjAyNi0wNC0zMFQxNTo1MzowMi44MTBaIiwibWVzc2FnZSI6eyJyb2xlIjoiYXNzaXN0YW50IiwiY29udGVudCI6W3sidHlwZSI6InRoaW5raW5nIiwidGhpbmtpbmciOiIgVGhlIGZpbGUgdXNlcyB0YWJzLiBMZXQgbWUgdXNlIGEgd29ya2VyIHRvIG1ha2UgdGhlIGVkaXQ6IiwidGhpbmtpbmdTaWduYXR1cmUiOiJyZWFzb25pbmcifSx7InR5cGUiOiJ0b29sQ2FsbCIsImlkIjoiZnVuY3Rpb25zLndvcmtlcjoyNiIsIm5hbWUiOiJ3b3JrZXIiLCJhcmd1bWVudHMiOnsidGFzayI6IlVwZGF0ZSBzeW1saW5rIHRlc3QgdG8gbW9jayBIT01FIiwiZmlsZXMiOlsicGFja2FnZXMvY29kaW5nLWFnZW50L3Rlc3QvcGFja2FnZS1tYW5hZ2VyLnRlc3QudHMiXSwiaW5zdHJ1Y3Rpb25zIjoiSW4gdGhlIGZpbGUgcGFja2FnZXMvY29kaW5nLWFnZW50L3Rlc3QvcGFja2FnZS1tYW5hZ2VyLnRlc3QudHMsIGZpbmQgdGhlIHRlc3QgXCJzaG91bGQgcmVzb2x2ZSBzeW1saW5rZWQgdXNlciBhbmQgcHJvamVjdCByZXNvdXJjZXMgb25jZVwiIHN0YXJ0aW5nIGF0IGxpbmUgMTYxLlxuXG5XcmFwIHRoZSBlbnRpcmUgdGVzdCBib2R5IChldmVyeXRoaW5nIGluc2lkZSB0aGUgYXN5bmMgZnVuY3Rpb24pIHdpdGg6XG4xLiBTYXZlIHRoZSBwcmV2aW91cyBIT01FOiBgY29uc3QgcHJldmlvdXNIb21lID0gcHJvY2Vzcy5lbnYuSE9NRTtgXG4yLiBTZXQgSE9NRSB0byB0ZW1wRGlyOiBgcHJvY2Vzcy5lbnYuSE9NRSA9IHRlbXBEaXI7YFxuMy4gV3JhcCBleGlzdGluZyBjb2RlIGluIHRyeSBibG9ja1xuNC4gQWRkIGZpbmFsbHkgYmxvY2sgdG8gcmVzdG9yZSBIT01FOlxuYGBgXG59IGZpbmFsbHkge1xuICBpZiAocHJldmlvdXNIb21lID09PSB1bmRlZmluZWQpIHtcbiAgICBkZWxldGUgcHJvY2Vzcy5lbnYuSE9NRTtcbiAgfSBlbHNlIHtcbiAgICBwcm9jZXNzLmVudi5IT01FID0gcHJldmlvdXNIb21lO1xuICB9XG59XG5gYGBcblxuTWFrZSBzdXJlIHRvIHByZXNlcnZlIGFsbCBleGlzdGluZyBjb2RlIGFuZCBpbmRlbnRhdGlvbiAodGhlIGZpbGUgdXNlcyB0YWJzKS4ifX1dLCJhcGkiOiJvcGVuYWktY29tcGxldGlvbnMiLCJwcm92aWRlciI6InN5bnRoZXRpYyIsIm1vZGVsIjoiaGY6bW9vbnNob3RhaS9LaW1pLUsyLjUiLCJ1c2FnZSI6eyJpbnB1dCI6ODQzLCJvdXRwdXQiOjIyNywiY2FjaGVSZWFkIjo2MDk2MCwiY2FjaGVXcml0ZSI6MCwidG90YWxUb2tlbnMiOjYyMDMwLCJjb3N0Ijp7ImlucHV0IjowLjAwMDM3OTM1MDAwMDAwMDAwMDAzLCJvdXRwdXQiOjAuMDAwNzcxOCwiY2FjaGVSZWFkIjowLjAyNzQzMiwiY2FjaGVXcml0ZSI6MCwidG90YWwiOjAuMDI4NTgzMTV9fSwic3RvcFJlYXNvbiI6InRvb2xVc2UiLCJ0aW1lc3RhbXAiOjE3Nzc1NjQzNzkzMzksInJlc3BvbnNlSWQiOiJjaGF0Y21wbC1hNjAwODk1YjEzZDkxMzMxIn19LHsidHlwZSI6Im1lc3NhZ2UiLCJpZCI6IjQ2ZDc3ZThmIiwicGFyZW50SWQiOiI1ODA0ODRhMiIsInRpbWVzdGFtcCI6IjIwMjYtMDQtMzBUMTU6NTM6MzcuNjQwWiIsIm1lc3NhZ2UiOnsicm9sZSI6InRvb2xSZXN1bHQiLCJ0b29sQ2FsbElkIjoiZnVuY3Rpb25zLndvcmtlcjoyNiIsInRvb2xOYW1lIjoid29ya2VyIiwiY29udGVudCI6W3sidHlwZSI6InRleHQiLCJ0ZXh0IjoiQWxsIGNoZWNrcyBwYXNzLlxuXG4qKlN1bW1hcnk6KipcbjEuICoqV2hhdCBJIGNoYW5nZWQ6KiogSW4gYHBhY2thZ2VzL2NvZGluZy1hZ2VudC90ZXN0L3BhY2thZ2UtbWFuYWdlci50ZXN0LnRzYCwgSSB3cmFwcGVkIHRoZSBib2R5IG9mIHRoZSB0ZXN0IFwic2hvdWxkIHJlc29sdmUgc3ltbGlua2VkIHVzZXIgYW5kIHByb2plY3QgcmVzb3VyY2VzIG9uY2VcIiB3aXRoIEhPTUUgZW52aXJvbm1lbnQgdmFyaWFibGUgc2F2ZS9yZXN0b3JlIGxvZ2ljOlxuICAgLSBBZGRlZCBgY29uc3QgcHJldmlvdXNIb21lID0gcHJvY2Vzcy5lbnYuSE9NRTtgIGFuZCBgcHJvY2Vzcy5lbnYuSE9NRSA9IHRlbXBEaXI7YCBhdCB0aGUgdG9wIG9mIHRoZSBhc3luYyBmdW5jdGlvblxuICAgLSBXcmFwcGVkIGFsbCBleGlzdGluZyBjb2RlIGluIGEgYHRyeWAgYmxvY2tcbiAgIC0gQWRkZWQgYSBgZmluYWxseWAgYmxvY2sgdGhhdCByZXN0b3JlcyBgcHJvY2Vzcy5lbnYuSE9NRWAgKGRlbGV0ZXMgaXQgaWYgaXQgd2FzIG9yaWdpbmFsbHkgYHVuZGVmaW5lZGAsIG90aGVyd2lzZSBzZXRzIGl0IGJhY2sgdG8gdGhlIHByZXZpb3VzIHZhbHVlKVxuICAgLSBQcmVzZXJ2ZWQgYWxsIG9yaWdpbmFsIGNvZGUgYW5kIHRhYiBpbmRlbnRhdGlvblxuXG4yLiAqKlZlcmlmaWNhdGlvbjoqKlxuICAgLSBgbnB4IHZpdGVzdCAtLXJ1biB0ZXN0L3BhY2thZ2UtbWFuYWdlci50ZXN0LnRzYCDigJQgYWxsIDk5IHRlc3RzIHBhc3NlZFxuICAgLSBgbnB4IGJpb21lIGNoZWNrIHBhY2thZ2VzL2NvZGluZy1hZ2VudC90ZXN0L3BhY2thZ2UtbWFuYWdlci50ZXN0LnRzYCDigJQgbm8gaXNzdWVzIGZvdW5kIn1dLCJkZXRhaWxzIjp7Il9yZW5kZXJLZXkiOiJmdW5jdGlvbnMud29ya2VyOjI2IiwidGFzayI6IlVwZGF0ZSBzeW1saW5rIHRlc3QgdG8gbW9jayBIT01FIiwiaW5zdHJ1Y3Rpb25zIjoiSW4gdGhlIGZpbGUgcGFja2FnZXMvY29kaW5nLWFnZW50L3Rlc3QvcGFja2FnZS1tYW5hZ2VyLnRlc3QudHMsIGZpbmQgdGhlIHRlc3QgXCJzaG91bGQgcmVzb2x2ZSBzeW1saW5rZWQgdXNlciBhbmQgcHJvamVjdCByZXNvdXJjZXMgb25jZVwiIHN0YXJ0aW5nIGF0IGxpbmUgMTYxLlxuXG5XcmFwIHRoZSBlbnRpcmUgdGVzdCBib2R5IChldmVyeXRoaW5nIGluc2lkZSB0aGUgYXN5bmMgZnVuY3Rpb24pIHdpdGg6XG4xLiBTYXZlIHRoZSBwcmV2aW91cyBIT01FOiBgY29uc3QgcHJldmlvdXNIb21lID0gcHJvY2Vzcy5lbnYuSE9NRTtgXG4yLiBTZXQgSE9NRSB0byB0ZW1wRGlyOiBgcHJvY2Vzcy5lbnYuSE9NRSA9IHRlbXBEaXI7YFxuMy4gV3JhcCBleGlzdGluZyBjb2RlIGluIHRyeSBibG9ja1xuNC4gQWRkIGZpbmFsbHkgYmxvY2sgdG8gcmVzdG9yZSBIT01FOlxuYGBgXG59IGZpbmFsbHkge1xuICBpZiAocHJldmlvdXNIb21lID09PSB1bmRlZmluZWQpIHtcbiAgICBkZWxldGUgcHJvY2Vzcy5lbnYuSE9NRTtcbiAgfSBlbHNlIHtcbiAgICBwcm9jZXNzLmVudi5IT01FID0gcHJldmlvdXNIb21lO1xuICB9XG59XG5gYGBcblxuTWFrZSBzdXJlIHRvIHByZXNlcnZlIGFsbCBleGlzdGluZyBjb2RlIGFuZCBpbmRlbnRhdGlvbiAodGhlIGZpbGUgdXNlcyB0YWJzKS4iLCJmaWxlcyI6WyJwYWNrYWdlcy9jb2RpbmctYWdlbnQvdGVzdC9wYWNrYWdlLW1hbmFnZXIudGVzdC50cyJdLCJza2lsbHNSZXNvbHZlZCI6MCwidG9vbENhbGxzIjpbeyJ0b29sQ2FsbElkIjoiY2FsbF8zMzIzYTk0NzFjNGY0ZDM2OGFmYjEyZmUiLCJ0b29sTmFtZSI6InJlYWQiLCJhcmdzIjp7InBhdGgiOiJwYWNrYWdlcy9jb2RpbmctYWdlbnQvdGVzdC9wYWNrYWdlLW1hbmFnZXIudGVzdC50cyIsIm9mZnNldCI6MTU1LCJsaW1pdCI6ODB9LCJzdGF0dXMiOiJkb25lIiwic3RhcnRlZEF0IjoxNzc3NTY0Mzg0OTUwLCJyZXN1bHQiOnsiY29udGVudCI6W3sidHlwZSI6InRleHQiLCJ0ZXh0IjoiXHRcdFx0c2V0dGluZ3NNYW5hZ2VyLnNldFByb21wdFRlbXBsYXRlUGF0aHMoW1wiIXByb21wdHMvYXV0by5tZFwiXSk7XG5cblx0XHRcdGNvbnN0IHJlc3VsdCA9IGF3YWl0IHBhY2thZ2VNYW5hZ2VyLnJlc29sdmUoKTtcblx0XHRcdGV4cGVjdChyZXN1bHQucHJvbXB0cy5zb21lKChyKSA9PiByLnBhdGggPT09IHByb21wdFBhdGggJiYgIXIuZW5hYmxlZCkpLnRvQmUodHJ1ZSk7XG5cdFx0fSk7XG5cblx0XHRpdChcInNob3VsZCByZXNvbHZlIHN5bWxpbmtlZCB1c2VyIGFuZCBwcm9qZWN0IHJlc291cmNlcyBvbmNlXCIsIGFzeW5jICgpID0+IHtcblx0XHRcdGNvbnN0IHNoYXJlZERpciA9IGpvaW4odGVtcERpciwgXCJzaGFyZWQtcmVzb3VyY2VzXCIpO1xuXHRcdFx0Y29uc3Qgc2hhcmVkRXh0ZW5zaW9uc0RpciA9IGpvaW4oc2hhcmVkRGlyLCBcImV4dGVuc2lvbnNcIik7XG5cdFx0XHRjb25zdCBzaGFyZWRTa2lsbHNEaXIgPSBqb2luKHNoYXJlZERpciwgXCJza2lsbHNcIik7XG5cdFx0XHRjb25zdCBzaGFyZWRQcm9tcHRzRGlyID0gam9pbihzaGFyZWREaXIsIFwicHJvbXB0c1wiKTtcblx0XHRcdGNvbnN0IHNoYXJlZFRoZW1lc0RpciA9IGpvaW4oc2hhcmVkRGlyLCBcInRoZW1lc1wiKTtcblx0XHRcdG1rZGlyU3luYyhzaGFyZWRFeHRlbnNpb25zRGlyLCB7IHJlY3Vyc2l2ZTogdHJ1ZSB9KTtcblx0XHRcdG1rZGlyU3luYyhzaGFyZWRTa2lsbHNEaXIsIHsgcmVjdXJzaXZlOiB0cnVlIH0pO1xuXHRcdFx0bWtkaXJTeW5jKHNoYXJlZFByb21wdHNEaXIsIHsgcmVjdXJzaXZlOiB0cnVlIH0pO1xuXHRcdFx0bWtkaXJTeW5jKHNoYXJlZFRoZW1lc0RpciwgeyByZWN1cnNpdmU6IHRydWUgfSk7XG5cblx0XHRcdHdyaXRlRmlsZVN5bmMoam9pbihzaGFyZWRFeHRlbnNpb25zRGlyLCBcInNoYXJlZC50c1wiKSwgXCJleHBvcnQgZGVmYXVsdCBmdW5jdGlvbigpIHt9XCIpO1xuXHRcdFx0bWtkaXJTeW5jKGpvaW4oc2hhcmVkU2tpbGxzRGlyLCBcInNoYXJlZC1za2lsbFwiKSwgeyByZWN1cnNpdmU6IHRydWUgfSk7XG5cdFx0XHR3cml0ZUZpbGVTeW5jKFxuXHRcdFx0XHRqb2luKHNoYXJlZFNraWxsc0RpciwgXCJzaGFyZWQtc2tpbGxcIiwgXCJTS0lMTC5tZFwiKSxcblx0XHRcdFx0YC0tLVxubmFtZTogc2hhcmVkLXNraWxsXG5kZXNjcmlwdGlvbjogU2hhcmVkIHNraWxsXG4tLS1cbkNvbnRlbnRgLFxuXHRcdFx0KTtcblx0XHRcdHdyaXRlRmlsZVN5bmMoam9pbihzaGFyZWRQcm9tcHRzRGlyLCBcInNoYXJlZC5tZFwiKSwgXCJTaGFyZWQgcHJvbXB0XCIpO1xuXHRcdFx0d3JpdGVGaWxlU3luYyhqb2luKHNoYXJlZFRoZW1lc0RpciwgXCJzaGFyZWQuanNvblwiKSwgSlNPTi5zdHJpbmdpZnkoeyBuYW1lOiBcInNoYXJlZC10aGVtZVwiIH0pKTtcblxuXHRcdFx0bWtkaXJTeW5jKGpvaW4oYWdlbnREaXIpLCB7IHJlY3Vyc2l2ZTogdHJ1ZSB9KTtcblx0XHRcdG1rZGlyU3luYyhqb2luKHRlbXBEaXIsIFwiLnBpXCIpLCB7IHJlY3Vyc2l2ZTogdHJ1ZSB9KTtcblx0XHRcdHN5bWxpbmtTeW5jKHNoYXJlZEV4dGVuc2lvbnNEaXIsIGpvaW4oYWdlbnREaXIsIFwiZXh0ZW5zaW9uc1wiKSwgXCJkaXJcIik7XG5cdFx0XHRzeW1saW5rU3luYyhzaGFyZWRTa2lsbHNEaXIsIGpvaW4oYWdlbnREaXIsIFwic2tpbGxzXCIpLCBcImRpclwiKTtcblx0XHRcdHN5bWxpbmtTeW5jKHNoYXJlZFByb21wdHNEaXIsIGpvaW4oYWdlbnREaXIsIFwicHJvbXB0c1wiKSwgXCJkaXJcIik7XG5cdFx0XHRzeW1saW5rU3luYyhzaGFyZWRUaGVtZXNEaXIsIGpvaW4oYWdlbnREaXIsIFwidGhlbWVzXCIpLCBcImRpclwiKTtcblx0XHRcdHN5bWxpbmtTeW5jKHNoYXJlZEV4dGVuc2lvbnNEaXIsIGpvaW4odGVtcERpciwgXCIucGlcIiwgXCJleHRlbnNpb25zXCIpLCBcImRpclwiKTtcblx0XHRcdHN5bWxpbmtTeW5jKHNoYXJlZFNraWxsc0Rpciwgam9pbih0ZW1wRGlyLCBcIi5waVwiLCBcInNraWxsc1wiKSwgXCJkaXJcIik7XG5cdFx0XHRzeW1saW5rU3luYyhzaGFyZWRQcm9tcHRzRGlyLCBqb2luKHRlbXBEaXIsIFwiLnBpXCIsIFwicHJvbXB0c1wiKSwgXCJkaXJcIik7XG5cdFx0XHRzeW1saW5rU3luYyhzaGFyZWRUaGVtZXNEaXIsIGpvaW4odGVtcERpciwgXCIucGlcIiwgXCJ0aGVtZXNcIiksIFwiZGlyXCIpO1xuXG5cdFx0XHRjb25zdCByZXN1bHQgPSBhd2FpdCBwYWNrYWdlTWFuYWdlci5yZXNvbHZlKCk7XG5cblx0XHRcdGV4cGVjdCh7XG5cdFx0XHRcdGV4dGVuc2lvbnM6IHJlc3VsdC5leHRlbnNpb25zLmxlbmd0aCxcblx0XHRcdFx0c2tpbGxzOiByZXN1bHQuc2tpbGxzLmxlbmd0aCxcblx0XHRcdFx0cHJvbXB0czogcmVzdWx0LnByb21wdHMubGVuZ3RoLFxuXHRcdFx0XHR0aGVtZXM6IHJlc3VsdC50aGVtZXMubGVuZ3RoLFxuXHRcdFx0fSkudG9FcXVhbCh7XG5cdFx0XHRcdGV4dGVuc2lvbnM6IDEsXG5cdFx0XHRcdHNraWxsczogMSxcblx0XHRcdFx0cHJvbXB0czogMSxcblx0XHRcdFx0dGhlbWVzOiAxLFxuXHRcdFx0fSk7XG5cblx0XHRcdC8vIFByb2plY3QgYXV0by1kaXNjb3ZlcmVkIGhhcyBoaWdoZXIgcHJlY2VkZW5jZSB0aGFuIHVzZXIgYXV0by1kaXNjb3ZlcmVkLFxuXHRcdFx0Ly8gc28gdGhlIHN1cnZpdmluZyBlbnRyeSBzaG91bGQgYmUgc2NvcGVkIHRvIHByb2plY3QuXG5cdFx0XHRleHBlY3QocmVzdWx0LmV4dGVuc2lvbnNbMF0ubWV0YWRhdGEuc2NvcGUpLnRvQmUoXCJwcm9qZWN0XCIpO1xuXHRcdFx0ZXhwZWN0KHJlc3VsdC5za2lsbHNbMF0ubWV0YWRhdGEuc2NvcGUpLnRvQmUoXCJwcm9qZWN0XCIpO1xuXHRcdFx0ZXhwZWN0KHJlc3VsdC5wcm9tcHRzWzBdLm1ldGFkYXRhLnNjb3BlKS50b0JlKFwicHJvamVjdFwiKTtcblx0XHRcdGV4cGVjdChyZXN1bHQudGhlbWVzWzBdLm1ldGFkYXRhLnNjb3BlKS50b0JlKFwicHJvamVjdFwiKTtcblx0XHR9KTtcblxuXHRcdGl0KFwic2hvdWxkIGF1dG8tZGlzY292ZXIgcHJvamVjdCBwcm9tcHRzIHdpdGggb3ZlcnJpZGVzXCIsIGFzeW5jICgpID0+IHtcblx0XHRcdGNvbnN0IHByb21wdHNEaXIgPSBqb2luKHRlbXBEaXIsIFwiLnBpXCIsIFwicHJvbXB0c1wiKTtcblx0XHRcdG1rZGlyU3luYyhwcm9tcHRzRGlyLCB7IHJlY3Vyc2l2ZTogdHJ1ZSB9KTtcblx0XHRcdGNvbnN0IHByb21wdFBhdGggPSBqb2luKHByb21wdHNEaXIsIFwiaXMubWRcIik7XG5cdFx0XHR3cml0ZUZpbGVTeW5jKHByb21wdFBhdGgsIFwiSXMgcHJvbXB0XCIpO1xuXG5cdFx0XHRzZXR0aW5nc01hbmFnZXIuc2V0UHJvamVjdFByb21wdFRlbXBsYXRlUGF0aHMoW1wiIXByb21wdHMvaXMubWRcIl0pO1xuXG5cdFx0XHRjb25zdCByZXN1bHQgPSBhd2FpdCBwYWNrYWdlTWFuYWdlci5yZXNvbHZlKCk7XG5cdFx0XHRleHBlY3QocmVzdWx0LnByb21wdHMuc29tZSgocikgPT4gci5wYXRoID09PSBwcm9tcHRQYXRoICYmICFyLmVuYWJsZWQpKS50b0JlKHRydWUpO1xuXHRcdH0pO1xuXG5cdFx0aXQoXCJzaG91bGQgcmVzb2x2ZSBkaXJlY3Rvcnkgd2l0aCBwYWNrYWdlLmpzb24gcGkuZXh0ZW5zaW9ucyBpbiBleHRlbnNpb25zIHNldHRpbmdcIiwgYXN5bmMgKCkgPT4ge1xuXHRcdFx0Ly8gQ3JlYXRlIGEgcGFja2FnZSB3aXRoIHBpLmV4dGVuc2lvbnMgaW4gcGFja2FnZS5qc29uXG5cdFx0XHRjb25zdCBwa2dEaXIgPSBqb2luKHRlbXBEaXIsIFwibXktZXh0ZW5zaW9ucy1wa2dcIik7XG5cdFx0XHRta2RpclN5bmMoam9pbihwa2dEaXIsIFwiZXh0ZW5zaW9uc1wiKSwgeyByZWN1cnNpdmU6IHRydWUgfSk7XG5cdFx0XHR3cml0ZUZpbGVTeW5jKFxuXG5bMTc4NiBtb3JlIGxpbmVzIGluIGZpbGUuIFVzZSBvZmZzZXQ9MjM1IHRvIGNvbnRpbnVlLl0ifV19LCJlbmRlZEF0IjoxNzc3NTY0Mzg0OTUxLCJkdXJhdGlvbk1zIjoxfSx7InRvb2xDYWxsSWQiOiJjYWxsXzQzYmUwZWFiMDE5MjRmZmY5NGM0Y2Y1OSIsInRvb2xOYW1lIjoiZWRpdCIsImFyZ3MiOnsicGF0aCI6InBhY2thZ2VzL2NvZGluZy1hZ2VudC90ZXN0L3BhY2thZ2UtbWFuYWdlci50ZXN0LnRzIiwiZWRpdHMiOlt7Im9sZFRleHQiOiJcdFx0aXQoXCJzaG91bGQgcmVzb2x2ZSBzeW1saW5rZWQgdXNlciBhbmQgcHJvamVjdCByZXNvdXJjZXMgb25jZVwiLCBhc3luYyAoKSA9PiB7XG5cdFx0XHRjb25zdCBzaGFyZWREaXIgPSBqb2luKHRlbXBEaXIsIFwic2hhcmVkLXJlc291cmNlc1wiKTtcblx0XHRcdGNvbnN0IHNoYXJlZEV4dGVuc2lvbnNEaXIgPSBqb2luKHNoYXJlZERpciwgXCJleHRlbnNpb25zXCIpO1xuXHRcdFx0Y29uc3Qgc2hhcmVkU2tpbGxzRGlyID0gam9pbihzaGFyZWREaXIsIFwic2tpbGxzXCIpO1xuXHRcdFx0Y29uc3Qgc2hhcmVkUHJvbXB0c0RpciA9IGpvaW4oc2hhcmVkRGlyLCBcInByb21wdHNcIik7XG5cdFx0XHRjb25zdCBzaGFyZWRUaGVtZXNEaXIgPSBqb2luKHNoYXJlZERpciwgXCJ0aGVtZXNcIik7XG5cdFx0XHRta2RpclN5bmMoc2hhcmVkRXh0ZW5zaW9uc0RpciwgeyByZWN1cnNpdmU6IHRydWUgfSk7XG5cdFx0XHRta2RpclN5bmMoc2hhcmVkU2tpbGxzRGlyLCB7IHJlY3Vyc2l2ZTogdHJ1ZSB9KTtcblx0XHRcdG1rZGlyU3luYyhzaGFyZWRQcm9tcHRzRGlyLCB7IHJlY3Vyc2l2ZTogdHJ1ZSB9KTtcblx0XHRcdG1rZGlyU3luYyhzaGFyZWRUaGVtZXNEaXIsIHsgcmVjdXJzaXZlOiB0cnVlIH0pO1xuXG5cdFx0XHR3cml0ZUZpbGVTeW5jKGpvaW4oc2hhcmVkRXh0ZW5zaW9uc0RpciwgXCJzaGFyZWQudHNcIiksIFwiZXhwb3J0IGRlZmF1bHQgZnVuY3Rpb24oKSB7fVwiKTtcblx0XHRcdG1rZGlyU3luYyhqb2luKHNoYXJlZFNraWxsc0RpciwgXCJzaGFyZWQtc2tpbGxcIiksIHsgcmVjdXJzaXZlOiB0cnVlIH0pO1xuXHRcdFx0d3JpdGVGaWxlU3luYyhcblx0XHRcdFx0am9pbihzaGFyZWRTa2lsbHNEaXIsIFwic2hhcmVkLXNraWxsXCIsIFwiU0tJTEwubWRcIiksXG5cdFx0XHRcdGAtLS1cbm5hbWU6IHNoYXJlZC1za2lsbFxuZGVzY3JpcHRpb246IFNoYXJlZCBza2lsbFxuLS0tXG5Db250ZW50YCxcblx0XHRcdCk7XG5cdFx0XHR3cml0ZUZpbGVTeW5jKGpvaW4oc2hhcmVkUHJvbXB0c0RpciwgXCJzaGFyZWQubWRcIiksIFwiU2hhcmVkIHByb21wdFwiKTtcblx0XHRcdHdyaXRlRmlsZVN5bmMoam9pbihzaGFyZWRUaGVtZXNEaXIsIFwic2hhcmVkLmpzb25cIiksIEpTT04uc3RyaW5naWZ5KHsgbmFtZTogXCJzaGFyZWQtdGhlbWVcIiB9KSk7XG5cblx0XHRcdG1rZGlyU3luYyhqb2luKGFnZW50RGlyKSwgeyByZWN1cnNpdmU6IHRydWUgfSk7XG5cdFx0XHRta2RpclN5bmMoam9pbih0ZW1wRGlyLCBcIi5waVwiKSwgeyByZWN1cnNpdmU6IHRydWUgfSk7XG5cdFx0XHRzeW1saW5rU3luYyhzaGFyZWRFeHRlbnNpb25zRGlyLCBqb2luKGFnZW50RGlyLCBcImV4dGVuc2lvbnNcIiksIFwiZGlyXCIpO1xuXHRcdFx0c3ltbGlua1N5bmMoc2hhcmVkU2tpbGxzRGlyLCBqb2luKGFnZW50RGlyLCBcInNraWxsc1wiKSwgXCJkaXJcIik7XG5cdFx0XHRzeW1saW5rU3luYyhzaGFyZWRQcm9tcHRzRGlyLCBqb2luKGFnZW50RGlyLCBcInByb21wdHNcIiksIFwiZGlyXCIpO1xuXHRcdFx0c3ltbGlua1N5bmMoc2hhcmVkVGhlbWVzRGlyLCBqb2luKGFnZW50RGlyLCBcInRoZW1lc1wiKSwgXCJkaXJcIik7XG5cdFx0XHRzeW1saW5rU3luYyhzaGFyZWRFeHRlbnNpb25zRGlyLCBqb2luKHRlbXBEaXIsIFwiLnBpXCIsIFwiZXh0ZW5zaW9uc1wiKSwgXCJkaXJcIik7XG5cdFx0XHRzeW1saW5rU3luYyhzaGFyZWRTa2lsbHNEaXIsIGpvaW4odGVtcERpciwgXCIucGlcIiwgXCJza2lsbHNcIiksIFwiZGlyXCIpO1xuXHRcdFx0c3ltbGlua1N5bmMoc2hhcmVkUHJvbXB0c0Rpciwgam9pbih0ZW1wRGlyLCBcIi5waVwiLCBcInByb21wdHNcIiksIFwiZGlyXCIpO1xuXHRcdFx0c3ltbGlua1N5bmMoc2hhcmVkVGhlbWVzRGlyLCBqb2luKHRlbXBEaXIsIFwiLnBpXCIsIFwidGhlbWVzXCIpLCBcImRpclwiKTtcblxuXHRcdFx0Y29uc3QgcmVzdWx0ID0gYXdhaXQgcGFja2FnZU1hbmFnZXIucmVzb2x2ZSgpO1xuXG5cdFx0XHRleHBlY3Qoe1xuXHRcdFx0XHRleHRlbnNpb25zOiByZXN1bHQuZXh0ZW5zaW9ucy5sZW5ndGgsXG5cdFx0XHRcdHNraWxsczogcmVzdWx0LnNraWxscy5sZW5ndGgsXG5cdFx0XHRcdHByb21wdHM6IHJlc3VsdC5wcm9tcHRzLmxlbmd0aCxcblx0XHRcdFx0dGhlbWVzOiByZXN1bHQudGhlbWVzLmxlbmd0aCxcblx0XHRcdH0pLnRvRXF1YWwoe1xuXHRcdFx0XHRleHRlbnNpb25zOiAxLFxuXHRcdFx0XHRza2lsbHM6IDEsXG5cdFx0XHRcdHByb21wdHM6IDEsXG5cdFx0XHRcdHRoZW1lczogMSxcblx0XHRcdH0pO1xuXG5cdFx0XHQvLyBQcm9qZWN0IGF1dG8tZGlzY292ZXJlZCBoYXMgaGlnaGVyIHByZWNlZGVuY2UgdGhhbiB1c2VyIGF1dG8tZGlzY292ZXJlZCxcblx0XHRcdC8vIHNvIHRoZSBzdXJ2aXZpbmcgZW50cnkgc2hvdWxkIGJlIHNjb3BlZCB0byBwcm9qZWN0LlxuXHRcdFx0ZXhwZWN0KHJlc3VsdC5leHRlbnNpb25zWzBdLm1ldGFkYXRhLnNjb3BlKS50b0JlKFwicHJvamVjdFwiKTtcblx0XHRcdGV4cGVjdChyZXN1bHQuc2tpbGxzWzBdLm1ldGFkYXRhLnNjb3BlKS50b0JlKFwicHJvamVjdFwiKTtcblx0XHRcdGV4cGVjdChyZXN1bHQucHJvbXB0c1swXS5tZXRhZGF0YS5zY29wZSkudG9CZShcInByb2plY3RcIik7XG5cdFx0XHRleHBlY3QocmVzdWx0LnRoZW1lc1swXS5tZXRhZGF0YS5zY29wZSkudG9CZShcInByb2plY3RcIik7XG5cdFx0fSk7IiwibmV3VGV4dCI6Ilx0XHRpdChcInNob3VsZCByZXNvbHZlIHN5bWxpbmtlZCB1c2VyIGFuZCBwcm9qZWN0IHJlc291cmNlcyBvbmNlXCIsIGFzeW5jICgpID0+IHtcblx0XHRcdGNvbnN0IHByZXZpb3VzSG9tZSA9IHByb2Nlc3MuZW52LkhPTUU7XG5cdFx0XHRwcm9jZXNzLmVudi5IT01FID0gdGVtcERpcjtcblx0XHRcdHRyeSB7XG5cdFx0XHRcdGNvbnN0IHNoYXJlZERpciA9IGpvaW4odGVtcERpciwgXCJzaGFyZWQtcmVzb3VyY2VzXCIpO1xuXHRcdFx0XHRjb25zdCBzaGFyZWRFeHRlbnNpb25zRGlyID0gam9pbihzaGFyZWREaXIsIFwiZXh0ZW5zaW9uc1wiKTtcblx0XHRcdFx0Y29uc3Qgc2hhcmVkU2tpbGxzRGlyID0gam9pbihzaGFyZWREaXIsIFwic2tpbGxzXCIpO1xuXHRcdFx0XHRjb25zdCBzaGFyZWRQcm9tcHRzRGlyID0gam9pbihzaGFyZWREaXIsIFwicHJvbXB0c1wiKTtcblx0XHRcdFx0Y29uc3Qgc2hhcmVkVGhlbWVzRGlyID0gam9pbihzaGFyZWREaXIsIFwidGhlbWVzXCIpO1xuXHRcdFx0XHRta2RpclN5bmMoc2hhcmVkRXh0ZW5zaW9uc0RpciwgeyByZWN1cnNpdmU6IHRydWUgfSk7XG5cdFx0XHRcdG1rZGlyU3luYyhzaGFyZWRTa2lsbHNEaXIsIHsgcmVjdXJzaXZlOiB0cnVlIH0pO1xuXHRcdFx0XHRta2RpclN5bmMoc2hhcmVkUHJvbXB0c0RpciwgeyByZWN1cnNpdmU6IHRydWUgfSk7XG5cdFx0XHRcdG1rZGlyU3luYyhzaGFyZWRUaGVtZXNEaXIsIHsgcmVjdXJzaXZlOiB0cnVlIH0pO1xuXG5cdFx0XHRcdHdyaXRlRmlsZVN5bmMoam9pbihzaGFyZWRFeHRlbnNpb25zRGlyLCBcInNoYXJlZC50c1wiKSwgXCJleHBvcnQgZGVmYXVsdCBmdW5jdGlvbigpIHt9XCIpO1xuXHRcdFx0XHRta2RpclN5bmMoam9pbihzaGFyZWRTa2lsbHNEaXIsIFwic2hhcmVkLXNraWxsXCIpLCB7IHJlY3Vyc2l2ZTogdHJ1ZSB9KTtcblx0XHRcdFx0d3JpdGVGaWxlU3luYyhcblx0XHRcdFx0XHRqb2luKHNoYXJlZFNraWxsc0RpciwgXCJzaGFyZWQtc2tpbGxcIiwgXCJTS0lMTC5tZFwiKSxcblx0XHRcdFx0XHRgLS0tXG5uYW1lOiBzaGFyZWQtc2tpbGxcbmRlc2NyaXB0aW9uOiBTaGFyZWQgc2tpbGxcbi0tLVxuQ29udGVudGAsXG5cdFx0XHRcdCk7XG5cdFx0XHRcdHdyaXRlRmlsZVN5bmMoam9pbihzaGFyZWRQcm9tcHRzRGlyLCBcInNoYXJlZC5tZFwiKSwgXCJTaGFyZWQgcHJvbXB0XCIpO1xuXHRcdFx0XHR3cml0ZUZpbGVTeW5jKGpvaW4oc2hhcmVkVGhlbWVzRGlyLCBcInNoYXJlZC5qc29uXCIpLCBKU09OLnN0cmluZ2lmeSh7IG5hbWU6IFwic2hhcmVkLXRoZW1lXCIgfSkpO1xuXG5cdFx0XHRcdG1rZGlyU3luYyhqb2luKGFnZW50RGlyKSwgeyByZWN1cnNpdmU6IHRydWUgfSk7XG5cdFx0XHRcdG1rZGlyU3luYyhqb2luKHRlbXBEaXIsIFwiLnBpXCIpLCB7IHJlY3Vyc2l2ZTogdHJ1ZSB9KTtcblx0XHRcdFx0c3ltbGlua1N5bmMoc2hhcmVkRXh0ZW5zaW9uc0Rpciwgam9pbihhZ2VudERpciwgXCJleHRlbnNpb25zXCIpLCBcImRpclwiKTtcblx0XHRcdFx0c3ltbGlua1N5bmMoc2hhcmVkU2tpbGxzRGlyLCBqb2luKGFnZW50RGlyLCBcInNraWxsc1wiKSwgXCJkaXJcIik7XG5cdFx0XHRcdHN5bWxpbmtTeW5jKHNoYXJlZFByb21wdHNEaXIsIGpvaW4oYWdlbnREaXIsIFwicHJvbXB0c1wiKSwgXCJkaXJcIik7XG5cdFx0XHRcdHN5bWxpbmtTeW5jKHNoYXJlZFRoZW1lc0Rpciwgam9pbihhZ2VudERpciwgXCJ0aGVtZXNcIiksIFwiZGlyXCIpO1xuXHRcdFx0XHRzeW1saW5rU3luYyhzaGFyZWRFeHRlbnNpb25zRGlyLCBqb2luKHRlbXBEaXIsIFwiLnBpXCIsIFwiZXh0ZW5zaW9uc1wiKSwgXCJkaXJcIik7XG5cdFx0XHRcdHN5bWxpbmtTeW5jKHNoYXJlZFNraWxsc0Rpciwgam9pbih0ZW1wRGlyLCBcIi5waVwiLCBcInNraWxsc1wiKSwgXCJkaXJcIik7XG5cdFx0XHRcdHN5bWxpbmtTeW5jKHNoYXJlZFByb21wdHNEaXIsIGpvaW4odGVtcERpciwgXCIucGlcIiwgXCJwcm9tcHRzXCIpLCBcImRpclwiKTtcblx0XHRcdFx0c3ltbGlua1N5bmMoc2hhcmVkVGhlbWVzRGlyLCBqb2luKHRlbXBEaXIsIFwiLnBpXCIsIFwidGhlbWVzXCIpLCBcImRpclwiKTtcblxuXHRcdFx0XHRjb25zdCByZXN1bHQgPSBhd2FpdCBwYWNrYWdlTWFuYWdlci5yZXNvbHZlKCk7XG5cblx0XHRcdFx0ZXhwZWN0KHtcblx0XHRcdFx0XHRleHRlbnNpb25zOiByZXN1bHQuZXh0ZW5zaW9ucy5sZW5ndGgsXG5cdFx0XHRcdFx0c2tpbGxzOiByZXN1bHQuc2tpbGxzLmxlbmd0aCxcblx0XHRcdFx0XHRwcm9tcHRzOiByZXN1bHQucHJvbXB0cy5sZW5ndGgsXG5cdFx0XHRcdFx0dGhlbWVzOiByZXN1bHQudGhlbWVzLmxlbmd0aCxcblx0XHRcdFx0fSkudG9FcXVhbCh7XG5cdFx0XHRcdFx0ZXh0ZW5zaW9uczogMSxcblx0XHRcdFx0XHRza2lsbHM6IDEsXG5cdFx0XHRcdFx0cHJvbXB0czogMSxcblx0XHRcdFx0XHR0aGVtZXM6IDEsXG5cdFx0XHRcdH0pO1xuXG5cdFx0XHRcdC8vIFByb2plY3QgYXV0by1kaXNjb3ZlcmVkIGhhcyBoaWdoZXIgcHJlY2VkZW5jZSB0aGFuIHVzZXIgYXV0by1kaXNjb3ZlcmVkLFxuXHRcdFx0XHQvLyBzbyB0aGUgc3Vydml2aW5nIGVudHJ5IHNob3VsZCBiZSBzY29wZWQgdG8gcHJvamVjdC5cblx0XHRcdFx0ZXhwZWN0KHJlc3VsdC5leHRlbnNpb25zWzBdLm1ldGFkYXRhLnNjb3BlKS50b0JlKFwicHJvamVjdFwiKTtcblx0XHRcdFx0ZXhwZWN0KHJlc3VsdC5za2lsbHNbMF0ubWV0YWRhdGEuc2NvcGUpLnRvQmUoXCJwcm9qZWN0XCIpO1xuXHRcdFx0XHRleHBlY3QocmVzdWx0LnByb21wdHNbMF0ubWV0YWRhdGEuc2NvcGUpLnRvQmUoXCJwcm9qZWN0XCIpO1xuXHRcdFx0XHRleHBlY3QocmVzdWx0LnRoZW1lc1swXS5tZXRhZGF0YS5zY29wZSkudG9CZShcInByb2plY3RcIik7XG5cdFx0XHR9IGZpbmFsbHkge1xuXHRcdFx0XHRpZiAocHJldmlvdXNIb21lID09PSB1bmRlZmluZWQpIHtcblx0XHRcdFx0XHRkZWxldGUgcHJvY2Vzcy5lbnYuSE9NRTtcblx0XHRcdFx0fSBlbHNlIHtcblx0XHRcdFx0XHRwcm9jZXNzLmVudi5IT01FID0gcHJldmlvdXNIb21lO1xuXHRcdFx0XHR9XG5cdFx0XHR9XG5cdFx0fSk7In1dfSwic3RhdHVzIjoiZG9uZSIsInN0YXJ0ZWRBdCI6MTc3NzU2NDM5Njg1NywicmVzdWx0Ijp7ImNvbnRlbnQiOlt7InR5cGUiOiJ0ZXh0IiwidGV4dCI6IlN1Y2Nlc3NmdWxseSByZXBsYWNlZCAxIGJsb2NrKHMpIGluIHBhY2thZ2VzL2NvZGluZy1hZ2VudC90ZXN0L3BhY2thZ2UtbWFuYWdlci50ZXN0LnRzLiJ9XSwiZGV0YWlscyI6eyJkaWZmIjoiICAgICAgLi4uXG4gIDE1OCBcdFx0XHRleHBlY3QocmVzdWx0LnByb21wdHMuc29tZSgocikgPT4gci5wYXRoID09PSBwcm9tcHRQYXRoICYmICFyLmVuYWJsZWQpKS50b0JlKHRydWUpO1xuICAxNTkgXHRcdH0pO1xuICAxNjAgXG4gIDE2MSBcdFx0aXQoXCJzaG91bGQgcmVzb2x2ZSBzeW1saW5rZWQgdXNlciBhbmQgcHJvamVjdCByZXNvdXJjZXMgb25jZVwiLCBhc3luYyAoKSA9PiB7XG4tIDE2MiBcdFx0XHRjb25zdCBzaGFyZWREaXIgPSBqb2luKHRlbXBEaXIsIFwic2hhcmVkLXJlc291cmNlc1wiKTtcbi0gMTYzIFx0XHRcdGNvbnN0IHNoYXJlZEV4dGVuc2lvbnNEaXIgPSBqb2luKHNoYXJlZERpciwgXCJleHRlbnNpb25zXCIpO1xuLSAxNjQgXHRcdFx0Y29uc3Qgc2hhcmVkU2tpbGxzRGlyID0gam9pbihzaGFyZWREaXIsIFwic2tpbGxzXCIpO1xuLSAxNjUgXHRcdFx0Y29uc3Qgc2hhcmVkUHJvbXB0c0RpciA9IGpvaW4oc2hhcmVkRGlyLCBcInByb21wdHNcIik7XG4tIDE2NiBcdFx0XHRjb25zdCBzaGFyZWRUaGVtZXNEaXIgPSBqb2luKHNoYXJlZERpciwgXCJ0aGVtZXNcIik7XG4tIDE2NyBcdFx0XHRta2RpclN5bmMoc2hhcmVkRXh0ZW5zaW9uc0RpciwgeyByZWN1cnNpdmU6IHRydWUgfSk7XG4tIDE2OCBcdFx0XHRta2RpclN5bmMoc2hhcmVkU2tpbGxzRGlyLCB7IHJlY3Vyc2l2ZTogdHJ1ZSB9KTtcbi0gMTY5IFx0XHRcdG1rZGlyU3luYyhzaGFyZWRQcm9tcHRzRGlyLCB7IHJlY3Vyc2l2ZTogdHJ1ZSB9KTtcbi0gMTcwIFx0XHRcdG1rZGlyU3luYyhzaGFyZWRUaGVtZXNEaXIsIHsgcmVjdXJzaXZlOiB0cnVlIH0pO1xuKyAxNjIgXHRcdFx0Y29uc3QgcHJldmlvdXNIb21lID0gcHJvY2Vzcy5lbnYuSE9NRTtcbisgMTYzIFx0XHRcdHByb2Nlc3MuZW52LkhPTUUgPSB0ZW1wRGlyO1xuKyAxNjQgXHRcdFx0dHJ5IHtcbisgMTY1IFx0XHRcdFx0Y29uc3Qgc2hhcmVkRGlyID0gam9pbih0ZW1wRGlyLCBcInNoYXJlZC1yZXNvdXJjZXNcIik7XG4rIDE2NiBcdFx0XHRcdGNvbnN0IHNoYXJlZEV4dGVuc2lvbnNEaXIgPSBqb2luKHNoYXJlZERpciwgXCJleHRlbnNpb25zXCIpO1xuKyAxNjcgXHRcdFx0XHRjb25zdCBzaGFyZWRTa2lsbHNEaXIgPSBqb2luKHNoYXJlZERpciwgXCJza2lsbHNcIik7XG4rIDE2OCBcdFx0XHRcdGNvbnN0IHNoYXJlZFByb21wdHNEaXIgPSBqb2luKHNoYXJlZERpciwgXCJwcm9tcHRzXCIpO1xuKyAxNjkgXHRcdFx0XHRjb25zdCBzaGFyZWRUaGVtZXNEaXIgPSBqb2luKHNoYXJlZERpciwgXCJ0aGVtZXNcIik7XG4rIDE3MCBcdFx0XHRcdG1rZGlyU3luYyhzaGFyZWRFeHRlbnNpb25zRGlyLCB7IHJlY3Vyc2l2ZTogdHJ1ZSB9KTtcbisgMTcxIFx0XHRcdFx0bWtkaXJTeW5jKHNoYXJlZFNraWxsc0RpciwgeyByZWN1cnNpdmU6IHRydWUgfSk7XG4rIDE3MiBcdFx0XHRcdG1rZGlyU3luYyhzaGFyZWRQcm9tcHRzRGlyLCB7IHJlY3Vyc2l2ZTogdHJ1ZSB9KTtcbisgMTczIFx0XHRcdFx0bWtkaXJTeW5jKHNoYXJlZFRoZW1lc0RpciwgeyByZWN1cnNpdmU6IHRydWUgfSk7XG4gIDE3MSBcbi0gMTcyIFx0XHRcdHdyaXRlRmlsZVN5bmMoam9pbihzaGFyZWRFeHRlbnNpb25zRGlyLCBcInNoYXJlZC50c1wiKSwgXCJleHBvcnQgZGVmYXVsdCBmdW5jdGlvbigpIHt9XCIpO1xuLSAxNzMgXHRcdFx0bWtkaXJTeW5jKGpvaW4oc2hhcmVkU2tpbGxzRGlyLCBcInNoYXJlZC1za2lsbFwiKSwgeyByZWN1cnNpdmU6IHRydWUgfSk7XG4tIDE3NCBcdFx0XHR3cml0ZUZpbGVTeW5jKFxuLSAxNzUgXHRcdFx0XHRqb2luKHNoYXJlZFNraWxsc0RpciwgXCJzaGFyZWQtc2tpbGxcIiwgXCJTS0lMTC5tZFwiKSxcbi0gMTc2IFx0XHRcdFx0YC0tLVxuKyAxNzUgXHRcdFx0XHR3cml0ZUZpbGVTeW5jKGpvaW4oc2hhcmVkRXh0ZW5zaW9uc0RpciwgXCJzaGFyZWQudHNcIiksIFwiZXhwb3J0IGRlZmF1bHQgZnVuY3Rpb24oKSB7fVwiKTtcbisgMTc2IFx0XHRcdFx0bWtkaXJTeW5jKGpvaW4oc2hhcmVkU2tpbGxzRGlyLCBcInNoYXJlZC1za2lsbFwiKSwgeyByZWN1cnNpdmU6IHRydWUgfSk7XG4rIDE3NyBcdFx0XHRcdHdyaXRlRmlsZVN5bmMoXG4rIDE3OCBcdFx0XHRcdFx0am9pbihzaGFyZWRTa2lsbHNEaXIsIFwic2hhcmVkLXNraWxsXCIsIFwiU0tJTEwubWRcIiksXG4rIDE3OSBcdFx0XHRcdFx0YC0tLVxuICAxNzcgbmFtZTogc2hhcmVkLXNraWxsXG4gIDE3OCBkZXNjcmlwdGlvbjogU2hhcmVkIHNraWxsXG4gIDE3OSAtLS1cbiAgMTgwIENvbnRlbnRgLFxuLSAxODEgXHRcdFx0KTtcbi0gMTgyIFx0XHRcdHdyaXRlRmlsZVN5bmMoam9pbihzaGFyZWRQcm9tcHRzRGlyLCBcInNoYXJlZC5tZFwiKSwgXCJTaGFyZWQgcHJvbXB0XCIpO1xuLSAxODMgXHRcdFx0d3JpdGVGaWxlU3luYyhqb2luKHNoYXJlZFRoZW1lc0RpciwgXCJzaGFyZWQuanNvblwiKSwgSlNPTi5zdHJpbmdpZnkoeyBuYW1lOiBcInNoYXJlZC10aGVtZVwiIH0pKTtcbisgMTg0IFx0XHRcdFx0KTtcbisgMTg1IFx0XHRcdFx0d3JpdGVGaWxlU3luYyhqb2luKHNoYXJlZFByb21wdHNEaXIsIFwic2hhcmVkLm1kXCIpLCBcIlNoYXJlZCBwcm9tcHRcIik7XG4rIDE4NiBcdFx0XHRcdHdyaXRlRmlsZVN5bmMoam9pbihzaGFyZWRUaGVtZXNEaXIsIFwic2hhcmVkLmpzb25cIiksIEpTT04uc3RyaW5naWZ5KHsgbmFtZTogXCJzaGFyZWQtdGhlbWVcIiB9KSk7XG4gIDE4NCBcbi0gMTg1IFx0XHRcdG1rZGlyU3luYyhqb2luKGFnZW50RGlyKSwgeyByZWN1cnNpdmU6IHRydWUgfSk7XG4tIDE4NiBcdFx0XHRta2RpclN5bmMoam9pbih0ZW1wRGlyLCBcIi5waVwiKSwgeyByZWN1cnNpdmU6IHRydWUgfSk7XG4tIDE4NyBcdFx0XHRzeW1saW5rU3luYyhzaGFyZWRFeHRlbnNpb25zRGlyLCBqb2luKGFnZW50RGlyLCBcImV4dGVuc2lvbnNcIiksIFwiZGlyXCIpO1xuLSAxODggXHRcdFx0c3ltbGlua1N5bmMoc2hhcmVkU2tpbGxzRGlyLCBqb2luKGFnZW50RGlyLCBcInNraWxsc1wiKSwgXCJkaXJcIik7XG4tIDE4OSBcdFx0XHRzeW1saW5rU3luYyhzaGFyZWRQcm9tcHRzRGlyLCBqb2luKGFnZW50RGlyLCBcInByb21wdHNcIiksIFwiZGlyXCIpO1xuLSAxOTAgXHRcdFx0c3ltbGlua1N5bmMoc2hhcmVkVGhlbWVzRGlyLCBqb2luKGFnZW50RGlyLCBcInRoZW1lc1wiKSwgXCJkaXJcIik7XG4tIDE5MSBcdFx0XHRzeW1saW5rU3luYyhzaGFyZWRFeHRlbnNpb25zRGlyLCBqb2luKHRlbXBEaXIsIFwiLnBpXCIsIFwiZXh0ZW5zaW9uc1wiKSwgXCJkaXJcIik7XG4tIDE5MiBcdFx0XHRzeW1saW5rU3luYyhzaGFyZWRTa2lsbHNEaXIsIGpvaW4odGVtcERpciwgXCIucGlcIiwgXCJza2lsbHNcIiksIFwiZGlyXCIpO1xuLSAxOTMgXHRcdFx0c3ltbGlua1N5bmMoc2hhcmVkUHJvbXB0c0Rpciwgam9pbih0ZW1wRGlyLCBcIi5waVwiLCBcInByb21wdHNcIiksIFwiZGlyXCIpO1xuLSAxOTQgXHRcdFx0c3ltbGlua1N5bmMoc2hhcmVkVGhlbWVzRGlyLCBqb2luKHRlbXBEaXIsIFwiLnBpXCIsIFwidGhlbWVzXCIpLCBcImRpclwiKTtcbisgMTg4IFx0XHRcdFx0bWtkaXJTeW5jKGpvaW4oYWdlbnREaXIpLCB7IHJlY3Vyc2l2ZTogdHJ1ZSB9KTtcbisgMTg5IFx0XHRcdFx0bWtkaXJTeW5jKGpvaW4odGVtcERpciwgXCIucGlcIiksIHsgcmVjdXJzaXZlOiB0cnVlIH0pO1xuKyAxOTAgXHRcdFx0XHRzeW1saW5rU3luYyhzaGFyZWRFeHRlbnNpb25zRGlyLCBqb2luKGFnZW50RGlyLCBcImV4dGVuc2lvbnNcIiksIFwiZGlyXCIpO1xuKyAxOTEgXHRcdFx0XHRzeW1saW5rU3luYyhzaGFyZWRTa2lsbHNEaXIsIGpvaW4oYWdlbnREaXIsIFwic2tpbGxzXCIpLCBcImRpclwiKTtcbisgMTkyIFx0XHRcdFx0c3ltbGlua1N5bmMoc2hhcmVkUHJvbXB0c0Rpciwgam9pbihhZ2VudERpciwgXCJwcm9tcHRzXCIpLCBcImRpclwiKTtcbisgMTkzIFx0XHRcdFx0c3ltbGlua1N5bmMoc2hhcmVkVGhlbWVzRGlyLCBqb2luKGFnZW50RGlyLCBcInRoZW1lc1wiKSwgXCJkaXJcIik7XG4rIDE5NCBcdFx0XHRcdHN5bWxpbmtTeW5jKHNoYXJlZEV4dGVuc2lvbnNEaXIsIGpvaW4odGVtcERpciwgXCIucGlcIiwgXCJleHRlbnNpb25zXCIpLCBcImRpclwiKTtcbisgMTk1IFx0XHRcdFx0c3ltbGlua1N5bmMoc2hhcmVkU2tpbGxzRGlyLCBqb2luKHRlbXBEaXIsIFwiLnBpXCIsIFwic2tpbGxzXCIpLCBcImRpclwiKTtcbisgMTk2IFx0XHRcdFx0c3ltbGlua1N5bmMoc2hhcmVkUHJvbXB0c0Rpciwgam9pbih0ZW1wRGlyLCBcIi5waVwiLCBcInByb21wdHNcIiksIFwiZGlyXCIpO1xuKyAxOTcgXHRcdFx0XHRzeW1saW5rU3luYyhzaGFyZWRUaGVtZXNEaXIsIGpvaW4odGVtcERpciwgXCIucGlcIiwgXCJ0aGVtZXNcIiksIFwiZGlyXCIpO1xuICAxOTUgXG4tIDE5NiBcdFx0XHRjb25zdCByZXN1bHQgPSBhd2FpdCBwYWNrYWdlTWFuYWdlci5yZXNvbHZlKCk7XG4rIDE5OSBcdFx0XHRcdGNvbnN0IHJlc3VsdCA9IGF3YWl0IHBhY2thZ2VNYW5hZ2VyLnJlc29sdmUoKTtcbiAgMTk3IFxuLSAxOTggXHRcdFx0ZXhwZWN0KHtcbi0gMTk5IFx0XHRcdFx0ZXh0ZW5zaW9uczogcmVzdWx0LmV4dGVuc2lvbnMubGVuZ3RoLFxuLSAyMDAgXHRcdFx0XHRza2lsbHM6IHJlc3VsdC5za2lsbHMubGVuZ3RoLFxuLSAyMDEgXHRcdFx0XHRwcm9tcHRzOiByZXN1bHQucHJvbXB0cy5sZW5ndGgsXG4tIDIwMiBcdFx0XHRcdHRoZW1lczogcmVzdWx0LnRoZW1lcy5sZW5ndGgsXG4tIDIwMyBcdFx0XHR9KS50b0VxdWFsKHtcbi0gMjA0IFx0XHRcdFx0ZXh0ZW5zaW9uczogMSxcbi0gMjA1IFx0XHRcdFx0c2tpbGxzOiAxLFxuLSAyMDYgXHRcdFx0XHRwcm9tcHRzOiAxLFxuLSAyMDcgXHRcdFx0XHR0aGVtZXM6IDEsXG4tIDIwOCBcdFx0XHR9KTtcbisgMjAxIFx0XHRcdFx0ZXhwZWN0KHtcbisgMjAyIFx0XHRcdFx0XHRleHRlbnNpb25zOiByZXN1bHQuZXh0ZW5zaW9ucy5sZW5ndGgsXG4rIDIwMyBcdFx0XHRcdFx0c2tpbGxzOiByZXN1bHQuc2tpbGxzLmxlbmd0aCxcbisgMjA0IFx0XHRcdFx0XHRwcm9tcHRzOiByZXN1bHQucHJvbXB0cy5sZW5ndGgsXG4rIDIwNSBcdFx0XHRcdFx0dGhlbWVzOiByZXN1bHQudGhlbWVzLmxlbmd0aCxcbisgMjA2IFx0XHRcdFx0fSkudG9FcXVhbCh7XG4rIDIwNyBcdFx0XHRcdFx0ZXh0ZW5zaW9uczogMSxcbisgMjA4IFx0XHRcdFx0XHRza2lsbHM6IDEsXG4rIDIwOSBcdFx0XHRcdFx0cHJvbXB0czogMSxcbisgMjEwIFx0XHRcdFx0XHR0aGVtZXM6IDEsXG4rIDIxMSBcdFx0XHRcdH0pO1xuICAyMDkgXG4tIDIxMCBcdFx0XHQvLyBQcm9qZWN0IGF1dG8tZGlzY292ZXJlZCBoYXMgaGlnaGVyIHByZWNlZGVuY2UgdGhhbiB1c2VyIGF1dG8tZGlzY292ZXJlZCxcbi0gMjExIFx0XHRcdC8vIHNvIHRoZSBzdXJ2aXZpbmcgZW50cnkgc2hvdWxkIGJlIHNjb3BlZCB0byBwcm9qZWN0LlxuLSAyMTIgXHRcdFx0ZXhwZWN0KHJlc3VsdC5leHRlbnNpb25zWzBdLm1ldGFkYXRhLnNjb3BlKS50b0JlKFwicHJvamVjdFwiKTtcbi0gMjEzIFx0XHRcdGV4cGVjdChyZXN1bHQuc2tpbGxzWzBdLm1ldGFkYXRhLnNjb3BlKS50b0JlKFwicHJvamVjdFwiKTtcbi0gMjE0IFx0XHRcdGV4cGVjdChyZXN1bHQucHJvbXB0c1swXS5tZXRhZGF0YS5zY29wZSkudG9CZShcInByb2plY3RcIik7XG4tIDIxNSBcdFx0XHRleHBlY3QocmVzdWx0LnRoZW1lc1swXS5tZXRhZGF0YS5zY29wZSkudG9CZShcInByb2plY3RcIik7XG4rIDIxMyBcdFx0XHRcdC8vIFByb2plY3QgYXV0by1kaXNjb3ZlcmVkIGhhcyBoaWdoZXIgcHJlY2VkZW5jZSB0aGFuIHVzZXIgYXV0by1kaXNjb3ZlcmVkLFxuKyAyMTQgXHRcdFx0XHQvLyBzbyB0aGUgc3Vydml2aW5nIGVudHJ5IHNob3VsZCBiZSBzY29wZWQgdG8gcHJvamVjdC5cbisgMjE1IFx0XHRcdFx0ZXhwZWN0KHJlc3VsdC5leHRlbnNpb25zWzBdLm1ldGFkYXRhLnNjb3BlKS50b0JlKFwicHJvamVjdFwiKTtcbisgMjE2IFx0XHRcdFx0ZXhwZWN0KHJlc3VsdC5za2lsbHNbMF0ubWV0YWRhdGEuc2NvcGUpLnRvQmUoXCJwcm9qZWN0XCIpO1xuKyAyMTcgXHRcdFx0XHRleHBlY3QocmVzdWx0LnByb21wdHNbMF0ubWV0YWRhdGEuc2NvcGUpLnRvQmUoXCJwcm9qZWN0XCIpO1xuKyAyMTggXHRcdFx0XHRleHBlY3QocmVzdWx0LnRoZW1lc1swXS5tZXRhZGF0YS5zY29wZSkudG9CZShcInByb2plY3RcIik7XG4rIDIxOSBcdFx0XHR9IGZpbmFsbHkge1xuKyAyMjAgXHRcdFx0XHRpZiAocHJldmlvdXNIb21lID09PSB1bmRlZmluZWQpIHtcbisgMjIxIFx0XHRcdFx0XHRkZWxldGUgcHJvY2Vzcy5lbnYuSE9NRTtcbisgMjIyIFx0XHRcdFx0fSBlbHNlIHtcbisgMjIzIFx0XHRcdFx0XHRwcm9jZXNzLmVudi5IT01FID0gcHJldmlvdXNIb21lO1xuKyAyMjQgXHRcdFx0XHR9XG4rIDIyNSBcdFx0XHR9XG4gIDIxNiBcdFx0fSk7XG4gIDIxNyBcbiAgMjE4IFx0XHRpdChcInNob3VsZCBhdXRvLWRpc2NvdmVyIHByb2plY3QgcHJvbXB0cyB3aXRoIG92ZXJyaWRlc1wiLCBhc3luYyAoKSA9PiB7XG4gIDIxOSBcdFx0XHRjb25zdCBwcm9tcHRzRGlyID0gam9pbih0ZW1wRGlyLCBcIi5waVwiLCBcInByb21wdHNcIik7XG4gICAgICAuLi4iLCJmaXJzdENoYW5nZWRMaW5lIjoxNjJ9fSwiZW5kZWRBdCI6MTc3NzU2NDM5Njg2MCwiZHVyYXRpb25NcyI6M30seyJ0b29sQ2FsbElkIjoiY2FsbF82M2JkNTNjNTBiMzg0YmUwYjg5NjczM2QiLCJ0b29sTmFtZSI6InJlYWQiLCJhcmdzIjp7InBhdGgiOiJwYWNrYWdlcy9jb2RpbmctYWdlbnQvdGVzdC9wYWNrYWdlLW1hbmFnZXIudGVzdC50cyIsIm9mZnNldCI6MTYxLCJsaW1pdCI6NjB9LCJzdGF0dXMiOiJkb25lIiwic3RhcnRlZEF0IjoxNzc3NTY0Mzk5Mzk0LCJyZXN1bHQiOnsiY29udGVudCI6W3sidHlwZSI6InRleHQiLCJ0ZXh0IjoiXHRcdGl0KFwic2hvdWxkIHJlc29sdmUgc3ltbGlua2VkIHVzZXIgYW5kIHByb2plY3QgcmVzb3VyY2VzIG9uY2VcIiwgYXN5bmMgKCkgPT4ge1xuXHRcdFx0Y29uc3QgcHJldmlvdXNIb21lID0gcHJvY2Vzcy5lbnYuSE9NRTtcblx0XHRcdHByb2Nlc3MuZW52LkhPTUUgPSB0ZW1wRGlyO1xuXHRcdFx0dHJ5IHtcblx0XHRcdFx0Y29uc3Qgc2hhcmVkRGlyID0gam9pbih0ZW1wRGlyLCBcInNoYXJlZC1yZXNvdXJjZXNcIik7XG5cdFx0XHRcdGNvbnN0IHNoYXJlZEV4dGVuc2lvbnNEaXIgPSBqb2luKHNoYXJlZERpciwgXCJleHRlbnNpb25zXCIpO1xuXHRcdFx0XHRjb25zdCBzaGFyZWRTa2lsbHNEaXIgPSBqb2luKHNoYXJlZERpciwgXCJza2lsbHNcIik7XG5cdFx0XHRcdGNvbnN0IHNoYXJlZFByb21wdHNEaXIgPSBqb2luKHNoYXJlZERpciwgXCJwcm9tcHRzXCIpO1xuXHRcdFx0XHRjb25zdCBzaGFyZWRUaGVtZXNEaXIgPSBqb2luKHNoYXJlZERpciwgXCJ0aGVtZXNcIik7XG5cdFx0XHRcdG1rZGlyU3luYyhzaGFyZWRFeHRlbnNpb25zRGlyLCB7IHJlY3Vyc2l2ZTogdHJ1ZSB9KTtcblx0XHRcdFx0bWtkaXJTeW5jKHNoYXJlZFNraWxsc0RpciwgeyByZWN1cnNpdmU6IHRydWUgfSk7XG5cdFx0XHRcdG1rZGlyU3luYyhzaGFyZWRQcm9tcHRzRGlyLCB7IHJlY3Vyc2l2ZTogdHJ1ZSB9KTtcblx0XHRcdFx0bWtkaXJTeW5jKHNoYXJlZFRoZW1lc0RpciwgeyByZWN1cnNpdmU6IHRydWUgfSk7XG5cblx0XHRcdFx0d3JpdGVGaWxlU3luYyhqb2luKHNoYXJlZEV4dGVuc2lvbnNEaXIsIFwic2hhcmVkLnRzXCIpLCBcImV4cG9ydCBkZWZhdWx0IGZ1bmN0aW9uKCkge31cIik7XG5cdFx0XHRcdG1rZGlyU3luYyhqb2luKHNoYXJlZFNraWxsc0RpciwgXCJzaGFyZWQtc2tpbGxcIiksIHsgcmVjdXJzaXZlOiB0cnVlIH0pO1xuXHRcdFx0XHR3cml0ZUZpbGVTeW5jKFxuXHRcdFx0XHRcdGpvaW4oc2hhcmVkU2tpbGxzRGlyLCBcInNoYXJlZC1za2lsbFwiLCBcIlNLSUxMLm1kXCIpLFxuXHRcdFx0XHRcdGAtLS1cbm5hbWU6IHNoYXJlZC1za2lsbFxuZGVzY3JpcHRpb246IFNoYXJlZCBza2lsbFxuLS0tXG5Db250ZW50YC
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment