diff --git a/Dockerfile b/Dockerfile index a3cc02e0..516715b0 100644 --- a/Dockerfile +++ b/Dockerfile @@ -8,8 +8,7 @@ RUN curl -fsSL https://deb.nodesource.com/setup_18.x | bash - \ WORKDIR /opt/app ADD mix.exs mix.lock ./ -RUN mix do deps.get, deps.compile +RUN mix do deps.get, compile ADD assets assets/ -RUN npm --prefix assets install -RUN npm --prefix assets run build +RUN npm --prefix assets ci --force diff --git a/README.md b/README.md index a7538aa8..c81bed48 100644 --- a/README.md +++ b/README.md @@ -77,7 +77,7 @@ every aspect of a particular resource view, like the edit form. * `actions` - functions that operate on a specific record * `tasks` - functions that operate on a resource as a whole -* `list_with` - function used to fetch records +* `query_with` - function used to fetch a batch of records * `render_with` - function used to encode field values in views * `create_with` - function used to insert a record * `update_with` - function used to update a record @@ -103,7 +103,6 @@ in any LiveView it is used. Extra options: * `schema` - use to set the schema for the resource (default: calling module) -* `preload` - manually choose which associations to preload (default: all `belongs_to` associations) ### Scope diff --git a/README.md.eex b/README.md.eex index 5c37a223..fb2713bb 100644 --- a/README.md.eex +++ b/README.md.eex @@ -77,7 +77,7 @@ every aspect of a particular resource view, like the edit form. * `actions` - functions that operate on a specific record * `tasks` - functions that operate on a resource as a whole -* `list_with` - function used to fetch records +* `query_with` - function used to fetch a batch of records * `render_with` - function used to encode field values in views * `create_with` - function used to insert a record * `update_with` - function used to update a record @@ -103,7 +103,6 @@ in any LiveView it is used. Extra options: * `schema` - use to set the schema for the resource (default: calling module) -* `preload` - manually choose which associations to preload (default: all `belongs_to` associations) ### Scope diff --git a/assets/css/app.css b/assets/css/app.css index 3d2ce15f..5dc11dc4 100644 --- a/assets/css/app.css +++ b/assets/css/app.css @@ -1,930 +1,1933 @@ -@tailwind base; -@tailwind components; -@tailwind utilities; +* { + margin: 0; + padding: 0; + box-sizing: border-box; +} -@layer base { - * { - @apply bg-inherit; - } +body { + font-family: system-ui, sans-serif; + background: var(--bg-light); + color: var(--text-primary); + + /* Primary Colors */ + --accent-color: #6b46c1; + --accent-hover: #7c3aed; + + /* Background Colors */ + --bg-light: #f5f5f7; + --bg-white: #fff; + --bg-medium: #e8e8ed; + + /* Border Colors */ + --border-light: #d2d2d7; + --border-medium: #e8e8ed; + + /* Text Colors */ + --text-primary: #1d1d1f; + --text-secondary: #515154; + --text-muted: #86868b; + + /* Status Colors - Error/Warning */ + --error-bg: #fef2f2; + --error-color: #dc2626; + --error-hover: #7f1d1d; + + /* Status Colors - Success */ + --success-bg: #f0fdf4; + --success-light: #d1fae5; + --success-color: #16a34a; + --success-dark: #065f46; + --success-hover: #166534; + + /* Status Colors - Info */ + --info-bg: #eff6ff; + --info-light: #dbeafe; + --info-color: #2563eb; + --info-dark: #1e40af; + --info-hover: #1e40af; + + /* Status Colors - Warning/Pending */ + --warning-bg: #fff1e5; + --warning-color: #e53e3e; + --warning-hover: #c53030; + + /* Purple Selection States */ + --purple-50: #f3e8ff; + --purple-100: #e9d5ff; + + /* Opacity Values */ + --opacity-disabled: 0.4; + --opacity-muted: 0.7; + + /* Shadow */ + --shadow-sm: 0 1px 3px rgba(0, 0, 0, 0.1); + --shadow-md: 0 4px 12px rgba(0, 0, 0, 0.15); + --shadow-lg: 0 20px 60px rgba(0, 0, 0, 0.3); + + /* Focus Ring */ + --focus-ring: 0 0 0 3px rgba(107, 70, 193, 0.1); + + --top-height: 64px; +} - h1 { - @apply text-3xl; - @apply md:text-5xl; - @apply mb-4; - @apply font-extrabold; - } +body { + padding-top: var(--top-height); +} - input, textarea { - @apply relative; - @apply rounded; - @apply text-sm; - @apply border; - @apply outline-none; - @apply focus:outline-none; - @apply focus:ring; - @apply p-1; - @apply overflow-hidden; - } +body:has(.alert-bar) { + padding-top: 112px; +} - select { - @apply appearance-none; - @apply bg-clip-padding; - @apply bg-no-repeat; - @apply border; - @apply border-solid; - @apply rounded; - @apply transition; - @apply ease-in-out; - @apply focus:outline-none; - @apply w-32; - @apply p-1; - } +p { + margin: 1lh 0; } -input[type="date"], input[type="number"] { - @apply w-32; +h1[class$="title"], +h3[class$="title"], +h3[class$="title"] { + font-weight: 600; + text-transform: uppercase; + letter-spacing: 0.1em; + color: var(--accent-hover); + font-size: 16px; + opacity: 0.75; } -input[type="submit"] { - @apply cursor-pointer; -}; +h1[class$="title"] { + font-size: 16px; +} -@layer components { - .view__container { - @apply overflow-y-auto; - } +h2[class$="title"] { + font-size: 14px; +} - #list .table__wrapper { - @apply overflow-auto; - @apply max-h-full; - } +h3[class$="title"] { + font-size: 12px; +} - #prefix-select nav { - @apply overflow-y-auto; - } +h1 span, +h2 span, +h3 span { + display: block; + font-size: 2.5em; + color: var(--text-primary); + text-transform: none; + opacity: 1; +} - #jobs { - @apply absolute; - @apply bottom-0; - @apply left-5; - @apply w-60; - @apply z-50; - @apply border-x-2; - @apply border-t-2; - @apply p-5; - @apply rounded-t-md; - } +/* Header */ +.header { + background: var(--bg-white); + border-bottom: 1px solid var(--border-light); + position: fixed; + top: 0; + left: 0; + right: 0; + z-index: 100; +} - #jobs:empty { - @apply invisible; - } +.header-content { + margin: 0 32px 0 24px; + display: flex; + align-items: center; + justify-content: space-between; + height: var(--top-height); +} - .job__container { - @apply w-full; - @apply rounded-full; - @apply mb-2; - @apply relative; - @apply bg-transparent; - @apply h-5; - } +.logo { + font-size: 20px; + font-weight: 600; + color: var(--text-primary); +} - .job__label { - @apply inline-block; - @apply text-xs; - @apply font-medium; - @apply pl-1; - @apply w-full; - @apply h-full; - @apply rounded-full; - @apply border; - @apply absolute; - @apply top-0; - @apply leading-normal; - } +.user-menu { + display: flex; + align-items: center; + gap: 16px; +} - .job__bar { - @apply absolute; - @apply top-0; - @apply h-full; - @apply rounded-full; - @apply -z-10; - @apply min-w-5; - } +#alert-bar { + position: fixed; + left: 0; + right: 0; +} - .topbar { - @apply bg-transparent; - } +#alert-bar:hover .alert-bar + .alert-bar { + top: 64px; + opacity: 100; + position: relative; +} - .disabled { - @apply opacity-30; - } +.alert-bar { + position: absolute; + padding: 14px 24px; + align-items: center; + justify-content: space-between; + border-width: 2px 0; + border-style: solid; + transition: all 0.2s ease-in-out; + width: 100%; + display: flex; + height: 64px; + z-index: 2; +} + +.alert-bar + .alert-bar { + border-top-width: 0; + top: 0; + opacity: 0; + z-index: 1; +} + +.alert-count { + border-width: 2px; + border-style: solid; + border-radius: 50%; + width: 1.25lh; + text-align: center; + height: 1.25lh; + vertical-align: middle; + display: flex; + align-items: center; + justify-content: center; + cursor: pointer; +} + +.alert-bar.error { + background: var(--error-bg); + border-color: var(--error-color); + color: var(--error-color); +} + +.alert-bar.error:hover { + color: var(--error-hover); +} + +.alert-bar.success { + background: var(--success-bg); + border-color: var(--success-color); + color: var(--success-color); +} + +.alert-bar.success:hover { + color: var(--success-hover); +} + +.alert-bar.info { + background: var(--info-bg); + border-color: var(--info-color); + color: var(--info-color); +} + +.alert-bar.info:hover { + color: var(--info-hover); +} + +#alert-bar[class$="loading"] { + opacity: var(--opacity-muted); + pointer-events: none; +} + +.alert-content { + display: flex; + align-items: center; + gap: 12px; + flex: 1; +} + +.alert-icon { + width: 20px; + height: 20px; + flex-shrink: 0; + cursor: pointer; +} + +.alert-message { + font-size: 14px; + font-weight: 500; +} + +.alert-close { + cursor: pointer; + padding: 6px 12px; + border-radius: 6px; + transition: all 0.2s; + font-size: 16px; + line-height: 1; + font-weight: 600; + flex-shrink: 0; +} + +/* Breadcrumb Navigation */ +.breadcrumb { + display: none; +} + +.breadcrumb-content { + display: none; +} + +.breadcrumb a { + display: none; +} + +.breadcrumb-separator { + display: none; +} + +.breadcrumb-current { + display: none; +} + +/* Main Layout */ +.main-layout { + display: flex; + min-height: calc(100vh - var(--top-height)); +} + +/* Sidebar Navigation */ +.sidebar { + width: 20vw; + min-width: 200px; + max-width: 300px; + background: var(--bg-white); + border-right: 1px solid var(--border-light); + padding: 24px 0 180px 0; + position: fixed; + left: 0; + top: var(--top-height); + bottom: 0; + overflow-y: auto; + z-index: 10; +} + +body:has(.alert-bar) .sidebar { + top: 112px; +} + +.nav-section { + margin-bottom: 32px; +} + +.nav-section-title { + padding: 0 24px 12px; + font-size: 12px; + font-weight: 600; + color: var(--text-muted); + text-transform: uppercase; + letter-spacing: 0.5px; +} + +.nav-item { + padding: 10px 24px; + color: var(--text-primary); + text-decoration: none; + display: flex; + align-items: center; + gap: 12px; + transition: background 0.2s; + cursor: pointer; +} + +.nav-item:hover { + background: var(--bg-light); +} + +.nav-item.active { + background: var(--bg-light); + font-weight: 500; + border-left: 3px solid var(--accent-color); + color: var(--accent-color) !important; +} + +.nav-icon { + width: 20px; + height: 20px; + fill: currentColor; +} + +.nav-icon svg { + width: 100%; + height: 100%; + display: block; +} + +.nav-item-expand { + margin-left: auto; + opacity: var(--opacity-muted); + font-size: 12px; + transition: transform 0.2s; +} + +.nav-toggle-input { + display: none; +} + +.nav-toggle-label { + padding: 10px 24px; + color: var(--text-primary); + text-decoration: none; + display: flex; + align-items: center; + gap: 12px; + transition: background 0.2s; + cursor: pointer; + user-select: none; +} + +.nav-toggle-label:hover { + background: var(--bg-light); +} + +.nav-toggle-label.active { + background: var(--bg-medium); + font-weight: 500; + border-left: 3px solid var(--accent-color); +} + +.nav-subitems { + max-height: 0; + overflow: hidden; +} + +.nav-toggle-input:checked + .nav-toggle-label + .nav-subitems { + max-height: none; +} + +.nav-toggle-input:checked + .nav-toggle-label .nav-item-expand { + transform: rotate(180deg); +} + +/* Nested level styles using child selectors */ +.nav-subitems .nav-toggle-label { + padding: 8px 24px; + color: var(--text-secondary); + font-size: 16px; +} + +.nav-subitems .nav-toggle-label:hover { + color: var(--accent-color); + background: transparent; +} + +.nav-subitems .nav-subitems { + padding-left: 16px; + max-height: 0; +} - .drop::before { - content: ' '; +/* Third level items (leaf nodes without expand arrows) */ +.nav-subitems .nav-subitems a { + padding: 8px 24px; + color: var(--text-secondary); + text-decoration: none; + display: flex; + align-items: center; + gap: 12px; + font-size: 16px; + transition: color 0.2s; +} + +.nav-subitems .nav-subitems a:hover { + color: var(--accent-color); +} + +.nav-subitem { + padding: 8px 24px; + color: var(--text-secondary); + text-decoration: none; + display: flex; + align-items: center; + justify-content: space-between; + font-size: 16px; + transition: color 0.2s; +} + +.nav-subitem:hover { + color: var(--accent-color); +} + +.nav-subitem .nav-item-expand { + opacity: var(--opacity-muted); + font-size: 12px; +} + +/* Progress Section */ +.nav-progress-section { + position: absolute; + bottom: 0; + left: 0; + right: 0; + padding: 16px 24px 24px; + border-top: 1px solid var(--border-light); + background: var(--bg-white); +} + +.nav-progress-title { + font-size: 12px; + font-weight: 600; + color: var(--text-muted); + text-transform: uppercase; + letter-spacing: 0.5px; + margin-bottom: 16px; +} + +.progress-item { + margin-bottom: 16px; +} + +.progress-item:last-child { + margin-bottom: 0; +} + +.progress-header { + display: flex; + justify-content: space-between; + align-items: center; + margin-bottom: 6px; +} + +.progress-label { + font-size: 13px; + color: var(--text-primary); + font-weight: 500; +} + +.progress-percentage { + font-size: 12px; + color: var(--text-muted); + font-weight: 600; +} + +.progress-bar-container { + width: 100%; + height: 6px; + background: var(--bg-medium); + border-radius: 3px; + overflow: hidden; +} + +.progress-bar { + height: 100%; + background: var(--accent-color); + border-radius: 3px; + transition: width 0.3s ease; +} + +/* Content Area */ +.content { + flex: 1; + padding: 32px; + margin-left: 20vw; + max-width: calc(100vw - 20vw); + box-sizing: border-box; +} + +@media (min-width: 1500px) { + .content { + margin-left: 300px; + max-width: calc(100vw - 300px); + } +} + +@media (max-width: 1000px) { + .content { + margin-left: 200px; + max-width: calc(100vw - 200px); + } +} + +.content-header { + display: flex; + justify-content: space-between; + align-items: center; + margin-bottom: 32px; + flex-wrap: wrap; + gap: 16px; + max-width: 100%; + overflow: visible; +} + +.content-title { + font-size: 32px; + font-weight: 600; + flex-shrink: 1; + min-width: 0; + overflow-wrap: break-word; +} + +@media (max-width: 768px) { + .content-header { + flex-direction: column; + align-items: flex-start; + } + + .contextual-actions { + width: 100%; + } +} + +/* Contextual Buttons */ +.contextual-actions { + display: flex; + gap: 12px; + flex-wrap: wrap; + flex-shrink: 0; +} + +.btn { + padding: 10px 20px; + border: none; + border-radius: 8px; + font-size: 14px; + font-weight: 500; + cursor: pointer; + transition: all 0.2s; + display: flex; + align-items: center; + gap: 8px; +} + +.btn-primary { + background: var(--accent-color); + color: var(--bg-white); +} + +.btn-primary:hover { + background: var(--accent-hover); +} + +.btn-secondary { + background: var(--bg-white); + color: var(--text-primary); + border: 1px solid var(--border-light); +} + +.btn-secondary:hover { + background: var(--bg-light); +} + +.btn-select { + padding: 10px 20px; + border: 1px solid var(--border-light); + border-radius: 8px; + font-size: 14px; + font-weight: 500; + cursor: pointer; + background: var(--bg-white); + color: var(--text-primary); + transition: all 0.2s; + position: relative; +} + +.btn-select:hover { + background: var(--bg-light); +} + +.btn-select[open] { + background: var(--bg-light); +} + +.btn-select summary { + list-style: none; + display: flex; + align-items: center; + gap: 8px; + cursor: pointer; + user-select: none; +} + +.btn-select summary::-webkit-details-marker { + display: none; +} + +.btn-select summary::after { + content: ""; + width: 0; + height: 0; + border-left: 4px solid transparent; + border-right: 4px solid transparent; + border-top: 5px solid var(--text-primary); + margin-left: 8px; +} + +.btn-select[open] summary::after { + border-top: none; + border-bottom: 5px solid var(--text-primary); +} + +.drop-menu { + position: absolute; + top: calc(100% + 4px); + right: 0; + background: var(--bg-white); + border: 1px solid var(--border-light); + border-radius: 8px; + box-shadow: var(--shadow-md); + min-width: 200px; + padding: 8px 0; + z-index: 1000; + max-height: 30vh; + overflow-y: scroll; +} + +.drop-link { + display: block; + padding: 10px 16px; + color: var(--text-primary); + text-decoration: none; + font-size: 14px; + transition: background 0.2s; display: inline-block; - border-top: 5px solid transparent; - border-bottom: 5px solid transparent; - border-left: 5px solid currentColor; + width: 100%; + height: 100%; +} + +.drop-link:hover { + background: var(--bg-light); +} + +.btn-icon { + width: 16px; + height: 16px; + fill: currentColor; +} + +.btn-icon svg { + width: 100%; + height: 100%; + display: block; +} + +.content-card { + background: var(--bg-white); + border-radius: 12px; + padding: 24px; + box-shadow: var(--shadow-sm); +} + +.card-section { + margin-bottom: 24px; +} + +.table-container { + overflow: scroll; + max-height: 200vh; +} + +.card-section:last-child { + margin-bottom: 0; +} + +.card-section-title { + font-size: 18px; + font-weight: 600; + margin-bottom: 16px; +} + +.card-text { + color: var(--text-secondary); + line-height: 1.6; +} + +.data-table { + width: 100%; + border-collapse: collapse; + margin-top: 16px; + min-width: 1600px; +} + +.data-table th { + background: var(--bg-light); + text-align: left; + font-weight: 600; + font-size: 14px; + color: var(--text-primary); + border-bottom: 2px solid var(--border-light); + user-select: none; + position: sticky; + top: 0; + z-index:2; +} + +.data-table th a { + color: inherit; + text-decoration: none; + width: 100%; + display: inline-block; + padding: 12px 16px; +} + +.data-table th a:hover { + color: var(--accent-color); +} + +.data-table tr { + background: var(--bg-white); +} + +.data-table th:first-child { + cursor: default; + left:0; + position: sticky; + z-index: 4; +} + +.data-table td:first-child { + left:0; + position: sticky; + z-index: 3; + background: inherit; +} + +.data-table th.sort-asc:after, +.data-table th.sort-desc:after { + content: ""; + font-size: 12px; + position: relative; + right: 3em; + z-index:-1; + margin-left:1em; +} + +.data-table th.sort-asc:after { + content: "▲"; + color: var(--accent-color); +} + +.data-table th.sort-desc:after { + content: "▼"; + color: var(--accent-color); +} + +.data-table td { + padding: 12px 16px; + border-bottom: 1px solid var(--border-medium); + color: var(--text-secondary); + position: relative; + max-width: 250px; vertical-align: middle; - margin-right: .7rem; - transform: translateY(-2px); - transition: transform .2s ease-out; - } +} - .drop-down::before { - transform: rotate(90deg) translateX(-3px); - } +.data-table td:first-child { + vertical-align: middle; +} - .drop-up::before { - transform: rotate(-90deg) translateX(3px); - } +.expand-icon { + position: absolute; + right: 2px; + bottom: 2px; + transition: opacity 0.2s; + cursor: pointer; + color: var(--text-muted); + background: #eee; + z-index: 10; + padding: 2px; + border-radius: 2px; + display: none; +} - .button__add { - @apply inline-block; - content: " "; - width: 24px; - height: 24px; - background: url("data:image/svg+xml;utf8,"); - } +.expand-icon:hover { + color: var(--text-secondary); +} - .button__remove { - @apply inline-block; - content: " "; - width: 24px; - height: 24px; - background: url("data:image/svg+xml;utf8,"); - } +.table-cell:hover .expand-icon, +.detail-field-value:hover .expand-icon { + display: flex; +} - .button__up { - @apply inline-block; - content: " "; - width: 24px; - height: 24px; - background: url("data:image/svg+xml;utf8,"); - } +.copy-icon { + position: absolute; + right: 6px; + bottom: 6px; + transition: opacity 0.2s; + cursor: pointer; + color: var(--text-muted); + background: #eee; + z-index: 100; + padding: 2px; + border-radius: 2px; + display: flex; + width: 20px; +} - .button__down { - @apply inline-block; - content: " "; - width: 24px; - height: 24px; - background: url("data:image/svg+xml;utf8,"); - } +.copy-icon:hover { + color: var(--text-secondary); +} + +.modal-body:hover .copy-icon { + display: flex; +} + +/* Modal */ +.modal { + display: none; + position: fixed; + top: 0; + left: 0; + right: 0; + bottom: 0; + background: rgba(0, 0, 0, 0.5); + z-index: 2000; + align-items: center; + justify-content: center; +} + +.modal-content { + background: var(--bg-white); + border-radius: 12px; + padding: 32px; + max-width: 600px; + max-height: 80vh; + overflow-y: auto; + position: relative; + box-shadow: var(--shadow-lg); +} + +.modal-header { + display: flex; + justify-content: space-between; + align-items: center; + margin-bottom: 24px; + padding-bottom: 16px; + border-bottom: 2px solid var(--border-medium); +} + +.modal-title { + font-size: 20px; + font-weight: 600; + color: var(--text-primary); +} + +.modal-close { + background: none; + border: none; + font-size: 28px; + color: var(--text-muted); + cursor: pointer; + padding: 0; + width: 32px; + height: 32px; + display: flex; + align-items: center; + justify-content: center; + border-radius: 6px; + transition: all 0.2s; +} + +.modal-close:hover { + background: var(--bg-light); + color: var(--text-primary); +} + +.modal-body { + color: var(--text-secondary); + line-height: 1.6; + position: relative; +} + +.cell-content { + display: inline-block; + max-width: calc(100% - 24px); + max-height: 60px; + overflow: hidden; + text-overflow: ellipsis; + display: -webkit-box; + -webkit-line-clamp: 3; + -webkit-box-orient: vertical; + line-height: 1.4; +} + +.cell-content * { + display: inline-block; +} + +.data-table tr:last-child td { + border-bottom: none; +} + +.data-table tr:hover { + background: var(--bg-light); +} + +.row-checkbox { + width: 18px; + height: 18px; + cursor: pointer; + accent-color: var(--accent-color); +} + +.row-checkbox:checked ~ td { + background: var(--purple-50); +} + +.data-table input[type="checkbox"]:checked { + background: var(--accent-color); +} + +.data-table tr:has(input[type="checkbox"]:checked) { + background: var(--purple-50); +} + +.data-table tr:has(input[type="checkbox"]:checked):hover { + background: var(--purple-100); +} + +.data-table th:first-child, +.data-table td:first-child { + width: 40px; + text-align: center; +} + +.status-badge { + display: inline-block; + padding: 4px 12px; + border-radius: 12px; + font-size: 12px; + font-weight: 500; +} + +.status-active { + background: var(--success-light); + color: var(--success-dark); +} + +.status-pending { + background: var(--warning-bg); + color: var(--warning-color); +} + +.status-completed { + background: var(--info-light); + color: var(--info-dark); +} + +.pagination { + display: flex; + justify-content: center; + align-items: center; + margin-top: 24px; + padding-top: 16px; + border-top: 1px solid var(--border-medium); +} + +.pagination-info { + color: var(--text-secondary); + font-size: 14px; +} + +.pagination-controls { + display: flex; + gap: 8px; + align-items: center; +} + +.pagination-btn { + padding: 6px 12px; + border: 1px solid var(--border-light); + border-radius: 6px; + background: var(--bg-white); + color: var(--text-primary); + font-size: 14px; + cursor: pointer; + transition: all 0.2s; +} + +.pagination-btn:hover:not(:disabled) { + background: var(--bg-light); + border-color: var(--accent-color); +} - @keyframes spinner { - to {transform: rotate(360deg);} - } +.pagination-btn:disabled { + opacity: var(--opacity-disabled); + cursor: not-allowed; +} - .spinner { - content: ""; - box-sizing: border-box; - width: 20px; - height: 20px; - border-radius: 50%; - border: 2px solid #ccc; - border-top-color: #000; - animation: spinner 0.6s linear infinite; - } +.pagination-info-btn { + padding: 6px 12px; + border: 1px solid var(--border-light); + border-radius: 6px; + background: var(--bg-white); + color: var(--text-secondary); + font-size: 14px; + cursor: pointer; + transition: all 0.2s; +} - input[class$="-loading"] + div nav:before { - @apply spinner; - @apply absolute; - @apply top-1; - @apply right-1; - } +.pagination-info-btn:hover { + background: var(--bg-light); + border-color: var(--accent-color); +} - .button__remove, .button__add { - @apply opacity-50; - } +.search-container { + position: relative; + max-width: 400px; + margin-bottom: 16px; +} - .button__remove:hover, .button__add:hover { - @apply opacity-100; - } +.search-input { + width: 100%; + padding: 10px 16px 10px 40px; + border: 1px solid var(--border-light); + border-radius: 8px; + font-size: 14px; + font-family: inherit; + transition: all 0.2s; +} - .search_select { - @apply flex; - @apply flex-row; - @apply content-center; - } +.search-input:focus { + outline: none; + border-color: var(--accent-color); + box-shadow: var(--focus-ring); +} - .search_select nav { - @apply w-full; - } +.search-input::placeholder { + color: var(--text-muted); +} - .search_select .button__remove { - @apply mr-1; - } +.search-icon { + position: absolute; + left: 12px; + top: 50%; + transform: translateY(-50%); + width: 18px; + height: 18px; + pointer-events: none; + opacity: var(--opacity-muted); +} - .main__content { - @apply flex; - @apply flex-col; - } +/* Edit Form View */ +.edit-view { + display: none; +} - .main__wrap { - @apply flex; - @apply overflow-hidden; - @apply h-screen; - } +.edit-view.active { + display: block; +} - .nav { - @apply overflow-y-auto; - @apply w-1/5; - @apply p-4; - } +.edit-view.hidden { + display: none; +} - .nav__list { - @apply content-center; - @apply justify-between; - } +.form-grid { + display: grid; + grid-template-columns: repeat(auto-fit, minmax(300px, 1fr)); + gap: 24px; + margin-bottom: 32px; +} - .nav__list > .nav__item:first-of-type { - @apply pb-5; - @apply text-3xl; - @apply font-bold; - @apply text-center; - } +.form-field { + display: flex; + flex-direction: column; + gap: 8px; +} - .nav__item { - @apply truncate; - } +.form-label { + font-size: 12px; + font-weight: 600; + color: var(--text-muted); + text-transform: uppercase; + letter-spacing: 0.5px; +} - .nav__item--drop { - @apply ml-1; - } +.form-input, +.form-select, +.form-textarea { + width: 100%; + padding: 10px 12px; + border: 1px solid var(--border-light); + border-radius: 6px; + font-size: 14px; + font-family: inherit; + color: var(--text-primary); + transition: all 0.2s; +} - .nav__item--drop > ul { - @apply ml-4; - } +.form-input:focus, +.form-select:focus, +.form-textarea:focus { + outline: none; + border-color: var(--accent-color); + box-shadow: var(--focus-ring); +} - .nav__item--group { - @apply nav__item; - @apply border-b; - @apply py-1; - @apply flex; - @apply flex-col; - } +.form-textarea { + height: 39px; + min-height: 39px; + resize: vertical; + padding: 10px 12px; + max-width: 30vw; +} - .nav__item--selected { - @apply nav__item; - } +.form-actions { + display: flex; + gap: 12px; + justify-content: flex-end; + padding-top: 16px; + border-top: 2px solid var(--border-medium); + margin-top: 16px; +} - .nav__item--selected a { - @apply underline; - @apply decoration-dotted; - } +.form-subsection { + grid-column: 1 / -1; + background: var(--bg-light); + padding: 24px; + border-radius: 8px; + margin-bottom: 16px; +} - .nav__item a { - @apply p-1; - @apply rounded; - } +.form-subsection-title { + font-size: 14px; + font-weight: 600; + color: var(--text-primary); + margin-bottom: 16px; + text-transform: uppercase; + letter-spacing: 0.5px; +} - .nav__item--active { - @apply p-2; - @apply truncate; - } +.form-subgrid { + display: grid; + grid-template-columns: repeat(auto-fit, minmax(250px, 1fr)); + gap: 16px; +} - .nav__item--drop { - @apply whitespace-nowrap; - } +.detail-grid { + display: grid; + grid-template-columns: repeat(auto-fit, minmax(300px, 1fr)); + gap: 24px; + margin-bottom: 32px; +} - .nav__item--drop input { - @apply hidden; - } +.detail-field { + display: flex; + flex-direction: column; + gap: 8px; +} - .nav__item--drop label { - @apply pl-1; - @apply font-bold; - cursor: pointer; - transition: all 0.25s ease-out; - } +.detail-field-label { + font-size: 12px; + font-weight: 600; + color: var(--text-muted); + text-transform: uppercase; + letter-spacing: 0.5px; +} - .nav__item--drop label { - @apply drop; - } +.detail-field-value { + font-size: 16px; + color: var(--text-primary); + max-height: calc(1lh * 3); + min-height: 1.5lh; + overflow: hidden; + display: flex; + position: relative; +} - .nav__item--drop input:checked + label { - @apply drop-down; - } +.detail-field-value > span { + display: flex; +} - .nav__item--drop ul { - @apply hidden; - } +.detail-field-value .btn, +.cell-content .btn { + padding: 4px; + margin: 2px; + cursor: default; +} - .nav__item--drop input:checked + label + ul { - @apply list-item; - } +.expand-content { + background: var(--bg-light); + padding: 16px; + border-radius: 8px; + line-height: 1.6; + color: var(--text-secondary); + overflow: scroll; + white-space: pre; + font-family: monospace; +} - .content { - @apply flex; - @apply flex-col; - @apply w-4/5; - @apply p-2; - } +.form-line .form-title { + font-size: 16px; + font-weight: 600; + color: var(--text-primary); + margin-bottom: 30px; + text-align: left; +} - .home__intro { - @apply py-2; - @apply text-xl; - } +.form-line .docs { + background: var(--info-bg); + border-left: 4px solid var(--info-color); + padding: 16px 20px; + margin-bottom: 30px; + border-radius: 8px; + color: var(--text-secondary); + font-size: 14px; + line-height: 1.6; +} - .resource__banner { - @apply grid; - @apply grid-cols-1; - @apply lg:grid-cols-2; - @apply whitespace-nowrap; - @apply overflow-x-clip; - @apply mb-2; - } +.form-line .form-group { + width: 100%; + margin-bottom: 24px; + display: flex; + align-items: flex-start; + gap: 12px; +} - .resource__title { - @apply grid; - @apply items-center; - @apply justify-items-center; - @apply lg:justify-items-end; - @apply h-full; - direction: rtl; - } +.form-line label { + display: block; + font-size: 14px; + font-weight: 500; + color: var(--text-secondary); + padding-top: 2px; + flex-shrink: 0; + min-width: 20px; +} - .resource__actions { - @apply flex-col; - @apply flex-1; - @apply items-center; - @apply grid; - @apply justify-items-center; - @apply lg:justify-items-end; - @apply whitespace-nowrap; - } +.form-line textarea { + width: 100%; + flex: 1; + padding: 8px 16px; + font-size: 15px; + border: 2px solid var(--border-light); + border-radius: 8px; + transition: all 0.3s ease; + font-family: inherit; + resize: vertical; + background: var(--bg-white); + color: var(--text-primary); +} - .resource__actions > div > * { - @apply ml-2; - } +.form-line textarea:focus { + outline: none; + border-color: var(--accent-color); + box-shadow: var(--focus-ring); +} - .resource__action { - @apply inline-flex; - @apply h-8; - } +.form-line .button-group { + display: flex; + gap: 12px; + margin-top: 32px; + width: 100%; + justify-content: flex-end; +} - .resource__action--link:hover { - @apply underline; - } +select { + background-color: #fff; +} - .resource__action--btn, .resource__action--secondary { - @apply resource__action; - @apply items-center; - @apply px-4; - @apply text-sm; - @apply transition-colors; - @apply duration-150; - @apply relative; - @apply rounded-lg; - @apply relative; - @apply whitespace-nowrap; - @apply border; - } +.btn { + text-decoration: none; +} - .resource__action--disabled { - @apply resource__action--btn; - @apply disabled; - } +.btn-danger { + background-color: var(--warning-color); + color: var(--warning-bg); + border: solid 1px var(--warning-color); +} - .resource__action--danger { - @apply resource__action--btn; - } +.btn-danger:hover { + background-color: var(--warning-hover); +} - .resource__action--drop { - @apply resource__action; - } +.nav-subitems .nav-icon { + display: none; +} - [class$="--drop"] { - @apply flex-col; - } +.detail-subtitle + .detail-subtitle::before { + content: "|"; +} - [class$="--drop"] > div { - @apply relative; - } +pre { + overflow: scroll; +} - [class$="--drop"] nav { - @apply appearance-none; - @apply hidden; - @apply absolute; - @apply left-0; - @apply border; - @apply rounded-md; - @apply pl-2; - @apply truncate; - @apply z-50; - @apply max-h-80; - @apply p-1; - } +th { + white-space: nowrap; +} - [class$="--drop"] div:first-child nav { - @apply bottom-2; - } +.cell-content { + max-width: 100%; + padding: 2px; +} - [class$="--drop"] div:last-child nav { - @apply top-1; - } +.cell-content * { + display: inline; +} - [class$="--drop"]:focus-within nav { - @apply block; - } +.modal-content { + min-width: 50%; +} - [class$="--drop"] nav a:hover { - @apply underline; - } +.edit-view { + display: block; +} - .resource__view dd { - @apply mb-3; - } +.nav-progress-section:not(:has(*)) { + display: none; +} - #index-page { - @apply overflow-x-auto; - } +.resource-link { + color: #444; + text-decoration-style: dashed; +} - .list__search { - @apply bg-transparent; - @apply flex; - @apply m-1; - } +.resource-link:hover { + color: #333; +} - .list__error { - @apply w-full; - @apply text-center; - } +.switch-container { + display: inline-block; + position: relative; +} - .list__error * { - @apply m-2; - } +/* Hide radio buttons */ +input[type="radio"] { + display: none; +} - .list__search input { - @apply px-4; - @apply py-1; - @apply w-60; - @apply border-0; - @apply h-8; - } +.switch { + width: 125px; + height: 38px; + background: #fff; + border-radius: 5.5px; + position: relative; + cursor: pointer; + border: 1px solid #d2d2d7; + overflow: hidden; +} - .list__search svg { - @apply w-5; - @apply h-5; - } +/* Background colors for each state */ +.switch-background { + position: absolute; + width: 300%; + height: 100%; + display: flex; + transition: transform 0.3s cubic-bezier(0.4, 0, 0.2, 1); + left: 0; + top: 0; +} - .resource__table { - @apply p-2; - @apply m-1; - @apply shadow-md; - @apply rounded; - @apply border-collapse; - @apply border; - @apply relative; - } +.bg-section { + width: 33.333%; + height: 100%; +} - .resource__table th { - @apply sticky; - @apply z-10; - @apply top-0; - } +/* Handle */ +.switch-handle { + position: absolute; + top: 1px; + width: 34px; + height: 34px; + background: white; + border-radius: 5.5px; + transition: transform 0.3s cubic-bezier(0.4, 0, 0.2, 1); + display: flex; + align-items: center; + justify-content: center; + font-size: 12px; + z-index: 2; + border: 1px solid #d2d2d7; +} - .table__footer > div { - @apply p-2; - @apply flex; - @apply items-center; - } +/* State transitions using radio button checked state */ +.switch-left:checked ~ .switch .switch-background { + transform: translateX(1px); +} - #footer-nav div { - @apply flex; - @apply flex-row; - @apply items-center; - @apply justify-center; - @apply w-full; - @apply font-semibold; - } +.switch-left:checked ~ .switch .switch-handle { + transform: translateX(1px); +} - #settings-modal label { - @apply bg-inherit; - @apply w-1/2; - } +.switch-left:checked ~ .switch .switch-handle::before { + content: ""; + width: 16px; + height: 16px; + background-image: url('data:image/svg+xml;utf8,'); + background-size: contain; + background-repeat: no-repeat; + flex-shrink: 0; +} - #list-filters > div:nth-child(1) { - @apply flex; - @apply justify-evenly; - } +.switch-center:checked ~ .switch .switch-background { + transform: translateX(-33.333%); +} - #list-filters div > div:nth-child(1) { - @apply flex; - } +.switch-center:checked ~ .switch .switch-handle { + transform: translateX(45px); +} - #list-filters > div > div:nth-child(2) { - @apply flex; - @apply justify-evenly; - } +.switch-center:checked ~ .switch .switch-handle::before { + content: ""; + width: 16px; + height: 16px; + background-image: url('data:image/svg+xml;utf8,'); + background-size: contain; + background-repeat: no-repeat; + flex-shrink: 0; +} - #list-filters div > div:nth-child(2) > * { - @apply w-1/4; - @apply leading-5; - } +.switch-right:checked ~ .switch .switch-background { + transform: translateX(-66.666%); +} - #list-filters > div:last-of-type { - @apply justify-start; - } +.switch-right:checked ~ .switch .switch-handle { + transform: translateX(88px); +} - .resource__table dd { - @apply mb-5; - } +.switch-right:checked ~ .switch .switch-handle::before { + content: ""; + width: 16px; + height: 16px; + background-image: url('data:image/svg+xml;utf8,'); + background-size: contain; + background-repeat: no-repeat; + flex-shrink: 0; +} - .resource__header { - @apply border; - @apply px-8; - @apply py-4; - @apply whitespace-nowrap; - } +.switch-left:checked ~ .labels .label-left, +.switch-center:checked ~ .labels .label-center, +.switch-right:checked ~ .labels .label-right { + color: #333; + font-weight: 600; + transform: scale(1.1); +} - .header__link--down { - @apply drop; - @apply drop-down; - } +/* Clickable label areas */ +.label-area { + position: absolute; + height: 35px; + width: 33.333px; + top: 0; + cursor: pointer; + z-index: 3; +} - .header__link--up { - @apply drop; - @apply drop-up; - } +.label-area.left { + left: 0; +} - [class^="resource__cell"] { - @apply px-4; - @apply py-2; - @apply h-20; - @apply relative; - } +.label-area.center { + left: 33.333px; +} - .resource__cell:not(:first-child) .cell__contents { - @apply overflow-y-auto; - } +.label-area.right { + right: 0; +} - .cell__contents { - @apply flex; - @apply flex-col; - @apply h-full; - @apply w-full; - @apply justify-center; - align-items: safe center; - } +*:disabled { + opacity: 0.5; +} - .resource__menu--drop svg { - @apply w-5; - @apply h-5; - } +select[multiple] { + height: 39px; +} - .cell__copy { - @apply cursor-pointer; - } +select[multiple]:focus-within { + height: 100px; +} - .resource__form { - @apply shadow-md; - @apply rounded; - @apply border-collapse; - @apply border; - @apply w-3/4; - @apply shadow-md; - @apply p-2; - @apply m-1; - @apply w-full; - } +/*search select*/ +.search-select-container { + position: relative; + width: 100%; +} - .form__actions { - @apply flex; - @apply justify-end; - } +.select-filter { + width: 100%; + padding: 10px; + border: 1px solid #ccc; + border-radius: 4px; + box-sizing: border-box; +} - .form__actions > * { - @apply ml-1; - } +.select-options { + display: none; + position: absolute; + top: 120%; + left: 0; + right: 0; + border: 1px solid #ccc; + border-radius: 4px; + background-color: white; + list-style: none; + margin: 0; + padding: 0; + max-height: 150px; + overflow-y: auto; + z-index: 1; +} - .table__actions { - @apply flex; - } +.search-select-container:focus-within .select-options { + display: block; +} - .table__actions * { - @apply mr-2; - } +.search-select-container .select-options:active, +.search-select-container .select-options:focus { + display: block; +} - .embed__sort, .embed__drop { - @apply hidden; - } +.select-options li { + padding: 10px; + cursor: pointer; +} - .embed__title { - @apply mb-2; - @apply uppercase; - @apply font-bold; - @apply text-lg; - } +.select-options li:hover { + background-color: #f0f0f0; +} - .embed__group { - @apply border-l; - @apply border-dashed; - @apply pb-5; - @apply relative; - @apply ml-3; - } +.search-select-container[class$="loading"] { + opacity: 0.5; +} - .embed__group .button__add { - @apply absolute; - @apply -bottom-2; - @apply -left-3; - } +.search-select-container[class$="loading"] input, +.search-select-container[class$="loading"] button { + opacity: 0.5; + pointer-events: none; +} - .embed__item > .button__remove { - @apply absolute; - @apply -top-2; - @apply -left-2; - } +input[class$="loading"] { + opacity: 0.5; + pointer-events: none; +} - .embed__item > .button__up { - @apply absolute; - @apply -top-2; - @apply -right-2; - } +input[class$="loading"] + .select-options { + content: ""; +} - .embed__item > .button__down { - @apply absolute; - @apply -bottom-2; - @apply -right-2; - } +button[class$="loading"] { + opacity: 0.5; + pointer-events: none; +} - .embed__item { - @apply relative; - @apply border; - @apply border-dotted; - @apply ml-5; - @apply mt-3; - } +.array-input-wrapper { + border: 1px solid #e2e8f0; + border-radius: 8px; + padding: 2px; + display: flex; + flex-wrap: wrap; + gap: 8px; + min-height: 39px; + transition: border-color 0.2s; +} - .embed__item > div { - @apply flex-col; - @apply p-3; - @apply grow; - } +.array-input-wrapper:focus-within { + border-color: var(--accent-color); + background: white; +} - .field__group { - @apply flex; - @apply flex-col; - @apply mb-4; - } +.array-input-wrapper .btn { + height: 32px; + padding: 0 10px; +} +@keyframes slideIn { + from { + opacity: 0; + transform: scale(0.8); + } + to { + opacity: 1; + transform: scale(1); + } +} - .field__group--disabled { - @apply field__group; - @apply disabled; - } +@keyframes fadeIn { + from { + opacity: 0; + } + to { + opacity: 0.5; + } +} - .field__label { - @apply mb-2 uppercase; - @apply font-bold; - @apply text-lg; - } +.array-input-wrapper input { + border: none; + outline: none; + flex: 1; + min-width: 120px; + font-size: 14px; + padding: 6px; + background: transparent; +} - .checkbox__group input { - @apply scale-150; - } +.array-input-wrapper input:not(:placeholder-shown) + .return-icon { + display: block; +} - .checkbox__group label { - @apply ml-1; - } +.return-icon { + display: none; + width: 20px; + height: 20px; + opacity: 0.5; + transition: opacity 0.2s; + animation: fadeIn 0.2s ease-out; + margin: 5px; +} - .checkbox__group { - @apply grid; - grid-template-columns: auto minmax(0, 1fr); - @apply gap-1; - @apply justify-items-start; - @apply ml-3; - } +.form-field.error .error-message { + color: #c15846; + font-size: 10px; + font-weight: bold; +} - .field__array--group { - @apply relative; - @apply pb-6; - } +.form-field.error input { + background: #fef2f2; +} - .field__array--row input:not(first-of-type) { - @apply mr-2; - } +.form-field.error textarea { + background: #fef2f2; +} - .field__array--group a.button__add { - @apply absolute; - @apply -left-0; - @apply -bottom-1; - } +.embed-container { + display: flex; + flex-direction: column; + gap: 30px; +} - .field__array--group > div { - @apply flex; - @apply items-center; - @apply mb-2; - } +.remove-icon { + position: absolute; + top: 6px; + left: 6px; + width: 24px; + height: 24px; + cursor: pointer; + color: #e53e3e; + transition: + color 0.2s, + opacity 0.2s; + background: none; + border: none; + padding: 0; + opacity: var(--opacity-muted); +} - .field__array--group > div > a { - @apply shrink-0; - @apply mr-2; - } +.remove-icon:hover { + color: #c53030; + opacity: 1; +} - .field__array--group input { - @apply mb-0; - } +.remove-icon svg { + width: 100%; + height: 100%; +} - .field__map--group > div { - @apply relative; - @apply pb-6; - } +.embed-section-wrapper { + margin-bottom: 15px; +} - .field__map--group a.button__remove { - @apply shrink-0; - @apply mr-2; - } +.embed-section-title-wrapper { + margin-bottom: 15px; +} - .field__map--group a.button__add { - @apply absolute; - @apply left-0; - @apply bottom-0; - } +.embed-section { + background: #f7f7f7; + padding: 25px; + padding-top: 50px; + border-radius: 8px; + position: relative; + margin-bottom: 15px; +} - .field__map--row { - @apply flex; - @apply items-center; - @apply mb-2; - } +.add-section-btn { + margin-top: 0; + width: 100%; + display: flex; + align-items: center; + justify-content: center; + gap: 8px; + padding: 16px; + background: var(--bg-white); + color: #2d3748; + border: 1px dashed var(--border-medium); + border-radius: 8px; + font-size: 15px; + font-weight: 600; + cursor: pointer; + transition: all 0.2s; +} - .field__map--row textarea { - @apply mb-0; - @apply mr-2; - @apply w-1/4; - } +.add-section-btn:hover { + border-style: solid; +} - .toast__container { - @apply fixed; - @apply w-48; - @apply z-40; - @apply rounded; - @apply p-1; - @apply text-center; - @apply border; - @apply bottom-5; - @apply text-clip; - @apply overflow-hidden; - - left: 50%; - top: auto !important; - transform: translate(-50%, -50%) !important; - } +.embed-section.odd { + position: relative; + background: #fff; + border-radius: 6px; + border: 1px solid #cbd5e0; + transition: border-color 0.2s; +} - [class^="toast__container"]:empty { - display: none; - } +.embed.subsection:hover { + border-color: #a0aec0; +} - .toast__container--info { - @apply toast__container; - top: auto !important; - transform: translate(-50%, -50%) !important; - } +.embed-section:has(.remove-icon.phx-click-loading) { + opacity: var(--opacity-disabled); + pointer-events: none; +} - .toast__container--error { - @apply toast__container; - top: auto !important; - transform: translate(-50%, -50%) !important; - } +.drag-icon { + position: absolute; + top: 6px; + right: 6px; + width: 28px; + height: 28px; + cursor: grab; + color: #718096; + transition: color 0.2s; + background: none; + border: none; + padding: 0; +} - .toast__container--success { - @apply toast__container; - top: auto !important; - transform: translate(-50%, -50%) !important; - } +.drag-icon:active { + cursor: grabbing; } -.cell__icons { - display: none; - position: absolute; - bottom: 0px; - right: 0px; - margin: 0.25rem; +.drag-icon:hover { + color: #4a5568; } -.cell__icons div { - cursor: pointer; - @apply mx-1; +.drag-icon svg { + width: 100%; + height: 100%; } -[class^="resource__cell"]:hover .cell__icons { - @apply flex; +.dragging { + opacity: 0.5; + transform: scale(0.95); + transition: + transform 0.2s, + opacity 0.2s; } -.resource__cell svg { - @apply w-6; - @apply h-6; +.drop-zone { + height: 60px; + margin: 10px 0; + border: 2px dashed #4299e1; + border-radius: 8px; + background: #ebf8ff; + align-items: center; + justify-content: center; + color: #4299e1; + font-weight: 500; + font-size: 14px; + display: none; + opacity: var(--opacity-muted); } -.field__assoc--link { - @apply leading-9; - @apply underline; - vertical-align: bottom; +.content-card:has(.tabs) { + padding: 0; } -.field__assoc--link:hover::after { - @apply leading-9; - @apply inline-block; - content: " "; - background-image: url("data:image/svg+xml,"); - width: 20px; - height: 20px; - @apply ml-2; - @apply ml-2; +.content-card:has(.tabs) .card-section { + padding: 24px; } -.modal { - @apply fixed; - @apply hidden; - @apply inset-0; - @apply bg-gray-600; - @apply bg-opacity-50; - @apply overflow-y-auto; - @apply h-full; - @apply w-full; - @apply z-50; - @apply m-0; +.tabs { + display: flex; + border-bottom: 1px solid #e5e7eb; + padding: 0px; + justify-content: right; } -.modal > div { - @apply relative; - @apply top-20; - @apply mx-auto; - @apply p-5; - @apply border; - @apply w-1/4; - @apply shadow-lg; - @apply rounded-md; - @apply bg-white; - @apply whitespace-normal; +.tabs a { + padding: 4px 2px; + font-size: 11px; + font-weight: 700; + color: #9ca3af; + background: none; + border: none; + cursor: pointer; + font-family: inherit; + letter-spacing: 0.08em; + text-transform: uppercase; + text-decoration: none; + flex: 1; + max-width: 200px; + transition: all 0.2s ease; + border-left: dashed 1px var(--border-light); + align-content: center; + text-align: center; } -.modal form { - @apply flex; - @apply flex-col; - @apply mt-3; +.tabs a:hover { + color: #6b7280; + background-color: #f9fafb; } -.modal label { - @apply flex; - @apply h-7; - @apply w-7; - @apply rounded-full; - @apply bg-gray-100; - @apply items-center; - @apply justify-center; - @apply mr-2; +.tabs a.active { + color: #1f2937; + font-weight: 700; + background-color: #f9fafb; } -.modal__title { - @apply text-lg; - @apply font-bold; - @apply border-b-2; +#main-link.active { + visibility: hidden; } -.modal__tabs { - @apply border-b-2; +#main-link { + margin-right: auto; + border: none; + border-right: 2px solid #e5e7eb; } -.modal__tabs > .modal__title--active { - @apply text-lg; - @apply font-bold; - @apply border-b-2; - @apply inline-block; - @apply mr-2; - @apply border-0; +#main-link:before { + content: "←"; + font-size: 16px; + font-weight: 400; } -.modal__tabs > .modal__title { - @apply inline-block; - @apply mr-2; - @apply border-0; - @apply cursor-pointer; +.error-box { + display: flex; + flex-direction: column; + align-items: center; + justify-content: center; + padding: 80px 40px; + text-align: center; } -.modal form > div { - @apply flex; - @apply my-1; - @apply items-center; +.error-header { + display: flex; + align-items: center; + gap: 12px; + margin-bottom: 12px; } -.modal form > input[type="submit"] { - @apply w-24; - @apply mx-auto; +.error-icon { + width: 32px; + height: 32px; + flex-shrink: 0; } +.error-icon svg { + width: 100%; + height: 100%; +} -.modal form > div:last-of-type { - @apply mb-3; +.error-header h3 { + font-size: 24px; + font-weight: 600; + color: #1a1a1a; } -.docs { - @apply whitespace-pre-wrap; - @apply block; - @apply font-mono; - @apply rounded; - @apply bg-gray-100; - @apply p-2; - @apply my-2; +.error-message { + font-size: 15px; + color: #666; + line-height: 1.6; + max-width: 500px; } + +.spinner { + width: 80px; + height: 80px; + border: 8px solid rgba(255, 255, 255, 0.3); + border-top-color: #ffffff; + border-radius: 50%; + animation: spin 1s linear infinite; + margin: 80px auto; + } + + @keyframes spin { + to { + transform: rotate(360deg); + } + } diff --git a/assets/css/default_overrides.css b/assets/css/default_overrides.css index 6de07612..e69de29b 100644 --- a/assets/css/default_overrides.css +++ b/assets/css/default_overrides.css @@ -1,71 +0,0 @@ -body { - @apply bg-white; -} - -.nav__list > .nav__item--group:first-of-type span { - @apply mt-3; - @apply bg-gradient-to-r; - @apply from-violet-500; - @apply to-purple-900; - @apply bg-clip-text; - @apply text-transparent; -} - -.resource__action--btn { - @apply bg-violet-600; - @apply border-violet-600; - @apply text-violet-50; -} - -.resource__action--btn:hover { - @apply bg-violet-900; - @apply border-violet-900; -} - -.resource__action--secondary { - @apply bg-violet-50; - @apply border-violet-50; - @apply text-violet-900; -} - -.resource__action--secondary:hover { - @apply bg-violet-300; - @apply border-violet-300; -} - -.resource__action--danger { - @apply bg-rose-500; - @apply border-rose-500; - @apply text-white; -} - -.resource__header { - @apply bg-violet-100; -} - -.nav a:hover { - @apply bg-violet-100; -} - -.toast__container--error { - @apply border-rose-500; - @apply text-rose-500; -} - -.toast__container--success { - @apply bg-lime-500; - @apply border-lime-500; -} - -.toast__container--info { - @apply bg-violet-300; - @apply border-violet-300; -} - -.job__container { - @apply text-violet-50; -} - -.job__bar { - @apply bg-violet-600; -} diff --git a/assets/esbuild.js b/assets/esbuild.js index dd180231..c834cdce 100644 --- a/assets/esbuild.js +++ b/assets/esbuild.js @@ -18,8 +18,8 @@ let opts = { target: 'es2016', outdir: '../dist/js', define: { - 'process.env.LATENCY_SIM': process.env.LATENCY_SIM || "0", - }, + 'process.env.LATENCY_SIM': process.env.LATENCY_SIM || "0", + }, } if (mode === 'watch') { opts = { diff --git a/assets/js/app.js b/assets/js/app.js index 55f02c9e..36844f2f 100644 --- a/assets/js/app.js +++ b/assets/js/app.js @@ -2,8 +2,8 @@ import "phoenix_html"; import { Socket } from "phoenix"; import { LiveSocket } from "phoenix_live_view"; import ClipboardJS from "clipboard"; -import Toastify from "toastify-js"; import topbar from "topbar"; +import {hooks as colocatedHooks} from "phoenix-colocated/live_admin"; topbar.config({ barColors: { 0: "rgb(67, 56, 202)" }, @@ -12,91 +12,121 @@ topbar.config({ }); window.addEventListener("phx:page-loading-start", (info) => topbar.show()); window.addEventListener("phx:page-loading-stop", () => topbar.hide()); -window.addEventListener("phx:success", (e) => { - Toastify({ - text: e.detail.msg, - className: "toast__container--success", - }).showToast(); -}); -window.addEventListener("phx:error", (e) => { - Toastify({ - text: e.detail.msg, - className: "toast__container--error", - }).showToast(); -}); let Hooks = {}; -Hooks.EmbedComponent = { +Hooks.ArrayInput = { mounted() { - this.el.addEventListener("live_admin:move_embed", (e) => { - const embedEl = e.target.parentElement; - const indexEl = embedEl.querySelector(".embed__index"); - const fieldEl = embedEl.parentElement; - - const newIndex = +indexEl.value + +e.target.dataset.dir; - indexEl.value = newIndex; + this.el.querySelector("input").addEventListener("input", e => e.stopPropagation()); - const targetEl = fieldEl.querySelectorAll(".embed__index")[newIndex]; - targetEl.value = +targetEl.value + +e.target.dataset.dir * -1; - - indexEl.dispatchEvent( - new Event("input", { bubbles: true, cancelable: true }), - ); + this.el.addEventListener("keydown", e => { + if (e.key === "Enter") { + e.target.blur() + e.preventDefault(); + } }); + }, + updated() { + this.el.querySelector("input").addEventListener("input", e => e.stopPropagation()); + } +}; - this.el.addEventListener("live_admin:embed_add", (e) => { - const sortInput = e.target.previousElementSibling; - sortInput.checked = true; - sortInput.dispatchEvent( - new Event("input", { bubbles: true, cancelable: true }), - ); - }); +Hooks.Show = { + setTab(el) { + const urlHash = window.location.hash || '#main'; - this.el.addEventListener("live_admin:embed_drop", (e) => { - e.target.parentElement.classList.add("hidden"); - const deleteInput = e.target.previousElementSibling; - deleteInput.checked = true; - deleteInput.dispatchEvent( - new Event("input", { bubbles: true, cancelable: true }), - ); - }); + for (tabLink of el.querySelectorAll('.tabs a')) { + const target = tabLink.getAttribute('href'); + if (target === urlHash) { + tabLink.classList.add('active'); + } else if (tabLink.getAttribute('href') !== "#main" && el.querySelector(target).querySelector(urlHash) || (el.querySelector(target).parentNode === el.querySelector(urlHash).parentElement && !tabLink.parentNode.querySelector(`:scope > a[href="${urlHash}"]`))) { + tabLink.classList.add('active'); + } else { + tabLink.classList.remove('active'); + }; + }; - this.el.addEventListener("live_admin:embed_delete", (e) => { - e.target.parentElement.classList.add("hidden"); + const currentTabContent = el.querySelector(urlHash) - const deleteInput = e.target - .closest(".embed__group") - .querySelector('input[value=""]'); - deleteInput.disabled = false; - deleteInput.dispatchEvent( - new Event("input", { bubbles: true, cancelable: true }), - ); - }); - }, -}; + for (const fieldSet of el.querySelectorAll('.card-section')) { + if (fieldSet.parentNode === currentTabContent) { + fieldSet.style.removeProperty('display') + } else { + fieldSet.style.setProperty('display', 'none'); + } + }; -Hooks.SearchSelect = { + for (const tabContent of currentTabContent.parentNode.querySelectorAll('.detail-view')) { + if (tabContent === currentTabContent) { + tabContent.style.removeProperty('display'); + } else { + tabContent.style.setProperty('display', 'none'); + } + }; + }, mounted() { - this.handleEvent("change", () => { - this.el - .querySelector("input") - .dispatchEvent(new Event("input", { bubbles: true, cancelable: true })); - }); + this.setTab(this.el); + + window.addEventListener('hashchange', () => this.setTab(this.el)); }, -}; +} -Hooks.ArrayInput = { +Hooks.Form = { mounted() { - this.handleEvent("change", () => { - this.el - .querySelector("input") - .dispatchEvent(new Event("input", { bubbles: true, cancelable: true })); + this.el.addEventListener('dragstart', (e) => { + e.target.classList.add('dragging'); + + for (const btn of this.el.querySelectorAll('.add-section-btn')) { + btn.style.setProperty('display', 'none'); + }; + + for (const zone of this.el.querySelectorAll(`.drop-zone:not([data-idx="${e.target.dataset.idx}"]):not([data-idx="${(+e.target.dataset.idx)+1}"])`)) { + zone.style.setProperty('display', 'flex'); + }; + + e.dataTransfer.setData('text/plain', e.target.dataset.idx); }); - }, -}; -Hooks.MapInput = { + + this.el.addEventListener('dragend', (e) => { + e.target.classList.remove('dragging'); + + for (const btn of this.el.querySelectorAll('.add-section-btn')) { + btn.style.removeProperty('display'); + }; + + for (const zone of this.el.querySelectorAll('.drop-zone')) { + zone.style.removeProperty('display'); + }; + }); + + this.el.addEventListener("dragover", e => { + if (e.target.classList.contains('drop-zone')) { + e.target.style.setProperty('opacity', 1); + e.preventDefault(); + } + }); + + this.el.addEventListener("dragleave", e => { + if (e.target.classList.contains('drop-zone')) { + e.target.style.removeProperty('opacity'); + e.preventDefault(); + } + }); + + this.el.addEventListener("drop", e => { + if (e.target.classList.contains('drop-zone')) { + e.preventDefault(); + const embed = e.target.parentNode.querySelector(`.embed-section[data-idx="${e.dataTransfer.getData("text/plain")}"]`) + e.target.after(embed); + + this.el.querySelector("input").dispatchEvent(new Event("change", { bubbles: true, cancelable: true })); + }; + }); + } +} + +Hooks.SearchSelect = { mounted() { this.handleEvent("change", () => { this.el @@ -106,95 +136,63 @@ Hooks.MapInput = { }, }; -Hooks.ViewPage = { +Hooks.CopyField = { mounted() { - this.el.addEventListener("live_admin:action", (e) => { - if (e.target.tagName === "FORM") { - const params = [...new FormData(e.target)].reduce( - (params, [key, val]) => { - if (key === "args[]") { - return { ...params, args: [...params.args, val] }; - } else { - return { ...params, [key]: val }; - } - }, - { args: [] }, - ); - - e.target.reset(); - - this.pushEventTo(this.el, "action", params); - } else { - this.pushEventTo(this.el, "action", { name: e.target.dataset.action }); - } - }); + new ClipboardJS(this.el.querySelectorAll('[data-clipboard-target]')) }, -}; +} Hooks.IndexPage = { mounted() { this.selected = []; - this.el.addEventListener("live_admin:action", (e) => { - if (e.target.tagName === "FORM") { - const params = [...new FormData(e.target)].reduce( - (params, [key, val]) => { - if (key === "args[]") { - return { ...params, args: [...params.args, val] }; - } else { - return { ...params, [key]: val }; - } - }, - { args: [] }, - ); - - this.pushEventTo(this.el, "action", { ...params, ids: this.selected }); - } else { - this.pushEventTo(this.el, "action", { - name: e.target.dataset.action, - ids: this.selected, - }); - } - }); - - this.el.addEventListener("live_admin:toggle_select", (e) => { - if (e.target.id === "select-all") { - this.el - .querySelectorAll(".resource__select") - .forEach((box) => (box.checked = e.target.checked)); - } else { - this.el.querySelector("#select-all").checked = false; - } - - this.selected = Array.from( - this.el.querySelectorAll("input[data-record-key]:checked"), - (e) => e.dataset.recordKey, - ); - - if (this.selected.length > 0) { - document.getElementById("footer-select").style.removeProperty("display"); - document.getElementById("footer-nav").style.display = "none"; - } else { - document.getElementById("footer-nav").style.removeProperty("display"); - document.getElementById("footer-select").style.display = "none"; - } - }); + // this.el.addEventListener("live_admin:action", (e) => { + // if (e.target.tagName === "FORM") { + // const params = [...new FormData(e.target)].reduce( + // (params, [key, val]) => { + // if (key === "args[]") { + // return { ...params, args: [...params.args, val] }; + // } else { + // return { ...params, [key]: val }; + // } + // }, + // { args: [] }, + // ); + + // this.pushEventTo(this.el, "action", { ...params, ids: this.selected }); + // } else { + // this.pushEventTo(this.el, "action", { + // name: e.target.dataset.action, + // ids: this.selected, + // }); + // } + // }); + + // this.el.addEventListener("live_admin:toggle_select", (e) => { + // if (e.target.id === "select-all") { + // this.el + // .querySelectorAll(".resource__select") + // .forEach((box) => (box.checked = e.target.checked)); + // } else { + // this.el.querySelector("#select-all").checked = false; + // } + + // this.selected = Array.from( + // this.el.querySelectorAll("input[data-record-key]:checked"), + // (e) => e.dataset.recordKey, + // ); + + // if (this.selected.length > 0) { + // document.getElementById("footer-select").style.removeProperty("display"); + // document.getElementById("footer-nav").style.display = "none"; + // } else { + // document.getElementById("footer-nav").style.removeProperty("display"); + // document.getElementById("footer-select").style.display = "none"; + // } + // }); }, updated() { this.selected = []; - - var clipboard = new ClipboardJS(this.el.querySelectorAll(".cell__copy"), { - target: function (trigger) { - return trigger.closest(".resource__cell").firstElementChild; - }, - }); - - clipboard.on("success", function (e) { - Toastify({ - text: e.trigger.dataset.message, - className: "toast__container", - }).showToast(); - }); }, }; @@ -202,7 +200,7 @@ let csrfToken = document .querySelector("meta[name='csrf-token']") .getAttribute("content"); let liveSocket = new LiveSocket("/live", Socket, { - hooks: Hooks, + hooks: {...Hooks, ...colocatedHooks}, params: { _csrf_token: csrfToken }, }); diff --git a/assets/package-lock.json b/assets/package-lock.json index 58f36862..b6de9c8e 100644 --- a/assets/package-lock.json +++ b/assets/package-lock.json @@ -1,7 +1,7 @@ { "name": "live_admin_assets", "version": "0.1.0", - "lockfileVersion": 2, + "lockfileVersion": 3, "requires": true, "packages": { "": { @@ -12,1422 +12,1599 @@ "phoenix": "file:../deps/phoenix", "phoenix_html": "file:../deps/phoenix_html", "phoenix_live_view": "file:../deps/phoenix_live_view", - "toastify-js": "^1.11.2", "topbar": "^1.0.1" }, "devDependencies": { "autoprefixer": "^10.4.1", + "cssnano": "^7.1.1", "esbuild": "^0.25.0", "postcss": "^8.4.31", - "tailwindcss": "^3.0.11" + "postcss-cli": "^11.0.1" } }, "../deps/phoenix": { - "version": "0.0.1" + "version": "1.8.1", + "license": "MIT", + "devDependencies": { + "@babel/cli": "7.28.3", + "@babel/core": "7.28.3", + "@babel/preset-env": "7.28.3", + "@eslint/js": "^9.28.0", + "@stylistic/eslint-plugin": "^5.0.0", + "documentation": "^14.0.3", + "eslint": "9.34.0", + "eslint-plugin-jest": "29.0.1", + "jest": "^30.0.0", + "jest-environment-jsdom": "^30.0.0", + "jsdom": "^26.1.0", + "mock-socket": "^9.3.1" + } }, "../deps/phoenix_html": { - "version": "0.0.1" + "version": "4.3.0" }, "../deps/phoenix_live_view": { - "version": "0.0.1" - }, - "node_modules/@babel/code-frame": { - "version": "7.16.7", - "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.16.7.tgz", - "integrity": "sha512-iAXqUn8IIeBTNd72xsFlgaXHkMBMt6y4HJp1tIaK465CWLT/fG1aqB7ykr95gHHmlBdGbFeWWfyB4NJJ0nmeIg==", - "dev": true, + "version": "1.1.14", + "license": "MIT", "dependencies": { - "@babel/highlight": "^7.16.7" + "morphdom": "2.7.7" }, + "devDependencies": { + "@babel/cli": "7.27.2", + "@babel/core": "7.27.4", + "@babel/preset-env": "7.27.2", + "@babel/preset-typescript": "^7.27.1", + "@eslint/js": "^9.29.0", + "@playwright/test": "^1.53.0", + "@types/jest": "^30.0.0", + "@types/phoenix": "^1.6.6", + "css.escape": "^1.5.1", + "eslint": "9.29.0", + "eslint-plugin-jest": "28.14.0", + "eslint-plugin-playwright": "^2.2.0", + "globals": "^16.2.0", + "jest": "^30.0.0", + "jest-environment-jsdom": "^30.0.0", + "jest-monocart-coverage": "^1.1.1", + "monocart-reporter": "^2.9.21", + "phoenix": "1.7.21", + "prettier": "3.5.3", + "ts-jest": "^29.4.0", + "typescript": "^5.8.3", + "typescript-eslint": "^8.34.0" + } + }, + "node_modules/@esbuild/linux-arm64": { + "version": "0.25.0", + "resolved": "https://registry.npmjs.org/@esbuild/linux-arm64/-/linux-arm64-0.25.0.tgz", + "integrity": "sha512-9QAQjTWNDM/Vk2bgBl17yWuZxZNQIF0OUUuPZRKoDtqF2k4EtYbpyiG5/Dk7nqeK6kIJWPYldkOcBqjXjrUlmg==", + "cpu": [ + "arm64" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ], "engines": { - "node": ">=6.9.0" + "node": ">=18" } }, - "node_modules/@babel/helper-validator-identifier": { - "version": "7.16.7", - "resolved": "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.16.7.tgz", - "integrity": "sha512-hsEnFemeiW4D08A5gUAZxLBTXpZ39P+a+DGDsHw1yxqyQ/jzFEnxf5uTEGp+3bzAbNOxU1paTgYS4ECU/IgfDw==", + "node_modules/ansi-regex": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz", + "integrity": "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==", "dev": true, + "license": "MIT", "engines": { - "node": ">=6.9.0" + "node": ">=8" } }, - "node_modules/@babel/highlight": { - "version": "7.16.7", - "resolved": "https://registry.npmjs.org/@babel/highlight/-/highlight-7.16.7.tgz", - "integrity": "sha512-aKpPMfLvGO3Q97V0qhw/V2SWNWlwfJknuwAunU7wZLSfrM4xTBvg7E5opUVi1kJTBKihE38CPg4nBiqX83PWYw==", + "node_modules/ansi-styles": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", + "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", "dev": true, "dependencies": { - "@babel/helper-validator-identifier": "^7.16.7", - "chalk": "^2.0.0", - "js-tokens": "^4.0.0" + "color-convert": "^2.0.1" }, "engines": { - "node": ">=6.9.0" + "node": ">=8" + }, + "funding": { + "url": "https://github.com/chalk/ansi-styles?sponsor=1" } }, - "node_modules/@babel/highlight/node_modules/ansi-styles": { - "version": "3.2.1", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz", - "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==", + "node_modules/anymatch": { + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/anymatch/-/anymatch-3.1.2.tgz", + "integrity": "sha512-P43ePfOAIupkguHUycrc4qJ9kz8ZiuOUijaETwX7THt0Y/GNK7v0aa8rY816xWjZ7rJdA5XdMcpVFTKMq+RvWg==", "dev": true, "dependencies": { - "color-convert": "^1.9.0" + "normalize-path": "^3.0.0", + "picomatch": "^2.0.4" }, "engines": { - "node": ">=4" + "node": ">= 8" } }, - "node_modules/@babel/highlight/node_modules/chalk": { - "version": "2.4.2", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz", - "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==", + "node_modules/autoprefixer": { + "version": "10.4.1", + "resolved": "https://registry.npmjs.org/autoprefixer/-/autoprefixer-10.4.1.tgz", + "integrity": "sha512-B3ZEG7wtzXDRCEFsan7HmR2AeNsxdJB0+sEC0Hc5/c2NbhJqPwuZm+tn233GBVw82L+6CtD6IPSfVruwKjfV3A==", "dev": true, "dependencies": { - "ansi-styles": "^3.2.1", - "escape-string-regexp": "^1.0.5", - "supports-color": "^5.3.0" + "browserslist": "^4.19.1", + "caniuse-lite": "^1.0.30001294", + "fraction.js": "^4.1.2", + "normalize-range": "^0.1.2", + "picocolors": "^1.0.0", + "postcss-value-parser": "^4.2.0" + }, + "bin": { + "autoprefixer": "bin/autoprefixer" }, "engines": { - "node": ">=4" + "node": "^10 || ^12 || >=14" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/postcss/" + }, + "peerDependencies": { + "postcss": "^8.1.0" } }, - "node_modules/@babel/highlight/node_modules/color-convert": { - "version": "1.9.3", - "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-1.9.3.tgz", - "integrity": "sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg==", + "node_modules/baseline-browser-mapping": { + "version": "2.9.10", + "resolved": "https://registry.npmjs.org/baseline-browser-mapping/-/baseline-browser-mapping-2.9.10.tgz", + "integrity": "sha512-2VIKvDx8Z1a9rTB2eCkdPE5nSe28XnA+qivGnWHoB40hMMt/h1hSz0960Zqsn6ZyxWXUie0EBdElKv8may20AA==", "dev": true, - "dependencies": { - "color-name": "1.1.3" + "license": "Apache-2.0", + "bin": { + "baseline-browser-mapping": "dist/cli.js" } }, - "node_modules/@babel/highlight/node_modules/color-name": { - "version": "1.1.3", - "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.3.tgz", - "integrity": "sha1-p9BVi9icQveV3UIyj3QIMcpTvCU=", - "dev": true - }, - "node_modules/@babel/highlight/node_modules/has-flag": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz", - "integrity": "sha1-tdRU3CGZriJWmfNGfloH87lVuv0=", + "node_modules/binary-extensions": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/binary-extensions/-/binary-extensions-2.2.0.tgz", + "integrity": "sha512-jDctJ/IVQbZoJykoeHbhXpOlNBqGNcwXJKJog42E5HDPUwQTSdjCHdihjj0DlnheQ7blbT6dHOafNAiS8ooQKA==", "dev": true, "engines": { - "node": ">=4" + "node": ">=8" } }, - "node_modules/@babel/highlight/node_modules/supports-color": { - "version": "5.5.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz", - "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==", + "node_modules/boolbase": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/boolbase/-/boolbase-1.0.0.tgz", + "integrity": "sha512-JZOSA7Mo9sNGB8+UjSgzdLtokWAky1zbztM3WRLCbZ70/3cTANmQmOdR7y2g+J0e2WXywy1yS468tY+IruqEww==", + "dev": true, + "license": "ISC" + }, + "node_modules/braces": { + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/braces/-/braces-3.0.3.tgz", + "integrity": "sha512-yQbXgO/OSZVD2IsiLlro+7Hf6Q18EJrKSEsdoMzKePKXct3gvD8oLcOQdIzGupr5Fj+EDe8gO/lxc1BzfMpxvA==", "dev": true, "dependencies": { - "has-flag": "^3.0.0" + "fill-range": "^7.1.1" }, "engines": { - "node": ">=4" + "node": ">=8" } }, - "node_modules/@esbuild/aix-ppc64": { - "version": "0.25.0", - "resolved": "https://registry.npmjs.org/@esbuild/aix-ppc64/-/aix-ppc64-0.25.0.tgz", - "integrity": "sha512-O7vun9Sf8DFjH2UtqK8Ku3LkquL9SZL8OLY1T5NZkA34+wG3OQF7cl4Ql8vdNzM6fzBbYfLaiRLIOZ+2FOCgBQ==", - "cpu": [ - "ppc64" - ], + "node_modules/browserslist": { + "version": "4.28.1", + "resolved": "https://registry.npmjs.org/browserslist/-/browserslist-4.28.1.tgz", + "integrity": "sha512-ZC5Bd0LgJXgwGqUknZY/vkUQ04r8NXnJZ3yYi4vDmSiZmC/pdSN0NbNRPxZpbtO4uAfDUAFffO8IZoM3Gj8IkA==", "dev": true, - "optional": true, - "os": [ - "aix" + "funding": [ + { + "type": "opencollective", + "url": "https://opencollective.com/browserslist" + }, + { + "type": "tidelift", + "url": "https://tidelift.com/funding/github/npm/browserslist" + }, + { + "type": "github", + "url": "https://github.com/sponsors/ai" + } ], + "license": "MIT", + "dependencies": { + "baseline-browser-mapping": "^2.9.0", + "caniuse-lite": "^1.0.30001759", + "electron-to-chromium": "^1.5.263", + "node-releases": "^2.0.27", + "update-browserslist-db": "^1.2.0" + }, + "bin": { + "browserslist": "cli.js" + }, "engines": { - "node": ">=18" + "node": "^6 || ^7 || ^8 || ^9 || ^10 || ^11 || ^12 || >=13.7" } }, - "node_modules/@esbuild/android-arm": { - "version": "0.25.0", - "resolved": "https://registry.npmjs.org/@esbuild/android-arm/-/android-arm-0.25.0.tgz", - "integrity": "sha512-PTyWCYYiU0+1eJKmw21lWtC+d08JDZPQ5g+kFyxP0V+es6VPPSUhM6zk8iImp2jbV6GwjX4pap0JFbUQN65X1g==", - "cpu": [ - "arm" - ], + "node_modules/caniuse-api": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/caniuse-api/-/caniuse-api-3.0.0.tgz", + "integrity": "sha512-bsTwuIg/BZZK/vreVTYYbSWoe2F+71P7K5QGEX+pT250DZbfU1MQ5prOKpPR+LL6uWKK3KMwMCAS74QB3Um1uw==", "dev": true, - "optional": true, - "os": [ - "android" - ], - "engines": { - "node": ">=18" + "license": "MIT", + "dependencies": { + "browserslist": "^4.0.0", + "caniuse-lite": "^1.0.0", + "lodash.memoize": "^4.1.2", + "lodash.uniq": "^4.5.0" } }, - "node_modules/@esbuild/android-arm64": { - "version": "0.25.0", - "resolved": "https://registry.npmjs.org/@esbuild/android-arm64/-/android-arm64-0.25.0.tgz", - "integrity": "sha512-grvv8WncGjDSyUBjN9yHXNt+cq0snxXbDxy5pJtzMKGmmpPxeAmAhWxXI+01lU5rwZomDgD3kJwulEnhTRUd6g==", - "cpu": [ - "arm64" - ], + "node_modules/caniuse-lite": { + "version": "1.0.30001760", + "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001760.tgz", + "integrity": "sha512-7AAMPcueWELt1p3mi13HR/LHH0TJLT11cnwDJEs3xA4+CK/PLKeO9Kl1oru24htkyUKtkGCvAx4ohB0Ttry8Dw==", "dev": true, - "optional": true, - "os": [ - "android" + "funding": [ + { + "type": "opencollective", + "url": "https://opencollective.com/browserslist" + }, + { + "type": "tidelift", + "url": "https://tidelift.com/funding/github/npm/caniuse-lite" + }, + { + "type": "github", + "url": "https://github.com/sponsors/ai" + } ], - "engines": { - "node": ">=18" - } + "license": "CC-BY-4.0" }, - "node_modules/@esbuild/android-x64": { - "version": "0.25.0", - "resolved": "https://registry.npmjs.org/@esbuild/android-x64/-/android-x64-0.25.0.tgz", - "integrity": "sha512-m/ix7SfKG5buCnxasr52+LI78SQ+wgdENi9CqyCXwjVR2X4Jkz+BpC3le3AoBPYTC9NHklwngVXvbJ9/Akhrfg==", - "cpu": [ - "x64" - ], + "node_modules/chokidar": { + "version": "3.5.2", + "resolved": "https://registry.npmjs.org/chokidar/-/chokidar-3.5.2.tgz", + "integrity": "sha512-ekGhOnNVPgT77r4K/U3GDhu+FQ2S8TnK/s2KbIGXi0SZWuwkZ2QNyfWdZW+TVfn84DpEP7rLeCt2UI6bJ8GwbQ==", "dev": true, - "optional": true, - "os": [ - "android" - ], + "dependencies": { + "anymatch": "~3.1.2", + "braces": "~3.0.2", + "glob-parent": "~5.1.2", + "is-binary-path": "~2.1.0", + "is-glob": "~4.0.1", + "normalize-path": "~3.0.0", + "readdirp": "~3.6.0" + }, "engines": { - "node": ">=18" + "node": ">= 8.10.0" + }, + "optionalDependencies": { + "fsevents": "~2.3.2" } }, - "node_modules/@esbuild/darwin-arm64": { - "version": "0.25.0", - "resolved": "https://registry.npmjs.org/@esbuild/darwin-arm64/-/darwin-arm64-0.25.0.tgz", - "integrity": "sha512-mVwdUb5SRkPayVadIOI78K7aAnPamoeFR2bT5nszFUZ9P8UpK4ratOdYbZZXYSqPKMHfS1wdHCJk1P1EZpRdvw==", - "cpu": [ - "arm64" - ], + "node_modules/chokidar/node_modules/glob-parent": { + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-5.1.2.tgz", + "integrity": "sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==", "dev": true, - "optional": true, - "os": [ - "darwin" - ], + "dependencies": { + "is-glob": "^4.0.1" + }, "engines": { - "node": ">=18" + "node": ">= 6" } }, - "node_modules/@esbuild/darwin-x64": { - "version": "0.25.0", - "resolved": "https://registry.npmjs.org/@esbuild/darwin-x64/-/darwin-x64-0.25.0.tgz", - "integrity": "sha512-DgDaYsPWFTS4S3nWpFcMn/33ZZwAAeAFKNHNa1QN0rI4pUjgqf0f7ONmXf6d22tqTY+H9FNdgeaAa+YIFUn2Rg==", - "cpu": [ - "x64" - ], - "dev": true, - "optional": true, - "os": [ - "darwin" - ], - "engines": { - "node": ">=18" + "node_modules/clipboard": { + "version": "2.0.10", + "resolved": "https://registry.npmjs.org/clipboard/-/clipboard-2.0.10.tgz", + "integrity": "sha512-cz3m2YVwFz95qSEbCDi2fzLN/epEN9zXBvfgAoGkvGOJZATMl9gtTDVOtBYkx2ODUJl2kvmud7n32sV2BpYR4g==", + "dependencies": { + "good-listener": "^1.2.2", + "select": "^1.1.2", + "tiny-emitter": "^2.0.0" } }, - "node_modules/@esbuild/freebsd-arm64": { - "version": "0.25.0", - "resolved": "https://registry.npmjs.org/@esbuild/freebsd-arm64/-/freebsd-arm64-0.25.0.tgz", - "integrity": "sha512-VN4ocxy6dxefN1MepBx/iD1dH5K8qNtNe227I0mnTRjry8tj5MRk4zprLEdG8WPyAPb93/e4pSgi1SoHdgOa4w==", - "cpu": [ - "arm64" - ], + "node_modules/cliui": { + "version": "8.0.1", + "resolved": "https://registry.npmjs.org/cliui/-/cliui-8.0.1.tgz", + "integrity": "sha512-BSeNnyus75C4//NQ9gQt1/csTXyo/8Sb+afLAkzAptFuMsod9HFokGNudZpi/oQV73hnVK+sR+5PVRMd+Dr7YQ==", "dev": true, - "optional": true, - "os": [ - "freebsd" - ], + "license": "ISC", + "dependencies": { + "string-width": "^4.2.0", + "strip-ansi": "^6.0.1", + "wrap-ansi": "^7.0.0" + }, "engines": { - "node": ">=18" + "node": ">=12" } }, - "node_modules/@esbuild/freebsd-x64": { - "version": "0.25.0", - "resolved": "https://registry.npmjs.org/@esbuild/freebsd-x64/-/freebsd-x64-0.25.0.tgz", - "integrity": "sha512-mrSgt7lCh07FY+hDD1TxiTyIHyttn6vnjesnPoVDNmDfOmggTLXRv8Id5fNZey1gl/V2dyVK1VXXqVsQIiAk+A==", - "cpu": [ - "x64" - ], + "node_modules/color-convert": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", + "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", "dev": true, - "optional": true, - "os": [ - "freebsd" - ], + "dependencies": { + "color-name": "~1.1.4" + }, "engines": { - "node": ">=18" + "node": ">=7.0.0" } }, - "node_modules/@esbuild/linux-arm": { - "version": "0.25.0", - "resolved": "https://registry.npmjs.org/@esbuild/linux-arm/-/linux-arm-0.25.0.tgz", - "integrity": "sha512-vkB3IYj2IDo3g9xX7HqhPYxVkNQe8qTK55fraQyTzTX/fxaDtXiEnavv9geOsonh2Fd2RMB+i5cbhu2zMNWJwg==", - "cpu": [ - "arm" - ], + "node_modules/color-name": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", + "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", + "dev": true + }, + "node_modules/colord": { + "version": "2.9.3", + "resolved": "https://registry.npmjs.org/colord/-/colord-2.9.3.tgz", + "integrity": "sha512-jeC1axXpnb0/2nn/Y1LPuLdgXBLH7aDcHu4KEKfqw3CUhX7ZpfBSlPKyqXE6btIgEzfWtrX3/tyBCaCvXvMkOw==", "dev": true, - "optional": true, - "os": [ - "linux" - ], + "license": "MIT" + }, + "node_modules/commander": { + "version": "11.1.0", + "resolved": "https://registry.npmjs.org/commander/-/commander-11.1.0.tgz", + "integrity": "sha512-yPVavfyCcRhmorC7rWlkHn15b4wDVgVmBA7kV4QVBsF7kv/9TKJAbAXVTxvTnwP8HHKjRCJDClKbciiYS7p0DQ==", + "dev": true, + "license": "MIT", "engines": { - "node": ">=18" + "node": ">=16" } }, - "node_modules/@esbuild/linux-arm64": { - "version": "0.25.0", - "resolved": "https://registry.npmjs.org/@esbuild/linux-arm64/-/linux-arm64-0.25.0.tgz", - "integrity": "sha512-9QAQjTWNDM/Vk2bgBl17yWuZxZNQIF0OUUuPZRKoDtqF2k4EtYbpyiG5/Dk7nqeK6kIJWPYldkOcBqjXjrUlmg==", - "cpu": [ - "arm64" - ], + "node_modules/css-declaration-sorter": { + "version": "7.3.0", + "resolved": "https://registry.npmjs.org/css-declaration-sorter/-/css-declaration-sorter-7.3.0.tgz", + "integrity": "sha512-LQF6N/3vkAMYF4xoHLJfG718HRJh34Z8BnNhd6bosOMIVjMlhuZK5++oZa3uYAgrI5+7x2o27gUqTR2U/KjUOQ==", "dev": true, - "optional": true, - "os": [ - "linux" - ], + "license": "ISC", "engines": { - "node": ">=18" + "node": "^14 || ^16 || >=18" + }, + "peerDependencies": { + "postcss": "^8.0.9" } }, - "node_modules/@esbuild/linux-ia32": { - "version": "0.25.0", - "resolved": "https://registry.npmjs.org/@esbuild/linux-ia32/-/linux-ia32-0.25.0.tgz", - "integrity": "sha512-43ET5bHbphBegyeqLb7I1eYn2P/JYGNmzzdidq/w0T8E2SsYL1U6un2NFROFRg1JZLTzdCoRomg8Rvf9M6W6Gg==", - "cpu": [ - "ia32" - ], + "node_modules/css-select": { + "version": "5.2.2", + "resolved": "https://registry.npmjs.org/css-select/-/css-select-5.2.2.tgz", + "integrity": "sha512-TizTzUddG/xYLA3NXodFM0fSbNizXjOKhqiQQwvhlspadZokn1KDy0NZFS0wuEubIYAV5/c1/lAr0TaaFXEXzw==", "dev": true, - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">=18" + "license": "BSD-2-Clause", + "dependencies": { + "boolbase": "^1.0.0", + "css-what": "^6.1.0", + "domhandler": "^5.0.2", + "domutils": "^3.0.1", + "nth-check": "^2.0.1" + }, + "funding": { + "url": "https://github.com/sponsors/fb55" } }, - "node_modules/@esbuild/linux-loong64": { - "version": "0.25.0", - "resolved": "https://registry.npmjs.org/@esbuild/linux-loong64/-/linux-loong64-0.25.0.tgz", - "integrity": "sha512-fC95c/xyNFueMhClxJmeRIj2yrSMdDfmqJnyOY4ZqsALkDrrKJfIg5NTMSzVBr5YW1jf+l7/cndBfP3MSDpoHw==", - "cpu": [ - "loong64" - ], + "node_modules/css-tree": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/css-tree/-/css-tree-3.1.0.tgz", + "integrity": "sha512-0eW44TGN5SQXU1mWSkKwFstI/22X2bG1nYzZTYMAWjylYURhse752YgbE4Cx46AC+bAvI+/dYTPRk1LqSUnu6w==", "dev": true, - "optional": true, - "os": [ - "linux" - ], + "license": "MIT", + "dependencies": { + "mdn-data": "2.12.2", + "source-map-js": "^1.0.1" + }, "engines": { - "node": ">=18" + "node": "^10 || ^12.20.0 || ^14.13.0 || >=15.0.0" } }, - "node_modules/@esbuild/linux-mips64el": { - "version": "0.25.0", - "resolved": "https://registry.npmjs.org/@esbuild/linux-mips64el/-/linux-mips64el-0.25.0.tgz", - "integrity": "sha512-nkAMFju7KDW73T1DdH7glcyIptm95a7Le8irTQNO/qtkoyypZAnjchQgooFUDQhNAy4iu08N79W4T4pMBwhPwQ==", - "cpu": [ - "mips64el" - ], + "node_modules/css-what": { + "version": "6.2.2", + "resolved": "https://registry.npmjs.org/css-what/-/css-what-6.2.2.tgz", + "integrity": "sha512-u/O3vwbptzhMs3L1fQE82ZSLHQQfto5gyZzwteVIEyeaY5Fc7R4dapF/BvRoSYFeqfBk4m0V1Vafq5Pjv25wvA==", "dev": true, - "optional": true, - "os": [ - "linux" - ], + "license": "BSD-2-Clause", "engines": { - "node": ">=18" + "node": ">= 6" + }, + "funding": { + "url": "https://github.com/sponsors/fb55" } }, - "node_modules/@esbuild/linux-ppc64": { - "version": "0.25.0", - "resolved": "https://registry.npmjs.org/@esbuild/linux-ppc64/-/linux-ppc64-0.25.0.tgz", - "integrity": "sha512-NhyOejdhRGS8Iwv+KKR2zTq2PpysF9XqY+Zk77vQHqNbo/PwZCzB5/h7VGuREZm1fixhs4Q/qWRSi5zmAiO4Fw==", - "cpu": [ - "ppc64" - ], + "node_modules/cssesc": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/cssesc/-/cssesc-3.0.0.tgz", + "integrity": "sha512-/Tb/JcjK111nNScGob5MNtsntNM1aCNUDipB/TkwZFhyDrrE47SOx/18wF2bbjgc3ZzCSKW1T5nt5EbFoAz/Vg==", "dev": true, - "optional": true, - "os": [ - "linux" - ], + "bin": { + "cssesc": "bin/cssesc" + }, "engines": { - "node": ">=18" + "node": ">=4" } }, - "node_modules/@esbuild/linux-riscv64": { - "version": "0.25.0", - "resolved": "https://registry.npmjs.org/@esbuild/linux-riscv64/-/linux-riscv64-0.25.0.tgz", - "integrity": "sha512-5S/rbP5OY+GHLC5qXp1y/Mx//e92L1YDqkiBbO9TQOvuFXM+iDqUNG5XopAnXoRH3FjIUDkeGcY1cgNvnXp/kA==", - "cpu": [ - "riscv64" - ], + "node_modules/cssnano": { + "version": "7.1.2", + "resolved": "https://registry.npmjs.org/cssnano/-/cssnano-7.1.2.tgz", + "integrity": "sha512-HYOPBsNvoiFeR1eghKD5C3ASm64v9YVyJB4Ivnl2gqKoQYvjjN/G0rztvKQq8OxocUtC6sjqY8jwYngIB4AByA==", "dev": true, - "optional": true, - "os": [ - "linux" - ], + "license": "MIT", + "dependencies": { + "cssnano-preset-default": "^7.0.10", + "lilconfig": "^3.1.3" + }, "engines": { - "node": ">=18" + "node": "^18.12.0 || ^20.9.0 || >=22.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/cssnano" + }, + "peerDependencies": { + "postcss": "^8.4.32" } }, - "node_modules/@esbuild/linux-s390x": { - "version": "0.25.0", - "resolved": "https://registry.npmjs.org/@esbuild/linux-s390x/-/linux-s390x-0.25.0.tgz", - "integrity": "sha512-XM2BFsEBz0Fw37V0zU4CXfcfuACMrppsMFKdYY2WuTS3yi8O1nFOhil/xhKTmE1nPmVyvQJjJivgDT+xh8pXJA==", - "cpu": [ - "s390x" - ], + "node_modules/cssnano-preset-default": { + "version": "7.0.10", + "resolved": "https://registry.npmjs.org/cssnano-preset-default/-/cssnano-preset-default-7.0.10.tgz", + "integrity": "sha512-6ZBjW0Lf1K1Z+0OKUAUpEN62tSXmYChXWi2NAA0afxEVsj9a+MbcB1l5qel6BHJHmULai2fCGRthCeKSFbScpA==", "dev": true, - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">=18" + "license": "MIT", + "dependencies": { + "browserslist": "^4.27.0", + "css-declaration-sorter": "^7.2.0", + "cssnano-utils": "^5.0.1", + "postcss-calc": "^10.1.1", + "postcss-colormin": "^7.0.5", + "postcss-convert-values": "^7.0.8", + "postcss-discard-comments": "^7.0.5", + "postcss-discard-duplicates": "^7.0.2", + "postcss-discard-empty": "^7.0.1", + "postcss-discard-overridden": "^7.0.1", + "postcss-merge-longhand": "^7.0.5", + "postcss-merge-rules": "^7.0.7", + "postcss-minify-font-values": "^7.0.1", + "postcss-minify-gradients": "^7.0.1", + "postcss-minify-params": "^7.0.5", + "postcss-minify-selectors": "^7.0.5", + "postcss-normalize-charset": "^7.0.1", + "postcss-normalize-display-values": "^7.0.1", + "postcss-normalize-positions": "^7.0.1", + "postcss-normalize-repeat-style": "^7.0.1", + "postcss-normalize-string": "^7.0.1", + "postcss-normalize-timing-functions": "^7.0.1", + "postcss-normalize-unicode": "^7.0.5", + "postcss-normalize-url": "^7.0.1", + "postcss-normalize-whitespace": "^7.0.1", + "postcss-ordered-values": "^7.0.2", + "postcss-reduce-initial": "^7.0.5", + "postcss-reduce-transforms": "^7.0.1", + "postcss-svgo": "^7.1.0", + "postcss-unique-selectors": "^7.0.4" + }, + "engines": { + "node": "^18.12.0 || ^20.9.0 || >=22.0" + }, + "peerDependencies": { + "postcss": "^8.4.32" } }, - "node_modules/@esbuild/linux-x64": { - "version": "0.25.0", - "resolved": "https://registry.npmjs.org/@esbuild/linux-x64/-/linux-x64-0.25.0.tgz", - "integrity": "sha512-9yl91rHw/cpwMCNytUDxwj2XjFpxML0y9HAOH9pNVQDpQrBxHy01Dx+vaMu0N1CKa/RzBD2hB4u//nfc+Sd3Cw==", - "cpu": [ - "x64" - ], + "node_modules/cssnano-utils": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/cssnano-utils/-/cssnano-utils-5.0.1.tgz", + "integrity": "sha512-ZIP71eQgG9JwjVZsTPSqhc6GHgEr53uJ7tK5///VfyWj6Xp2DBmixWHqJgPno+PqATzn48pL42ww9x5SSGmhZg==", "dev": true, - "optional": true, - "os": [ - "linux" - ], + "license": "MIT", "engines": { - "node": ">=18" + "node": "^18.12.0 || ^20.9.0 || >=22.0" + }, + "peerDependencies": { + "postcss": "^8.4.32" } }, - "node_modules/@esbuild/netbsd-arm64": { - "version": "0.25.0", - "resolved": "https://registry.npmjs.org/@esbuild/netbsd-arm64/-/netbsd-arm64-0.25.0.tgz", - "integrity": "sha512-RuG4PSMPFfrkH6UwCAqBzauBWTygTvb1nxWasEJooGSJ/NwRw7b2HOwyRTQIU97Hq37l3npXoZGYMy3b3xYvPw==", - "cpu": [ - "arm64" - ], + "node_modules/cssnano/node_modules/lilconfig": { + "version": "3.1.3", + "resolved": "https://registry.npmjs.org/lilconfig/-/lilconfig-3.1.3.tgz", + "integrity": "sha512-/vlFKAoH5Cgt3Ie+JLhRbwOsCQePABiU3tJ1egGvyQ+33R/vcwM2Zl2QR/LzjsBeItPt3oSVXapn+m4nQDvpzw==", "dev": true, - "optional": true, - "os": [ - "netbsd" - ], + "license": "MIT", "engines": { - "node": ">=18" + "node": ">=14" + }, + "funding": { + "url": "https://github.com/sponsors/antonk52" } }, - "node_modules/@esbuild/netbsd-x64": { - "version": "0.25.0", - "resolved": "https://registry.npmjs.org/@esbuild/netbsd-x64/-/netbsd-x64-0.25.0.tgz", - "integrity": "sha512-jl+qisSB5jk01N5f7sPCsBENCOlPiS/xptD5yxOx2oqQfyourJwIKLRA2yqWdifj3owQZCL2sn6o08dBzZGQzA==", - "cpu": [ - "x64" - ], + "node_modules/csso": { + "version": "5.0.5", + "resolved": "https://registry.npmjs.org/csso/-/csso-5.0.5.tgz", + "integrity": "sha512-0LrrStPOdJj+SPCCrGhzryycLjwcgUSHBtxNA8aIDxf0GLsRh1cKYhB00Gd1lDOS4yGH69+SNn13+TWbVHETFQ==", "dev": true, - "optional": true, - "os": [ - "netbsd" - ], + "license": "MIT", + "dependencies": { + "css-tree": "~2.2.0" + }, "engines": { - "node": ">=18" + "node": "^10 || ^12.20.0 || ^14.13.0 || >=15.0.0", + "npm": ">=7.0.0" } }, - "node_modules/@esbuild/openbsd-arm64": { - "version": "0.25.0", - "resolved": "https://registry.npmjs.org/@esbuild/openbsd-arm64/-/openbsd-arm64-0.25.0.tgz", - "integrity": "sha512-21sUNbq2r84YE+SJDfaQRvdgznTD8Xc0oc3p3iW/a1EVWeNj/SdUCbm5U0itZPQYRuRTW20fPMWMpcrciH2EJw==", - "cpu": [ - "arm64" - ], + "node_modules/csso/node_modules/css-tree": { + "version": "2.2.1", + "resolved": "https://registry.npmjs.org/css-tree/-/css-tree-2.2.1.tgz", + "integrity": "sha512-OA0mILzGc1kCOCSJerOeqDxDQ4HOh+G8NbOJFOTgOCzpw7fCBubk0fEyxp8AgOL/jvLgYA/uV0cMbe43ElF1JA==", "dev": true, - "optional": true, - "os": [ - "openbsd" - ], + "license": "MIT", + "dependencies": { + "mdn-data": "2.0.28", + "source-map-js": "^1.0.1" + }, "engines": { - "node": ">=18" + "node": "^10 || ^12.20.0 || ^14.13.0 || >=15.0.0", + "npm": ">=7.0.0" } }, - "node_modules/@esbuild/openbsd-x64": { - "version": "0.25.0", - "resolved": "https://registry.npmjs.org/@esbuild/openbsd-x64/-/openbsd-x64-0.25.0.tgz", - "integrity": "sha512-2gwwriSMPcCFRlPlKx3zLQhfN/2WjJ2NSlg5TKLQOJdV0mSxIcYNTMhk3H3ulL/cak+Xj0lY1Ym9ysDV1igceg==", - "cpu": [ - "x64" - ], + "node_modules/csso/node_modules/mdn-data": { + "version": "2.0.28", + "resolved": "https://registry.npmjs.org/mdn-data/-/mdn-data-2.0.28.tgz", + "integrity": "sha512-aylIc7Z9y4yzHYAJNuESG3hfhC+0Ibp/MAMiaOZgNv4pmEdFyfZhhhny4MNiAfWdBQ1RQ2mfDWmM1x8SvGyp8g==", "dev": true, - "optional": true, - "os": [ - "openbsd" - ], - "engines": { - "node": ">=18" - } + "license": "CC0-1.0" }, - "node_modules/@esbuild/sunos-x64": { - "version": "0.25.0", - "resolved": "https://registry.npmjs.org/@esbuild/sunos-x64/-/sunos-x64-0.25.0.tgz", - "integrity": "sha512-bxI7ThgLzPrPz484/S9jLlvUAHYMzy6I0XiU1ZMeAEOBcS0VePBFxh1JjTQt3Xiat5b6Oh4x7UC7IwKQKIJRIg==", - "cpu": [ - "x64" - ], + "node_modules/delegate": { + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/delegate/-/delegate-3.2.0.tgz", + "integrity": "sha512-IofjkYBZaZivn0V8nnsMJGBr4jVLxHDheKSW88PyxS5QC4Vo9ZbZVvhzlSxY87fVq3STR6r+4cGepyHkcWOQSw==" + }, + "node_modules/dependency-graph": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/dependency-graph/-/dependency-graph-1.0.0.tgz", + "integrity": "sha512-cW3gggJ28HZ/LExwxP2B++aiKxhJXMSIt9K48FOXQkm+vuG5gyatXnLsONRJdzO/7VfjDIiaOOa/bs4l464Lwg==", "dev": true, - "optional": true, - "os": [ - "sunos" - ], + "license": "MIT", "engines": { - "node": ">=18" + "node": ">=4" } }, - "node_modules/@esbuild/win32-arm64": { - "version": "0.25.0", - "resolved": "https://registry.npmjs.org/@esbuild/win32-arm64/-/win32-arm64-0.25.0.tgz", - "integrity": "sha512-ZUAc2YK6JW89xTbXvftxdnYy3m4iHIkDtK3CLce8wg8M2L+YZhIvO1DKpxrd0Yr59AeNNkTiic9YLf6FTtXWMw==", - "cpu": [ - "arm64" - ], + "node_modules/dom-serializer": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/dom-serializer/-/dom-serializer-2.0.0.tgz", + "integrity": "sha512-wIkAryiqt/nV5EQKqQpo3SToSOV9J0DnbJqwK7Wv/Trc92zIAYZ4FlMu+JPFW1DfGFt81ZTCGgDEabffXeLyJg==", "dev": true, - "optional": true, - "os": [ - "win32" - ], - "engines": { - "node": ">=18" + "license": "MIT", + "dependencies": { + "domelementtype": "^2.3.0", + "domhandler": "^5.0.2", + "entities": "^4.2.0" + }, + "funding": { + "url": "https://github.com/cheeriojs/dom-serializer?sponsor=1" } }, - "node_modules/@esbuild/win32-ia32": { - "version": "0.25.0", - "resolved": "https://registry.npmjs.org/@esbuild/win32-ia32/-/win32-ia32-0.25.0.tgz", - "integrity": "sha512-eSNxISBu8XweVEWG31/JzjkIGbGIJN/TrRoiSVZwZ6pkC6VX4Im/WV2cz559/TXLcYbcrDN8JtKgd9DJVIo8GA==", - "cpu": [ - "ia32" - ], + "node_modules/domelementtype": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/domelementtype/-/domelementtype-2.3.0.tgz", + "integrity": "sha512-OLETBj6w0OsagBwdXnPdN0cnMfF9opN69co+7ZrbfPGrdpPVNBUj02spi6B1N7wChLQiPn4CSH/zJvXw56gmHw==", "dev": true, - "optional": true, - "os": [ - "win32" + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/fb55" + } ], - "engines": { - "node": ">=18" - } + "license": "BSD-2-Clause" }, - "node_modules/@esbuild/win32-x64": { - "version": "0.25.0", - "resolved": "https://registry.npmjs.org/@esbuild/win32-x64/-/win32-x64-0.25.0.tgz", - "integrity": "sha512-ZENoHJBxA20C2zFzh6AI4fT6RraMzjYw4xKWemRTRmRVtN9c5DcH9r/f2ihEkMjOW5eGgrwCslG/+Y/3bL+DHQ==", - "cpu": [ - "x64" - ], + "node_modules/domhandler": { + "version": "5.0.3", + "resolved": "https://registry.npmjs.org/domhandler/-/domhandler-5.0.3.tgz", + "integrity": "sha512-cgwlv/1iFQiFnU96XXgROh8xTeetsnJiDsTc7TYCLFd9+/WNkIqPTxiM/8pSd8VIrhXGTf1Ny1q1hquVqDJB5w==", "dev": true, - "optional": true, - "os": [ - "win32" - ], + "license": "BSD-2-Clause", + "dependencies": { + "domelementtype": "^2.3.0" + }, "engines": { - "node": ">=18" + "node": ">= 4" + }, + "funding": { + "url": "https://github.com/fb55/domhandler?sponsor=1" } }, - "node_modules/@nodelib/fs.scandir": { - "version": "2.1.5", - "resolved": "https://registry.npmjs.org/@nodelib/fs.scandir/-/fs.scandir-2.1.5.tgz", - "integrity": "sha512-vq24Bq3ym5HEQm2NKCr3yXDwjc7vTsEThRDnkp2DK9p1uqLR+DHurm/NOTo0KG7HYHU7eppKZj3MyqYuMBf62g==", + "node_modules/domutils": { + "version": "3.2.2", + "resolved": "https://registry.npmjs.org/domutils/-/domutils-3.2.2.tgz", + "integrity": "sha512-6kZKyUajlDuqlHKVX1w7gyslj9MPIXzIFiz/rGu35uC1wMi+kMhQwGhl4lt9unC9Vb9INnY9Z3/ZA3+FhASLaw==", "dev": true, + "license": "BSD-2-Clause", "dependencies": { - "@nodelib/fs.stat": "2.0.5", - "run-parallel": "^1.1.9" + "dom-serializer": "^2.0.0", + "domelementtype": "^2.3.0", + "domhandler": "^5.0.3" }, - "engines": { - "node": ">= 8" + "funding": { + "url": "https://github.com/fb55/domutils?sponsor=1" } }, - "node_modules/@nodelib/fs.stat": { - "version": "2.0.5", - "resolved": "https://registry.npmjs.org/@nodelib/fs.stat/-/fs.stat-2.0.5.tgz", - "integrity": "sha512-RkhPPp2zrqDAQA/2jNhnztcPAlv64XdhIp7a7454A5ovI7Bukxgt7MX7udwAu3zg1DcpPU0rz3VV1SeaqvY4+A==", + "node_modules/electron-to-chromium": { + "version": "1.5.267", + "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.5.267.tgz", + "integrity": "sha512-0Drusm6MVRXSOJpGbaSVgcQsuB4hEkMpHXaVstcPmhu5LIedxs1xNK/nIxmQIU/RPC0+1/o0AVZfBTkTNJOdUw==", "dev": true, - "engines": { - "node": ">= 8" - } + "license": "ISC" }, - "node_modules/@nodelib/fs.walk": { - "version": "1.2.8", - "resolved": "https://registry.npmjs.org/@nodelib/fs.walk/-/fs.walk-1.2.8.tgz", - "integrity": "sha512-oGB+UxlgWcgQkgwo8GcEGwemoTFt3FIO9ababBmaGwXIoBKZ+GTy0pP185beGg7Llih/NSHSV2XAs1lnznocSg==", + "node_modules/emoji-regex": { + "version": "8.0.0", + "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz", + "integrity": "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==", "dev": true, - "dependencies": { - "@nodelib/fs.scandir": "2.1.5", - "fastq": "^1.6.0" - }, + "license": "MIT" + }, + "node_modules/entities": { + "version": "4.5.0", + "resolved": "https://registry.npmjs.org/entities/-/entities-4.5.0.tgz", + "integrity": "sha512-V0hjH4dGPh9Ao5p0MoRY6BVqtwCjhz6vI5LT8AJ55H+4g9/4vbHx1I54fS0XuclLhDHArPQCiMjDxjaL8fPxhw==", + "dev": true, + "license": "BSD-2-Clause", "engines": { - "node": ">= 8" + "node": ">=0.12" + }, + "funding": { + "url": "https://github.com/fb55/entities?sponsor=1" } }, - "node_modules/@types/parse-json": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/@types/parse-json/-/parse-json-4.0.0.tgz", - "integrity": "sha512-//oorEZjL6sbPcKUaCdIGlIUeH26mgzimjBB77G6XRgnDl/L5wOnpyBGRe/Mmf5CVW3PwEBE1NjiMZ/ssFh4wA==", - "dev": true - }, - "node_modules/acorn": { - "version": "7.4.1", - "resolved": "https://registry.npmjs.org/acorn/-/acorn-7.4.1.tgz", - "integrity": "sha512-nQyp0o1/mNdbTO1PO6kHkwSrmgZ0MT/jCCpNiwbUjGoRN4dlBhqJtoQuCnEOKzgTVwg0ZWiCoQy6SxMebQVh8A==", + "node_modules/esbuild": { + "version": "0.25.0", + "resolved": "https://registry.npmjs.org/esbuild/-/esbuild-0.25.0.tgz", + "integrity": "sha512-BXq5mqc8ltbaN34cDqWuYKyNhX8D/Z0J1xdtdQ8UcIIIyJyz+ZMKUt58tF3SrZ85jcfN/PZYhjR5uDQAYNVbuw==", "dev": true, + "hasInstallScript": true, "bin": { - "acorn": "bin/acorn" + "esbuild": "bin/esbuild" }, "engines": { - "node": ">=0.4.0" - } - }, - "node_modules/acorn-node": { - "version": "1.8.2", - "resolved": "https://registry.npmjs.org/acorn-node/-/acorn-node-1.8.2.tgz", - "integrity": "sha512-8mt+fslDufLYntIoPAaIMUe/lrbrehIiwmR3t2k9LljIzoigEPF27eLk2hy8zSGzmR/ogr7zbRKINMo1u0yh5A==", - "dev": true, - "dependencies": { - "acorn": "^7.0.0", - "acorn-walk": "^7.0.0", - "xtend": "^4.0.2" + "node": ">=18" + }, + "optionalDependencies": { + "@esbuild/aix-ppc64": "0.25.0", + "@esbuild/android-arm": "0.25.0", + "@esbuild/android-arm64": "0.25.0", + "@esbuild/android-x64": "0.25.0", + "@esbuild/darwin-arm64": "0.25.0", + "@esbuild/darwin-x64": "0.25.0", + "@esbuild/freebsd-arm64": "0.25.0", + "@esbuild/freebsd-x64": "0.25.0", + "@esbuild/linux-arm": "0.25.0", + "@esbuild/linux-arm64": "0.25.0", + "@esbuild/linux-ia32": "0.25.0", + "@esbuild/linux-loong64": "0.25.0", + "@esbuild/linux-mips64el": "0.25.0", + "@esbuild/linux-ppc64": "0.25.0", + "@esbuild/linux-riscv64": "0.25.0", + "@esbuild/linux-s390x": "0.25.0", + "@esbuild/linux-x64": "0.25.0", + "@esbuild/netbsd-arm64": "0.25.0", + "@esbuild/netbsd-x64": "0.25.0", + "@esbuild/openbsd-arm64": "0.25.0", + "@esbuild/openbsd-x64": "0.25.0", + "@esbuild/sunos-x64": "0.25.0", + "@esbuild/win32-arm64": "0.25.0", + "@esbuild/win32-ia32": "0.25.0", + "@esbuild/win32-x64": "0.25.0" } }, - "node_modules/acorn-walk": { - "version": "7.2.0", - "resolved": "https://registry.npmjs.org/acorn-walk/-/acorn-walk-7.2.0.tgz", - "integrity": "sha512-OPdCF6GsMIP+Az+aWfAAOEt2/+iVDKE7oy6lJ098aoe59oAmK76qV6Gw60SbZ8jHuG2wH058GF4pLFbYamYrVA==", + "node_modules/escalade": { + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/escalade/-/escalade-3.2.0.tgz", + "integrity": "sha512-WUj2qlxaQtO4g6Pq5c29GTcWGDyd8itL8zTlipgECz3JesAiiOKotd8JU6otB3PACgG6xkJUyVhboMS+bje/jA==", "dev": true, + "license": "MIT", "engines": { - "node": ">=0.4.0" + "node": ">=6" } }, - "node_modules/ansi-styles": { - "version": "4.3.0", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", - "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", + "node_modules/fill-range": { + "version": "7.1.1", + "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-7.1.1.tgz", + "integrity": "sha512-YsGpe3WHLK8ZYi4tWDg2Jy3ebRz2rXowDxnld4bkQB00cc/1Zw9AWnC0i9ztDJitivtQvaI9KaLyKrc+hBW0yg==", "dev": true, "dependencies": { - "color-convert": "^2.0.1" + "to-regex-range": "^5.0.1" }, "engines": { "node": ">=8" + } + }, + "node_modules/fraction.js": { + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/fraction.js/-/fraction.js-4.1.2.tgz", + "integrity": "sha512-o2RiJQ6DZaR/5+Si0qJUIy637QMRudSi9kU/FFzx9EZazrIdnBgpU+3sEWCxAVhH2RtxW2Oz+T4p2o8uOPVcgA==", + "dev": true, + "engines": { + "node": "*" }, "funding": { - "url": "https://github.com/chalk/ansi-styles?sponsor=1" + "type": "patreon", + "url": "https://www.patreon.com/infusion" } }, - "node_modules/anymatch": { - "version": "3.1.2", - "resolved": "https://registry.npmjs.org/anymatch/-/anymatch-3.1.2.tgz", - "integrity": "sha512-P43ePfOAIupkguHUycrc4qJ9kz8ZiuOUijaETwX7THt0Y/GNK7v0aa8rY816xWjZ7rJdA5XdMcpVFTKMq+RvWg==", + "node_modules/fs-extra": { + "version": "11.3.3", + "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-11.3.3.tgz", + "integrity": "sha512-VWSRii4t0AFm6ixFFmLLx1t7wS1gh+ckoa84aOeapGum0h+EZd1EhEumSB+ZdDLnEPuucsVB9oB7cxJHap6Afg==", "dev": true, + "license": "MIT", "dependencies": { - "normalize-path": "^3.0.0", - "picomatch": "^2.0.4" + "graceful-fs": "^4.2.0", + "jsonfile": "^6.0.1", + "universalify": "^2.0.0" }, "engines": { - "node": ">= 8" + "node": ">=14.14" } }, - "node_modules/arg": { - "version": "5.0.1", - "resolved": "https://registry.npmjs.org/arg/-/arg-5.0.1.tgz", - "integrity": "sha512-e0hDa9H2Z9AwFkk2qDlwhoMYE4eToKarchkQHovNdLTCYMHZHeRjI71crOh+dio4K6u1IcwubQqo79Ga4CyAQA==", - "dev": true + "node_modules/get-caller-file": { + "version": "2.0.5", + "resolved": "https://registry.npmjs.org/get-caller-file/-/get-caller-file-2.0.5.tgz", + "integrity": "sha512-DyFP3BM/3YHTQOCUL/w0OZHR0lpKeGrxotcHWcqNEdnltqFwXVfhEBQ94eIo34AfQpo0rGki4cyIiftY06h2Fg==", + "dev": true, + "license": "ISC", + "engines": { + "node": "6.* || 8.* || >= 10.*" + } }, - "node_modules/autoprefixer": { - "version": "10.4.1", - "resolved": "https://registry.npmjs.org/autoprefixer/-/autoprefixer-10.4.1.tgz", - "integrity": "sha512-B3ZEG7wtzXDRCEFsan7HmR2AeNsxdJB0+sEC0Hc5/c2NbhJqPwuZm+tn233GBVw82L+6CtD6IPSfVruwKjfV3A==", + "node_modules/good-listener": { + "version": "1.2.2", + "resolved": "https://registry.npmjs.org/good-listener/-/good-listener-1.2.2.tgz", + "integrity": "sha1-1TswzfkxPf+33JoNR3CWqm0UXFA=", + "dependencies": { + "delegate": "^3.1.2" + } + }, + "node_modules/graceful-fs": { + "version": "4.2.11", + "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.2.11.tgz", + "integrity": "sha512-RbJ5/jmFcNNCcDV5o9eTnBLJ/HszWV0P73bc+Ff4nS/rJj+YaS6IGyiOL0VoBYX+l1Wrl3k63h/KrH+nhJ0XvQ==", + "dev": true, + "license": "ISC" + }, + "node_modules/is-binary-path": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/is-binary-path/-/is-binary-path-2.1.0.tgz", + "integrity": "sha512-ZMERYes6pDydyuGidse7OsHxtbI7WVeUEozgR/g7rd0xUimYNlvZRE/K2MgZTjWy725IfelLeVcEM97mmtRGXw==", "dev": true, "dependencies": { - "browserslist": "^4.19.1", - "caniuse-lite": "^1.0.30001294", - "fraction.js": "^4.1.2", - "normalize-range": "^0.1.2", - "picocolors": "^1.0.0", - "postcss-value-parser": "^4.2.0" - }, - "bin": { - "autoprefixer": "bin/autoprefixer" + "binary-extensions": "^2.0.0" }, "engines": { - "node": "^10 || ^12 || >=14" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/postcss/" - }, - "peerDependencies": { - "postcss": "^8.1.0" + "node": ">=8" } }, - "node_modules/binary-extensions": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/binary-extensions/-/binary-extensions-2.2.0.tgz", - "integrity": "sha512-jDctJ/IVQbZoJykoeHbhXpOlNBqGNcwXJKJog42E5HDPUwQTSdjCHdihjj0DlnheQ7blbT6dHOafNAiS8ooQKA==", + "node_modules/is-extglob": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/is-extglob/-/is-extglob-2.1.1.tgz", + "integrity": "sha1-qIwCU1eR8C7TfHahueqXc8gz+MI=", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/is-fullwidth-code-point": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-3.0.0.tgz", + "integrity": "sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==", "dev": true, + "license": "MIT", "engines": { "node": ">=8" } }, - "node_modules/braces": { - "version": "3.0.3", - "resolved": "https://registry.npmjs.org/braces/-/braces-3.0.3.tgz", - "integrity": "sha512-yQbXgO/OSZVD2IsiLlro+7Hf6Q18EJrKSEsdoMzKePKXct3gvD8oLcOQdIzGupr5Fj+EDe8gO/lxc1BzfMpxvA==", + "node_modules/is-glob": { + "version": "4.0.3", + "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-4.0.3.tgz", + "integrity": "sha512-xelSayHH36ZgE7ZWhli7pW34hNbNl8Ojv5KVmkJD4hBdD3th8Tfk9vYasLM+mXWOZhFkgZfxhLSnrwRr4elSSg==", "dev": true, "dependencies": { - "fill-range": "^7.1.1" + "is-extglob": "^2.1.1" }, "engines": { - "node": ">=8" + "node": ">=0.10.0" } }, - "node_modules/browserslist": { - "version": "4.19.1", - "resolved": "https://registry.npmjs.org/browserslist/-/browserslist-4.19.1.tgz", - "integrity": "sha512-u2tbbG5PdKRTUoctO3NBD8FQ5HdPh1ZXPHzp1rwaa5jTc+RV9/+RlWiAIKmjRPQF+xbGM9Kklj5bZQFa2s/38A==", + "node_modules/is-number": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/is-number/-/is-number-7.0.0.tgz", + "integrity": "sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==", + "dev": true, + "engines": { + "node": ">=0.12.0" + } + }, + "node_modules/jsonfile": { + "version": "6.2.0", + "resolved": "https://registry.npmjs.org/jsonfile/-/jsonfile-6.2.0.tgz", + "integrity": "sha512-FGuPw30AdOIUTRMC2OMRtQV+jkVj2cfPqSeWXv1NEAJ1qZ5zb1X6z1mFhbfOB/iy3ssJCD+3KuZ8r8C3uVFlAg==", "dev": true, + "license": "MIT", "dependencies": { - "caniuse-lite": "^1.0.30001286", - "electron-to-chromium": "^1.4.17", - "escalade": "^3.1.1", - "node-releases": "^2.0.1", - "picocolors": "^1.0.0" + "universalify": "^2.0.0" }, + "optionalDependencies": { + "graceful-fs": "^4.1.6" + } + }, + "node_modules/lodash.memoize": { + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/lodash.memoize/-/lodash.memoize-4.1.2.tgz", + "integrity": "sha512-t7j+NzmgnQzTAYXcsHYLgimltOV1MXHtlOWf6GjL9Kj8GK5FInw5JotxvbOs+IvV1/Dzo04/fCGfLVs7aXb4Ag==", + "dev": true, + "license": "MIT" + }, + "node_modules/lodash.uniq": { + "version": "4.5.0", + "resolved": "https://registry.npmjs.org/lodash.uniq/-/lodash.uniq-4.5.0.tgz", + "integrity": "sha512-xfBaXQd9ryd9dlSDvnvI0lvxfLJlYAZzXomUYzLKtUeOQvOP5piqAWuGtrhWeqaXK9hhoM/iyJc5AV+XfsX3HQ==", + "dev": true, + "license": "MIT" + }, + "node_modules/mdn-data": { + "version": "2.12.2", + "resolved": "https://registry.npmjs.org/mdn-data/-/mdn-data-2.12.2.tgz", + "integrity": "sha512-IEn+pegP1aManZuckezWCO+XZQDplx1366JoVhTpMpBB1sPey/SbveZQUosKiKiGYjg1wH4pMlNgXbCiYgihQA==", + "dev": true, + "license": "CC0-1.0" + }, + "node_modules/nanoid": { + "version": "3.3.11", + "resolved": "https://registry.npmjs.org/nanoid/-/nanoid-3.3.11.tgz", + "integrity": "sha512-N8SpfPUnUp1bK+PMYW8qSWdl9U+wwNWI4QKxOYDy9JAro3WMX7p2OeVRF9v+347pnakNevPmiHhNmZ2HbFA76w==", + "dev": true, + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/ai" + } + ], + "license": "MIT", "bin": { - "browserslist": "cli.js" + "nanoid": "bin/nanoid.cjs" }, "engines": { - "node": "^6 || ^7 || ^8 || ^9 || ^10 || ^11 || ^12 || >=13.7" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/browserslist" + "node": "^10 || ^12 || ^13.7 || ^14 || >=15.0.1" } }, - "node_modules/callsites": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/callsites/-/callsites-3.1.0.tgz", - "integrity": "sha512-P8BjAsXvZS+VIDUI11hHCQEv74YT67YUi5JJFNWIqL235sBmjX4+qx9Muvls5ivyNENctx46xQLQ3aTuE7ssaQ==", + "node_modules/node-releases": { + "version": "2.0.27", + "resolved": "https://registry.npmjs.org/node-releases/-/node-releases-2.0.27.tgz", + "integrity": "sha512-nmh3lCkYZ3grZvqcCH+fjmQ7X+H0OeZgP40OierEaAptX4XofMh5kwNbWh7lBduUzCcV/8kZ+NDLCwm2iorIlA==", "dev": true, - "engines": { - "node": ">=6" - } + "license": "MIT" }, - "node_modules/camelcase-css": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/camelcase-css/-/camelcase-css-2.0.1.tgz", - "integrity": "sha512-QOSvevhslijgYwRx6Rv7zKdMF8lbRmx+uQGx2+vDc+KI/eBnsy9kit5aj23AgGu3pa4t9AgwbnXWqS+iOY+2aA==", + "node_modules/normalize-path": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/normalize-path/-/normalize-path-3.0.0.tgz", + "integrity": "sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA==", "dev": true, "engines": { - "node": ">= 6" + "node": ">=0.10.0" } }, - "node_modules/caniuse-lite": { - "version": "1.0.30001296", - "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001296.tgz", - "integrity": "sha512-WfrtPEoNSoeATDlf4y3QvkwiELl9GyPLISV5GejTbbQRtQx4LhsXmc9IQ6XCL2d7UxCyEzToEZNMeqR79OUw8Q==", + "node_modules/normalize-range": { + "version": "0.1.2", + "resolved": "https://registry.npmjs.org/normalize-range/-/normalize-range-0.1.2.tgz", + "integrity": "sha1-LRDAa9/TEuqXd2laTShDlFa3WUI=", "dev": true, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/browserslist" + "engines": { + "node": ">=0.10.0" } }, - "node_modules/chalk": { - "version": "4.1.2", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", - "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", + "node_modules/nth-check": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/nth-check/-/nth-check-2.1.1.tgz", + "integrity": "sha512-lqjrjmaOoAnWfMmBPL+XNnynZh2+swxiX3WUE0s4yEHI6m+AwrK2UZOimIRl3X/4QctVqS8AiZjFqyOGrMXb/w==", "dev": true, + "license": "BSD-2-Clause", "dependencies": { - "ansi-styles": "^4.1.0", - "supports-color": "^7.1.0" - }, - "engines": { - "node": ">=10" + "boolbase": "^1.0.0" }, "funding": { - "url": "https://github.com/chalk/chalk?sponsor=1" + "url": "https://github.com/fb55/nth-check?sponsor=1" } }, - "node_modules/chokidar": { - "version": "3.5.2", - "resolved": "https://registry.npmjs.org/chokidar/-/chokidar-3.5.2.tgz", - "integrity": "sha512-ekGhOnNVPgT77r4K/U3GDhu+FQ2S8TnK/s2KbIGXi0SZWuwkZ2QNyfWdZW+TVfn84DpEP7rLeCt2UI6bJ8GwbQ==", + "node_modules/phoenix": { + "resolved": "../deps/phoenix", + "link": true + }, + "node_modules/phoenix_html": { + "resolved": "../deps/phoenix_html", + "link": true + }, + "node_modules/phoenix_live_view": { + "resolved": "../deps/phoenix_live_view", + "link": true + }, + "node_modules/picocolors": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/picocolors/-/picocolors-1.1.1.tgz", + "integrity": "sha512-xceH2snhtb5M9liqDsmEw56le376mTZkEX/jEb/RxNFyegNul7eNslCXP9FDj/Lcu0X8KEyMceP2ntpaHrDEVA==", + "dev": true, + "license": "ISC" + }, + "node_modules/picomatch": { + "version": "2.3.1", + "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-2.3.1.tgz", + "integrity": "sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA==", "dev": true, - "dependencies": { - "anymatch": "~3.1.2", - "braces": "~3.0.2", - "glob-parent": "~5.1.2", - "is-binary-path": "~2.1.0", - "is-glob": "~4.0.1", - "normalize-path": "~3.0.0", - "readdirp": "~3.6.0" - }, "engines": { - "node": ">= 8.10.0" + "node": ">=8.6" }, - "optionalDependencies": { - "fsevents": "~2.3.2" + "funding": { + "url": "https://github.com/sponsors/jonschlinkert" } }, - "node_modules/chokidar/node_modules/glob-parent": { - "version": "5.1.2", - "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-5.1.2.tgz", - "integrity": "sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==", + "node_modules/pify": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/pify/-/pify-2.3.0.tgz", + "integrity": "sha512-udgsAY+fTnvv7kI7aaxbqwWNb0AHiB0qBO89PZKPkoTmGOgdbrHDKD+0B2X4uTfJ/FT1R09r9gTsjUjNJotuog==", "dev": true, - "dependencies": { - "is-glob": "^4.0.1" - }, + "license": "MIT", "engines": { - "node": ">= 6" - } - }, - "node_modules/clipboard": { - "version": "2.0.10", - "resolved": "https://registry.npmjs.org/clipboard/-/clipboard-2.0.10.tgz", - "integrity": "sha512-cz3m2YVwFz95qSEbCDi2fzLN/epEN9zXBvfgAoGkvGOJZATMl9gtTDVOtBYkx2ODUJl2kvmud7n32sV2BpYR4g==", - "dependencies": { - "good-listener": "^1.2.2", - "select": "^1.1.2", - "tiny-emitter": "^2.0.0" + "node": ">=0.10.0" } }, - "node_modules/color-convert": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", - "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", + "node_modules/postcss": { + "version": "8.5.6", + "resolved": "https://registry.npmjs.org/postcss/-/postcss-8.5.6.tgz", + "integrity": "sha512-3Ybi1tAuwAP9s0r1UQ2J4n5Y0G05bJkpUIO0/bI9MhwmD70S5aTWbXGBwxHrelT+XM1k6dM0pk+SwNkpTRN7Pg==", "dev": true, + "funding": [ + { + "type": "opencollective", + "url": "https://opencollective.com/postcss/" + }, + { + "type": "tidelift", + "url": "https://tidelift.com/funding/github/npm/postcss" + }, + { + "type": "github", + "url": "https://github.com/sponsors/ai" + } + ], + "license": "MIT", "dependencies": { - "color-name": "~1.1.4" + "nanoid": "^3.3.11", + "picocolors": "^1.1.1", + "source-map-js": "^1.2.1" }, "engines": { - "node": ">=7.0.0" + "node": "^10 || ^12 || >=14" } }, - "node_modules/color-name": { - "version": "1.1.4", - "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", - "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", - "dev": true - }, - "node_modules/cosmiconfig": { - "version": "7.0.1", - "resolved": "https://registry.npmjs.org/cosmiconfig/-/cosmiconfig-7.0.1.tgz", - "integrity": "sha512-a1YWNUV2HwGimB7dU2s1wUMurNKjpx60HxBB6xUM8Re+2s1g1IIfJvFR0/iCF+XHdE0GMTKTuLR32UQff4TEyQ==", + "node_modules/postcss-calc": { + "version": "10.1.1", + "resolved": "https://registry.npmjs.org/postcss-calc/-/postcss-calc-10.1.1.tgz", + "integrity": "sha512-NYEsLHh8DgG/PRH2+G9BTuUdtf9ViS+vdoQ0YA5OQdGsfN4ztiwtDWNtBl9EKeqNMFnIu8IKZ0cLxEQ5r5KVMw==", "dev": true, + "license": "MIT", "dependencies": { - "@types/parse-json": "^4.0.0", - "import-fresh": "^3.2.1", - "parse-json": "^5.0.0", - "path-type": "^4.0.0", - "yaml": "^1.10.0" + "postcss-selector-parser": "^7.0.0", + "postcss-value-parser": "^4.2.0" }, "engines": { - "node": ">=10" + "node": "^18.12 || ^20.9 || >=22.0" + }, + "peerDependencies": { + "postcss": "^8.4.38" } }, - "node_modules/cssesc": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/cssesc/-/cssesc-3.0.0.tgz", - "integrity": "sha512-/Tb/JcjK111nNScGob5MNtsntNM1aCNUDipB/TkwZFhyDrrE47SOx/18wF2bbjgc3ZzCSKW1T5nt5EbFoAz/Vg==", + "node_modules/postcss-calc/node_modules/postcss-selector-parser": { + "version": "7.1.1", + "resolved": "https://registry.npmjs.org/postcss-selector-parser/-/postcss-selector-parser-7.1.1.tgz", + "integrity": "sha512-orRsuYpJVw8LdAwqqLykBj9ecS5/cRHlI5+nvTo8LcCKmzDmqVORXtOIYEEQuL9D4BxtA1lm5isAqzQZCoQ6Eg==", "dev": true, - "bin": { - "cssesc": "bin/cssesc" + "license": "MIT", + "dependencies": { + "cssesc": "^3.0.0", + "util-deprecate": "^1.0.2" }, "engines": { "node": ">=4" } }, - "node_modules/defined": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/defined/-/defined-1.0.0.tgz", - "integrity": "sha1-yY2bzvdWdBiOEQlpFRGZ45sfppM=", - "dev": true - }, - "node_modules/delegate": { - "version": "3.2.0", - "resolved": "https://registry.npmjs.org/delegate/-/delegate-3.2.0.tgz", - "integrity": "sha512-IofjkYBZaZivn0V8nnsMJGBr4jVLxHDheKSW88PyxS5QC4Vo9ZbZVvhzlSxY87fVq3STR6r+4cGepyHkcWOQSw==" - }, - "node_modules/detective": { - "version": "5.2.0", - "resolved": "https://registry.npmjs.org/detective/-/detective-5.2.0.tgz", - "integrity": "sha512-6SsIx+nUUbuK0EthKjv0zrdnajCCXVYGmbYYiYjFVpzcjwEs/JMDZ8tPRG29J/HhN56t3GJp2cGSWDRjjot8Pg==", + "node_modules/postcss-cli": { + "version": "11.0.1", + "resolved": "https://registry.npmjs.org/postcss-cli/-/postcss-cli-11.0.1.tgz", + "integrity": "sha512-0UnkNPSayHKRe/tc2YGW6XnSqqOA9eqpiRMgRlV1S6HdGi16vwJBx7lviARzbV1HpQHqLLRH3o8vTcB0cLc+5g==", "dev": true, + "license": "MIT", "dependencies": { - "acorn-node": "^1.6.1", - "defined": "^1.0.0", - "minimist": "^1.1.1" + "chokidar": "^3.3.0", + "dependency-graph": "^1.0.0", + "fs-extra": "^11.0.0", + "picocolors": "^1.0.0", + "postcss-load-config": "^5.0.0", + "postcss-reporter": "^7.0.0", + "pretty-hrtime": "^1.0.3", + "read-cache": "^1.0.0", + "slash": "^5.0.0", + "tinyglobby": "^0.2.12", + "yargs": "^17.0.0" }, "bin": { - "detective": "bin/detective.js" + "postcss": "index.js" }, "engines": { - "node": ">=0.8.0" + "node": ">=18" + }, + "peerDependencies": { + "postcss": "^8.0.0" } }, - "node_modules/didyoumean": { - "version": "1.2.2", - "resolved": "https://registry.npmjs.org/didyoumean/-/didyoumean-1.2.2.tgz", - "integrity": "sha512-gxtyfqMg7GKyhQmb056K7M3xszy/myH8w+B4RT+QXBQsvAOdc3XymqDDPHx1BgPgsdAA5SIifona89YtRATDzw==", - "dev": true - }, - "node_modules/dlv": { - "version": "1.1.3", - "resolved": "https://registry.npmjs.org/dlv/-/dlv-1.1.3.tgz", - "integrity": "sha512-+HlytyjlPKnIG8XuRG8WvmBP8xs8P71y+SKKS6ZXWoEgLuePxtDoUEiH7WkdePWrQ5JBpE6aoVqfZfJUQkjXwA==", - "dev": true - }, - "node_modules/electron-to-chromium": { - "version": "1.4.37", - "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.4.37.tgz", - "integrity": "sha512-XIvFB1omSAxYgHYX48sC+HR8i/p7lx7R+0cX9faElg1g++h9IilCrJ12+bQuY+d96Wp7zkBiJwMOv+AhLtLrTg==", - "dev": true - }, - "node_modules/error-ex": { - "version": "1.3.2", - "resolved": "https://registry.npmjs.org/error-ex/-/error-ex-1.3.2.tgz", - "integrity": "sha512-7dFHNmqeFSEt2ZBsCriorKnn3Z2pj+fd9kmI6QoWw4//DL+icEBfc0U7qJCisqrTsKTjw4fNFy2pW9OqStD84g==", + "node_modules/postcss-cli/node_modules/lilconfig": { + "version": "3.1.3", + "resolved": "https://registry.npmjs.org/lilconfig/-/lilconfig-3.1.3.tgz", + "integrity": "sha512-/vlFKAoH5Cgt3Ie+JLhRbwOsCQePABiU3tJ1egGvyQ+33R/vcwM2Zl2QR/LzjsBeItPt3oSVXapn+m4nQDvpzw==", "dev": true, - "dependencies": { - "is-arrayish": "^0.2.1" - } - }, - "node_modules/esbuild": { - "version": "0.25.0", - "resolved": "https://registry.npmjs.org/esbuild/-/esbuild-0.25.0.tgz", - "integrity": "sha512-BXq5mqc8ltbaN34cDqWuYKyNhX8D/Z0J1xdtdQ8UcIIIyJyz+ZMKUt58tF3SrZ85jcfN/PZYhjR5uDQAYNVbuw==", - "dev": true, - "hasInstallScript": true, - "bin": { - "esbuild": "bin/esbuild" - }, + "license": "MIT", "engines": { - "node": ">=18" + "node": ">=14" }, - "optionalDependencies": { - "@esbuild/aix-ppc64": "0.25.0", - "@esbuild/android-arm": "0.25.0", - "@esbuild/android-arm64": "0.25.0", - "@esbuild/android-x64": "0.25.0", - "@esbuild/darwin-arm64": "0.25.0", - "@esbuild/darwin-x64": "0.25.0", - "@esbuild/freebsd-arm64": "0.25.0", - "@esbuild/freebsd-x64": "0.25.0", - "@esbuild/linux-arm": "0.25.0", - "@esbuild/linux-arm64": "0.25.0", - "@esbuild/linux-ia32": "0.25.0", - "@esbuild/linux-loong64": "0.25.0", - "@esbuild/linux-mips64el": "0.25.0", - "@esbuild/linux-ppc64": "0.25.0", - "@esbuild/linux-riscv64": "0.25.0", - "@esbuild/linux-s390x": "0.25.0", - "@esbuild/linux-x64": "0.25.0", - "@esbuild/netbsd-arm64": "0.25.0", - "@esbuild/netbsd-x64": "0.25.0", - "@esbuild/openbsd-arm64": "0.25.0", - "@esbuild/openbsd-x64": "0.25.0", - "@esbuild/sunos-x64": "0.25.0", - "@esbuild/win32-arm64": "0.25.0", - "@esbuild/win32-ia32": "0.25.0", - "@esbuild/win32-x64": "0.25.0" + "funding": { + "url": "https://github.com/sponsors/antonk52" } }, - "node_modules/escalade": { - "version": "3.1.1", - "resolved": "https://registry.npmjs.org/escalade/-/escalade-3.1.1.tgz", - "integrity": "sha512-k0er2gUkLf8O0zKJiAhmkTnJlTvINGv7ygDNPbeIsX/TJjGJZHuh9B2UxbsaEkmlEo9MfhrSzmhIlhRlI2GXnw==", + "node_modules/postcss-cli/node_modules/postcss-load-config": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/postcss-load-config/-/postcss-load-config-5.1.0.tgz", + "integrity": "sha512-G5AJ+IX0aD0dygOE0yFZQ/huFFMSNneyfp0e3/bT05a8OfPC5FUoZRPfGijUdGOJNMewJiwzcHJXFafFzeKFVA==", "dev": true, + "funding": [ + { + "type": "opencollective", + "url": "https://opencollective.com/postcss/" + }, + { + "type": "github", + "url": "https://github.com/sponsors/ai" + } + ], + "license": "MIT", + "dependencies": { + "lilconfig": "^3.1.1", + "yaml": "^2.4.2" + }, "engines": { - "node": ">=6" + "node": ">= 18" + }, + "peerDependencies": { + "jiti": ">=1.21.0", + "postcss": ">=8.0.9", + "tsx": "^4.8.1" + }, + "peerDependenciesMeta": { + "jiti": { + "optional": true + }, + "postcss": { + "optional": true + }, + "tsx": { + "optional": true + } } }, - "node_modules/escape-string-regexp": { - "version": "1.0.5", - "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz", - "integrity": "sha1-G2HAViGQqN/2rjuyzwIAyhMLhtQ=", + "node_modules/postcss-cli/node_modules/yaml": { + "version": "2.8.2", + "resolved": "https://registry.npmjs.org/yaml/-/yaml-2.8.2.tgz", + "integrity": "sha512-mplynKqc1C2hTVYxd0PU2xQAc22TI1vShAYGksCCfxbn/dFwnHTNi1bvYsBTkhdUNtGIf5xNOg938rrSSYvS9A==", "dev": true, + "license": "ISC", + "bin": { + "yaml": "bin.mjs" + }, "engines": { - "node": ">=0.8.0" + "node": ">= 14.6" + }, + "funding": { + "url": "https://github.com/sponsors/eemeli" } }, - "node_modules/fast-glob": { - "version": "3.2.7", - "resolved": "https://registry.npmjs.org/fast-glob/-/fast-glob-3.2.7.tgz", - "integrity": "sha512-rYGMRwip6lUMvYD3BTScMwT1HtAs2d71SMv66Vrxs0IekGZEjhM0pcMfjQPnknBt2zeCwQMEupiN02ZP4DiT1Q==", + "node_modules/postcss-colormin": { + "version": "7.0.5", + "resolved": "https://registry.npmjs.org/postcss-colormin/-/postcss-colormin-7.0.5.tgz", + "integrity": "sha512-ekIBP/nwzRWhEMmIxHHbXHcMdzd1HIUzBECaj5KEdLz9DVP2HzT065sEhvOx1dkLjYW7jyD0CngThx6bpFi2fA==", "dev": true, + "license": "MIT", "dependencies": { - "@nodelib/fs.stat": "^2.0.2", - "@nodelib/fs.walk": "^1.2.3", - "glob-parent": "^5.1.2", - "merge2": "^1.3.0", - "micromatch": "^4.0.4" + "browserslist": "^4.27.0", + "caniuse-api": "^3.0.0", + "colord": "^2.9.3", + "postcss-value-parser": "^4.2.0" }, "engines": { - "node": ">=8" + "node": "^18.12.0 || ^20.9.0 || >=22.0" + }, + "peerDependencies": { + "postcss": "^8.4.32" } }, - "node_modules/fast-glob/node_modules/glob-parent": { - "version": "5.1.2", - "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-5.1.2.tgz", - "integrity": "sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==", + "node_modules/postcss-convert-values": { + "version": "7.0.8", + "resolved": "https://registry.npmjs.org/postcss-convert-values/-/postcss-convert-values-7.0.8.tgz", + "integrity": "sha512-+XNKuPfkHTCEo499VzLMYn94TiL3r9YqRE3Ty+jP7UX4qjewUONey1t7CG21lrlTLN07GtGM8MqFVp86D4uKJg==", "dev": true, + "license": "MIT", "dependencies": { - "is-glob": "^4.0.1" + "browserslist": "^4.27.0", + "postcss-value-parser": "^4.2.0" }, "engines": { - "node": ">= 6" + "node": "^18.12.0 || ^20.9.0 || >=22.0" + }, + "peerDependencies": { + "postcss": "^8.4.32" } }, - "node_modules/fastq": { - "version": "1.13.0", - "resolved": "https://registry.npmjs.org/fastq/-/fastq-1.13.0.tgz", - "integrity": "sha512-YpkpUnK8od0o1hmeSc7UUs/eB/vIPWJYjKck2QKIzAf71Vm1AAQ3EbuZB3g2JIy+pg+ERD0vqI79KyZiB2e2Nw==", + "node_modules/postcss-discard-comments": { + "version": "7.0.5", + "resolved": "https://registry.npmjs.org/postcss-discard-comments/-/postcss-discard-comments-7.0.5.tgz", + "integrity": "sha512-IR2Eja8WfYgN5n32vEGSctVQ1+JARfu4UH8M7bgGh1bC+xI/obsPJXaBpQF7MAByvgwZinhpHpdrmXtvVVlKcQ==", "dev": true, + "license": "MIT", "dependencies": { - "reusify": "^1.0.4" + "postcss-selector-parser": "^7.1.0" + }, + "engines": { + "node": "^18.12.0 || ^20.9.0 || >=22.0" + }, + "peerDependencies": { + "postcss": "^8.4.32" } }, - "node_modules/fill-range": { + "node_modules/postcss-discard-comments/node_modules/postcss-selector-parser": { "version": "7.1.1", - "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-7.1.1.tgz", - "integrity": "sha512-YsGpe3WHLK8ZYi4tWDg2Jy3ebRz2rXowDxnld4bkQB00cc/1Zw9AWnC0i9ztDJitivtQvaI9KaLyKrc+hBW0yg==", + "resolved": "https://registry.npmjs.org/postcss-selector-parser/-/postcss-selector-parser-7.1.1.tgz", + "integrity": "sha512-orRsuYpJVw8LdAwqqLykBj9ecS5/cRHlI5+nvTo8LcCKmzDmqVORXtOIYEEQuL9D4BxtA1lm5isAqzQZCoQ6Eg==", "dev": true, + "license": "MIT", "dependencies": { - "to-regex-range": "^5.0.1" + "cssesc": "^3.0.0", + "util-deprecate": "^1.0.2" }, "engines": { - "node": ">=8" + "node": ">=4" } }, - "node_modules/fraction.js": { - "version": "4.1.2", - "resolved": "https://registry.npmjs.org/fraction.js/-/fraction.js-4.1.2.tgz", - "integrity": "sha512-o2RiJQ6DZaR/5+Si0qJUIy637QMRudSi9kU/FFzx9EZazrIdnBgpU+3sEWCxAVhH2RtxW2Oz+T4p2o8uOPVcgA==", + "node_modules/postcss-discard-duplicates": { + "version": "7.0.2", + "resolved": "https://registry.npmjs.org/postcss-discard-duplicates/-/postcss-discard-duplicates-7.0.2.tgz", + "integrity": "sha512-eTonaQvPZ/3i1ASDHOKkYwAybiM45zFIc7KXils4mQmHLqIswXD9XNOKEVxtTFnsmwYzF66u4LMgSr0abDlh5w==", "dev": true, + "license": "MIT", "engines": { - "node": "*" + "node": "^18.12.0 || ^20.9.0 || >=22.0" }, - "funding": { - "type": "patreon", - "url": "https://www.patreon.com/infusion" + "peerDependencies": { + "postcss": "^8.4.32" } }, - "node_modules/fsevents": { - "version": "2.3.2", - "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-2.3.2.tgz", - "integrity": "sha512-xiqMQR4xAeHTuB9uWm+fFRcIOgKBMiOBP+eXiyT7jsgVCq1bkVygt00oASowB7EdtpOHaaPgKt812P9ab+DDKA==", + "node_modules/postcss-discard-empty": { + "version": "7.0.1", + "resolved": "https://registry.npmjs.org/postcss-discard-empty/-/postcss-discard-empty-7.0.1.tgz", + "integrity": "sha512-cFrJKZvcg/uxB6Ijr4l6qmn3pXQBna9zyrPC+sK0zjbkDUZew+6xDltSF7OeB7rAtzaaMVYSdbod+sZOCWnMOg==", "dev": true, - "hasInstallScript": true, - "optional": true, - "os": [ - "darwin" - ], + "license": "MIT", "engines": { - "node": "^8.16.0 || ^10.6.0 || >=11.0.0" + "node": "^18.12.0 || ^20.9.0 || >=22.0" + }, + "peerDependencies": { + "postcss": "^8.4.32" } }, - "node_modules/function-bind": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/function-bind/-/function-bind-1.1.1.tgz", - "integrity": "sha512-yIovAzMX49sF8Yl58fSCWJ5svSLuaibPxXQJFLmBObTuCr0Mf1KiPopGM9NiFjiYBCbfaa2Fh6breQ6ANVTI0A==", - "dev": true - }, - "node_modules/glob-parent": { - "version": "6.0.2", - "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-6.0.2.tgz", - "integrity": "sha512-XxwI8EOhVQgWp6iDL+3b0r86f4d6AX6zSU55HfB4ydCEuXLXc5FcYeOu+nnGftS4TEju/11rt4KJPTMgbfmv4A==", + "node_modules/postcss-discard-overridden": { + "version": "7.0.1", + "resolved": "https://registry.npmjs.org/postcss-discard-overridden/-/postcss-discard-overridden-7.0.1.tgz", + "integrity": "sha512-7c3MMjjSZ/qYrx3uc1940GSOzN1Iqjtlqe8uoSg+qdVPYyRb0TILSqqmtlSFuE4mTDECwsm397Ya7iXGzfF7lg==", "dev": true, - "dependencies": { - "is-glob": "^4.0.3" - }, + "license": "MIT", "engines": { - "node": ">=10.13.0" + "node": "^18.12.0 || ^20.9.0 || >=22.0" + }, + "peerDependencies": { + "postcss": "^8.4.32" } }, - "node_modules/good-listener": { - "version": "1.2.2", - "resolved": "https://registry.npmjs.org/good-listener/-/good-listener-1.2.2.tgz", - "integrity": "sha1-1TswzfkxPf+33JoNR3CWqm0UXFA=", + "node_modules/postcss-merge-longhand": { + "version": "7.0.5", + "resolved": "https://registry.npmjs.org/postcss-merge-longhand/-/postcss-merge-longhand-7.0.5.tgz", + "integrity": "sha512-Kpu5v4Ys6QI59FxmxtNB/iHUVDn9Y9sYw66D6+SZoIk4QTz1prC4aYkhIESu+ieG1iylod1f8MILMs1Em3mmIw==", + "dev": true, + "license": "MIT", "dependencies": { - "delegate": "^3.1.2" + "postcss-value-parser": "^4.2.0", + "stylehacks": "^7.0.5" + }, + "engines": { + "node": "^18.12.0 || ^20.9.0 || >=22.0" + }, + "peerDependencies": { + "postcss": "^8.4.32" } }, - "node_modules/has": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/has/-/has-1.0.3.tgz", - "integrity": "sha512-f2dvO0VU6Oej7RkWJGrehjbzMAjFp5/VKPp5tTpWIV4JHHZK1/BxbFRtf/siA2SWTe09caDmVtYYzWEIbBS4zw==", + "node_modules/postcss-merge-rules": { + "version": "7.0.7", + "resolved": "https://registry.npmjs.org/postcss-merge-rules/-/postcss-merge-rules-7.0.7.tgz", + "integrity": "sha512-njWJrd/Ms6XViwowaaCc+/vqhPG3SmXn725AGrnl+BgTuRPEacjiLEaGq16J6XirMJbtKkTwnt67SS+e2WGoew==", "dev": true, + "license": "MIT", "dependencies": { - "function-bind": "^1.1.1" + "browserslist": "^4.27.0", + "caniuse-api": "^3.0.0", + "cssnano-utils": "^5.0.1", + "postcss-selector-parser": "^7.1.0" }, "engines": { - "node": ">= 0.4.0" + "node": "^18.12.0 || ^20.9.0 || >=22.0" + }, + "peerDependencies": { + "postcss": "^8.4.32" } }, - "node_modules/has-flag": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", - "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", + "node_modules/postcss-merge-rules/node_modules/postcss-selector-parser": { + "version": "7.1.1", + "resolved": "https://registry.npmjs.org/postcss-selector-parser/-/postcss-selector-parser-7.1.1.tgz", + "integrity": "sha512-orRsuYpJVw8LdAwqqLykBj9ecS5/cRHlI5+nvTo8LcCKmzDmqVORXtOIYEEQuL9D4BxtA1lm5isAqzQZCoQ6Eg==", "dev": true, + "license": "MIT", + "dependencies": { + "cssesc": "^3.0.0", + "util-deprecate": "^1.0.2" + }, "engines": { - "node": ">=8" + "node": ">=4" } }, - "node_modules/import-fresh": { - "version": "3.3.0", - "resolved": "https://registry.npmjs.org/import-fresh/-/import-fresh-3.3.0.tgz", - "integrity": "sha512-veYYhQa+D1QBKznvhUHxb8faxlrwUnxseDAbAp457E0wLNio2bOSKnjYDhMj+YiAq61xrMGhQk9iXVk5FzgQMw==", + "node_modules/postcss-minify-font-values": { + "version": "7.0.1", + "resolved": "https://registry.npmjs.org/postcss-minify-font-values/-/postcss-minify-font-values-7.0.1.tgz", + "integrity": "sha512-2m1uiuJeTplll+tq4ENOQSzB8LRnSUChBv7oSyFLsJRtUgAAJGP6LLz0/8lkinTgxrmJSPOEhgY1bMXOQ4ZXhQ==", "dev": true, + "license": "MIT", "dependencies": { - "parent-module": "^1.0.0", - "resolve-from": "^4.0.0" + "postcss-value-parser": "^4.2.0" }, "engines": { - "node": ">=6" + "node": "^18.12.0 || ^20.9.0 || >=22.0" }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" + "peerDependencies": { + "postcss": "^8.4.32" } }, - "node_modules/is-arrayish": { - "version": "0.2.1", - "resolved": "https://registry.npmjs.org/is-arrayish/-/is-arrayish-0.2.1.tgz", - "integrity": "sha1-d8mYQFJ6qOyxqLppe4BkWnqSap0=", - "dev": true - }, - "node_modules/is-binary-path": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/is-binary-path/-/is-binary-path-2.1.0.tgz", - "integrity": "sha512-ZMERYes6pDydyuGidse7OsHxtbI7WVeUEozgR/g7rd0xUimYNlvZRE/K2MgZTjWy725IfelLeVcEM97mmtRGXw==", + "node_modules/postcss-minify-gradients": { + "version": "7.0.1", + "resolved": "https://registry.npmjs.org/postcss-minify-gradients/-/postcss-minify-gradients-7.0.1.tgz", + "integrity": "sha512-X9JjaysZJwlqNkJbUDgOclyG3jZEpAMOfof6PUZjPnPrePnPG62pS17CjdM32uT1Uq1jFvNSff9l7kNbmMSL2A==", "dev": true, + "license": "MIT", "dependencies": { - "binary-extensions": "^2.0.0" + "colord": "^2.9.3", + "cssnano-utils": "^5.0.1", + "postcss-value-parser": "^4.2.0" }, "engines": { - "node": ">=8" + "node": "^18.12.0 || ^20.9.0 || >=22.0" + }, + "peerDependencies": { + "postcss": "^8.4.32" } }, - "node_modules/is-core-module": { - "version": "2.8.1", - "resolved": "https://registry.npmjs.org/is-core-module/-/is-core-module-2.8.1.tgz", - "integrity": "sha512-SdNCUs284hr40hFTFP6l0IfZ/RSrMXF3qgoRHd3/79unUTvrFO/JoXwkGm+5J/Oe3E/b5GsnG330uUNgRpu1PA==", + "node_modules/postcss-minify-params": { + "version": "7.0.5", + "resolved": "https://registry.npmjs.org/postcss-minify-params/-/postcss-minify-params-7.0.5.tgz", + "integrity": "sha512-FGK9ky02h6Ighn3UihsyeAH5XmLEE2MSGH5Tc4tXMFtEDx7B+zTG6hD/+/cT+fbF7PbYojsmmWjyTwFwW1JKQQ==", "dev": true, + "license": "MIT", "dependencies": { - "has": "^1.0.3" + "browserslist": "^4.27.0", + "cssnano-utils": "^5.0.1", + "postcss-value-parser": "^4.2.0" }, - "funding": { - "url": "https://github.com/sponsors/ljharb" + "engines": { + "node": "^18.12.0 || ^20.9.0 || >=22.0" + }, + "peerDependencies": { + "postcss": "^8.4.32" } }, - "node_modules/is-extglob": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/is-extglob/-/is-extglob-2.1.1.tgz", - "integrity": "sha1-qIwCU1eR8C7TfHahueqXc8gz+MI=", + "node_modules/postcss-minify-selectors": { + "version": "7.0.5", + "resolved": "https://registry.npmjs.org/postcss-minify-selectors/-/postcss-minify-selectors-7.0.5.tgz", + "integrity": "sha512-x2/IvofHcdIrAm9Q+p06ZD1h6FPcQ32WtCRVodJLDR+WMn8EVHI1kvLxZuGKz/9EY5nAmI6lIQIrpo4tBy5+ug==", "dev": true, + "license": "MIT", + "dependencies": { + "cssesc": "^3.0.0", + "postcss-selector-parser": "^7.1.0" + }, "engines": { - "node": ">=0.10.0" + "node": "^18.12.0 || ^20.9.0 || >=22.0" + }, + "peerDependencies": { + "postcss": "^8.4.32" } }, - "node_modules/is-glob": { - "version": "4.0.3", - "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-4.0.3.tgz", - "integrity": "sha512-xelSayHH36ZgE7ZWhli7pW34hNbNl8Ojv5KVmkJD4hBdD3th8Tfk9vYasLM+mXWOZhFkgZfxhLSnrwRr4elSSg==", + "node_modules/postcss-minify-selectors/node_modules/postcss-selector-parser": { + "version": "7.1.1", + "resolved": "https://registry.npmjs.org/postcss-selector-parser/-/postcss-selector-parser-7.1.1.tgz", + "integrity": "sha512-orRsuYpJVw8LdAwqqLykBj9ecS5/cRHlI5+nvTo8LcCKmzDmqVORXtOIYEEQuL9D4BxtA1lm5isAqzQZCoQ6Eg==", "dev": true, + "license": "MIT", "dependencies": { - "is-extglob": "^2.1.1" + "cssesc": "^3.0.0", + "util-deprecate": "^1.0.2" }, "engines": { - "node": ">=0.10.0" + "node": ">=4" } }, - "node_modules/is-number": { - "version": "7.0.0", - "resolved": "https://registry.npmjs.org/is-number/-/is-number-7.0.0.tgz", - "integrity": "sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==", + "node_modules/postcss-normalize-charset": { + "version": "7.0.1", + "resolved": "https://registry.npmjs.org/postcss-normalize-charset/-/postcss-normalize-charset-7.0.1.tgz", + "integrity": "sha512-sn413ofhSQHlZFae//m9FTOfkmiZ+YQXsbosqOWRiVQncU2BA3daX3n0VF3cG6rGLSFVc5Di/yns0dFfh8NFgQ==", "dev": true, + "license": "MIT", "engines": { - "node": ">=0.12.0" + "node": "^18.12.0 || ^20.9.0 || >=22.0" + }, + "peerDependencies": { + "postcss": "^8.4.32" } }, - "node_modules/js-tokens": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/js-tokens/-/js-tokens-4.0.0.tgz", - "integrity": "sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ==", - "dev": true - }, - "node_modules/json-parse-even-better-errors": { - "version": "2.3.1", - "resolved": "https://registry.npmjs.org/json-parse-even-better-errors/-/json-parse-even-better-errors-2.3.1.tgz", - "integrity": "sha512-xyFwyhro/JEof6Ghe2iz2NcXoj2sloNsWr/XsERDK/oiPCfaNhl5ONfp+jQdAZRQQ0IJWNzH9zIZF7li91kh2w==", - "dev": true - }, - "node_modules/lilconfig": { - "version": "2.0.4", - "resolved": "https://registry.npmjs.org/lilconfig/-/lilconfig-2.0.4.tgz", - "integrity": "sha512-bfTIN7lEsiooCocSISTWXkiWJkRqtL9wYtYy+8EK3Y41qh3mpwPU0ycTOgjdY9ErwXCc8QyrQp82bdL0Xkm9yA==", + "node_modules/postcss-normalize-display-values": { + "version": "7.0.1", + "resolved": "https://registry.npmjs.org/postcss-normalize-display-values/-/postcss-normalize-display-values-7.0.1.tgz", + "integrity": "sha512-E5nnB26XjSYz/mGITm6JgiDpAbVuAkzXwLzRZtts19jHDUBFxZ0BkXAehy0uimrOjYJbocby4FVswA/5noOxrQ==", "dev": true, + "license": "MIT", + "dependencies": { + "postcss-value-parser": "^4.2.0" + }, "engines": { - "node": ">=10" + "node": "^18.12.0 || ^20.9.0 || >=22.0" + }, + "peerDependencies": { + "postcss": "^8.4.32" } }, - "node_modules/lines-and-columns": { - "version": "1.2.4", - "resolved": "https://registry.npmjs.org/lines-and-columns/-/lines-and-columns-1.2.4.tgz", - "integrity": "sha512-7ylylesZQ/PV29jhEDl3Ufjo6ZX7gCqJr5F7PKrqc93v7fzSymt1BpwEU8nAUXs8qzzvqhbjhK5QZg6Mt/HkBg==", - "dev": true - }, - "node_modules/merge2": { - "version": "1.4.1", - "resolved": "https://registry.npmjs.org/merge2/-/merge2-1.4.1.tgz", - "integrity": "sha512-8q7VEgMJW4J8tcfVPy8g09NcQwZdbwFEqhe/WZkoIzjn/3TGDwtOCYtXGxA3O8tPzpczCCDgv+P2P5y00ZJOOg==", + "node_modules/postcss-normalize-positions": { + "version": "7.0.1", + "resolved": "https://registry.npmjs.org/postcss-normalize-positions/-/postcss-normalize-positions-7.0.1.tgz", + "integrity": "sha512-pB/SzrIP2l50ZIYu+yQZyMNmnAcwyYb9R1fVWPRxm4zcUFCY2ign7rcntGFuMXDdd9L2pPNUgoODDk91PzRZuQ==", "dev": true, + "license": "MIT", + "dependencies": { + "postcss-value-parser": "^4.2.0" + }, "engines": { - "node": ">= 8" + "node": "^18.12.0 || ^20.9.0 || >=22.0" + }, + "peerDependencies": { + "postcss": "^8.4.32" } }, - "node_modules/micromatch": { - "version": "4.0.4", - "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-4.0.4.tgz", - "integrity": "sha512-pRmzw/XUcwXGpD9aI9q/0XOwLNygjETJ8y0ao0wdqprrzDa4YnxLcz7fQRZr8voh8V10kGhABbNcHVk5wHgWwg==", + "node_modules/postcss-normalize-repeat-style": { + "version": "7.0.1", + "resolved": "https://registry.npmjs.org/postcss-normalize-repeat-style/-/postcss-normalize-repeat-style-7.0.1.tgz", + "integrity": "sha512-NsSQJ8zj8TIDiF0ig44Byo3Jk9e4gNt9x2VIlJudnQQ5DhWAHJPF4Tr1ITwyHio2BUi/I6Iv0HRO7beHYOloYQ==", "dev": true, + "license": "MIT", "dependencies": { - "braces": "^3.0.1", - "picomatch": "^2.2.3" + "postcss-value-parser": "^4.2.0" }, "engines": { - "node": ">=8.6" + "node": "^18.12.0 || ^20.9.0 || >=22.0" + }, + "peerDependencies": { + "postcss": "^8.4.32" } }, - "node_modules/minimist": { - "version": "1.2.6", - "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.6.tgz", - "integrity": "sha512-Jsjnk4bw3YJqYzbdyBiNsPWHPfO++UGG749Cxs6peCu5Xg4nrena6OVxOYxrQTqww0Jmwt+Ref8rggumkTLz9Q==", - "dev": true - }, - "node_modules/nanoid": { - "version": "3.3.6", - "resolved": "https://registry.npmjs.org/nanoid/-/nanoid-3.3.6.tgz", - "integrity": "sha512-BGcqMMJuToF7i1rt+2PWSNVnWIkGCU78jBG3RxO/bZlnZPK2Cmi2QaffxGO/2RvWi9sL+FAiRiXMgsyxQ1DIDA==", + "node_modules/postcss-normalize-string": { + "version": "7.0.1", + "resolved": "https://registry.npmjs.org/postcss-normalize-string/-/postcss-normalize-string-7.0.1.tgz", + "integrity": "sha512-QByrI7hAhsoze992kpbMlJSbZ8FuCEc1OT9EFbZ6HldXNpsdpZr+YXC5di3UEv0+jeZlHbZcoCADgb7a+lPmmQ==", "dev": true, - "funding": [ - { - "type": "github", - "url": "https://github.com/sponsors/ai" - } - ], - "bin": { - "nanoid": "bin/nanoid.cjs" + "license": "MIT", + "dependencies": { + "postcss-value-parser": "^4.2.0" }, "engines": { - "node": "^10 || ^12 || ^13.7 || ^14 || >=15.0.1" + "node": "^18.12.0 || ^20.9.0 || >=22.0" + }, + "peerDependencies": { + "postcss": "^8.4.32" } }, - "node_modules/node-releases": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/node-releases/-/node-releases-2.0.1.tgz", - "integrity": "sha512-CqyzN6z7Q6aMeF/ktcMVTzhAHCEpf8SOarwpzpf8pNBY2k5/oM34UHldUwp8VKI7uxct2HxSRdJjBaZeESzcxA==", - "dev": true - }, - "node_modules/normalize-path": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/normalize-path/-/normalize-path-3.0.0.tgz", - "integrity": "sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA==", + "node_modules/postcss-normalize-timing-functions": { + "version": "7.0.1", + "resolved": "https://registry.npmjs.org/postcss-normalize-timing-functions/-/postcss-normalize-timing-functions-7.0.1.tgz", + "integrity": "sha512-bHifyuuSNdKKsnNJ0s8fmfLMlvsQwYVxIoUBnowIVl2ZAdrkYQNGVB4RxjfpvkMjipqvbz0u7feBZybkl/6NJg==", "dev": true, + "license": "MIT", + "dependencies": { + "postcss-value-parser": "^4.2.0" + }, "engines": { - "node": ">=0.10.0" + "node": "^18.12.0 || ^20.9.0 || >=22.0" + }, + "peerDependencies": { + "postcss": "^8.4.32" } }, - "node_modules/normalize-range": { - "version": "0.1.2", - "resolved": "https://registry.npmjs.org/normalize-range/-/normalize-range-0.1.2.tgz", - "integrity": "sha1-LRDAa9/TEuqXd2laTShDlFa3WUI=", + "node_modules/postcss-normalize-unicode": { + "version": "7.0.5", + "resolved": "https://registry.npmjs.org/postcss-normalize-unicode/-/postcss-normalize-unicode-7.0.5.tgz", + "integrity": "sha512-X6BBwiRxVaFHrb2WyBMddIeB5HBjJcAaUHyhLrM2FsxSq5TFqcHSsK7Zu1otag+o0ZphQGJewGH1tAyrD0zX1Q==", "dev": true, + "license": "MIT", + "dependencies": { + "browserslist": "^4.27.0", + "postcss-value-parser": "^4.2.0" + }, "engines": { - "node": ">=0.10.0" + "node": "^18.12.0 || ^20.9.0 || >=22.0" + }, + "peerDependencies": { + "postcss": "^8.4.32" } }, - "node_modules/object-hash": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/object-hash/-/object-hash-2.2.0.tgz", - "integrity": "sha512-gScRMn0bS5fH+IuwyIFgnh9zBdo4DV+6GhygmWM9HyNJSgS0hScp1f5vjtm7oIIOiT9trXrShAkLFSc2IqKNgw==", + "node_modules/postcss-normalize-url": { + "version": "7.0.1", + "resolved": "https://registry.npmjs.org/postcss-normalize-url/-/postcss-normalize-url-7.0.1.tgz", + "integrity": "sha512-sUcD2cWtyK1AOL/82Fwy1aIVm/wwj5SdZkgZ3QiUzSzQQofrbq15jWJ3BA7Z+yVRwamCjJgZJN0I9IS7c6tgeQ==", "dev": true, + "license": "MIT", + "dependencies": { + "postcss-value-parser": "^4.2.0" + }, "engines": { - "node": ">= 6" + "node": "^18.12.0 || ^20.9.0 || >=22.0" + }, + "peerDependencies": { + "postcss": "^8.4.32" } }, - "node_modules/parent-module": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/parent-module/-/parent-module-1.0.1.tgz", - "integrity": "sha512-GQ2EWRpQV8/o+Aw8YqtfZZPfNRWZYkbidE9k5rpl/hC3vtHHBfGm2Ifi6qWV+coDGkrUKZAxE3Lot5kcsRlh+g==", + "node_modules/postcss-normalize-whitespace": { + "version": "7.0.1", + "resolved": "https://registry.npmjs.org/postcss-normalize-whitespace/-/postcss-normalize-whitespace-7.0.1.tgz", + "integrity": "sha512-vsbgFHMFQrJBJKrUFJNZ2pgBeBkC2IvvoHjz1to0/0Xk7sII24T0qFOiJzG6Fu3zJoq/0yI4rKWi7WhApW+EFA==", "dev": true, + "license": "MIT", "dependencies": { - "callsites": "^3.0.0" + "postcss-value-parser": "^4.2.0" }, "engines": { - "node": ">=6" + "node": "^18.12.0 || ^20.9.0 || >=22.0" + }, + "peerDependencies": { + "postcss": "^8.4.32" } }, - "node_modules/parse-json": { - "version": "5.2.0", - "resolved": "https://registry.npmjs.org/parse-json/-/parse-json-5.2.0.tgz", - "integrity": "sha512-ayCKvm/phCGxOkYRSCM82iDwct8/EonSEgCSxWxD7ve6jHggsFl4fZVQBPRNgQoKiuV/odhFrGzQXZwbifC8Rg==", + "node_modules/postcss-ordered-values": { + "version": "7.0.2", + "resolved": "https://registry.npmjs.org/postcss-ordered-values/-/postcss-ordered-values-7.0.2.tgz", + "integrity": "sha512-AMJjt1ECBffF7CEON/Y0rekRLS6KsePU6PRP08UqYW4UGFRnTXNrByUzYK1h8AC7UWTZdQ9O3Oq9kFIhm0SFEw==", "dev": true, + "license": "MIT", "dependencies": { - "@babel/code-frame": "^7.0.0", - "error-ex": "^1.3.1", - "json-parse-even-better-errors": "^2.3.0", - "lines-and-columns": "^1.1.6" + "cssnano-utils": "^5.0.1", + "postcss-value-parser": "^4.2.0" }, "engines": { - "node": ">=8" + "node": "^18.12.0 || ^20.9.0 || >=22.0" }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" + "peerDependencies": { + "postcss": "^8.4.32" } }, - "node_modules/path-parse": { - "version": "1.0.7", - "resolved": "https://registry.npmjs.org/path-parse/-/path-parse-1.0.7.tgz", - "integrity": "sha512-LDJzPVEEEPR+y48z93A0Ed0yXb8pAByGWo/k5YYdYgpY2/2EsOsksJrq7lOHxryrVOn1ejG6oAp8ahvOIQD8sw==", - "dev": true - }, - "node_modules/path-type": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/path-type/-/path-type-4.0.0.tgz", - "integrity": "sha512-gDKb8aZMDeD/tZWs9P6+q0J9Mwkdl6xMV8TjnGP3qJVJ06bdMgkbBlLU8IdfOsIsFz2BW1rNVT3XuNEl8zPAvw==", + "node_modules/postcss-reduce-initial": { + "version": "7.0.5", + "resolved": "https://registry.npmjs.org/postcss-reduce-initial/-/postcss-reduce-initial-7.0.5.tgz", + "integrity": "sha512-RHagHLidG8hTZcnr4FpyMB2jtgd/OcyAazjMhoy5qmWJOx1uxKh4ntk0Pb46ajKM0rkf32lRH4C8c9qQiPR6IA==", "dev": true, + "license": "MIT", + "dependencies": { + "browserslist": "^4.27.0", + "caniuse-api": "^3.0.0" + }, "engines": { - "node": ">=8" + "node": "^18.12.0 || ^20.9.0 || >=22.0" + }, + "peerDependencies": { + "postcss": "^8.4.32" } }, - "node_modules/phoenix": { - "resolved": "../deps/phoenix", - "link": true - }, - "node_modules/phoenix_html": { - "resolved": "../deps/phoenix_html", - "link": true - }, - "node_modules/phoenix_live_view": { - "resolved": "../deps/phoenix_live_view", - "link": true - }, - "node_modules/picocolors": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/picocolors/-/picocolors-1.0.0.tgz", - "integrity": "sha512-1fygroTLlHu66zi26VoTDv8yRgm0Fccecssto+MhsZ0D/DGW2sm8E8AjW7NU5VVTRt5GxbeZ5qBuJr+HyLYkjQ==", - "dev": true - }, - "node_modules/picomatch": { - "version": "2.3.1", - "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-2.3.1.tgz", - "integrity": "sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA==", + "node_modules/postcss-reduce-transforms": { + "version": "7.0.1", + "resolved": "https://registry.npmjs.org/postcss-reduce-transforms/-/postcss-reduce-transforms-7.0.1.tgz", + "integrity": "sha512-MhyEbfrm+Mlp/36hvZ9mT9DaO7dbncU0CvWI8V93LRkY6IYlu38OPg3FObnuKTUxJ4qA8HpurdQOo5CyqqO76g==", "dev": true, + "license": "MIT", + "dependencies": { + "postcss-value-parser": "^4.2.0" + }, "engines": { - "node": ">=8.6" + "node": "^18.12.0 || ^20.9.0 || >=22.0" }, - "funding": { - "url": "https://github.com/sponsors/jonschlinkert" + "peerDependencies": { + "postcss": "^8.4.32" } }, - "node_modules/postcss": { - "version": "8.4.31", - "resolved": "https://registry.npmjs.org/postcss/-/postcss-8.4.31.tgz", - "integrity": "sha512-PS08Iboia9mts/2ygV3eLpY5ghnUcfLV/EXTOW1E2qYxJKGGBUtNjN76FYHnMs36RmARn41bC0AZmn+rR0OVpQ==", + "node_modules/postcss-reporter": { + "version": "7.1.0", + "resolved": "https://registry.npmjs.org/postcss-reporter/-/postcss-reporter-7.1.0.tgz", + "integrity": "sha512-/eoEylGWyy6/DOiMP5lmFRdmDKThqgn7D6hP2dXKJI/0rJSO1ADFNngZfDzxL0YAxFvws+Rtpuji1YIHj4mySA==", "dev": true, "funding": [ { "type": "opencollective", "url": "https://opencollective.com/postcss/" }, - { - "type": "tidelift", - "url": "https://tidelift.com/funding/github/npm/postcss" - }, { "type": "github", "url": "https://github.com/sponsors/ai" } ], + "license": "MIT", "dependencies": { - "nanoid": "^3.3.6", "picocolors": "^1.0.0", - "source-map-js": "^1.0.2" - }, - "engines": { - "node": "^10 || ^12 || >=14" - } - }, - "node_modules/postcss-js": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/postcss-js/-/postcss-js-4.0.0.tgz", - "integrity": "sha512-77QESFBwgX4irogGVPgQ5s07vLvFqWr228qZY+w6lW599cRlK/HmnlivnnVUxkjHnCu4J16PDMHcH+e+2HbvTQ==", - "dev": true, - "dependencies": { - "camelcase-css": "^2.0.1" + "thenby": "^1.3.4" }, "engines": { - "node": "^12 || ^14 || >= 16" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/postcss/" + "node": ">=10" }, "peerDependencies": { - "postcss": "^8.3.3" + "postcss": "^8.1.0" } }, - "node_modules/postcss-load-config": { - "version": "3.1.1", - "resolved": "https://registry.npmjs.org/postcss-load-config/-/postcss-load-config-3.1.1.tgz", - "integrity": "sha512-c/9XYboIbSEUZpiD1UQD0IKiUe8n9WHYV7YFe7X7J+ZwCsEKkUJSFWjS9hBU1RR9THR7jMXst8sxiqP0jjo2mg==", + "node_modules/postcss-svgo": { + "version": "7.1.0", + "resolved": "https://registry.npmjs.org/postcss-svgo/-/postcss-svgo-7.1.0.tgz", + "integrity": "sha512-KnAlfmhtoLz6IuU3Sij2ycusNs4jPW+QoFE5kuuUOK8awR6tMxZQrs5Ey3BUz7nFCzT3eqyFgqkyrHiaU2xx3w==", "dev": true, + "license": "MIT", "dependencies": { - "lilconfig": "^2.0.4", - "yaml": "^1.10.2" + "postcss-value-parser": "^4.2.0", + "svgo": "^4.0.0" }, "engines": { - "node": ">= 10" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/postcss/" + "node": "^18.12.0 || ^20.9.0 || >= 18" }, "peerDependencies": { - "ts-node": ">=9.0.0" - }, - "peerDependenciesMeta": { - "ts-node": { - "optional": true - } + "postcss": "^8.4.32" } }, - "node_modules/postcss-nested": { - "version": "5.0.6", - "resolved": "https://registry.npmjs.org/postcss-nested/-/postcss-nested-5.0.6.tgz", - "integrity": "sha512-rKqm2Fk0KbA8Vt3AdGN0FB9OBOMDVajMG6ZCf/GoHgdxUJ4sBFp0A/uMIRm+MJUdo33YXEtjqIz8u7DAp8B7DA==", + "node_modules/postcss-unique-selectors": { + "version": "7.0.4", + "resolved": "https://registry.npmjs.org/postcss-unique-selectors/-/postcss-unique-selectors-7.0.4.tgz", + "integrity": "sha512-pmlZjsmEAG7cHd7uK3ZiNSW6otSZ13RHuZ/4cDN/bVglS5EpF2r2oxY99SuOHa8m7AWoBCelTS3JPpzsIs8skQ==", "dev": true, + "license": "MIT", "dependencies": { - "postcss-selector-parser": "^6.0.6" + "postcss-selector-parser": "^7.1.0" }, "engines": { - "node": ">=12.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/postcss/" + "node": "^18.12.0 || ^20.9.0 || >=22.0" }, "peerDependencies": { - "postcss": "^8.2.14" + "postcss": "^8.4.32" } }, - "node_modules/postcss-selector-parser": { - "version": "6.0.8", - "resolved": "https://registry.npmjs.org/postcss-selector-parser/-/postcss-selector-parser-6.0.8.tgz", - "integrity": "sha512-D5PG53d209Z1Uhcc0qAZ5U3t5HagH3cxu+WLZ22jt3gLUpXM4eXXfiO14jiDWST3NNooX/E8wISfOhZ9eIjGTQ==", + "node_modules/postcss-unique-selectors/node_modules/postcss-selector-parser": { + "version": "7.1.1", + "resolved": "https://registry.npmjs.org/postcss-selector-parser/-/postcss-selector-parser-7.1.1.tgz", + "integrity": "sha512-orRsuYpJVw8LdAwqqLykBj9ecS5/cRHlI5+nvTo8LcCKmzDmqVORXtOIYEEQuL9D4BxtA1lm5isAqzQZCoQ6Eg==", "dev": true, + "license": "MIT", "dependencies": { "cssesc": "^3.0.0", "util-deprecate": "^1.0.2" @@ -1442,36 +1619,24 @@ "integrity": "sha512-1NNCs6uurfkVbeXG4S8JFT9t19m45ICnif8zWLd5oPSZ50QnwMfK+H3jv408d4jw/7Bttv5axS5IiHoLaVNHeQ==", "dev": true }, - "node_modules/queue-microtask": { - "version": "1.2.3", - "resolved": "https://registry.npmjs.org/queue-microtask/-/queue-microtask-1.2.3.tgz", - "integrity": "sha512-NuaNSa6flKT5JaSYQzJok04JzTL1CA6aGhv5rfLW3PgqA+M2ChpZQnAC8h8i4ZFkBS8X5RqkDBHA7r4hej3K9A==", + "node_modules/pretty-hrtime": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/pretty-hrtime/-/pretty-hrtime-1.0.3.tgz", + "integrity": "sha512-66hKPCr+72mlfiSjlEB1+45IjXSqvVAIy6mocupoww4tBFE9R9IhwwUGoI4G++Tc9Aq+2rxOt0RFU6gPcrte0A==", "dev": true, - "funding": [ - { - "type": "github", - "url": "https://github.com/sponsors/feross" - }, - { - "type": "patreon", - "url": "https://www.patreon.com/feross" - }, - { - "type": "consulting", - "url": "https://feross.org/support" - } - ] + "license": "MIT", + "engines": { + "node": ">= 0.8" + } }, - "node_modules/quick-lru": { - "version": "5.1.1", - "resolved": "https://registry.npmjs.org/quick-lru/-/quick-lru-5.1.1.tgz", - "integrity": "sha512-WuyALRjWPDGtt/wzJiadO5AXY+8hZ80hVpe6MyivgraREW751X3SbhRvG3eLKOYN+8VEvqLcf3wdnt44Z4S4SA==", + "node_modules/read-cache": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/read-cache/-/read-cache-1.0.0.tgz", + "integrity": "sha512-Owdv/Ft7IjOgm/i0xvNDZ1LrRANRfew4b2prF3OWMQLxLfu3bS8FVhCsrSCMK4lR56Y9ya+AThoTpDCTxCmpRA==", "dev": true, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" + "license": "MIT", + "dependencies": { + "pify": "^2.3.0" } }, "node_modules/readdirp": { @@ -1486,147 +1651,196 @@ "node": ">=8.10.0" } }, - "node_modules/resolve": { - "version": "1.21.0", - "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.21.0.tgz", - "integrity": "sha512-3wCbTpk5WJlyE4mSOtDLhqQmGFi0/TD9VPwmiolnk8U0wRgMEktqCXd3vy5buTO3tljvalNvKrjHEfrd2WpEKA==", - "dev": true, - "dependencies": { - "is-core-module": "^2.8.0", - "path-parse": "^1.0.7", - "supports-preserve-symlinks-flag": "^1.0.0" - }, - "bin": { - "resolve": "bin/resolve" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/resolve-from": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-4.0.0.tgz", - "integrity": "sha512-pb/MYmXstAkysRFx8piNI1tGFNQIFA3vkE3Gq4EuA1dF6gHp/+vgZqsCGJapvy8N3Q+4o7FwvquPJcnZ7RYy4g==", - "dev": true, - "engines": { - "node": ">=4" - } - }, - "node_modules/reusify": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/reusify/-/reusify-1.0.4.tgz", - "integrity": "sha512-U9nH88a3fc/ekCF1l0/UP1IosiuIjyTh7hBvXVMHYgVcfGvt897Xguj2UOLDeI5BG2m7/uwyaLVT6fbtCwTyzw==", + "node_modules/require-directory": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/require-directory/-/require-directory-2.1.1.tgz", + "integrity": "sha512-fGxEI7+wsG9xrvdjsrlmL22OMTTiHRwAMroiEeMgq8gzoLC/PQr7RsRDSTLUg/bZAZtF+TVIkHc6/4RIKrui+Q==", "dev": true, + "license": "MIT", "engines": { - "iojs": ">=1.0.0", "node": ">=0.10.0" } }, - "node_modules/run-parallel": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/run-parallel/-/run-parallel-1.2.0.tgz", - "integrity": "sha512-5l4VyZR86LZ/lDxZTR6jqL8AFE2S0IFLMP26AbjsLVADxHdhB/c0GUsH+y39UfCi3dzz8OlQuPmnaJOMoDHQBA==", + "node_modules/sax": { + "version": "1.4.3", + "resolved": "https://registry.npmjs.org/sax/-/sax-1.4.3.tgz", + "integrity": "sha512-yqYn1JhPczigF94DMS+shiDMjDowYO6y9+wB/4WgO0Y19jWYk0lQ4tuG5KI7kj4FTp1wxPj5IFfcrz/s1c3jjQ==", "dev": true, - "funding": [ - { - "type": "github", - "url": "https://github.com/sponsors/feross" - }, - { - "type": "patreon", - "url": "https://www.patreon.com/feross" - }, - { - "type": "consulting", - "url": "https://feross.org/support" - } - ], - "dependencies": { - "queue-microtask": "^1.2.2" - } + "license": "BlueOak-1.0.0" }, "node_modules/select": { "version": "1.1.2", "resolved": "https://registry.npmjs.org/select/-/select-1.1.2.tgz", "integrity": "sha1-DnNQrN7ICxEIUoeG7B1EGNEbOW0=" }, + "node_modules/slash": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/slash/-/slash-5.1.0.tgz", + "integrity": "sha512-ZA6oR3T/pEyuqwMgAKT0/hAv8oAXckzbkmR0UkUosQ+Mc4RxGoJkRmwHgHufaenlyAgE1Mxgpdcrf75y6XcnDg==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=14.16" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, "node_modules/source-map-js": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/source-map-js/-/source-map-js-1.0.2.tgz", - "integrity": "sha512-R0XvVJ9WusLiqTCEiGCmICCMplcCkIwwR11mOSD9CR5u+IXYdiseeEuXCVAjS54zqwkLcPNnmU4OeJ6tUrWhDw==", + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/source-map-js/-/source-map-js-1.2.1.tgz", + "integrity": "sha512-UXWMKhLOwVKb728IUtQPXxfYU+usdybtUrK/8uGE8CQMvrhOpwvzDBwj0QhSL7MQc7vIsISBG8VQ8+IDQxpfQA==", "dev": true, + "license": "BSD-3-Clause", "engines": { "node": ">=0.10.0" } }, - "node_modules/supports-color": { - "version": "7.2.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", - "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", + "node_modules/string-width": { + "version": "4.2.3", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz", + "integrity": "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==", "dev": true, + "license": "MIT", "dependencies": { - "has-flag": "^4.0.0" + "emoji-regex": "^8.0.0", + "is-fullwidth-code-point": "^3.0.0", + "strip-ansi": "^6.0.1" }, "engines": { "node": ">=8" } }, - "node_modules/supports-preserve-symlinks-flag": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/supports-preserve-symlinks-flag/-/supports-preserve-symlinks-flag-1.0.0.tgz", - "integrity": "sha512-ot0WnXS9fgdkgIcePe6RHNk1WA8+muPa6cSjeR3V8K27q9BB1rTE3R1p7Hv0z1ZyAc8s6Vvv8DIyWf681MAt0w==", + "node_modules/strip-ansi": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz", + "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==", + "dev": true, + "license": "MIT", + "dependencies": { + "ansi-regex": "^5.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/stylehacks": { + "version": "7.0.7", + "resolved": "https://registry.npmjs.org/stylehacks/-/stylehacks-7.0.7.tgz", + "integrity": "sha512-bJkD0JkEtbRrMFtwgpJyBbFIwfDDONQ1Ov3sDLZQP8HuJ73kBOyx66H4bOcAbVWmnfLdvQ0AJwXxOMkpujcO6g==", "dev": true, + "license": "MIT", + "dependencies": { + "browserslist": "^4.27.0", + "postcss-selector-parser": "^7.1.0" + }, "engines": { - "node": ">= 0.4" + "node": "^18.12.0 || ^20.9.0 || >=22.0" }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/tailwindcss": { - "version": "3.0.11", - "resolved": "https://registry.npmjs.org/tailwindcss/-/tailwindcss-3.0.11.tgz", - "integrity": "sha512-JyMsQ2kPqpOvG8ow535XpauXj3wz3nQqcy2tVlXj4FQ0eNlsdzvlAqpRA3q5rPLboWirNG6r2DqKczwjW2uc8Q==", - "dev": true, - "dependencies": { - "arg": "^5.0.1", - "chalk": "^4.1.2", - "chokidar": "^3.5.2", - "color-name": "^1.1.4", - "cosmiconfig": "^7.0.1", - "detective": "^5.2.0", - "didyoumean": "^1.2.2", - "dlv": "^1.1.3", - "fast-glob": "^3.2.7", - "glob-parent": "^6.0.2", - "is-glob": "^4.0.3", - "normalize-path": "^3.0.0", - "object-hash": "^2.2.0", - "postcss-js": "^4.0.0", - "postcss-load-config": "^3.1.0", - "postcss-nested": "5.0.6", - "postcss-selector-parser": "^6.0.7", - "postcss-value-parser": "^4.2.0", - "quick-lru": "^5.1.1", - "resolve": "^1.20.0" + "peerDependencies": { + "postcss": "^8.4.32" + } + }, + "node_modules/stylehacks/node_modules/postcss-selector-parser": { + "version": "7.1.1", + "resolved": "https://registry.npmjs.org/postcss-selector-parser/-/postcss-selector-parser-7.1.1.tgz", + "integrity": "sha512-orRsuYpJVw8LdAwqqLykBj9ecS5/cRHlI5+nvTo8LcCKmzDmqVORXtOIYEEQuL9D4BxtA1lm5isAqzQZCoQ6Eg==", + "dev": true, + "license": "MIT", + "dependencies": { + "cssesc": "^3.0.0", + "util-deprecate": "^1.0.2" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/svgo": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/svgo/-/svgo-4.0.0.tgz", + "integrity": "sha512-VvrHQ+9uniE+Mvx3+C9IEe/lWasXCU0nXMY2kZeLrHNICuRiC8uMPyM14UEaMOFA5mhyQqEkB02VoQ16n3DLaw==", + "dev": true, + "license": "MIT", + "dependencies": { + "commander": "^11.1.0", + "css-select": "^5.1.0", + "css-tree": "^3.0.1", + "css-what": "^6.1.0", + "csso": "^5.0.5", + "picocolors": "^1.1.1", + "sax": "^1.4.1" }, "bin": { - "tailwind": "lib/cli.js", - "tailwindcss": "lib/cli.js" + "svgo": "bin/svgo.js" }, "engines": { - "node": ">=12.13.0" + "node": ">=16" }, - "peerDependencies": { - "autoprefixer": "^10.0.2", - "postcss": "^8.0.9" + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/svgo" } }, + "node_modules/thenby": { + "version": "1.3.4", + "resolved": "https://registry.npmjs.org/thenby/-/thenby-1.3.4.tgz", + "integrity": "sha512-89Gi5raiWA3QZ4b2ePcEwswC3me9JIg+ToSgtE0JWeCynLnLxNr/f9G+xfo9K+Oj4AFdom8YNJjibIARTJmapQ==", + "dev": true, + "license": "Apache-2.0" + }, "node_modules/tiny-emitter": { "version": "2.1.0", "resolved": "https://registry.npmjs.org/tiny-emitter/-/tiny-emitter-2.1.0.tgz", "integrity": "sha512-NB6Dk1A9xgQPMoGqC5CVXn123gWyte215ONT5Pp5a0yt4nlEoO1ZWeCwpncaekPHXO60i47ihFnZPiRPjRMq4Q==" }, + "node_modules/tinyglobby": { + "version": "0.2.15", + "resolved": "https://registry.npmjs.org/tinyglobby/-/tinyglobby-0.2.15.tgz", + "integrity": "sha512-j2Zq4NyQYG5XMST4cbs02Ak8iJUdxRM0XI5QyxXuZOzKOINmWurp3smXu3y5wDcJrptwpSjgXHzIQxR0omXljQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "fdir": "^6.5.0", + "picomatch": "^4.0.3" + }, + "engines": { + "node": ">=12.0.0" + }, + "funding": { + "url": "https://github.com/sponsors/SuperchupuDev" + } + }, + "node_modules/tinyglobby/node_modules/fdir": { + "version": "6.5.0", + "resolved": "https://registry.npmjs.org/fdir/-/fdir-6.5.0.tgz", + "integrity": "sha512-tIbYtZbucOs0BRGqPJkshJUYdL+SDH7dVM8gjy+ERp3WAUjLEFJE+02kanyHtwjWOnwrKYBiwAmM0p4kLJAnXg==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=12.0.0" + }, + "peerDependencies": { + "picomatch": "^3 || ^4" + }, + "peerDependenciesMeta": { + "picomatch": { + "optional": true + } + } + }, + "node_modules/tinyglobby/node_modules/picomatch": { + "version": "4.0.3", + "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-4.0.3.tgz", + "integrity": "sha512-5gTmgEY/sqK6gFXLIsQNH19lWb4ebPDLA4SdLP7dsWkIXHWlG66oPuVvXSGFPppYZz8ZDZq0dYYrbHfBCVUb1Q==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/jonschlinkert" + } + }, "node_modules/to-regex-range": { "version": "5.0.1", "resolved": "https://registry.npmjs.org/to-regex-range/-/to-regex-range-5.0.1.tgz", @@ -1639,1091 +1853,114 @@ "node": ">=8.0" } }, - "node_modules/toastify-js": { - "version": "1.11.2", - "resolved": "https://registry.npmjs.org/toastify-js/-/toastify-js-1.11.2.tgz", - "integrity": "sha512-bMBNKhZLPX/sDhpwM7KHIRUTtqCylQeoZDiEWy5zE7iDUJ92XmP8AKgDAp9rXx6pR5GXGFtQHHoH62toahbHgQ==" - }, "node_modules/topbar": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/topbar/-/topbar-1.0.1.tgz", "integrity": "sha512-HZqQSMBiG29vcjOrqKCM9iGY/h69G5gQH7ae83ZCPz5uPmbQKwK0sMEqzVDBiu64tWHJ+kk9NApECrF+FAAvRA==" }, + "node_modules/universalify": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/universalify/-/universalify-2.0.1.tgz", + "integrity": "sha512-gptHNQghINnc/vTGIk0SOFGFNXw7JVrlRUtConJRlvaw6DuX0wO5Jeko9sWrMBhh+PsYAZ7oXAiOnf/UKogyiw==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 10.0.0" + } + }, + "node_modules/update-browserslist-db": { + "version": "1.2.3", + "resolved": "https://registry.npmjs.org/update-browserslist-db/-/update-browserslist-db-1.2.3.tgz", + "integrity": "sha512-Js0m9cx+qOgDxo0eMiFGEueWztz+d4+M3rGlmKPT+T4IS/jP4ylw3Nwpu6cpTTP8R1MAC1kF4VbdLt3ARf209w==", + "dev": true, + "funding": [ + { + "type": "opencollective", + "url": "https://opencollective.com/browserslist" + }, + { + "type": "tidelift", + "url": "https://tidelift.com/funding/github/npm/browserslist" + }, + { + "type": "github", + "url": "https://github.com/sponsors/ai" + } + ], + "license": "MIT", + "dependencies": { + "escalade": "^3.2.0", + "picocolors": "^1.1.1" + }, + "bin": { + "update-browserslist-db": "cli.js" + }, + "peerDependencies": { + "browserslist": ">= 4.21.0" + } + }, "node_modules/util-deprecate": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/util-deprecate/-/util-deprecate-1.0.2.tgz", "integrity": "sha1-RQ1Nyfpw3nMnYvvS1KKJgUGaDM8=", "dev": true }, - "node_modules/xtend": { - "version": "4.0.2", - "resolved": "https://registry.npmjs.org/xtend/-/xtend-4.0.2.tgz", - "integrity": "sha512-LKYU1iAXJXUgAXn9URjiu+MWhyUXHsvfp7mcuYm9dSUKK0/CjtrUwFAxD82/mCWbtLsGjFIad0wIsod4zrTAEQ==", + "node_modules/wrap-ansi": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-7.0.0.tgz", + "integrity": "sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q==", "dev": true, + "license": "MIT", + "dependencies": { + "ansi-styles": "^4.0.0", + "string-width": "^4.1.0", + "strip-ansi": "^6.0.0" + }, "engines": { - "node": ">=0.4" + "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/wrap-ansi?sponsor=1" } }, - "node_modules/yaml": { - "version": "1.10.2", - "resolved": "https://registry.npmjs.org/yaml/-/yaml-1.10.2.tgz", - "integrity": "sha512-r3vXyErRCYJ7wg28yvBY5VSoAF8ZvlcW9/BwUzEtUsjvX/DKs24dIkuwjtuprwJJHsbyUbLApepYTR1BN4uHrg==", + "node_modules/y18n": { + "version": "5.0.8", + "resolved": "https://registry.npmjs.org/y18n/-/y18n-5.0.8.tgz", + "integrity": "sha512-0pfFzegeDWJHJIAmTLRP2DwHjdF5s7jo9tuztdQxAhINCdvS+3nGINqPd00AphqJR/0LhANUS6/+7SCb98YOfA==", "dev": true, + "license": "ISC", "engines": { - "node": ">= 6" - } - } - }, - "dependencies": { - "@babel/code-frame": { - "version": "7.16.7", - "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.16.7.tgz", - "integrity": "sha512-iAXqUn8IIeBTNd72xsFlgaXHkMBMt6y4HJp1tIaK465CWLT/fG1aqB7ykr95gHHmlBdGbFeWWfyB4NJJ0nmeIg==", - "dev": true, - "requires": { - "@babel/highlight": "^7.16.7" - } - }, - "@babel/helper-validator-identifier": { - "version": "7.16.7", - "resolved": "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.16.7.tgz", - "integrity": "sha512-hsEnFemeiW4D08A5gUAZxLBTXpZ39P+a+DGDsHw1yxqyQ/jzFEnxf5uTEGp+3bzAbNOxU1paTgYS4ECU/IgfDw==", - "dev": true - }, - "@babel/highlight": { - "version": "7.16.7", - "resolved": "https://registry.npmjs.org/@babel/highlight/-/highlight-7.16.7.tgz", - "integrity": "sha512-aKpPMfLvGO3Q97V0qhw/V2SWNWlwfJknuwAunU7wZLSfrM4xTBvg7E5opUVi1kJTBKihE38CPg4nBiqX83PWYw==", - "dev": true, - "requires": { - "@babel/helper-validator-identifier": "^7.16.7", - "chalk": "^2.0.0", - "js-tokens": "^4.0.0" - }, - "dependencies": { - "ansi-styles": { - "version": "3.2.1", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz", - "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==", - "dev": true, - "requires": { - "color-convert": "^1.9.0" - } - }, - "chalk": { - "version": "2.4.2", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz", - "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==", - "dev": true, - "requires": { - "ansi-styles": "^3.2.1", - "escape-string-regexp": "^1.0.5", - "supports-color": "^5.3.0" - } - }, - "color-convert": { - "version": "1.9.3", - "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-1.9.3.tgz", - "integrity": "sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg==", - "dev": true, - "requires": { - "color-name": "1.1.3" - } - }, - "color-name": { - "version": "1.1.3", - "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.3.tgz", - "integrity": "sha1-p9BVi9icQveV3UIyj3QIMcpTvCU=", - "dev": true - }, - "has-flag": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz", - "integrity": "sha1-tdRU3CGZriJWmfNGfloH87lVuv0=", - "dev": true - }, - "supports-color": { - "version": "5.5.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz", - "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==", - "dev": true, - "requires": { - "has-flag": "^3.0.0" - } - } + "node": ">=10" } }, - "@esbuild/aix-ppc64": { - "version": "0.25.0", - "resolved": "https://registry.npmjs.org/@esbuild/aix-ppc64/-/aix-ppc64-0.25.0.tgz", - "integrity": "sha512-O7vun9Sf8DFjH2UtqK8Ku3LkquL9SZL8OLY1T5NZkA34+wG3OQF7cl4Ql8vdNzM6fzBbYfLaiRLIOZ+2FOCgBQ==", + "node_modules/yargs": { + "version": "17.7.2", + "resolved": "https://registry.npmjs.org/yargs/-/yargs-17.7.2.tgz", + "integrity": "sha512-7dSzzRQ++CKnNI/krKnYRV7JKKPUXMEh61soaHKg9mrWEhzFWhFnxPxGl+69cD1Ou63C13NUPCnmIcrvqCuM6w==", "dev": true, - "optional": true + "license": "MIT", + "dependencies": { + "cliui": "^8.0.1", + "escalade": "^3.1.1", + "get-caller-file": "^2.0.5", + "require-directory": "^2.1.1", + "string-width": "^4.2.3", + "y18n": "^5.0.5", + "yargs-parser": "^21.1.1" + }, + "engines": { + "node": ">=12" + } }, - "@esbuild/android-arm": { - "version": "0.25.0", - "resolved": "https://registry.npmjs.org/@esbuild/android-arm/-/android-arm-0.25.0.tgz", - "integrity": "sha512-PTyWCYYiU0+1eJKmw21lWtC+d08JDZPQ5g+kFyxP0V+es6VPPSUhM6zk8iImp2jbV6GwjX4pap0JFbUQN65X1g==", + "node_modules/yargs-parser": { + "version": "21.1.1", + "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-21.1.1.tgz", + "integrity": "sha512-tVpsJW7DdjecAiFpbIB1e3qxIQsE6NoPc5/eTdrbbIC4h0LVsWhnoa3g+m2HclBIujHzsxZ4VJVA+GUuc2/LBw==", "dev": true, - "optional": true - }, - "@esbuild/android-arm64": { - "version": "0.25.0", - "resolved": "https://registry.npmjs.org/@esbuild/android-arm64/-/android-arm64-0.25.0.tgz", - "integrity": "sha512-grvv8WncGjDSyUBjN9yHXNt+cq0snxXbDxy5pJtzMKGmmpPxeAmAhWxXI+01lU5rwZomDgD3kJwulEnhTRUd6g==", - "dev": true, - "optional": true - }, - "@esbuild/android-x64": { - "version": "0.25.0", - "resolved": "https://registry.npmjs.org/@esbuild/android-x64/-/android-x64-0.25.0.tgz", - "integrity": "sha512-m/ix7SfKG5buCnxasr52+LI78SQ+wgdENi9CqyCXwjVR2X4Jkz+BpC3le3AoBPYTC9NHklwngVXvbJ9/Akhrfg==", - "dev": true, - "optional": true - }, - "@esbuild/darwin-arm64": { - "version": "0.25.0", - "resolved": "https://registry.npmjs.org/@esbuild/darwin-arm64/-/darwin-arm64-0.25.0.tgz", - "integrity": "sha512-mVwdUb5SRkPayVadIOI78K7aAnPamoeFR2bT5nszFUZ9P8UpK4ratOdYbZZXYSqPKMHfS1wdHCJk1P1EZpRdvw==", - "dev": true, - "optional": true - }, - "@esbuild/darwin-x64": { - "version": "0.25.0", - "resolved": "https://registry.npmjs.org/@esbuild/darwin-x64/-/darwin-x64-0.25.0.tgz", - "integrity": "sha512-DgDaYsPWFTS4S3nWpFcMn/33ZZwAAeAFKNHNa1QN0rI4pUjgqf0f7ONmXf6d22tqTY+H9FNdgeaAa+YIFUn2Rg==", - "dev": true, - "optional": true - }, - "@esbuild/freebsd-arm64": { - "version": "0.25.0", - "resolved": "https://registry.npmjs.org/@esbuild/freebsd-arm64/-/freebsd-arm64-0.25.0.tgz", - "integrity": "sha512-VN4ocxy6dxefN1MepBx/iD1dH5K8qNtNe227I0mnTRjry8tj5MRk4zprLEdG8WPyAPb93/e4pSgi1SoHdgOa4w==", - "dev": true, - "optional": true - }, - "@esbuild/freebsd-x64": { - "version": "0.25.0", - "resolved": "https://registry.npmjs.org/@esbuild/freebsd-x64/-/freebsd-x64-0.25.0.tgz", - "integrity": "sha512-mrSgt7lCh07FY+hDD1TxiTyIHyttn6vnjesnPoVDNmDfOmggTLXRv8Id5fNZey1gl/V2dyVK1VXXqVsQIiAk+A==", - "dev": true, - "optional": true - }, - "@esbuild/linux-arm": { - "version": "0.25.0", - "resolved": "https://registry.npmjs.org/@esbuild/linux-arm/-/linux-arm-0.25.0.tgz", - "integrity": "sha512-vkB3IYj2IDo3g9xX7HqhPYxVkNQe8qTK55fraQyTzTX/fxaDtXiEnavv9geOsonh2Fd2RMB+i5cbhu2zMNWJwg==", - "dev": true, - "optional": true - }, - "@esbuild/linux-arm64": { - "version": "0.25.0", - "resolved": "https://registry.npmjs.org/@esbuild/linux-arm64/-/linux-arm64-0.25.0.tgz", - "integrity": "sha512-9QAQjTWNDM/Vk2bgBl17yWuZxZNQIF0OUUuPZRKoDtqF2k4EtYbpyiG5/Dk7nqeK6kIJWPYldkOcBqjXjrUlmg==", - "dev": true, - "optional": true - }, - "@esbuild/linux-ia32": { - "version": "0.25.0", - "resolved": "https://registry.npmjs.org/@esbuild/linux-ia32/-/linux-ia32-0.25.0.tgz", - "integrity": "sha512-43ET5bHbphBegyeqLb7I1eYn2P/JYGNmzzdidq/w0T8E2SsYL1U6un2NFROFRg1JZLTzdCoRomg8Rvf9M6W6Gg==", - "dev": true, - "optional": true - }, - "@esbuild/linux-loong64": { - "version": "0.25.0", - "resolved": "https://registry.npmjs.org/@esbuild/linux-loong64/-/linux-loong64-0.25.0.tgz", - "integrity": "sha512-fC95c/xyNFueMhClxJmeRIj2yrSMdDfmqJnyOY4ZqsALkDrrKJfIg5NTMSzVBr5YW1jf+l7/cndBfP3MSDpoHw==", - "dev": true, - "optional": true - }, - "@esbuild/linux-mips64el": { - "version": "0.25.0", - "resolved": "https://registry.npmjs.org/@esbuild/linux-mips64el/-/linux-mips64el-0.25.0.tgz", - "integrity": "sha512-nkAMFju7KDW73T1DdH7glcyIptm95a7Le8irTQNO/qtkoyypZAnjchQgooFUDQhNAy4iu08N79W4T4pMBwhPwQ==", - "dev": true, - "optional": true - }, - "@esbuild/linux-ppc64": { - "version": "0.25.0", - "resolved": "https://registry.npmjs.org/@esbuild/linux-ppc64/-/linux-ppc64-0.25.0.tgz", - "integrity": "sha512-NhyOejdhRGS8Iwv+KKR2zTq2PpysF9XqY+Zk77vQHqNbo/PwZCzB5/h7VGuREZm1fixhs4Q/qWRSi5zmAiO4Fw==", - "dev": true, - "optional": true - }, - "@esbuild/linux-riscv64": { - "version": "0.25.0", - "resolved": "https://registry.npmjs.org/@esbuild/linux-riscv64/-/linux-riscv64-0.25.0.tgz", - "integrity": "sha512-5S/rbP5OY+GHLC5qXp1y/Mx//e92L1YDqkiBbO9TQOvuFXM+iDqUNG5XopAnXoRH3FjIUDkeGcY1cgNvnXp/kA==", - "dev": true, - "optional": true - }, - "@esbuild/linux-s390x": { - "version": "0.25.0", - "resolved": "https://registry.npmjs.org/@esbuild/linux-s390x/-/linux-s390x-0.25.0.tgz", - "integrity": "sha512-XM2BFsEBz0Fw37V0zU4CXfcfuACMrppsMFKdYY2WuTS3yi8O1nFOhil/xhKTmE1nPmVyvQJjJivgDT+xh8pXJA==", - "dev": true, - "optional": true - }, - "@esbuild/linux-x64": { - "version": "0.25.0", - "resolved": "https://registry.npmjs.org/@esbuild/linux-x64/-/linux-x64-0.25.0.tgz", - "integrity": "sha512-9yl91rHw/cpwMCNytUDxwj2XjFpxML0y9HAOH9pNVQDpQrBxHy01Dx+vaMu0N1CKa/RzBD2hB4u//nfc+Sd3Cw==", - "dev": true, - "optional": true - }, - "@esbuild/netbsd-arm64": { - "version": "0.25.0", - "resolved": "https://registry.npmjs.org/@esbuild/netbsd-arm64/-/netbsd-arm64-0.25.0.tgz", - "integrity": "sha512-RuG4PSMPFfrkH6UwCAqBzauBWTygTvb1nxWasEJooGSJ/NwRw7b2HOwyRTQIU97Hq37l3npXoZGYMy3b3xYvPw==", - "dev": true, - "optional": true - }, - "@esbuild/netbsd-x64": { - "version": "0.25.0", - "resolved": "https://registry.npmjs.org/@esbuild/netbsd-x64/-/netbsd-x64-0.25.0.tgz", - "integrity": "sha512-jl+qisSB5jk01N5f7sPCsBENCOlPiS/xptD5yxOx2oqQfyourJwIKLRA2yqWdifj3owQZCL2sn6o08dBzZGQzA==", - "dev": true, - "optional": true - }, - "@esbuild/openbsd-arm64": { - "version": "0.25.0", - "resolved": "https://registry.npmjs.org/@esbuild/openbsd-arm64/-/openbsd-arm64-0.25.0.tgz", - "integrity": "sha512-21sUNbq2r84YE+SJDfaQRvdgznTD8Xc0oc3p3iW/a1EVWeNj/SdUCbm5U0itZPQYRuRTW20fPMWMpcrciH2EJw==", - "dev": true, - "optional": true - }, - "@esbuild/openbsd-x64": { - "version": "0.25.0", - "resolved": "https://registry.npmjs.org/@esbuild/openbsd-x64/-/openbsd-x64-0.25.0.tgz", - "integrity": "sha512-2gwwriSMPcCFRlPlKx3zLQhfN/2WjJ2NSlg5TKLQOJdV0mSxIcYNTMhk3H3ulL/cak+Xj0lY1Ym9ysDV1igceg==", - "dev": true, - "optional": true - }, - "@esbuild/sunos-x64": { - "version": "0.25.0", - "resolved": "https://registry.npmjs.org/@esbuild/sunos-x64/-/sunos-x64-0.25.0.tgz", - "integrity": "sha512-bxI7ThgLzPrPz484/S9jLlvUAHYMzy6I0XiU1ZMeAEOBcS0VePBFxh1JjTQt3Xiat5b6Oh4x7UC7IwKQKIJRIg==", - "dev": true, - "optional": true - }, - "@esbuild/win32-arm64": { - "version": "0.25.0", - "resolved": "https://registry.npmjs.org/@esbuild/win32-arm64/-/win32-arm64-0.25.0.tgz", - "integrity": "sha512-ZUAc2YK6JW89xTbXvftxdnYy3m4iHIkDtK3CLce8wg8M2L+YZhIvO1DKpxrd0Yr59AeNNkTiic9YLf6FTtXWMw==", - "dev": true, - "optional": true - }, - "@esbuild/win32-ia32": { - "version": "0.25.0", - "resolved": "https://registry.npmjs.org/@esbuild/win32-ia32/-/win32-ia32-0.25.0.tgz", - "integrity": "sha512-eSNxISBu8XweVEWG31/JzjkIGbGIJN/TrRoiSVZwZ6pkC6VX4Im/WV2cz559/TXLcYbcrDN8JtKgd9DJVIo8GA==", - "dev": true, - "optional": true - }, - "@esbuild/win32-x64": { - "version": "0.25.0", - "resolved": "https://registry.npmjs.org/@esbuild/win32-x64/-/win32-x64-0.25.0.tgz", - "integrity": "sha512-ZENoHJBxA20C2zFzh6AI4fT6RraMzjYw4xKWemRTRmRVtN9c5DcH9r/f2ihEkMjOW5eGgrwCslG/+Y/3bL+DHQ==", - "dev": true, - "optional": true - }, - "@nodelib/fs.scandir": { - "version": "2.1.5", - "resolved": "https://registry.npmjs.org/@nodelib/fs.scandir/-/fs.scandir-2.1.5.tgz", - "integrity": "sha512-vq24Bq3ym5HEQm2NKCr3yXDwjc7vTsEThRDnkp2DK9p1uqLR+DHurm/NOTo0KG7HYHU7eppKZj3MyqYuMBf62g==", - "dev": true, - "requires": { - "@nodelib/fs.stat": "2.0.5", - "run-parallel": "^1.1.9" - } - }, - "@nodelib/fs.stat": { - "version": "2.0.5", - "resolved": "https://registry.npmjs.org/@nodelib/fs.stat/-/fs.stat-2.0.5.tgz", - "integrity": "sha512-RkhPPp2zrqDAQA/2jNhnztcPAlv64XdhIp7a7454A5ovI7Bukxgt7MX7udwAu3zg1DcpPU0rz3VV1SeaqvY4+A==", - "dev": true - }, - "@nodelib/fs.walk": { - "version": "1.2.8", - "resolved": "https://registry.npmjs.org/@nodelib/fs.walk/-/fs.walk-1.2.8.tgz", - "integrity": "sha512-oGB+UxlgWcgQkgwo8GcEGwemoTFt3FIO9ababBmaGwXIoBKZ+GTy0pP185beGg7Llih/NSHSV2XAs1lnznocSg==", - "dev": true, - "requires": { - "@nodelib/fs.scandir": "2.1.5", - "fastq": "^1.6.0" - } - }, - "@types/parse-json": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/@types/parse-json/-/parse-json-4.0.0.tgz", - "integrity": "sha512-//oorEZjL6sbPcKUaCdIGlIUeH26mgzimjBB77G6XRgnDl/L5wOnpyBGRe/Mmf5CVW3PwEBE1NjiMZ/ssFh4wA==", - "dev": true - }, - "acorn": { - "version": "7.4.1", - "resolved": "https://registry.npmjs.org/acorn/-/acorn-7.4.1.tgz", - "integrity": "sha512-nQyp0o1/mNdbTO1PO6kHkwSrmgZ0MT/jCCpNiwbUjGoRN4dlBhqJtoQuCnEOKzgTVwg0ZWiCoQy6SxMebQVh8A==", - "dev": true - }, - "acorn-node": { - "version": "1.8.2", - "resolved": "https://registry.npmjs.org/acorn-node/-/acorn-node-1.8.2.tgz", - "integrity": "sha512-8mt+fslDufLYntIoPAaIMUe/lrbrehIiwmR3t2k9LljIzoigEPF27eLk2hy8zSGzmR/ogr7zbRKINMo1u0yh5A==", - "dev": true, - "requires": { - "acorn": "^7.0.0", - "acorn-walk": "^7.0.0", - "xtend": "^4.0.2" - } - }, - "acorn-walk": { - "version": "7.2.0", - "resolved": "https://registry.npmjs.org/acorn-walk/-/acorn-walk-7.2.0.tgz", - "integrity": "sha512-OPdCF6GsMIP+Az+aWfAAOEt2/+iVDKE7oy6lJ098aoe59oAmK76qV6Gw60SbZ8jHuG2wH058GF4pLFbYamYrVA==", - "dev": true - }, - "ansi-styles": { - "version": "4.3.0", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", - "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", - "dev": true, - "requires": { - "color-convert": "^2.0.1" - } - }, - "anymatch": { - "version": "3.1.2", - "resolved": "https://registry.npmjs.org/anymatch/-/anymatch-3.1.2.tgz", - "integrity": "sha512-P43ePfOAIupkguHUycrc4qJ9kz8ZiuOUijaETwX7THt0Y/GNK7v0aa8rY816xWjZ7rJdA5XdMcpVFTKMq+RvWg==", - "dev": true, - "requires": { - "normalize-path": "^3.0.0", - "picomatch": "^2.0.4" - } - }, - "arg": { - "version": "5.0.1", - "resolved": "https://registry.npmjs.org/arg/-/arg-5.0.1.tgz", - "integrity": "sha512-e0hDa9H2Z9AwFkk2qDlwhoMYE4eToKarchkQHovNdLTCYMHZHeRjI71crOh+dio4K6u1IcwubQqo79Ga4CyAQA==", - "dev": true - }, - "autoprefixer": { - "version": "10.4.1", - "resolved": "https://registry.npmjs.org/autoprefixer/-/autoprefixer-10.4.1.tgz", - "integrity": "sha512-B3ZEG7wtzXDRCEFsan7HmR2AeNsxdJB0+sEC0Hc5/c2NbhJqPwuZm+tn233GBVw82L+6CtD6IPSfVruwKjfV3A==", - "dev": true, - "requires": { - "browserslist": "^4.19.1", - "caniuse-lite": "^1.0.30001294", - "fraction.js": "^4.1.2", - "normalize-range": "^0.1.2", - "picocolors": "^1.0.0", - "postcss-value-parser": "^4.2.0" - } - }, - "binary-extensions": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/binary-extensions/-/binary-extensions-2.2.0.tgz", - "integrity": "sha512-jDctJ/IVQbZoJykoeHbhXpOlNBqGNcwXJKJog42E5HDPUwQTSdjCHdihjj0DlnheQ7blbT6dHOafNAiS8ooQKA==", - "dev": true - }, - "braces": { - "version": "3.0.3", - "resolved": "https://registry.npmjs.org/braces/-/braces-3.0.3.tgz", - "integrity": "sha512-yQbXgO/OSZVD2IsiLlro+7Hf6Q18EJrKSEsdoMzKePKXct3gvD8oLcOQdIzGupr5Fj+EDe8gO/lxc1BzfMpxvA==", - "dev": true, - "requires": { - "fill-range": "^7.1.1" - } - }, - "browserslist": { - "version": "4.19.1", - "resolved": "https://registry.npmjs.org/browserslist/-/browserslist-4.19.1.tgz", - "integrity": "sha512-u2tbbG5PdKRTUoctO3NBD8FQ5HdPh1ZXPHzp1rwaa5jTc+RV9/+RlWiAIKmjRPQF+xbGM9Kklj5bZQFa2s/38A==", - "dev": true, - "requires": { - "caniuse-lite": "^1.0.30001286", - "electron-to-chromium": "^1.4.17", - "escalade": "^3.1.1", - "node-releases": "^2.0.1", - "picocolors": "^1.0.0" - } - }, - "callsites": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/callsites/-/callsites-3.1.0.tgz", - "integrity": "sha512-P8BjAsXvZS+VIDUI11hHCQEv74YT67YUi5JJFNWIqL235sBmjX4+qx9Muvls5ivyNENctx46xQLQ3aTuE7ssaQ==", - "dev": true - }, - "camelcase-css": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/camelcase-css/-/camelcase-css-2.0.1.tgz", - "integrity": "sha512-QOSvevhslijgYwRx6Rv7zKdMF8lbRmx+uQGx2+vDc+KI/eBnsy9kit5aj23AgGu3pa4t9AgwbnXWqS+iOY+2aA==", - "dev": true - }, - "caniuse-lite": { - "version": "1.0.30001296", - "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001296.tgz", - "integrity": "sha512-WfrtPEoNSoeATDlf4y3QvkwiELl9GyPLISV5GejTbbQRtQx4LhsXmc9IQ6XCL2d7UxCyEzToEZNMeqR79OUw8Q==", - "dev": true - }, - "chalk": { - "version": "4.1.2", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", - "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", - "dev": true, - "requires": { - "ansi-styles": "^4.1.0", - "supports-color": "^7.1.0" - } - }, - "chokidar": { - "version": "3.5.2", - "resolved": "https://registry.npmjs.org/chokidar/-/chokidar-3.5.2.tgz", - "integrity": "sha512-ekGhOnNVPgT77r4K/U3GDhu+FQ2S8TnK/s2KbIGXi0SZWuwkZ2QNyfWdZW+TVfn84DpEP7rLeCt2UI6bJ8GwbQ==", - "dev": true, - "requires": { - "anymatch": "~3.1.2", - "braces": "~3.0.2", - "fsevents": "~2.3.2", - "glob-parent": "~5.1.2", - "is-binary-path": "~2.1.0", - "is-glob": "~4.0.1", - "normalize-path": "~3.0.0", - "readdirp": "~3.6.0" - }, - "dependencies": { - "glob-parent": { - "version": "5.1.2", - "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-5.1.2.tgz", - "integrity": "sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==", - "dev": true, - "requires": { - "is-glob": "^4.0.1" - } - } - } - }, - "clipboard": { - "version": "2.0.10", - "resolved": "https://registry.npmjs.org/clipboard/-/clipboard-2.0.10.tgz", - "integrity": "sha512-cz3m2YVwFz95qSEbCDi2fzLN/epEN9zXBvfgAoGkvGOJZATMl9gtTDVOtBYkx2ODUJl2kvmud7n32sV2BpYR4g==", - "requires": { - "good-listener": "^1.2.2", - "select": "^1.1.2", - "tiny-emitter": "^2.0.0" - } - }, - "color-convert": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", - "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", - "dev": true, - "requires": { - "color-name": "~1.1.4" - } - }, - "color-name": { - "version": "1.1.4", - "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", - "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", - "dev": true - }, - "cosmiconfig": { - "version": "7.0.1", - "resolved": "https://registry.npmjs.org/cosmiconfig/-/cosmiconfig-7.0.1.tgz", - "integrity": "sha512-a1YWNUV2HwGimB7dU2s1wUMurNKjpx60HxBB6xUM8Re+2s1g1IIfJvFR0/iCF+XHdE0GMTKTuLR32UQff4TEyQ==", - "dev": true, - "requires": { - "@types/parse-json": "^4.0.0", - "import-fresh": "^3.2.1", - "parse-json": "^5.0.0", - "path-type": "^4.0.0", - "yaml": "^1.10.0" - } - }, - "cssesc": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/cssesc/-/cssesc-3.0.0.tgz", - "integrity": "sha512-/Tb/JcjK111nNScGob5MNtsntNM1aCNUDipB/TkwZFhyDrrE47SOx/18wF2bbjgc3ZzCSKW1T5nt5EbFoAz/Vg==", - "dev": true - }, - "defined": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/defined/-/defined-1.0.0.tgz", - "integrity": "sha1-yY2bzvdWdBiOEQlpFRGZ45sfppM=", - "dev": true - }, - "delegate": { - "version": "3.2.0", - "resolved": "https://registry.npmjs.org/delegate/-/delegate-3.2.0.tgz", - "integrity": "sha512-IofjkYBZaZivn0V8nnsMJGBr4jVLxHDheKSW88PyxS5QC4Vo9ZbZVvhzlSxY87fVq3STR6r+4cGepyHkcWOQSw==" - }, - "detective": { - "version": "5.2.0", - "resolved": "https://registry.npmjs.org/detective/-/detective-5.2.0.tgz", - "integrity": "sha512-6SsIx+nUUbuK0EthKjv0zrdnajCCXVYGmbYYiYjFVpzcjwEs/JMDZ8tPRG29J/HhN56t3GJp2cGSWDRjjot8Pg==", - "dev": true, - "requires": { - "acorn-node": "^1.6.1", - "defined": "^1.0.0", - "minimist": "^1.1.1" - } - }, - "didyoumean": { - "version": "1.2.2", - "resolved": "https://registry.npmjs.org/didyoumean/-/didyoumean-1.2.2.tgz", - "integrity": "sha512-gxtyfqMg7GKyhQmb056K7M3xszy/myH8w+B4RT+QXBQsvAOdc3XymqDDPHx1BgPgsdAA5SIifona89YtRATDzw==", - "dev": true - }, - "dlv": { - "version": "1.1.3", - "resolved": "https://registry.npmjs.org/dlv/-/dlv-1.1.3.tgz", - "integrity": "sha512-+HlytyjlPKnIG8XuRG8WvmBP8xs8P71y+SKKS6ZXWoEgLuePxtDoUEiH7WkdePWrQ5JBpE6aoVqfZfJUQkjXwA==", - "dev": true - }, - "electron-to-chromium": { - "version": "1.4.37", - "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.4.37.tgz", - "integrity": "sha512-XIvFB1omSAxYgHYX48sC+HR8i/p7lx7R+0cX9faElg1g++h9IilCrJ12+bQuY+d96Wp7zkBiJwMOv+AhLtLrTg==", - "dev": true - }, - "error-ex": { - "version": "1.3.2", - "resolved": "https://registry.npmjs.org/error-ex/-/error-ex-1.3.2.tgz", - "integrity": "sha512-7dFHNmqeFSEt2ZBsCriorKnn3Z2pj+fd9kmI6QoWw4//DL+icEBfc0U7qJCisqrTsKTjw4fNFy2pW9OqStD84g==", - "dev": true, - "requires": { - "is-arrayish": "^0.2.1" - } - }, - "esbuild": { - "version": "0.25.0", - "resolved": "https://registry.npmjs.org/esbuild/-/esbuild-0.25.0.tgz", - "integrity": "sha512-BXq5mqc8ltbaN34cDqWuYKyNhX8D/Z0J1xdtdQ8UcIIIyJyz+ZMKUt58tF3SrZ85jcfN/PZYhjR5uDQAYNVbuw==", - "dev": true, - "requires": { - "@esbuild/aix-ppc64": "0.25.0", - "@esbuild/android-arm": "0.25.0", - "@esbuild/android-arm64": "0.25.0", - "@esbuild/android-x64": "0.25.0", - "@esbuild/darwin-arm64": "0.25.0", - "@esbuild/darwin-x64": "0.25.0", - "@esbuild/freebsd-arm64": "0.25.0", - "@esbuild/freebsd-x64": "0.25.0", - "@esbuild/linux-arm": "0.25.0", - "@esbuild/linux-arm64": "0.25.0", - "@esbuild/linux-ia32": "0.25.0", - "@esbuild/linux-loong64": "0.25.0", - "@esbuild/linux-mips64el": "0.25.0", - "@esbuild/linux-ppc64": "0.25.0", - "@esbuild/linux-riscv64": "0.25.0", - "@esbuild/linux-s390x": "0.25.0", - "@esbuild/linux-x64": "0.25.0", - "@esbuild/netbsd-arm64": "0.25.0", - "@esbuild/netbsd-x64": "0.25.0", - "@esbuild/openbsd-arm64": "0.25.0", - "@esbuild/openbsd-x64": "0.25.0", - "@esbuild/sunos-x64": "0.25.0", - "@esbuild/win32-arm64": "0.25.0", - "@esbuild/win32-ia32": "0.25.0", - "@esbuild/win32-x64": "0.25.0" - } - }, - "escalade": { - "version": "3.1.1", - "resolved": "https://registry.npmjs.org/escalade/-/escalade-3.1.1.tgz", - "integrity": "sha512-k0er2gUkLf8O0zKJiAhmkTnJlTvINGv7ygDNPbeIsX/TJjGJZHuh9B2UxbsaEkmlEo9MfhrSzmhIlhRlI2GXnw==", - "dev": true - }, - "escape-string-regexp": { - "version": "1.0.5", - "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz", - "integrity": "sha1-G2HAViGQqN/2rjuyzwIAyhMLhtQ=", - "dev": true - }, - "fast-glob": { - "version": "3.2.7", - "resolved": "https://registry.npmjs.org/fast-glob/-/fast-glob-3.2.7.tgz", - "integrity": "sha512-rYGMRwip6lUMvYD3BTScMwT1HtAs2d71SMv66Vrxs0IekGZEjhM0pcMfjQPnknBt2zeCwQMEupiN02ZP4DiT1Q==", - "dev": true, - "requires": { - "@nodelib/fs.stat": "^2.0.2", - "@nodelib/fs.walk": "^1.2.3", - "glob-parent": "^5.1.2", - "merge2": "^1.3.0", - "micromatch": "^4.0.4" - }, - "dependencies": { - "glob-parent": { - "version": "5.1.2", - "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-5.1.2.tgz", - "integrity": "sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==", - "dev": true, - "requires": { - "is-glob": "^4.0.1" - } - } - } - }, - "fastq": { - "version": "1.13.0", - "resolved": "https://registry.npmjs.org/fastq/-/fastq-1.13.0.tgz", - "integrity": "sha512-YpkpUnK8od0o1hmeSc7UUs/eB/vIPWJYjKck2QKIzAf71Vm1AAQ3EbuZB3g2JIy+pg+ERD0vqI79KyZiB2e2Nw==", - "dev": true, - "requires": { - "reusify": "^1.0.4" - } - }, - "fill-range": { - "version": "7.1.1", - "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-7.1.1.tgz", - "integrity": "sha512-YsGpe3WHLK8ZYi4tWDg2Jy3ebRz2rXowDxnld4bkQB00cc/1Zw9AWnC0i9ztDJitivtQvaI9KaLyKrc+hBW0yg==", - "dev": true, - "requires": { - "to-regex-range": "^5.0.1" - } - }, - "fraction.js": { - "version": "4.1.2", - "resolved": "https://registry.npmjs.org/fraction.js/-/fraction.js-4.1.2.tgz", - "integrity": "sha512-o2RiJQ6DZaR/5+Si0qJUIy637QMRudSi9kU/FFzx9EZazrIdnBgpU+3sEWCxAVhH2RtxW2Oz+T4p2o8uOPVcgA==", - "dev": true - }, - "fsevents": { - "version": "2.3.2", - "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-2.3.2.tgz", - "integrity": "sha512-xiqMQR4xAeHTuB9uWm+fFRcIOgKBMiOBP+eXiyT7jsgVCq1bkVygt00oASowB7EdtpOHaaPgKt812P9ab+DDKA==", - "dev": true, - "optional": true - }, - "function-bind": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/function-bind/-/function-bind-1.1.1.tgz", - "integrity": "sha512-yIovAzMX49sF8Yl58fSCWJ5svSLuaibPxXQJFLmBObTuCr0Mf1KiPopGM9NiFjiYBCbfaa2Fh6breQ6ANVTI0A==", - "dev": true - }, - "glob-parent": { - "version": "6.0.2", - "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-6.0.2.tgz", - "integrity": "sha512-XxwI8EOhVQgWp6iDL+3b0r86f4d6AX6zSU55HfB4ydCEuXLXc5FcYeOu+nnGftS4TEju/11rt4KJPTMgbfmv4A==", - "dev": true, - "requires": { - "is-glob": "^4.0.3" - } - }, - "good-listener": { - "version": "1.2.2", - "resolved": "https://registry.npmjs.org/good-listener/-/good-listener-1.2.2.tgz", - "integrity": "sha1-1TswzfkxPf+33JoNR3CWqm0UXFA=", - "requires": { - "delegate": "^3.1.2" - } - }, - "has": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/has/-/has-1.0.3.tgz", - "integrity": "sha512-f2dvO0VU6Oej7RkWJGrehjbzMAjFp5/VKPp5tTpWIV4JHHZK1/BxbFRtf/siA2SWTe09caDmVtYYzWEIbBS4zw==", - "dev": true, - "requires": { - "function-bind": "^1.1.1" - } - }, - "has-flag": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", - "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", - "dev": true - }, - "import-fresh": { - "version": "3.3.0", - "resolved": "https://registry.npmjs.org/import-fresh/-/import-fresh-3.3.0.tgz", - "integrity": "sha512-veYYhQa+D1QBKznvhUHxb8faxlrwUnxseDAbAp457E0wLNio2bOSKnjYDhMj+YiAq61xrMGhQk9iXVk5FzgQMw==", - "dev": true, - "requires": { - "parent-module": "^1.0.0", - "resolve-from": "^4.0.0" - } - }, - "is-arrayish": { - "version": "0.2.1", - "resolved": "https://registry.npmjs.org/is-arrayish/-/is-arrayish-0.2.1.tgz", - "integrity": "sha1-d8mYQFJ6qOyxqLppe4BkWnqSap0=", - "dev": true - }, - "is-binary-path": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/is-binary-path/-/is-binary-path-2.1.0.tgz", - "integrity": "sha512-ZMERYes6pDydyuGidse7OsHxtbI7WVeUEozgR/g7rd0xUimYNlvZRE/K2MgZTjWy725IfelLeVcEM97mmtRGXw==", - "dev": true, - "requires": { - "binary-extensions": "^2.0.0" - } - }, - "is-core-module": { - "version": "2.8.1", - "resolved": "https://registry.npmjs.org/is-core-module/-/is-core-module-2.8.1.tgz", - "integrity": "sha512-SdNCUs284hr40hFTFP6l0IfZ/RSrMXF3qgoRHd3/79unUTvrFO/JoXwkGm+5J/Oe3E/b5GsnG330uUNgRpu1PA==", - "dev": true, - "requires": { - "has": "^1.0.3" - } - }, - "is-extglob": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/is-extglob/-/is-extglob-2.1.1.tgz", - "integrity": "sha1-qIwCU1eR8C7TfHahueqXc8gz+MI=", - "dev": true - }, - "is-glob": { - "version": "4.0.3", - "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-4.0.3.tgz", - "integrity": "sha512-xelSayHH36ZgE7ZWhli7pW34hNbNl8Ojv5KVmkJD4hBdD3th8Tfk9vYasLM+mXWOZhFkgZfxhLSnrwRr4elSSg==", - "dev": true, - "requires": { - "is-extglob": "^2.1.1" - } - }, - "is-number": { - "version": "7.0.0", - "resolved": "https://registry.npmjs.org/is-number/-/is-number-7.0.0.tgz", - "integrity": "sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==", - "dev": true - }, - "js-tokens": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/js-tokens/-/js-tokens-4.0.0.tgz", - "integrity": "sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ==", - "dev": true - }, - "json-parse-even-better-errors": { - "version": "2.3.1", - "resolved": "https://registry.npmjs.org/json-parse-even-better-errors/-/json-parse-even-better-errors-2.3.1.tgz", - "integrity": "sha512-xyFwyhro/JEof6Ghe2iz2NcXoj2sloNsWr/XsERDK/oiPCfaNhl5ONfp+jQdAZRQQ0IJWNzH9zIZF7li91kh2w==", - "dev": true - }, - "lilconfig": { - "version": "2.0.4", - "resolved": "https://registry.npmjs.org/lilconfig/-/lilconfig-2.0.4.tgz", - "integrity": "sha512-bfTIN7lEsiooCocSISTWXkiWJkRqtL9wYtYy+8EK3Y41qh3mpwPU0ycTOgjdY9ErwXCc8QyrQp82bdL0Xkm9yA==", - "dev": true - }, - "lines-and-columns": { - "version": "1.2.4", - "resolved": "https://registry.npmjs.org/lines-and-columns/-/lines-and-columns-1.2.4.tgz", - "integrity": "sha512-7ylylesZQ/PV29jhEDl3Ufjo6ZX7gCqJr5F7PKrqc93v7fzSymt1BpwEU8nAUXs8qzzvqhbjhK5QZg6Mt/HkBg==", - "dev": true - }, - "merge2": { - "version": "1.4.1", - "resolved": "https://registry.npmjs.org/merge2/-/merge2-1.4.1.tgz", - "integrity": "sha512-8q7VEgMJW4J8tcfVPy8g09NcQwZdbwFEqhe/WZkoIzjn/3TGDwtOCYtXGxA3O8tPzpczCCDgv+P2P5y00ZJOOg==", - "dev": true - }, - "micromatch": { - "version": "4.0.4", - "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-4.0.4.tgz", - "integrity": "sha512-pRmzw/XUcwXGpD9aI9q/0XOwLNygjETJ8y0ao0wdqprrzDa4YnxLcz7fQRZr8voh8V10kGhABbNcHVk5wHgWwg==", - "dev": true, - "requires": { - "braces": "^3.0.1", - "picomatch": "^2.2.3" - } - }, - "minimist": { - "version": "1.2.6", - "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.6.tgz", - "integrity": "sha512-Jsjnk4bw3YJqYzbdyBiNsPWHPfO++UGG749Cxs6peCu5Xg4nrena6OVxOYxrQTqww0Jmwt+Ref8rggumkTLz9Q==", - "dev": true - }, - "nanoid": { - "version": "3.3.6", - "resolved": "https://registry.npmjs.org/nanoid/-/nanoid-3.3.6.tgz", - "integrity": "sha512-BGcqMMJuToF7i1rt+2PWSNVnWIkGCU78jBG3RxO/bZlnZPK2Cmi2QaffxGO/2RvWi9sL+FAiRiXMgsyxQ1DIDA==", - "dev": true - }, - "node-releases": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/node-releases/-/node-releases-2.0.1.tgz", - "integrity": "sha512-CqyzN6z7Q6aMeF/ktcMVTzhAHCEpf8SOarwpzpf8pNBY2k5/oM34UHldUwp8VKI7uxct2HxSRdJjBaZeESzcxA==", - "dev": true - }, - "normalize-path": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/normalize-path/-/normalize-path-3.0.0.tgz", - "integrity": "sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA==", - "dev": true - }, - "normalize-range": { - "version": "0.1.2", - "resolved": "https://registry.npmjs.org/normalize-range/-/normalize-range-0.1.2.tgz", - "integrity": "sha1-LRDAa9/TEuqXd2laTShDlFa3WUI=", - "dev": true - }, - "object-hash": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/object-hash/-/object-hash-2.2.0.tgz", - "integrity": "sha512-gScRMn0bS5fH+IuwyIFgnh9zBdo4DV+6GhygmWM9HyNJSgS0hScp1f5vjtm7oIIOiT9trXrShAkLFSc2IqKNgw==", - "dev": true - }, - "parent-module": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/parent-module/-/parent-module-1.0.1.tgz", - "integrity": "sha512-GQ2EWRpQV8/o+Aw8YqtfZZPfNRWZYkbidE9k5rpl/hC3vtHHBfGm2Ifi6qWV+coDGkrUKZAxE3Lot5kcsRlh+g==", - "dev": true, - "requires": { - "callsites": "^3.0.0" - } - }, - "parse-json": { - "version": "5.2.0", - "resolved": "https://registry.npmjs.org/parse-json/-/parse-json-5.2.0.tgz", - "integrity": "sha512-ayCKvm/phCGxOkYRSCM82iDwct8/EonSEgCSxWxD7ve6jHggsFl4fZVQBPRNgQoKiuV/odhFrGzQXZwbifC8Rg==", - "dev": true, - "requires": { - "@babel/code-frame": "^7.0.0", - "error-ex": "^1.3.1", - "json-parse-even-better-errors": "^2.3.0", - "lines-and-columns": "^1.1.6" - } - }, - "path-parse": { - "version": "1.0.7", - "resolved": "https://registry.npmjs.org/path-parse/-/path-parse-1.0.7.tgz", - "integrity": "sha512-LDJzPVEEEPR+y48z93A0Ed0yXb8pAByGWo/k5YYdYgpY2/2EsOsksJrq7lOHxryrVOn1ejG6oAp8ahvOIQD8sw==", - "dev": true - }, - "path-type": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/path-type/-/path-type-4.0.0.tgz", - "integrity": "sha512-gDKb8aZMDeD/tZWs9P6+q0J9Mwkdl6xMV8TjnGP3qJVJ06bdMgkbBlLU8IdfOsIsFz2BW1rNVT3XuNEl8zPAvw==", - "dev": true - }, - "phoenix": { - "version": "file:../deps/phoenix" - }, - "phoenix_html": { - "version": "file:../deps/phoenix_html" - }, - "phoenix_live_view": { - "version": "file:../deps/phoenix_live_view" - }, - "picocolors": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/picocolors/-/picocolors-1.0.0.tgz", - "integrity": "sha512-1fygroTLlHu66zi26VoTDv8yRgm0Fccecssto+MhsZ0D/DGW2sm8E8AjW7NU5VVTRt5GxbeZ5qBuJr+HyLYkjQ==", - "dev": true - }, - "picomatch": { - "version": "2.3.1", - "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-2.3.1.tgz", - "integrity": "sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA==", - "dev": true - }, - "postcss": { - "version": "8.4.31", - "resolved": "https://registry.npmjs.org/postcss/-/postcss-8.4.31.tgz", - "integrity": "sha512-PS08Iboia9mts/2ygV3eLpY5ghnUcfLV/EXTOW1E2qYxJKGGBUtNjN76FYHnMs36RmARn41bC0AZmn+rR0OVpQ==", - "dev": true, - "requires": { - "nanoid": "^3.3.6", - "picocolors": "^1.0.0", - "source-map-js": "^1.0.2" - } - }, - "postcss-js": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/postcss-js/-/postcss-js-4.0.0.tgz", - "integrity": "sha512-77QESFBwgX4irogGVPgQ5s07vLvFqWr228qZY+w6lW599cRlK/HmnlivnnVUxkjHnCu4J16PDMHcH+e+2HbvTQ==", - "dev": true, - "requires": { - "camelcase-css": "^2.0.1" - } - }, - "postcss-load-config": { - "version": "3.1.1", - "resolved": "https://registry.npmjs.org/postcss-load-config/-/postcss-load-config-3.1.1.tgz", - "integrity": "sha512-c/9XYboIbSEUZpiD1UQD0IKiUe8n9WHYV7YFe7X7J+ZwCsEKkUJSFWjS9hBU1RR9THR7jMXst8sxiqP0jjo2mg==", - "dev": true, - "requires": { - "lilconfig": "^2.0.4", - "yaml": "^1.10.2" - } - }, - "postcss-nested": { - "version": "5.0.6", - "resolved": "https://registry.npmjs.org/postcss-nested/-/postcss-nested-5.0.6.tgz", - "integrity": "sha512-rKqm2Fk0KbA8Vt3AdGN0FB9OBOMDVajMG6ZCf/GoHgdxUJ4sBFp0A/uMIRm+MJUdo33YXEtjqIz8u7DAp8B7DA==", - "dev": true, - "requires": { - "postcss-selector-parser": "^6.0.6" - } - }, - "postcss-selector-parser": { - "version": "6.0.8", - "resolved": "https://registry.npmjs.org/postcss-selector-parser/-/postcss-selector-parser-6.0.8.tgz", - "integrity": "sha512-D5PG53d209Z1Uhcc0qAZ5U3t5HagH3cxu+WLZ22jt3gLUpXM4eXXfiO14jiDWST3NNooX/E8wISfOhZ9eIjGTQ==", - "dev": true, - "requires": { - "cssesc": "^3.0.0", - "util-deprecate": "^1.0.2" - } - }, - "postcss-value-parser": { - "version": "4.2.0", - "resolved": "https://registry.npmjs.org/postcss-value-parser/-/postcss-value-parser-4.2.0.tgz", - "integrity": "sha512-1NNCs6uurfkVbeXG4S8JFT9t19m45ICnif8zWLd5oPSZ50QnwMfK+H3jv408d4jw/7Bttv5axS5IiHoLaVNHeQ==", - "dev": true - }, - "queue-microtask": { - "version": "1.2.3", - "resolved": "https://registry.npmjs.org/queue-microtask/-/queue-microtask-1.2.3.tgz", - "integrity": "sha512-NuaNSa6flKT5JaSYQzJok04JzTL1CA6aGhv5rfLW3PgqA+M2ChpZQnAC8h8i4ZFkBS8X5RqkDBHA7r4hej3K9A==", - "dev": true - }, - "quick-lru": { - "version": "5.1.1", - "resolved": "https://registry.npmjs.org/quick-lru/-/quick-lru-5.1.1.tgz", - "integrity": "sha512-WuyALRjWPDGtt/wzJiadO5AXY+8hZ80hVpe6MyivgraREW751X3SbhRvG3eLKOYN+8VEvqLcf3wdnt44Z4S4SA==", - "dev": true - }, - "readdirp": { - "version": "3.6.0", - "resolved": "https://registry.npmjs.org/readdirp/-/readdirp-3.6.0.tgz", - "integrity": "sha512-hOS089on8RduqdbhvQ5Z37A0ESjsqz6qnRcffsMU3495FuTdqSm+7bhJ29JvIOsBDEEnan5DPu9t3To9VRlMzA==", - "dev": true, - "requires": { - "picomatch": "^2.2.1" - } - }, - "resolve": { - "version": "1.21.0", - "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.21.0.tgz", - "integrity": "sha512-3wCbTpk5WJlyE4mSOtDLhqQmGFi0/TD9VPwmiolnk8U0wRgMEktqCXd3vy5buTO3tljvalNvKrjHEfrd2WpEKA==", - "dev": true, - "requires": { - "is-core-module": "^2.8.0", - "path-parse": "^1.0.7", - "supports-preserve-symlinks-flag": "^1.0.0" - } - }, - "resolve-from": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-4.0.0.tgz", - "integrity": "sha512-pb/MYmXstAkysRFx8piNI1tGFNQIFA3vkE3Gq4EuA1dF6gHp/+vgZqsCGJapvy8N3Q+4o7FwvquPJcnZ7RYy4g==", - "dev": true - }, - "reusify": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/reusify/-/reusify-1.0.4.tgz", - "integrity": "sha512-U9nH88a3fc/ekCF1l0/UP1IosiuIjyTh7hBvXVMHYgVcfGvt897Xguj2UOLDeI5BG2m7/uwyaLVT6fbtCwTyzw==", - "dev": true - }, - "run-parallel": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/run-parallel/-/run-parallel-1.2.0.tgz", - "integrity": "sha512-5l4VyZR86LZ/lDxZTR6jqL8AFE2S0IFLMP26AbjsLVADxHdhB/c0GUsH+y39UfCi3dzz8OlQuPmnaJOMoDHQBA==", - "dev": true, - "requires": { - "queue-microtask": "^1.2.2" - } - }, - "select": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/select/-/select-1.1.2.tgz", - "integrity": "sha1-DnNQrN7ICxEIUoeG7B1EGNEbOW0=" - }, - "source-map-js": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/source-map-js/-/source-map-js-1.0.2.tgz", - "integrity": "sha512-R0XvVJ9WusLiqTCEiGCmICCMplcCkIwwR11mOSD9CR5u+IXYdiseeEuXCVAjS54zqwkLcPNnmU4OeJ6tUrWhDw==", - "dev": true - }, - "supports-color": { - "version": "7.2.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", - "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", - "dev": true, - "requires": { - "has-flag": "^4.0.0" - } - }, - "supports-preserve-symlinks-flag": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/supports-preserve-symlinks-flag/-/supports-preserve-symlinks-flag-1.0.0.tgz", - "integrity": "sha512-ot0WnXS9fgdkgIcePe6RHNk1WA8+muPa6cSjeR3V8K27q9BB1rTE3R1p7Hv0z1ZyAc8s6Vvv8DIyWf681MAt0w==", - "dev": true - }, - "tailwindcss": { - "version": "3.0.11", - "resolved": "https://registry.npmjs.org/tailwindcss/-/tailwindcss-3.0.11.tgz", - "integrity": "sha512-JyMsQ2kPqpOvG8ow535XpauXj3wz3nQqcy2tVlXj4FQ0eNlsdzvlAqpRA3q5rPLboWirNG6r2DqKczwjW2uc8Q==", - "dev": true, - "requires": { - "arg": "^5.0.1", - "chalk": "^4.1.2", - "chokidar": "^3.5.2", - "color-name": "^1.1.4", - "cosmiconfig": "^7.0.1", - "detective": "^5.2.0", - "didyoumean": "^1.2.2", - "dlv": "^1.1.3", - "fast-glob": "^3.2.7", - "glob-parent": "^6.0.2", - "is-glob": "^4.0.3", - "normalize-path": "^3.0.0", - "object-hash": "^2.2.0", - "postcss-js": "^4.0.0", - "postcss-load-config": "^3.1.0", - "postcss-nested": "5.0.6", - "postcss-selector-parser": "^6.0.7", - "postcss-value-parser": "^4.2.0", - "quick-lru": "^5.1.1", - "resolve": "^1.20.0" - } - }, - "tiny-emitter": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/tiny-emitter/-/tiny-emitter-2.1.0.tgz", - "integrity": "sha512-NB6Dk1A9xgQPMoGqC5CVXn123gWyte215ONT5Pp5a0yt4nlEoO1ZWeCwpncaekPHXO60i47ihFnZPiRPjRMq4Q==" - }, - "to-regex-range": { - "version": "5.0.1", - "resolved": "https://registry.npmjs.org/to-regex-range/-/to-regex-range-5.0.1.tgz", - "integrity": "sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ==", - "dev": true, - "requires": { - "is-number": "^7.0.0" + "license": "ISC", + "engines": { + "node": ">=12" } - }, - "toastify-js": { - "version": "1.11.2", - "resolved": "https://registry.npmjs.org/toastify-js/-/toastify-js-1.11.2.tgz", - "integrity": "sha512-bMBNKhZLPX/sDhpwM7KHIRUTtqCylQeoZDiEWy5zE7iDUJ92XmP8AKgDAp9rXx6pR5GXGFtQHHoH62toahbHgQ==" - }, - "topbar": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/topbar/-/topbar-1.0.1.tgz", - "integrity": "sha512-HZqQSMBiG29vcjOrqKCM9iGY/h69G5gQH7ae83ZCPz5uPmbQKwK0sMEqzVDBiu64tWHJ+kk9NApECrF+FAAvRA==" - }, - "util-deprecate": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/util-deprecate/-/util-deprecate-1.0.2.tgz", - "integrity": "sha1-RQ1Nyfpw3nMnYvvS1KKJgUGaDM8=", - "dev": true - }, - "xtend": { - "version": "4.0.2", - "resolved": "https://registry.npmjs.org/xtend/-/xtend-4.0.2.tgz", - "integrity": "sha512-LKYU1iAXJXUgAXn9URjiu+MWhyUXHsvfp7mcuYm9dSUKK0/CjtrUwFAxD82/mCWbtLsGjFIad0wIsod4zrTAEQ==", - "dev": true - }, - "yaml": { - "version": "1.10.2", - "resolved": "https://registry.npmjs.org/yaml/-/yaml-1.10.2.tgz", - "integrity": "sha512-r3vXyErRCYJ7wg28yvBY5VSoAF8ZvlcW9/BwUzEtUsjvX/DKs24dIkuwjtuprwJJHsbyUbLApepYTR1BN4uHrg==", - "dev": true } } } diff --git a/assets/package.json b/assets/package.json index 2123e6fb..8d3b2bff 100644 --- a/assets/package.json +++ b/assets/package.json @@ -12,13 +12,13 @@ "phoenix": "file:../deps/phoenix", "phoenix_html": "file:../deps/phoenix_html", "phoenix_live_view": "file:../deps/phoenix_live_view", - "toastify-js": "^1.11.2", "topbar": "^1.0.1" }, "devDependencies": { "autoprefixer": "^10.4.1", "esbuild": "^0.25.0", + "cssnano": "^7.1.1", "postcss": "^8.4.31", - "tailwindcss": "^3.0.11" + "postcss-cli": "^11.0.1" } } diff --git a/assets/postcss.config.js b/assets/postcss.config.js index f1c8dac8..276347c6 100644 --- a/assets/postcss.config.js +++ b/assets/postcss.config.js @@ -1,6 +1,6 @@ module.exports = { plugins: { - tailwindcss: {}, autoprefixer: {}, + cssnano: { preset: 'default' } } } diff --git a/assets/tailwind.config.js b/assets/tailwind.config.js deleted file mode 100644 index 95ff634a..00000000 --- a/assets/tailwind.config.js +++ /dev/null @@ -1,9 +0,0 @@ -module.exports = { - content: [ - './css/**/*.css', - '../lib/live_admin/**/*.*ex', - ], - theme: {}, - variants: {}, - plugins: [] -}; diff --git a/config/config.exs b/config/config.exs index 7e3505f7..1d6c5441 100644 --- a/config/config.exs +++ b/config/config.exs @@ -6,11 +6,9 @@ config :phoenix, :stacktrace_depth, 20 config :logger, level: :warning config :logger, :console, format: "[$level] $message\n" -config :phoenix, LiveAdmin.Endpoint, - watchers: [ - node: ["esbuild.js", "--watch", cd: Path.expand("../assets", __DIR__)] - ] - config :docout, app_name: :live_admin, formatters: [LiveAdmin.READMECompiler] + +config :phoenix_live_view, :colocated_js, + target_directory: Path.expand("../assets/node_modules/phoenix-colocated", __DIR__) diff --git a/dev.exs b/dev.exs index 2fde226d..5677d9bb 100644 --- a/dev.exs +++ b/dev.exs @@ -18,20 +18,21 @@ Application.put_env(:live_admin, DemoWeb.Endpoint, watchers: [ npm: ["run", "watch", cd: "assets"], npx: [ - "tailwindcss", - "--input=css/app.css", + "postcss", + "css/app.css", "--output=../dist/css/app.css", - "--postcss", "--watch", cd: "assets" ], npx: [ - "tailwindcss", - "--input=css/default_overrides.css", + "postcss", + "css/default_overrides.css", "--output=../dist/css/default_overrides.css", - "--postcss", "--watch", cd: "assets" + ], + watchers: [ + node: ["esbuild.js", "--watch", cd: Path.expand("../assets", __DIR__)] ] ], live_reload: [ @@ -206,9 +207,9 @@ defmodule DemoWeb.PostsAdmin.Home do @impl true def render(assigns) do ~H""" -
-
- This is only for managing posts +
+
+ Posts demo
""" @@ -221,9 +222,9 @@ defmodule DemoWeb.Extra do @impl true def render(assigns) do ~H""" -
-
- This is an extra page +
+
+ Extra page
""" diff --git a/dev/repo.ex b/dev/repo.ex index 96aae347..54467ab7 100644 --- a/dev/repo.ex +++ b/dev/repo.ex @@ -1,5 +1,5 @@ defmodule Demo.Repo do use Ecto.Repo, otp_app: :live_admin, adapter: Ecto.Adapters.Postgres - def prefixes, do: ["public", "alt"] + def prefixes, do: ["public", "alt"] ++ Enum.map(0..100, & "fake #{&1}") end diff --git a/dev/user_admin.ex b/dev/user_admin.ex index 2d5cc669..8e48fccf 100644 --- a/dev/user_admin.ex +++ b/dev/user_admin.ex @@ -3,11 +3,10 @@ defmodule DemoWeb.UserAdmin do schema: Demo.Accounts.User, hidden_fields: [:private_data], immutable_fields: [:encrypted_password, :inserted_at], - components: [new: DemoWeb.CreateUserForm], + components: [create: DemoWeb.CreateUserForm], label_with: :name, actions: [:deactivate, :activate, set_password: {__MODULE__, :set_password, 3}], - tasks: [:regenerate_passwords, {__MODULE__, :aggregate, 4}], - render_with: :render_field + tasks: [:regenerate_passwords, {__MODULE__, :aggregate, 4}] use PhoenixHTMLHelpers diff --git a/dist/css/app.css b/dist/css/app.css index 87ce6b61..bc836d86 100644 --- a/dist/css/app.css +++ b/dist/css/app.css @@ -1,1941 +1 @@ -/* -! tailwindcss v3.4.1 | MIT License | https://tailwindcss.com -*/ - -/* -1. Prevent padding and border from affecting element width. (https://github.com/mozdevs/cssremedy/issues/4) -2. Allow adding a border to an element by just adding a border-width. (https://github.com/tailwindcss/tailwindcss/pull/116) -*/ - -*, -::before, -::after { - box-sizing: border-box; - /* 1 */ - border-width: 0; - /* 2 */ - border-style: solid; - /* 2 */ - border-color: #e5e7eb; - /* 2 */ -} - -::before, -::after { - --tw-content: ''; -} - -/* -1. Use a consistent sensible line-height in all browsers. -2. Prevent adjustments of font size after orientation changes in iOS. -3. Use a more readable tab size. -4. Use the user's configured `sans` font-family by default. -5. Use the user's configured `sans` font-feature-settings by default. -6. Use the user's configured `sans` font-variation-settings by default. -7. Disable tap highlights on iOS -*/ - -html, -:host { - line-height: 1.5; - /* 1 */ - -webkit-text-size-adjust: 100%; - /* 2 */ - -moz-tab-size: 4; - /* 3 */ - -o-tab-size: 4; - tab-size: 4; - /* 3 */ - font-family: ui-sans-serif, system-ui, sans-serif, "Apple Color Emoji", "Segoe UI Emoji", "Segoe UI Symbol", "Noto Color Emoji"; - /* 4 */ - font-feature-settings: normal; - /* 5 */ - font-variation-settings: normal; - /* 6 */ - -webkit-tap-highlight-color: transparent; - /* 7 */ -} - -/* -1. Remove the margin in all browsers. -2. Inherit line-height from `html` so users can set them as a class directly on the `html` element. -*/ - -body { - margin: 0; - /* 1 */ - line-height: inherit; - /* 2 */ -} - -/* -1. Add the correct height in Firefox. -2. Correct the inheritance of border color in Firefox. (https://bugzilla.mozilla.org/show_bug.cgi?id=190655) -3. Ensure horizontal rules are visible by default. -*/ - -hr { - height: 0; - /* 1 */ - color: inherit; - /* 2 */ - border-top-width: 1px; - /* 3 */ -} - -/* -Add the correct text decoration in Chrome, Edge, and Safari. -*/ - -abbr:where([title]) { - -webkit-text-decoration: underline dotted; - text-decoration: underline dotted; -} - -/* -Remove the default font size and weight for headings. -*/ - -h1, -h2, -h3, -h4, -h5, -h6 { - font-size: inherit; - font-weight: inherit; -} - -/* -Reset links to optimize for opt-in styling instead of opt-out. -*/ - -a { - color: inherit; - text-decoration: inherit; -} - -/* -Add the correct font weight in Edge and Safari. -*/ - -b, -strong { - font-weight: bolder; -} - -/* -1. Use the user's configured `mono` font-family by default. -2. Use the user's configured `mono` font-feature-settings by default. -3. Use the user's configured `mono` font-variation-settings by default. -4. Correct the odd `em` font sizing in all browsers. -*/ - -code, -kbd, -samp, -pre { - font-family: ui-monospace, SFMono-Regular, Menlo, Monaco, Consolas, "Liberation Mono", "Courier New", monospace; - /* 1 */ - font-feature-settings: normal; - /* 2 */ - font-variation-settings: normal; - /* 3 */ - font-size: 1em; - /* 4 */ -} - -/* -Add the correct font size in all browsers. -*/ - -small { - font-size: 80%; -} - -/* -Prevent `sub` and `sup` elements from affecting the line height in all browsers. -*/ - -sub, -sup { - font-size: 75%; - line-height: 0; - position: relative; - vertical-align: baseline; -} - -sub { - bottom: -0.25em; -} - -sup { - top: -0.5em; -} - -/* -1. Remove text indentation from table contents in Chrome and Safari. (https://bugs.chromium.org/p/chromium/issues/detail?id=999088, https://bugs.webkit.org/show_bug.cgi?id=201297) -2. Correct table border color inheritance in all Chrome and Safari. (https://bugs.chromium.org/p/chromium/issues/detail?id=935729, https://bugs.webkit.org/show_bug.cgi?id=195016) -3. Remove gaps between table borders by default. -*/ - -table { - text-indent: 0; - /* 1 */ - border-color: inherit; - /* 2 */ - border-collapse: collapse; - /* 3 */ -} - -/* -1. Change the font styles in all browsers. -2. Remove the margin in Firefox and Safari. -3. Remove default padding in all browsers. -*/ - -button, -input, -optgroup, -select, -textarea { - font-family: inherit; - /* 1 */ - font-feature-settings: inherit; - /* 1 */ - font-variation-settings: inherit; - /* 1 */ - font-size: 100%; - /* 1 */ - font-weight: inherit; - /* 1 */ - line-height: inherit; - /* 1 */ - color: inherit; - /* 1 */ - margin: 0; - /* 2 */ - padding: 0; - /* 3 */ -} - -/* -Remove the inheritance of text transform in Edge and Firefox. -*/ - -button, -select { - text-transform: none; -} - -/* -1. Correct the inability to style clickable types in iOS and Safari. -2. Remove default button styles. -*/ - -button, -[type='button'], -[type='reset'], -[type='submit'] { - -webkit-appearance: button; - /* 1 */ - background-color: transparent; - /* 2 */ - background-image: none; - /* 2 */ -} - -/* -Use the modern Firefox focus style for all focusable elements. -*/ - -:-moz-focusring { - outline: auto; -} - -/* -Remove the additional `:invalid` styles in Firefox. (https://github.com/mozilla/gecko-dev/blob/2f9eacd9d3d995c937b4251a5557d95d494c9be1/layout/style/res/forms.css#L728-L737) -*/ - -:-moz-ui-invalid { - box-shadow: none; -} - -/* -Add the correct vertical alignment in Chrome and Firefox. -*/ - -progress { - vertical-align: baseline; -} - -/* -Correct the cursor style of increment and decrement buttons in Safari. -*/ - -::-webkit-inner-spin-button, -::-webkit-outer-spin-button { - height: auto; -} - -/* -1. Correct the odd appearance in Chrome and Safari. -2. Correct the outline style in Safari. -*/ - -[type='search'] { - -webkit-appearance: textfield; - /* 1 */ - outline-offset: -2px; - /* 2 */ -} - -/* -Remove the inner padding in Chrome and Safari on macOS. -*/ - -::-webkit-search-decoration { - -webkit-appearance: none; -} - -/* -1. Correct the inability to style clickable types in iOS and Safari. -2. Change font properties to `inherit` in Safari. -*/ - -::-webkit-file-upload-button { - -webkit-appearance: button; - /* 1 */ - font: inherit; - /* 2 */ -} - -/* -Add the correct display in Chrome and Safari. -*/ - -summary { - display: list-item; -} - -/* -Removes the default spacing and border for appropriate elements. -*/ - -blockquote, -dl, -dd, -h1, -h2, -h3, -h4, -h5, -h6, -hr, -figure, -p, -pre { - margin: 0; -} - -fieldset { - margin: 0; - padding: 0; -} - -legend { - padding: 0; -} - -ol, -ul, -menu { - list-style: none; - margin: 0; - padding: 0; -} - -/* -Reset default styling for dialogs. -*/ - -dialog { - padding: 0; -} - -/* -Prevent resizing textareas horizontally by default. -*/ - -textarea { - resize: vertical; -} - -/* -1. Reset the default placeholder opacity in Firefox. (https://github.com/tailwindlabs/tailwindcss/issues/3300) -2. Set the default placeholder color to the user's configured gray 400 color. -*/ - -input::-moz-placeholder, textarea::-moz-placeholder { - opacity: 1; - /* 1 */ - color: #9ca3af; - /* 2 */ -} - -input:-ms-input-placeholder, textarea:-ms-input-placeholder { - opacity: 1; - /* 1 */ - color: #9ca3af; - /* 2 */ -} - -input::placeholder, -textarea::placeholder { - opacity: 1; - /* 1 */ - color: #9ca3af; - /* 2 */ -} - -/* -Set the default cursor for buttons. -*/ - -button, -[role="button"] { - cursor: pointer; -} - -/* -Make sure disabled buttons don't get the pointer cursor. -*/ - -:disabled { - cursor: default; -} - -/* -1. Make replaced elements `display: block` by default. (https://github.com/mozdevs/cssremedy/issues/14) -2. Add `vertical-align: middle` to align replaced elements more sensibly by default. (https://github.com/jensimmons/cssremedy/issues/14#issuecomment-634934210) - This can trigger a poorly considered lint error in some tools but is included by design. -*/ - -img, -svg, -video, -canvas, -audio, -iframe, -embed, -object { - display: block; - /* 1 */ - vertical-align: middle; - /* 2 */ -} - -/* -Constrain images and videos to the parent width and preserve their intrinsic aspect ratio. (https://github.com/mozdevs/cssremedy/issues/14) -*/ - -img, -video { - max-width: 100%; - height: auto; -} - -/* Make elements with the HTML hidden attribute stay hidden by default */ - -[hidden] { - display: none; -} - -* { - background-color: inherit; -} - -h1 { - font-size: 1.875rem; - line-height: 2.25rem; -} - -@media (min-width: 768px) { - h1 { - font-size: 3rem; - line-height: 1; - } -} - -h1 { - margin-bottom: 1rem; - font-weight: 800; -} - -input, textarea { - position: relative; - border-radius: 0.25rem; - font-size: 0.875rem; - line-height: 1.25rem; - border-width: 1px; - outline: 2px solid transparent; - outline-offset: 2px; -} - -input:focus, textarea:focus { - outline: 2px solid transparent; - outline-offset: 2px; - --tw-ring-offset-shadow: var(--tw-ring-inset) 0 0 0 var(--tw-ring-offset-width) var(--tw-ring-offset-color); - --tw-ring-shadow: var(--tw-ring-inset) 0 0 0 calc(3px + var(--tw-ring-offset-width)) var(--tw-ring-color); - box-shadow: var(--tw-ring-offset-shadow), var(--tw-ring-shadow), var(--tw-shadow, 0 0 #0000); -} - -input, textarea { - padding: 0.25rem; - overflow: hidden; -} - -select { - -webkit-appearance: none; - -moz-appearance: none; - appearance: none; - background-clip: padding-box; - background-repeat: no-repeat; - border-width: 1px; - border-style: solid; - border-radius: 0.25rem; - transition-property: color, background-color, border-color, fill, stroke, opacity, box-shadow, transform, filter, -webkit-text-decoration-color, -webkit-backdrop-filter; - transition-property: color, background-color, border-color, text-decoration-color, fill, stroke, opacity, box-shadow, transform, filter, backdrop-filter; - transition-property: color, background-color, border-color, text-decoration-color, fill, stroke, opacity, box-shadow, transform, filter, backdrop-filter, -webkit-text-decoration-color, -webkit-backdrop-filter; - transition-duration: 150ms; - transition-timing-function: cubic-bezier(0.4, 0, 0.2, 1); -} - -select:focus { - outline: 2px solid transparent; - outline-offset: 2px; -} - -select { - width: 8rem; - padding: 0.25rem; -} - -*, ::before, ::after { - --tw-border-spacing-x: 0; - --tw-border-spacing-y: 0; - --tw-translate-x: 0; - --tw-translate-y: 0; - --tw-rotate: 0; - --tw-skew-x: 0; - --tw-skew-y: 0; - --tw-scale-x: 1; - --tw-scale-y: 1; - --tw-pan-x: ; - --tw-pan-y: ; - --tw-pinch-zoom: ; - --tw-scroll-snap-strictness: proximity; - --tw-gradient-from-position: ; - --tw-gradient-via-position: ; - --tw-gradient-to-position: ; - --tw-ordinal: ; - --tw-slashed-zero: ; - --tw-numeric-figure: ; - --tw-numeric-spacing: ; - --tw-numeric-fraction: ; - --tw-ring-inset: ; - --tw-ring-offset-width: 0px; - --tw-ring-offset-color: #fff; - --tw-ring-color: rgb(59 130 246 / 0.5); - --tw-ring-offset-shadow: 0 0 #0000; - --tw-ring-shadow: 0 0 #0000; - --tw-shadow: 0 0 #0000; - --tw-shadow-colored: 0 0 #0000; - --tw-blur: ; - --tw-brightness: ; - --tw-contrast: ; - --tw-grayscale: ; - --tw-hue-rotate: ; - --tw-invert: ; - --tw-saturate: ; - --tw-sepia: ; - --tw-drop-shadow: ; - --tw-backdrop-blur: ; - --tw-backdrop-brightness: ; - --tw-backdrop-contrast: ; - --tw-backdrop-grayscale: ; - --tw-backdrop-hue-rotate: ; - --tw-backdrop-invert: ; - --tw-backdrop-opacity: ; - --tw-backdrop-saturate: ; - --tw-backdrop-sepia: ; -} - -::-webkit-backdrop { - --tw-border-spacing-x: 0; - --tw-border-spacing-y: 0; - --tw-translate-x: 0; - --tw-translate-y: 0; - --tw-rotate: 0; - --tw-skew-x: 0; - --tw-skew-y: 0; - --tw-scale-x: 1; - --tw-scale-y: 1; - --tw-pan-x: ; - --tw-pan-y: ; - --tw-pinch-zoom: ; - --tw-scroll-snap-strictness: proximity; - --tw-gradient-from-position: ; - --tw-gradient-via-position: ; - --tw-gradient-to-position: ; - --tw-ordinal: ; - --tw-slashed-zero: ; - --tw-numeric-figure: ; - --tw-numeric-spacing: ; - --tw-numeric-fraction: ; - --tw-ring-inset: ; - --tw-ring-offset-width: 0px; - --tw-ring-offset-color: #fff; - --tw-ring-color: rgb(59 130 246 / 0.5); - --tw-ring-offset-shadow: 0 0 #0000; - --tw-ring-shadow: 0 0 #0000; - --tw-shadow: 0 0 #0000; - --tw-shadow-colored: 0 0 #0000; - --tw-blur: ; - --tw-brightness: ; - --tw-contrast: ; - --tw-grayscale: ; - --tw-hue-rotate: ; - --tw-invert: ; - --tw-saturate: ; - --tw-sepia: ; - --tw-drop-shadow: ; - --tw-backdrop-blur: ; - --tw-backdrop-brightness: ; - --tw-backdrop-contrast: ; - --tw-backdrop-grayscale: ; - --tw-backdrop-hue-rotate: ; - --tw-backdrop-invert: ; - --tw-backdrop-opacity: ; - --tw-backdrop-saturate: ; - --tw-backdrop-sepia: ; -} - -::backdrop { - --tw-border-spacing-x: 0; - --tw-border-spacing-y: 0; - --tw-translate-x: 0; - --tw-translate-y: 0; - --tw-rotate: 0; - --tw-skew-x: 0; - --tw-skew-y: 0; - --tw-scale-x: 1; - --tw-scale-y: 1; - --tw-pan-x: ; - --tw-pan-y: ; - --tw-pinch-zoom: ; - --tw-scroll-snap-strictness: proximity; - --tw-gradient-from-position: ; - --tw-gradient-via-position: ; - --tw-gradient-to-position: ; - --tw-ordinal: ; - --tw-slashed-zero: ; - --tw-numeric-figure: ; - --tw-numeric-spacing: ; - --tw-numeric-fraction: ; - --tw-ring-inset: ; - --tw-ring-offset-width: 0px; - --tw-ring-offset-color: #fff; - --tw-ring-color: rgb(59 130 246 / 0.5); - --tw-ring-offset-shadow: 0 0 #0000; - --tw-ring-shadow: 0 0 #0000; - --tw-shadow: 0 0 #0000; - --tw-shadow-colored: 0 0 #0000; - --tw-blur: ; - --tw-brightness: ; - --tw-contrast: ; - --tw-grayscale: ; - --tw-hue-rotate: ; - --tw-invert: ; - --tw-saturate: ; - --tw-sepia: ; - --tw-drop-shadow: ; - --tw-backdrop-blur: ; - --tw-backdrop-brightness: ; - --tw-backdrop-contrast: ; - --tw-backdrop-grayscale: ; - --tw-backdrop-hue-rotate: ; - --tw-backdrop-invert: ; - --tw-backdrop-opacity: ; - --tw-backdrop-saturate: ; - --tw-backdrop-sepia: ; -} - -.view__container { - overflow-y: auto; -} - -#list .table__wrapper { - overflow: auto; - max-height: 100%; -} - -#prefix-select nav { - overflow-y: auto; -} - -#jobs { - position: absolute; - bottom: 0px; - left: 1.25rem; - width: 15rem; - z-index: 50; - border-left-width: 2px; - border-right-width: 2px; - border-top-width: 2px; - padding: 1.25rem; - border-top-left-radius: 0.375rem; - border-top-right-radius: 0.375rem; -} - -#jobs:empty { - visibility: hidden; -} - -.job__container { - width: 100%; - border-radius: 9999px; - margin-bottom: 0.5rem; - position: relative; - background-color: transparent; - height: 1.25rem; -} - -.job__label { - display: inline-block; - font-size: 0.75rem; - line-height: 1rem; - font-weight: 500; - padding-left: 0.25rem; - width: 100%; - height: 100%; - border-radius: 9999px; - border-width: 1px; - position: absolute; - top: 0px; - line-height: 1.5; -} - -.job__bar { - position: absolute; - top: 0px; - height: 100%; - border-radius: 9999px; - z-index: -10; - min-width: 1.25rem; -} - -.topbar { - background-color: transparent; -} - -.disabled { - opacity: 0.3; -} - -.drop::before { - content: ' '; - display: inline-block; - border-top: 5px solid transparent; - border-bottom: 5px solid transparent; - border-left: 5px solid currentColor; - vertical-align: middle; - margin-right: .7rem; - transform: translateY(-2px); - transition: transform .2s ease-out; -} - -.button__add { - display: inline-block; - content: " "; - width: 24px; - height: 24px; - background: url("data:image/svg+xml;utf8,"); -} - -.button__remove { - display: inline-block; - content: " "; - width: 24px; - height: 24px; - background: url("data:image/svg+xml;utf8,"); -} - -.button__up { - display: inline-block; - content: " "; - width: 24px; - height: 24px; - background: url("data:image/svg+xml;utf8,"); -} - -.button__down { - display: inline-block; - content: " "; - width: 24px; - height: 24px; - background: url("data:image/svg+xml;utf8,"); -} - -@-webkit-keyframes spinner { - to { - transform: rotate(360deg); - } -} - -@keyframes spinner { - to { - transform: rotate(360deg); - } -} - -.spinner { - content: ""; - box-sizing: border-box; - width: 20px; - height: 20px; - border-radius: 50%; - border: 2px solid #ccc; - border-top-color: #000; - -webkit-animation: spinner 0.6s linear infinite; - animation: spinner 0.6s linear infinite; -} - -input[class$="-loading"] + div nav:before { - content: ""; - box-sizing: border-box; - width: 20px; - height: 20px; - border-radius: 50%; - border: 2px solid #ccc; - border-top-color: #000; - -webkit-animation: spinner 0.6s linear infinite; - animation: spinner 0.6s linear infinite; - position: absolute; - top: 0.25rem; - right: 0.25rem; -} - -.button__remove, .button__add { - opacity: 0.5; -} - -.button__remove:hover, .button__add:hover { - opacity: 1; -} - -.search_select { - display: flex; - flex-direction: row; - align-content: center; -} - -.search_select nav { - width: 100%; -} - -.search_select .button__remove { - margin-right: 0.25rem; -} - -.main__content { - display: flex; - flex-direction: column; -} - -.main__wrap { - display: flex; - overflow: hidden; - height: 100vh; -} - -.nav { - overflow-y: auto; - width: 20%; - padding: 1rem; -} - -.nav__list { - align-content: center; - justify-content: space-between; -} - -.nav__list > .nav__item:first-of-type { - padding-bottom: 1.25rem; - font-size: 1.875rem; - line-height: 2.25rem; - font-weight: 700; - text-align: center; -} - -.nav__item { - overflow: hidden; - text-overflow: ellipsis; - white-space: nowrap; -} - -.nav__item--drop { - margin-left: 0.25rem; -} - -.nav__item--drop > ul { - margin-left: 1rem; -} - -.nav__list > .nav__item--group:first-of-type { - padding-bottom: 1.25rem; - font-size: 1.875rem; - line-height: 2.25rem; - font-weight: 700; - text-align: center; -} - -.nav__item--group { - overflow: hidden; - text-overflow: ellipsis; - white-space: nowrap; -} - -.nav__item--group a { - padding: 0.25rem; - border-radius: 0.25rem; -} - -.nav__item--group { - border-bottom-width: 1px; - padding-top: 0.25rem; - padding-bottom: 0.25rem; - display: flex; - flex-direction: column; -} - -.nav__list > .nav__item--selected:first-of-type { - padding-bottom: 1.25rem; - font-size: 1.875rem; - line-height: 2.25rem; - font-weight: 700; - text-align: center; -} - -.nav__item--selected { - overflow: hidden; - text-overflow: ellipsis; - white-space: nowrap; -} - -.nav__item--selected a { - padding: 0.25rem; - border-radius: 0.25rem; - -webkit-text-decoration-line: underline; - text-decoration-line: underline; - -webkit-text-decoration-style: dotted; - text-decoration-style: dotted; -} - -.nav__item a { - padding: 0.25rem; - border-radius: 0.25rem; -} - -.nav__item--active { - padding: 0.5rem; - overflow: hidden; - text-overflow: ellipsis; - white-space: nowrap; -} - -.nav__item--drop { - white-space: nowrap; -} - -.nav__item--drop input { - display: none; -} - -.nav__item--drop label { - padding-left: 0.25rem; - font-weight: 700; - cursor: pointer; - transition: all 0.25s ease-out; -} - -.nav__item--drop label::before { - content: ' '; - display: inline-block; - border-top: 5px solid transparent; - border-bottom: 5px solid transparent; - border-left: 5px solid currentColor; - vertical-align: middle; - margin-right: .7rem; - transform: translateY(-2px); - transition: transform .2s ease-out; -} - -.nav__item--drop input:checked + label::before { - transform: rotate(90deg) translateX(-3px); -} - -.nav__item--drop ul { - display: none; -} - -.nav__item--drop input:checked + label + ul { - display: list-item; -} - -.content { - display: flex; - flex-direction: column; - width: 80%; - padding: 0.5rem; -} - -.home__intro { - padding-top: 0.5rem; - padding-bottom: 0.5rem; - font-size: 1.25rem; - line-height: 1.75rem; -} - -.resource__banner { - display: grid; - grid-template-columns: repeat(1, minmax(0, 1fr)); -} - -@media (min-width: 1024px) { - .resource__banner { - grid-template-columns: repeat(2, minmax(0, 1fr)); - } -} - -.resource__banner { - white-space: nowrap; - overflow-x: clip; - margin-bottom: 0.5rem; -} - -.resource__title { - display: grid; - align-items: center; - justify-items: center; -} - -@media (min-width: 1024px) { - .resource__title { - justify-items: end; - } -} - -.resource__title { - height: 100%; - direction: rtl; -} - -.resource__actions { - flex-direction: column; - flex: 1 1 0%; - align-items: center; - display: grid; - justify-items: center; -} - -@media (min-width: 1024px) { - .resource__actions { - justify-items: end; - } -} - -.resource__actions { - white-space: nowrap; -} - -.resource__actions > div > * { - margin-left: 0.5rem; -} - -.resource__action { - display: inline-flex; - height: 2rem; -} - -.resource__action--link:hover { - -webkit-text-decoration-line: underline; - text-decoration-line: underline; -} - -.resource__action--btn, .resource__action--secondary { - display: inline-flex; - height: 2rem; - align-items: center; - padding-left: 1rem; - padding-right: 1rem; - font-size: 0.875rem; - line-height: 1.25rem; - transition-property: color, background-color, border-color, fill, stroke, -webkit-text-decoration-color; - transition-property: color, background-color, border-color, text-decoration-color, fill, stroke; - transition-property: color, background-color, border-color, text-decoration-color, fill, stroke, -webkit-text-decoration-color; - transition-timing-function: cubic-bezier(0.4, 0, 0.2, 1); - transition-duration: 150ms; - border-radius: 0.5rem; - position: relative; - white-space: nowrap; - border-width: 1px; -} - -.resource__action--disabled { - display: inline-flex; - height: 2rem; - align-items: center; - padding-left: 1rem; - padding-right: 1rem; - font-size: 0.875rem; - line-height: 1.25rem; - transition-property: color, background-color, border-color, fill, stroke, -webkit-text-decoration-color; - transition-property: color, background-color, border-color, text-decoration-color, fill, stroke; - transition-property: color, background-color, border-color, text-decoration-color, fill, stroke, -webkit-text-decoration-color; - transition-timing-function: cubic-bezier(0.4, 0, 0.2, 1); - transition-duration: 150ms; - border-radius: 0.5rem; - position: relative; - white-space: nowrap; - border-width: 1px; - opacity: 0.3; -} - -.resource__action--danger { - display: inline-flex; - height: 2rem; - align-items: center; - padding-left: 1rem; - padding-right: 1rem; - font-size: 0.875rem; - line-height: 1.25rem; - transition-property: color, background-color, border-color, fill, stroke, -webkit-text-decoration-color; - transition-property: color, background-color, border-color, text-decoration-color, fill, stroke; - transition-property: color, background-color, border-color, text-decoration-color, fill, stroke, -webkit-text-decoration-color; - transition-timing-function: cubic-bezier(0.4, 0, 0.2, 1); - transition-duration: 150ms; - border-radius: 0.5rem; - position: relative; - white-space: nowrap; - border-width: 1px; -} - -.resource__action--drop { - display: inline-flex; - height: 2rem; -} - -[class$="--drop"] { - flex-direction: column; -} - -[class$="--drop"] > div { - position: relative; -} - -[class$="--drop"] nav { - -webkit-appearance: none; - -moz-appearance: none; - appearance: none; - display: none; - position: absolute; - left: 0px; - border-width: 1px; - border-radius: 0.375rem; - padding-left: 0.5rem; - overflow: hidden; - text-overflow: ellipsis; - white-space: nowrap; - z-index: 50; - max-height: 20rem; - padding: 0.25rem; -} - -[class$="--drop"] div:first-child nav { - bottom: 0.5rem; -} - -[class$="--drop"] div:last-child nav { - top: 0.25rem; -} - -[class$="--drop"]:focus-within nav { - display: block; -} - -[class$="--drop"] nav a:hover { - -webkit-text-decoration-line: underline; - text-decoration-line: underline; -} - -.resource__view dd { - margin-bottom: 0.75rem; -} - -#index-page { - overflow-x: auto; -} - -.list__search { - background-color: transparent; - display: flex; - margin: 0.25rem; -} - -.list__error { - width: 100%; - text-align: center; -} - -.list__error * { - margin: 0.5rem; -} - -.list__search input { - padding-left: 1rem; - padding-right: 1rem; - padding-top: 0.25rem; - padding-bottom: 0.25rem; - width: 15rem; - border-width: 0px; - height: 2rem; -} - -.list__search svg { - width: 1.25rem; - height: 1.25rem; -} - -.resource__table { - padding: 0.5rem; - margin: 0.25rem; - --tw-shadow: 0 4px 6px -1px rgb(0 0 0 / 0.1), 0 2px 4px -2px rgb(0 0 0 / 0.1); - --tw-shadow-colored: 0 4px 6px -1px var(--tw-shadow-color), 0 2px 4px -2px var(--tw-shadow-color); - box-shadow: var(--tw-ring-offset-shadow, 0 0 #0000), var(--tw-ring-shadow, 0 0 #0000), var(--tw-shadow); - border-radius: 0.25rem; - border-collapse: collapse; - border-width: 1px; - position: relative; -} - -.resource__table th { - position: -webkit-sticky; - position: sticky; - z-index: 10; - top: 0px; -} - -.table__footer > div { - padding: 0.5rem; - display: flex; - align-items: center; -} - -#footer-nav div { - display: flex; - flex-direction: row; - align-items: center; - justify-content: center; - width: 100%; - font-weight: 600; -} - -#settings-modal label { - background-color: inherit; - width: 50%; -} - -#list-filters > div:nth-child(1) { - display: flex; - justify-content: space-evenly; -} - -#list-filters div > div:nth-child(1) { - display: flex; -} - -#list-filters > div > div:nth-child(2) { - display: flex; - justify-content: space-evenly; -} - -#list-filters div > div:nth-child(2) > * { - width: 25%; - line-height: 1.25rem; -} - -#list-filters > div:last-of-type { - justify-content: flex-start; -} - -.resource__table dd { - margin-bottom: 1.25rem; -} - -.resource__header { - border-width: 1px; - padding-left: 2rem; - padding-right: 2rem; - padding-top: 1rem; - padding-bottom: 1rem; - white-space: nowrap; -} - -.header__link--down::before { - content: ' '; - display: inline-block; - border-top: 5px solid transparent; - border-bottom: 5px solid transparent; - border-left: 5px solid currentColor; - vertical-align: middle; - margin-right: .7rem; - transform: translateY(-2px); - transition: transform .2s ease-out; - transform: rotate(90deg) translateX(-3px); -} - -.header__link--up::before { - content: ' '; - display: inline-block; - border-top: 5px solid transparent; - border-bottom: 5px solid transparent; - border-left: 5px solid currentColor; - vertical-align: middle; - margin-right: .7rem; - transform: translateY(-2px); - transition: transform .2s ease-out; - transform: rotate(-90deg) translateX(3px); -} - -[class^="resource__cell"] { - padding-left: 1rem; - padding-right: 1rem; - padding-top: 0.5rem; - padding-bottom: 0.5rem; - height: 5rem; - position: relative; -} - -.resource__cell:not(:first-child) .cell__contents { - overflow-y: auto; -} - -.cell__contents { - display: flex; - flex-direction: column; - height: 100%; - width: 100%; - justify-content: center; - align-items: safe center; -} - -.resource__menu--drop svg { - width: 1.25rem; - height: 1.25rem; -} - -.cell__copy { - cursor: pointer; -} - -.resource__form { - border-radius: 0.25rem; - border-collapse: collapse; - border-width: 1px; - --tw-shadow: 0 4px 6px -1px rgb(0 0 0 / 0.1), 0 2px 4px -2px rgb(0 0 0 / 0.1); - --tw-shadow-colored: 0 4px 6px -1px var(--tw-shadow-color), 0 2px 4px -2px var(--tw-shadow-color); - box-shadow: var(--tw-ring-offset-shadow, 0 0 #0000), var(--tw-ring-shadow, 0 0 #0000), var(--tw-shadow); - padding: 0.5rem; - margin: 0.25rem; - width: 100%; -} - -.form__actions { - display: flex; - justify-content: flex-end; -} - -.form__actions > * { - margin-left: 0.25rem; -} - -.table__actions { - display: flex; -} - -.table__actions * { - margin-right: 0.5rem; -} - -.embed__sort, .embed__drop { - display: none; -} - -.embed__title { - margin-bottom: 0.5rem; - text-transform: uppercase; - font-weight: 700; - font-size: 1.125rem; - line-height: 1.75rem; -} - -.embed__group { - border-left-width: 1px; - border-style: dashed; - padding-bottom: 1.25rem; - position: relative; - margin-left: 0.75rem; -} - -.embed__group .button__add { - position: absolute; - bottom: -0.5rem; - left: -0.75rem; -} - -.embed__item > .button__remove { - position: absolute; - top: -0.5rem; - left: -0.5rem; -} - -.embed__item > .button__up { - position: absolute; - top: -0.5rem; - right: -0.5rem; -} - -.embed__item > .button__down { - position: absolute; - bottom: -0.5rem; - right: -0.5rem; -} - -.embed__item { - position: relative; - border-width: 1px; - border-style: dotted; - margin-left: 1.25rem; - margin-top: 0.75rem; -} - -.embed__item > div { - flex-direction: column; - padding: 0.75rem; - flex-grow: 1; -} - -.field__group { - display: flex; - flex-direction: column; - margin-bottom: 1rem; -} - -.field__group--disabled { - display: flex; - flex-direction: column; - margin-bottom: 1rem; - opacity: 0.3; -} - -.field__label { - margin-bottom: 0.5rem; - text-transform: uppercase; - font-weight: 700; - font-size: 1.125rem; - line-height: 1.75rem; -} - -.checkbox__group input { - --tw-scale-x: 1.5; - --tw-scale-y: 1.5; - transform: translate(var(--tw-translate-x), var(--tw-translate-y)) rotate(var(--tw-rotate)) skewX(var(--tw-skew-x)) skewY(var(--tw-skew-y)) scaleX(var(--tw-scale-x)) scaleY(var(--tw-scale-y)); -} - -.checkbox__group label { - margin-left: 0.25rem; -} - -.checkbox__group { - display: grid; - grid-template-columns: auto minmax(0, 1fr); - gap: 0.25rem; - justify-items: start; - margin-left: 0.75rem; -} - -.field__array--group { - position: relative; - padding-bottom: 1.5rem; -} - -.field__array--row input:not(first-of-type) { - margin-right: 0.5rem; -} - -.field__array--group a.button__add { - position: absolute; - left: -0px; - bottom: -0.25rem; -} - -.field__array--group > div { - display: flex; - align-items: center; - margin-bottom: 0.5rem; -} - -.field__array--group > div > a { - flex-shrink: 0; - margin-right: 0.5rem; -} - -.field__array--group input { - margin-bottom: 0px; -} - -.field__map--group > div { - position: relative; - padding-bottom: 1.5rem; -} - -.field__map--group a.button__remove { - flex-shrink: 0; - margin-right: 0.5rem; -} - -.field__map--group a.button__add { - position: absolute; - left: 0px; - bottom: 0px; -} - -.field__map--row { - display: flex; - align-items: center; - margin-bottom: 0.5rem; -} - -.field__map--row textarea { - margin-bottom: 0px; - margin-right: 0.5rem; - width: 25%; -} - -.toast__container { - position: fixed; - width: 12rem; - z-index: 40; - border-radius: 0.25rem; - padding: 0.25rem; - text-align: center; - border-width: 1px; - bottom: 1.25rem; - text-overflow: clip; - overflow: hidden; - left: 50%; - top: auto !important; - transform: translate(-50%, -50%) !important; -} - -[class^="toast__container"]:empty { - display: none; -} - -.toast__container--info { - position: fixed; - width: 12rem; - z-index: 40; - border-radius: 0.25rem; - padding: 0.25rem; - text-align: center; - border-width: 1px; - bottom: 1.25rem; - text-overflow: clip; - overflow: hidden; - left: 50%; - top: auto !important; - transform: translate(-50%, -50%) !important; -} - -.toast__container--error { - position: fixed; - width: 12rem; - z-index: 40; - border-radius: 0.25rem; - padding: 0.25rem; - text-align: center; - border-width: 1px; - bottom: 1.25rem; - text-overflow: clip; - overflow: hidden; - left: 50%; - top: auto !important; - transform: translate(-50%, -50%) !important; -} - -.toast__container--success { - position: fixed; - width: 12rem; - z-index: 40; - border-radius: 0.25rem; - padding: 0.25rem; - text-align: center; - border-width: 1px; - bottom: 1.25rem; - text-overflow: clip; - overflow: hidden; - left: 50%; - top: auto !important; - transform: translate(-50%, -50%) !important; -} - -.invisible { - visibility: hidden; -} - -.fixed { - position: fixed; -} - -.absolute { - position: absolute; -} - -.relative { - position: relative; -} - -.sticky { - position: -webkit-sticky; - position: sticky; -} - -.mb-2 { - margin-bottom: 0.5rem; -} - -.block { - display: block; -} - -.flex { - display: flex; -} - -.table { - display: table; -} - -.grid { - display: grid; -} - -.contents { - display: contents; -} - -.hidden { - display: none; -} - -.size-6 { - width: 1.5rem; - height: 1.5rem; -} - -.h-5 { - height: 1.25rem; -} - -.h-6 { - height: 1.5rem; -} - -.h-full { - height: 100%; -} - -.w-1\/2 { - width: 50%; -} - -.w-5 { - width: 1.25rem; -} - -.w-6 { - width: 1.5rem; -} - -.grow { - flex-grow: 1; -} - -.transform { - transform: translate(var(--tw-translate-x), var(--tw-translate-y)) rotate(var(--tw-rotate)) skewX(var(--tw-skew-x)) skewY(var(--tw-skew-y)) scaleX(var(--tw-scale-x)) scaleY(var(--tw-scale-y)); -} - -.select-all { - -webkit-user-select: all; - -moz-user-select: all; - user-select: all; -} - -.items-center { - align-items: center; -} - -.justify-center { - justify-content: center; -} - -.truncate { - overflow: hidden; - text-overflow: ellipsis; - white-space: nowrap; -} - -.rounded { - border-radius: 0.25rem; -} - -.rounded-lg { - border-radius: 0.5rem; -} - -.border { - border-width: 1px; -} - -.border-2 { - border-width: 2px; -} - -.border-l { - border-left-width: 1px; -} - -.p-10 { - padding: 2.5rem; -} - -.px-2 { - padding-left: 0.5rem; - padding-right: 0.5rem; -} - -.uppercase { - text-transform: uppercase; -} - -.underline { - -webkit-text-decoration-line: underline; - text-decoration-line: underline; -} - -.opacity-0 { - opacity: 0; -} - -.opacity-100 { - opacity: 1; -} - -.opacity-30 { - opacity: 0.3; -} - -.filter { - filter: var(--tw-blur) var(--tw-brightness) var(--tw-contrast) var(--tw-grayscale) var(--tw-hue-rotate) var(--tw-invert) var(--tw-saturate) var(--tw-sepia) var(--tw-drop-shadow); -} - -.transition { - transition-property: color, background-color, border-color, fill, stroke, opacity, box-shadow, transform, filter, -webkit-text-decoration-color, -webkit-backdrop-filter; - transition-property: color, background-color, border-color, text-decoration-color, fill, stroke, opacity, box-shadow, transform, filter, backdrop-filter; - transition-property: color, background-color, border-color, text-decoration-color, fill, stroke, opacity, box-shadow, transform, filter, backdrop-filter, -webkit-text-decoration-color, -webkit-backdrop-filter; - transition-timing-function: cubic-bezier(0.4, 0, 0.2, 1); - transition-duration: 150ms; -} - -.duration-300 { - transition-duration: 300ms; -} - -.ease-in { - transition-timing-function: cubic-bezier(0.4, 0, 1, 1); -} - -.ease-out { - transition-timing-function: cubic-bezier(0, 0, 0.2, 1); -} - -input[type="date"], input[type="number"] { - width: 8rem; -} - -input[type="submit"] { - cursor: pointer; -} - -.cell__icons { - display: none; - position: absolute; - bottom: 0px; - right: 0px; - margin: 0.25rem; -} - -.cell__icons div { - cursor: pointer; - margin-left: 0.25rem; - margin-right: 0.25rem; -} - -[class^="resource__cell"]:hover .cell__icons { - display: flex; -} - -.resource__cell svg { - width: 1.5rem; - height: 1.5rem; -} - -.field__assoc--link { - line-height: 2.25rem; - -webkit-text-decoration-line: underline; - text-decoration-line: underline; - vertical-align: bottom; -} - -.field__assoc--link:hover::after { - line-height: 2.25rem; - display: inline-block; - content: " "; - background-image: url("data:image/svg+xml,"); - width: 20px; - height: 20px; - margin-left: 0.5rem; -} - -.modal { - position: fixed; - display: none; - inset: 0px; - background-color: rgb(75 85 99 / var(--tw-bg-opacity)); - --tw-bg-opacity: 0.5; - overflow-y: auto; - height: 100%; - width: 100%; - z-index: 50; - margin: 0px; -} - -.modal > div { - position: relative; - top: 5rem; - margin-left: auto; - margin-right: auto; - padding: 1.25rem; - border-width: 1px; - width: 25%; - --tw-shadow: 0 10px 15px -3px rgb(0 0 0 / 0.1), 0 4px 6px -4px rgb(0 0 0 / 0.1); - --tw-shadow-colored: 0 10px 15px -3px var(--tw-shadow-color), 0 4px 6px -4px var(--tw-shadow-color); - box-shadow: var(--tw-ring-offset-shadow, 0 0 #0000), var(--tw-ring-shadow, 0 0 #0000), var(--tw-shadow); - border-radius: 0.375rem; - --tw-bg-opacity: 1; - background-color: rgb(255 255 255 / var(--tw-bg-opacity)); - white-space: normal; -} - -.modal form { - display: flex; - flex-direction: column; - margin-top: 0.75rem; -} - -.modal label { - display: flex; - height: 1.75rem; - width: 1.75rem; - border-radius: 9999px; - --tw-bg-opacity: 1; - background-color: rgb(243 244 246 / var(--tw-bg-opacity)); - align-items: center; - justify-content: center; - margin-right: 0.5rem; -} - -.modal__title { - font-size: 1.125rem; - line-height: 1.75rem; - font-weight: 700; - border-bottom-width: 2px; -} - -.modal__tabs { - border-bottom-width: 2px; -} - -.modal__tabs > .modal__title--active { - font-size: 1.125rem; - line-height: 1.75rem; - font-weight: 700; - border-bottom-width: 2px; - display: inline-block; - margin-right: 0.5rem; - border-width: 0px; -} - -.modal__tabs > .modal__title { - display: inline-block; - margin-right: 0.5rem; - border-width: 0px; - cursor: pointer; -} - -.modal form > div { - display: flex; - margin-top: 0.25rem; - margin-bottom: 0.25rem; - align-items: center; -} - -.modal form > input[type="submit"] { - width: 6rem; - margin-left: auto; - margin-right: auto; -} - -.modal form > div:last-of-type { - margin-bottom: 0.75rem; -} - -.docs { - white-space: pre-wrap; - display: block; - font-family: ui-monospace, SFMono-Regular, Menlo, Monaco, Consolas, "Liberation Mono", "Courier New", monospace; - border-radius: 0.25rem; - --tw-bg-opacity: 1; - background-color: rgb(243 244 246 / var(--tw-bg-opacity)); - padding: 0.5rem; - margin-top: 0.5rem; - margin-bottom: 0.5rem; -} - -.focus\:ring:focus { - --tw-ring-offset-shadow: var(--tw-ring-inset) 0 0 0 var(--tw-ring-offset-width) var(--tw-ring-offset-color); - --tw-ring-shadow: var(--tw-ring-inset) 0 0 0 calc(3px + var(--tw-ring-offset-width)) var(--tw-ring-color); - box-shadow: var(--tw-ring-offset-shadow), var(--tw-ring-shadow), var(--tw-shadow, 0 0 #0000); -} +*{box-sizing:border-box;margin:0;padding:0}body{background:var(--bg-light);color:var(--text-primary);font-family:system-ui,sans-serif;--accent-color:#6b46c1;--accent-hover:#7c3aed;--bg-light:#f5f5f7;--bg-white:#fff;--bg-medium:#e8e8ed;--border-light:#d2d2d7;--border-medium:#e8e8ed;--text-primary:#1d1d1f;--text-secondary:#515154;--text-muted:#86868b;--error-bg:#fef2f2;--error-color:#dc2626;--error-hover:#7f1d1d;--success-bg:#f0fdf4;--success-light:#d1fae5;--success-color:#16a34a;--success-dark:#065f46;--success-hover:#166534;--info-bg:#eff6ff;--info-light:#dbeafe;--info-color:#2563eb;--info-dark:#1e40af;--info-hover:#1e40af;--warning-bg:#fff1e5;--warning-color:#e53e3e;--warning-hover:#c53030;--purple-50:#f3e8ff;--purple-100:#e9d5ff;--opacity-disabled:0.4;--opacity-muted:0.7;--shadow-sm:0 1px 3px rgba(0,0,0,.1);--shadow-md:0 4px 12px rgba(0,0,0,.15);--shadow-lg:0 20px 60px rgba(0,0,0,.3);--focus-ring:0 0 0 3px rgba(107,70,193,.1);--top-height:64px;padding-top:var(--top-height)}body:has(.alert-bar){padding-top:112px}p{margin:1lh 0}h1[class$=title],h3[class$=title]{color:var(--accent-hover);font-size:16px;font-weight:600;letter-spacing:.1em;opacity:.75;text-transform:uppercase}h1[class$=title]{font-size:16px}h2[class$=title]{font-size:14px}h3[class$=title]{font-size:12px}h1 span,h2 span,h3 span{color:var(--text-primary);display:block;font-size:2.5em;opacity:1;text-transform:none}.header{background:var(--bg-white);border-bottom:1px solid var(--border-light);left:0;position:fixed;right:0;top:0;z-index:100}.header-content{align-items:center;display:flex;height:var(--top-height);justify-content:space-between;margin:0 32px 0 24px}.logo{color:var(--text-primary);font-size:20px;font-weight:600}.user-menu{align-items:center;display:flex;gap:16px}#alert-bar{left:0;position:fixed;right:0}#alert-bar:hover .alert-bar+.alert-bar{opacity:1;position:relative;top:64px}.alert-bar{align-items:center;border-style:solid;border-width:2px 0;display:flex;height:64px;justify-content:space-between;padding:14px 24px;position:absolute;transition:all .2s ease-in-out;width:100%;z-index:2}.alert-bar+.alert-bar{border-top-width:0;opacity:0;top:0;z-index:1}.alert-count{align-items:center;border-radius:50%;border-style:solid;border-width:2px;cursor:pointer;display:flex;height:1.25lh;justify-content:center;text-align:center;vertical-align:middle;width:1.25lh}.alert-bar.error{background:var(--error-bg);border-color:var(--error-color);color:var(--error-color)}.alert-bar.error:hover{color:var(--error-hover)}.alert-bar.success{background:var(--success-bg);border-color:var(--success-color);color:var(--success-color)}.alert-bar.success:hover{color:var(--success-hover)}.alert-bar.info{background:var(--info-bg);border-color:var(--info-color);color:var(--info-color)}.alert-bar.info:hover{color:var(--info-hover)}#alert-bar[class$=loading]{opacity:var(--opacity-muted);pointer-events:none}.alert-content{align-items:center;display:flex;flex:1;gap:12px}.alert-icon{cursor:pointer;flex-shrink:0;height:20px;width:20px}.alert-message{font-size:14px;font-weight:500}.alert-close{border-radius:6px;cursor:pointer;flex-shrink:0;font-size:16px;font-weight:600;line-height:1;padding:6px 12px;transition:all .2s}.breadcrumb,.breadcrumb a,.breadcrumb-content,.breadcrumb-current,.breadcrumb-separator{display:none}.main-layout{display:flex;min-height:calc(100vh - var(--top-height))}.sidebar{background:var(--bg-white);border-right:1px solid var(--border-light);bottom:0;left:0;max-width:300px;min-width:200px;overflow-y:auto;padding:24px 0 180px;position:fixed;top:var(--top-height);width:20vw;z-index:10}body:has(.alert-bar) .sidebar{top:112px}.nav-section{margin-bottom:32px}.nav-section-title{color:var(--text-muted);font-size:12px;font-weight:600;letter-spacing:.5px;padding:0 24px 12px;text-transform:uppercase}.nav-item{align-items:center;color:var(--text-primary);cursor:pointer;display:flex;gap:12px;padding:10px 24px;text-decoration:none;transition:background .2s}.nav-item.active,.nav-item:hover{background:var(--bg-light)}.nav-item.active{border-left:3px solid var(--accent-color);color:var(--accent-color)!important;font-weight:500}.nav-icon{fill:currentColor;height:20px;width:20px}.nav-icon svg{display:block;height:100%;width:100%}.nav-item-expand{font-size:12px;margin-left:auto;opacity:var(--opacity-muted);transition:transform .2s}.nav-toggle-input{display:none}.nav-toggle-label{align-items:center;color:var(--text-primary);cursor:pointer;display:flex;gap:12px;padding:10px 24px;text-decoration:none;transition:background .2s;-webkit-user-select:none;-moz-user-select:none;user-select:none}.nav-toggle-label:hover{background:var(--bg-light)}.nav-toggle-label.active{background:var(--bg-medium);border-left:3px solid var(--accent-color);font-weight:500}.nav-subitems{max-height:0;overflow:hidden}.nav-toggle-input:checked+.nav-toggle-label+.nav-subitems{max-height:none}.nav-toggle-input:checked+.nav-toggle-label .nav-item-expand{transform:rotate(180deg)}.nav-subitems .nav-toggle-label{color:var(--text-secondary);font-size:16px;padding:8px 24px}.nav-subitems .nav-toggle-label:hover{background:transparent;color:var(--accent-color)}.nav-subitems .nav-subitems{max-height:0;padding-left:16px}.nav-subitems .nav-subitems a{align-items:center;color:var(--text-secondary);display:flex;font-size:16px;gap:12px;padding:8px 24px;text-decoration:none;transition:color .2s}.nav-subitems .nav-subitems a:hover{color:var(--accent-color)}.nav-subitem{align-items:center;color:var(--text-secondary);display:flex;font-size:16px;justify-content:space-between;padding:8px 24px;text-decoration:none;transition:color .2s}.nav-subitem:hover{color:var(--accent-color)}.nav-subitem .nav-item-expand{font-size:12px;opacity:var(--opacity-muted)}.nav-progress-section{background:var(--bg-white);border-top:1px solid var(--border-light);bottom:0;left:0;padding:16px 24px 24px;position:absolute;right:0}.nav-progress-title{color:var(--text-muted);font-size:12px;font-weight:600;letter-spacing:.5px;margin-bottom:16px;text-transform:uppercase}.progress-item{margin-bottom:16px}.progress-item:last-child{margin-bottom:0}.progress-header{align-items:center;display:flex;justify-content:space-between;margin-bottom:6px}.progress-label{color:var(--text-primary);font-size:13px;font-weight:500}.progress-percentage{color:var(--text-muted);font-size:12px;font-weight:600}.progress-bar-container{background:var(--bg-medium);border-radius:3px;height:6px;overflow:hidden;width:100%}.progress-bar{background:var(--accent-color);border-radius:3px;height:100%;transition:width .3s ease}.content{box-sizing:border-box;flex:1;margin-left:20vw;max-width:80vw;padding:32px}@media (min-width:1500px){.content{margin-left:300px;max-width:calc(100vw - 300px)}}@media (max-width:1000px){.content{margin-left:200px;max-width:calc(100vw - 200px)}}.content-header{align-items:center;display:flex;flex-wrap:wrap;gap:16px;justify-content:space-between;margin-bottom:32px;max-width:100%;overflow:visible}.content-title{flex-shrink:1;font-size:32px;font-weight:600;min-width:0;overflow-wrap:break-word}@media (max-width:768px){.content-header{align-items:flex-start;flex-direction:column}.contextual-actions{width:100%}}.contextual-actions{display:flex;flex-shrink:0;flex-wrap:wrap;gap:12px}.btn{align-items:center;border:none;border-radius:8px;cursor:pointer;display:flex;font-size:14px;font-weight:500;gap:8px;padding:10px 20px;transition:all .2s}.btn-primary{background:var(--accent-color);color:var(--bg-white)}.btn-primary:hover{background:var(--accent-hover)}.btn-secondary{background:var(--bg-white);border:1px solid var(--border-light);color:var(--text-primary)}.btn-secondary:hover{background:var(--bg-light)}.btn-select{background:var(--bg-white);border:1px solid var(--border-light);border-radius:8px;color:var(--text-primary);cursor:pointer;font-size:14px;font-weight:500;padding:10px 20px;position:relative;transition:all .2s}.btn-select:hover,.btn-select[open]{background:var(--bg-light)}.btn-select summary{align-items:center;cursor:pointer;display:flex;gap:8px;list-style:none;-webkit-user-select:none;-moz-user-select:none;user-select:none}.btn-select summary::-webkit-details-marker{display:none}.btn-select summary:after{border-left:4px solid transparent;border-right:4px solid transparent;border-top:5px solid var(--text-primary);content:"";height:0;margin-left:8px;width:0}.btn-select[open] summary:after{border-bottom:5px solid var(--text-primary);border-top:none}.drop-menu{background:var(--bg-white);border:1px solid var(--border-light);border-radius:8px;box-shadow:var(--shadow-md);max-height:30vh;min-width:200px;overflow-y:scroll;padding:8px 0;position:absolute;right:0;top:calc(100% + 4px);z-index:1000}.drop-link{color:var(--text-primary);display:block;display:inline-block;font-size:14px;height:100%;padding:10px 16px;text-decoration:none;transition:background .2s;width:100%}.drop-link:hover{background:var(--bg-light)}.btn-icon{fill:currentColor;height:16px;width:16px}.btn-icon svg{display:block;height:100%;width:100%}.content-card{background:var(--bg-white);border-radius:12px;box-shadow:var(--shadow-sm);padding:24px}.card-section{margin-bottom:24px}.table-container{max-height:200vh;overflow:scroll}.card-section:last-child{margin-bottom:0}.card-section-title{font-size:18px;font-weight:600;margin-bottom:16px}.card-text{color:var(--text-secondary);line-height:1.6}.data-table{border-collapse:collapse;margin-top:16px;min-width:1600px;width:100%}.data-table th{background:var(--bg-light);border-bottom:2px solid var(--border-light);color:var(--text-primary);font-size:14px;font-weight:600;position:sticky;text-align:left;top:0;-webkit-user-select:none;-moz-user-select:none;user-select:none;z-index:2}.data-table th a{color:inherit;display:inline-block;padding:12px 16px;text-decoration:none;width:100%}.data-table th a:hover{color:var(--accent-color)}.data-table tr{background:var(--bg-white)}.data-table th:first-child{cursor:default;left:0;position:sticky;z-index:4}.data-table td:first-child{background:inherit;left:0;position:sticky;z-index:3}.data-table th.sort-asc:after,.data-table th.sort-desc:after{content:"";font-size:12px;margin-left:1em;position:relative;right:3em;z-index:-1}.data-table th.sort-asc:after{color:var(--accent-color);content:"▲"}.data-table th.sort-desc:after{color:var(--accent-color);content:"▼"}.data-table td{border-bottom:1px solid var(--border-medium);color:var(--text-secondary);max-width:250px;padding:12px 16px;position:relative}.data-table td,.data-table td:first-child{vertical-align:middle}.expand-icon{background:#eee;border-radius:2px;bottom:2px;color:var(--text-muted);cursor:pointer;display:none;padding:2px;position:absolute;right:2px;transition:opacity .2s;z-index:10}.expand-icon:hover{color:var(--text-secondary)}.copy-icon,.detail-field-value:hover .expand-icon,.table-cell:hover .expand-icon{display:flex}.copy-icon{background:#eee;border-radius:2px;bottom:6px;color:var(--text-muted);cursor:pointer;padding:2px;position:absolute;right:6px;transition:opacity .2s;width:20px;z-index:100}.copy-icon:hover{color:var(--text-secondary)}.modal-body:hover .copy-icon{display:flex}.modal{align-items:center;background:rgba(0,0,0,.5);bottom:0;display:none;justify-content:center;left:0;position:fixed;right:0;top:0;z-index:2000}.modal-content{background:var(--bg-white);border-radius:12px;box-shadow:var(--shadow-lg);max-height:80vh;max-width:600px;overflow-y:auto;padding:32px;position:relative}.modal-header{align-items:center;border-bottom:2px solid var(--border-medium);display:flex;justify-content:space-between;margin-bottom:24px;padding-bottom:16px}.modal-title{color:var(--text-primary);font-size:20px;font-weight:600}.modal-close{align-items:center;background:none;border:none;border-radius:6px;color:var(--text-muted);cursor:pointer;display:flex;font-size:28px;height:32px;justify-content:center;padding:0;transition:all .2s;width:32px}.modal-close:hover{background:var(--bg-light);color:var(--text-primary)}.modal-body{color:var(--text-secondary);line-height:1.6;position:relative}.cell-content{display:inline-block;display:-webkit-box;-webkit-line-clamp:3;max-height:60px;max-width:calc(100% - 24px);overflow:hidden;text-overflow:ellipsis;-webkit-box-orient:vertical;line-height:1.4}.cell-content *{display:inline-block}.data-table tr:last-child td{border-bottom:none}.data-table tr:hover{background:var(--bg-light)}.row-checkbox{accent-color:var(--accent-color);cursor:pointer;height:18px;width:18px}.row-checkbox:checked~td{background:var(--purple-50)}.data-table input[type=checkbox]:checked{background:var(--accent-color)}.data-table tr:has(input[type=checkbox]:checked){background:var(--purple-50)}.data-table tr:has(input[type=checkbox]:checked):hover{background:var(--purple-100)}.data-table td:first-child,.data-table th:first-child{text-align:center;width:40px}.status-badge{border-radius:12px;display:inline-block;font-size:12px;font-weight:500;padding:4px 12px}.status-active{background:var(--success-light);color:var(--success-dark)}.status-pending{background:var(--warning-bg);color:var(--warning-color)}.status-completed{background:var(--info-light);color:var(--info-dark)}.pagination{align-items:center;border-top:1px solid var(--border-medium);display:flex;justify-content:center;margin-top:24px;padding-top:16px}.pagination-info{color:var(--text-secondary);font-size:14px}.pagination-controls{align-items:center;display:flex;gap:8px}.pagination-btn{background:var(--bg-white);border:1px solid var(--border-light);border-radius:6px;color:var(--text-primary);cursor:pointer;font-size:14px;padding:6px 12px;transition:all .2s}.pagination-btn:hover:not(:disabled){background:var(--bg-light);border-color:var(--accent-color)}.pagination-btn:disabled{cursor:not-allowed;opacity:var(--opacity-disabled)}.pagination-info-btn{background:var(--bg-white);border:1px solid var(--border-light);border-radius:6px;color:var(--text-secondary);cursor:pointer;font-size:14px;padding:6px 12px;transition:all .2s}.pagination-info-btn:hover{background:var(--bg-light);border-color:var(--accent-color)}.search-container{margin-bottom:16px;max-width:400px;position:relative}.search-input{border:1px solid var(--border-light);border-radius:8px;font-family:inherit;font-size:14px;padding:10px 16px 10px 40px;transition:all .2s;width:100%}.search-input:focus{border-color:var(--accent-color);box-shadow:var(--focus-ring);outline:none}.search-input::-moz-placeholder{color:var(--text-muted)}.search-input::placeholder{color:var(--text-muted)}.search-icon{height:18px;left:12px;opacity:var(--opacity-muted);pointer-events:none;position:absolute;top:50%;transform:translateY(-50%);width:18px}.edit-view{display:none}.edit-view.active{display:block}.edit-view.hidden{display:none}.form-grid{display:grid;gap:24px;grid-template-columns:repeat(auto-fit,minmax(300px,1fr));margin-bottom:32px}.form-field{display:flex;flex-direction:column;gap:8px}.form-label{color:var(--text-muted);font-size:12px;font-weight:600;letter-spacing:.5px;text-transform:uppercase}.form-input,.form-select,.form-textarea{border:1px solid var(--border-light);border-radius:6px;color:var(--text-primary);font-family:inherit;font-size:14px;padding:10px 12px;transition:all .2s;width:100%}.form-input:focus,.form-select:focus,.form-textarea:focus{border-color:var(--accent-color);box-shadow:var(--focus-ring);outline:none}.form-textarea{height:39px;max-width:30vw;min-height:39px;padding:10px 12px;resize:vertical}.form-actions{border-top:2px solid var(--border-medium);display:flex;gap:12px;justify-content:flex-end;margin-top:16px;padding-top:16px}.form-subsection{background:var(--bg-light);border-radius:8px;grid-column:1/-1;margin-bottom:16px;padding:24px}.form-subsection-title{color:var(--text-primary);font-size:14px;font-weight:600;letter-spacing:.5px;margin-bottom:16px;text-transform:uppercase}.form-subgrid{display:grid;gap:16px;grid-template-columns:repeat(auto-fit,minmax(250px,1fr))}.detail-grid{display:grid;gap:24px;grid-template-columns:repeat(auto-fit,minmax(300px,1fr));margin-bottom:32px}.detail-field{display:flex;flex-direction:column;gap:8px}.detail-field-label{color:var(--text-muted);font-size:12px;font-weight:600;letter-spacing:.5px;text-transform:uppercase}.detail-field-value{color:var(--text-primary);display:flex;font-size:16px;max-height:3lh;min-height:1.5lh;overflow:hidden;position:relative}.detail-field-value>span{display:flex}.cell-content .btn,.detail-field-value .btn{cursor:default;margin:2px;padding:4px}.expand-content{background:var(--bg-light);border-radius:8px;color:var(--text-secondary);font-family:monospace;line-height:1.6;overflow:scroll;padding:16px;white-space:pre}.form-line .form-title{color:var(--text-primary);font-size:16px;font-weight:600;margin-bottom:30px;text-align:left}.form-line .docs{background:var(--info-bg);border-left:4px solid var(--info-color);border-radius:8px;color:var(--text-secondary);font-size:14px;line-height:1.6;margin-bottom:30px;padding:16px 20px}.form-line .form-group{align-items:flex-start;display:flex;gap:12px;margin-bottom:24px;width:100%}.form-line label{color:var(--text-secondary);display:block;flex-shrink:0;font-size:14px;font-weight:500;min-width:20px;padding-top:2px}.form-line textarea{background:var(--bg-white);border:2px solid var(--border-light);border-radius:8px;color:var(--text-primary);flex:1;font-family:inherit;font-size:15px;padding:8px 16px;resize:vertical;transition:all .3s ease;width:100%}.form-line textarea:focus{border-color:var(--accent-color);box-shadow:var(--focus-ring);outline:none}.form-line .button-group{display:flex;gap:12px;justify-content:flex-end;margin-top:32px;width:100%}select{background-color:#fff}.btn{text-decoration:none}.btn-danger{background-color:var(--warning-color);border:1px solid var(--warning-color);color:var(--warning-bg)}.btn-danger:hover{background-color:var(--warning-hover)}.nav-subitems .nav-icon{display:none}.detail-subtitle+.detail-subtitle:before{content:"|"}pre{overflow:scroll}th{white-space:nowrap}.cell-content{max-width:100%;padding:2px}.cell-content *{display:inline}.modal-content{min-width:50%}.edit-view{display:block}.nav-progress-section:not(:has(*)){display:none}.resource-link{color:#444;-webkit-text-decoration-style:dashed;text-decoration-style:dashed}.resource-link:hover{color:#333}.switch-container{display:inline-block;position:relative}input[type=radio]{display:none}.switch{background:#fff;border:1px solid #d2d2d7;border-radius:5.5px;cursor:pointer;height:38px;overflow:hidden;position:relative;width:125px}.switch-background{display:flex;height:100%;left:0;position:absolute;top:0;transition:transform .3s cubic-bezier(.4,0,.2,1);width:300%}.bg-section{height:100%;width:33.333%}.switch-handle{align-items:center;background:#fff;border:1px solid #d2d2d7;border-radius:5.5px;display:flex;font-size:12px;height:34px;justify-content:center;position:absolute;top:1px;transition:transform .3s cubic-bezier(.4,0,.2,1);width:34px;z-index:2}.switch-left:checked~.switch .switch-background,.switch-left:checked~.switch .switch-handle{transform:translateX(1px)}.switch-left:checked~.switch .switch-handle:before{background-image:url('data:image/svg+xml;utf8,');background-repeat:no-repeat;background-size:contain;content:"";flex-shrink:0;height:16px;width:16px}.switch-center:checked~.switch .switch-background{transform:translateX(-33.333%)}.switch-center:checked~.switch .switch-handle{transform:translateX(45px)}.switch-center:checked~.switch .switch-handle:before{background-image:url('data:image/svg+xml;utf8,');background-repeat:no-repeat;background-size:contain;content:"";flex-shrink:0;height:16px;width:16px}.switch-right:checked~.switch .switch-background{transform:translateX(-66.666%)}.switch-right:checked~.switch .switch-handle{transform:translateX(88px)}.switch-right:checked~.switch .switch-handle:before{background-image:url('data:image/svg+xml;utf8,');background-repeat:no-repeat;background-size:contain;content:"";flex-shrink:0;height:16px;width:16px}.switch-center:checked~.labels .label-center,.switch-left:checked~.labels .label-left,.switch-right:checked~.labels .label-right{color:#333;font-weight:600;transform:scale(1.1)}.label-area{cursor:pointer;height:35px;position:absolute;top:0;width:33.333px;z-index:3}.label-area.left{left:0}.label-area.center{left:33.333px}.label-area.right{right:0}:disabled{opacity:.5}select[multiple]{height:39px}select[multiple]:focus-within{height:100px}.search-select-container{position:relative;width:100%}.select-filter{box-sizing:border-box;padding:10px;width:100%}.select-filter,.select-options{border:1px solid #ccc;border-radius:4px}.select-options{background-color:#fff;display:none;left:0;list-style:none;margin:0;max-height:150px;overflow-y:auto;padding:0;position:absolute;right:0;top:120%;z-index:1}.search-select-container:focus-within .select-options{display:block}.search-select-container .select-options:active,.search-select-container .select-options:focus{display:block}.select-options li{cursor:pointer;padding:10px}.select-options li:hover{background-color:#f0f0f0}.search-select-container[class$=loading]{opacity:.5}.search-select-container[class$=loading] button,.search-select-container[class$=loading] input,input[class$=loading]{opacity:.5;pointer-events:none}input[class$=loading]+.select-options{content:""}button[class$=loading]{opacity:.5;pointer-events:none}.array-input-wrapper{border:1px solid #e2e8f0;border-radius:8px;display:flex;flex-wrap:wrap;gap:8px;min-height:39px;padding:2px;transition:border-color .2s}.array-input-wrapper:focus-within{background:#fff;border-color:var(--accent-color)}.array-input-wrapper .btn{height:32px;padding:0 10px}@keyframes slideIn{0%{opacity:0;transform:scale(.8)}to{opacity:1;transform:scale(1)}}@keyframes fadeIn{0%{opacity:0}to{opacity:.5}}.array-input-wrapper input{background:transparent;border:none;flex:1;font-size:14px;min-width:120px;outline:none;padding:6px}.array-input-wrapper input:not(:-moz-placeholder-shown)+.return-icon{display:block}.array-input-wrapper input:not(:placeholder-shown)+.return-icon{display:block}.return-icon{animation:fadeIn .2s ease-out;display:none;height:20px;margin:5px;opacity:.5;transition:opacity .2s;width:20px}.form-field.error .error-message{color:#c15846;font-size:10px;font-weight:700}.form-field.error input,.form-field.error textarea{background:#fef2f2}.embed-container{display:flex;flex-direction:column;gap:30px}.remove-icon{background:none;border:none;color:#e53e3e;cursor:pointer;height:24px;left:6px;opacity:var(--opacity-muted);padding:0;position:absolute;top:6px;transition:color .2s,opacity .2s;width:24px}.remove-icon:hover{color:#c53030;opacity:1}.remove-icon svg{height:100%;width:100%}.embed-section,.embed-section-title-wrapper,.embed-section-wrapper{margin-bottom:15px}.embed-section{background:#f7f7f7;border-radius:8px;padding:50px 25px 25px;position:relative}.add-section-btn{align-items:center;background:var(--bg-white);border:1px dashed var(--border-medium);border-radius:8px;color:#2d3748;cursor:pointer;display:flex;font-size:15px;font-weight:600;gap:8px;justify-content:center;margin-top:0;padding:16px;transition:all .2s;width:100%}.add-section-btn:hover{border-style:solid}.embed-section.odd{background:#fff;border:1px solid #cbd5e0;border-radius:6px;position:relative;transition:border-color .2s}.embed.subsection:hover{border-color:#a0aec0}.embed-section:has(.remove-icon.phx-click-loading){opacity:var(--opacity-disabled);pointer-events:none}.drag-icon{background:none;border:none;color:#718096;cursor:grab;height:28px;padding:0;position:absolute;right:6px;top:6px;transition:color .2s;width:28px}.drag-icon:active{cursor:grabbing}.drag-icon:hover{color:#4a5568}.drag-icon svg{height:100%;width:100%}.dragging{opacity:.5;transform:scale(.95);transition:transform .2s,opacity .2s}.drop-zone{align-items:center;background:#ebf8ff;border:2px dashed #4299e1;border-radius:8px;color:#4299e1;display:none;font-size:14px;font-weight:500;height:60px;justify-content:center;margin:10px 0;opacity:var(--opacity-muted)}.content-card:has(.tabs){padding:0}.content-card:has(.tabs) .card-section{padding:24px}.tabs{border-bottom:1px solid #e5e7eb;display:flex;justify-content:right;padding:0}.tabs a{align-content:center;background:none;border:none;border-left:1px dashed var(--border-light);color:#9ca3af;cursor:pointer;flex:1;font-family:inherit;font-size:11px;font-weight:700;letter-spacing:.08em;max-width:200px;padding:4px 2px;text-align:center;text-decoration:none;text-transform:uppercase;transition:all .2s ease}.tabs a:hover{background-color:#f9fafb;color:#6b7280}.tabs a.active{background-color:#f9fafb;color:#1f2937;font-weight:700}#main-link.active{visibility:hidden}#main-link{border:none;border-right:2px solid #e5e7eb;margin-right:auto}#main-link:before{content:"←";font-size:16px;font-weight:400}.error-box{flex-direction:column;justify-content:center;padding:80px 40px;text-align:center}.error-box,.error-header{align-items:center;display:flex}.error-header{gap:12px;margin-bottom:12px}.error-icon{flex-shrink:0;height:32px;width:32px}.error-icon svg{height:100%;width:100%}.error-header h3{color:#1a1a1a;font-size:24px;font-weight:600}.error-message{color:#666;font-size:15px;line-height:1.6;max-width:500px}.spinner{animation:spin 1s linear infinite;border:8px solid hsla(0,0%,100%,.3);border-radius:50%;border-top-color:#fff;height:80px;margin:80px auto;width:80px}@keyframes spin{to{transform:rotate(1turn)}} \ No newline at end of file diff --git a/dist/css/default_overrides.css b/dist/css/default_overrides.css index bca456a2..e69de29b 100644 --- a/dist/css/default_overrides.css +++ b/dist/css/default_overrides.css @@ -1,97 +0,0 @@ -body { - --tw-bg-opacity: 1; - background-color: rgb(255 255 255 / var(--tw-bg-opacity)) -} - -.nav__list > .nav__item--group:first-of-type span { - margin-top: 0.75rem; - background-image: linear-gradient(to right, var(--tw-gradient-stops)); - --tw-gradient-from: #8b5cf6; - --tw-gradient-stops: var(--tw-gradient-from), var(--tw-gradient-to, rgb(139 92 246 / 0)); - --tw-gradient-to: #581c87; - -webkit-background-clip: text; - background-clip: text; - color: transparent -} - -.resource__action--btn { - --tw-bg-opacity: 1; - background-color: rgb(124 58 237 / var(--tw-bg-opacity)); - --tw-border-opacity: 1; - border-color: rgb(124 58 237 / var(--tw-border-opacity)); - --tw-text-opacity: 1; - color: rgb(245 243 255 / var(--tw-text-opacity)) -} - -.resource__action--btn:hover { - --tw-bg-opacity: 1; - background-color: rgb(76 29 149 / var(--tw-bg-opacity)); - --tw-border-opacity: 1; - border-color: rgb(76 29 149 / var(--tw-border-opacity)) -} - -.resource__action--secondary { - --tw-bg-opacity: 1; - background-color: rgb(245 243 255 / var(--tw-bg-opacity)); - --tw-border-opacity: 1; - border-color: rgb(245 243 255 / var(--tw-border-opacity)); - --tw-text-opacity: 1; - color: rgb(76 29 149 / var(--tw-text-opacity)) -} - -.resource__action--secondary:hover { - --tw-bg-opacity: 1; - background-color: rgb(196 181 253 / var(--tw-bg-opacity)); - --tw-border-opacity: 1; - border-color: rgb(196 181 253 / var(--tw-border-opacity)) -} - -.resource__action--danger { - --tw-bg-opacity: 1; - background-color: rgb(244 63 94 / var(--tw-bg-opacity)); - --tw-border-opacity: 1; - border-color: rgb(244 63 94 / var(--tw-border-opacity)); - --tw-text-opacity: 1; - color: rgb(255 255 255 / var(--tw-text-opacity)) -} - -.resource__header { - --tw-bg-opacity: 1; - background-color: rgb(237 233 254 / var(--tw-bg-opacity)) -} - -.nav a:hover { - --tw-bg-opacity: 1; - background-color: rgb(237 233 254 / var(--tw-bg-opacity)) -} - -.toast__container--error { - --tw-border-opacity: 1; - border-color: rgb(244 63 94 / var(--tw-border-opacity)); - --tw-text-opacity: 1; - color: rgb(244 63 94 / var(--tw-text-opacity)) -} - -.toast__container--success { - --tw-bg-opacity: 1; - background-color: rgb(132 204 22 / var(--tw-bg-opacity)); - --tw-border-opacity: 1; - border-color: rgb(132 204 22 / var(--tw-border-opacity)) -} - -.toast__container--info { - --tw-bg-opacity: 1; - background-color: rgb(196 181 253 / var(--tw-bg-opacity)); - --tw-border-opacity: 1; - border-color: rgb(196 181 253 / var(--tw-border-opacity)) -} - -.job__container { - --tw-text-opacity: 1; - color: rgb(245 243 255 / var(--tw-text-opacity)) -} - -.job__bar { - --tw-bg-opacity: 1; - background-color: rgb(124 58 237 / var(--tw-bg-opacity)) -} diff --git a/dist/js/app.js b/dist/js/app.js index 212ebe22..2b24d8fa 100644 --- a/dist/js/app.js +++ b/dist/js/app.js @@ -690,306 +690,6 @@ } }); - // node_modules/toastify-js/src/toastify.js - var require_toastify = __commonJS({ - "node_modules/toastify-js/src/toastify.js"(exports, module) { - (function(root, factory) { - if (typeof module === "object" && module.exports) { - module.exports = factory(); - } else { - root.Toastify = factory(); - } - })(exports, function(global2) { - var Toastify2 = function(options) { - return new Toastify2.lib.init(options); - }, version = "1.11.2"; - Toastify2.defaults = { - oldestFirst: true, - text: "Toastify is awesome!", - node: void 0, - duration: 3e3, - selector: void 0, - callback: function() { - }, - destination: void 0, - newWindow: false, - close: false, - gravity: "toastify-top", - positionLeft: false, - position: "", - backgroundColor: "", - avatar: "", - className: "", - stopOnFocus: true, - onClick: function() { - }, - offset: { x: 0, y: 0 }, - escapeMarkup: true, - style: { background: "" } - }; - Toastify2.lib = Toastify2.prototype = { - toastify: version, - constructor: Toastify2, - // Initializing the object with required parameters - init: function(options) { - if (!options) { - options = {}; - } - this.options = {}; - this.toastElement = null; - this.options.text = options.text || Toastify2.defaults.text; - this.options.node = options.node || Toastify2.defaults.node; - this.options.duration = options.duration === 0 ? 0 : options.duration || Toastify2.defaults.duration; - this.options.selector = options.selector || Toastify2.defaults.selector; - this.options.callback = options.callback || Toastify2.defaults.callback; - this.options.destination = options.destination || Toastify2.defaults.destination; - this.options.newWindow = options.newWindow || Toastify2.defaults.newWindow; - this.options.close = options.close || Toastify2.defaults.close; - this.options.gravity = options.gravity === "bottom" ? "toastify-bottom" : Toastify2.defaults.gravity; - this.options.positionLeft = options.positionLeft || Toastify2.defaults.positionLeft; - this.options.position = options.position || Toastify2.defaults.position; - this.options.backgroundColor = options.backgroundColor || Toastify2.defaults.backgroundColor; - this.options.avatar = options.avatar || Toastify2.defaults.avatar; - this.options.className = options.className || Toastify2.defaults.className; - this.options.stopOnFocus = options.stopOnFocus === void 0 ? Toastify2.defaults.stopOnFocus : options.stopOnFocus; - this.options.onClick = options.onClick || Toastify2.defaults.onClick; - this.options.offset = options.offset || Toastify2.defaults.offset; - this.options.escapeMarkup = options.escapeMarkup !== void 0 ? options.escapeMarkup : Toastify2.defaults.escapeMarkup; - this.options.style = options.style || Toastify2.defaults.style; - if (options.backgroundColor) { - this.options.style.background = options.backgroundColor; - } - return this; - }, - // Building the DOM element - buildToast: function() { - if (!this.options) { - throw "Toastify is not initialized"; - } - var divElement = document.createElement("div"); - divElement.className = "toastify on " + this.options.className; - if (!!this.options.position) { - divElement.className += " toastify-" + this.options.position; - } else { - if (this.options.positionLeft === true) { - divElement.className += " toastify-left"; - console.warn("Property `positionLeft` will be depreciated in further versions. Please use `position` instead."); - } else { - divElement.className += " toastify-right"; - } - } - divElement.className += " " + this.options.gravity; - if (this.options.backgroundColor) { - console.warn('DEPRECATION NOTICE: "backgroundColor" is being deprecated. Please use the "style.background" property.'); - } - for (var property in this.options.style) { - divElement.style[property] = this.options.style[property]; - } - if (this.options.node && this.options.node.nodeType === Node.ELEMENT_NODE) { - divElement.appendChild(this.options.node); - } else { - if (this.options.escapeMarkup) { - divElement.innerText = this.options.text; - } else { - divElement.innerHTML = this.options.text; - } - if (this.options.avatar !== "") { - var avatarElement = document.createElement("img"); - avatarElement.src = this.options.avatar; - avatarElement.className = "toastify-avatar"; - if (this.options.position == "left" || this.options.positionLeft === true) { - divElement.appendChild(avatarElement); - } else { - divElement.insertAdjacentElement("afterbegin", avatarElement); - } - } - } - if (this.options.close === true) { - var closeElement = document.createElement("span"); - closeElement.innerHTML = "✖"; - closeElement.className = "toast-close"; - closeElement.addEventListener( - "click", - function(event) { - event.stopPropagation(); - this.removeElement(this.toastElement); - window.clearTimeout(this.toastElement.timeOutValue); - }.bind(this) - ); - var width = window.innerWidth > 0 ? window.innerWidth : screen.width; - if ((this.options.position == "left" || this.options.positionLeft === true) && width > 360) { - divElement.insertAdjacentElement("afterbegin", closeElement); - } else { - divElement.appendChild(closeElement); - } - } - if (this.options.stopOnFocus && this.options.duration > 0) { - var self2 = this; - divElement.addEventListener( - "mouseover", - function(event) { - window.clearTimeout(divElement.timeOutValue); - } - ); - divElement.addEventListener( - "mouseleave", - function() { - divElement.timeOutValue = window.setTimeout( - function() { - self2.removeElement(divElement); - }, - self2.options.duration - ); - } - ); - } - if (typeof this.options.destination !== "undefined") { - divElement.addEventListener( - "click", - function(event) { - event.stopPropagation(); - if (this.options.newWindow === true) { - window.open(this.options.destination, "_blank"); - } else { - window.location = this.options.destination; - } - }.bind(this) - ); - } - if (typeof this.options.onClick === "function" && typeof this.options.destination === "undefined") { - divElement.addEventListener( - "click", - function(event) { - event.stopPropagation(); - this.options.onClick(); - }.bind(this) - ); - } - if (typeof this.options.offset === "object") { - var x = getAxisOffsetAValue("x", this.options); - var y = getAxisOffsetAValue("y", this.options); - var xOffset = this.options.position == "left" ? x : "-" + x; - var yOffset = this.options.gravity == "toastify-top" ? y : "-" + y; - divElement.style.transform = "translate(" + xOffset + "," + yOffset + ")"; - } - return divElement; - }, - // Displaying the toast - showToast: function() { - this.toastElement = this.buildToast(); - var rootElement; - if (typeof this.options.selector === "string") { - rootElement = document.getElementById(this.options.selector); - } else if (this.options.selector instanceof HTMLElement || typeof ShadowRoot !== "undefined" && this.options.selector instanceof ShadowRoot) { - rootElement = this.options.selector; - } else { - rootElement = document.body; - } - if (!rootElement) { - throw "Root element is not defined"; - } - var elementToInsert = Toastify2.defaults.oldestFirst ? rootElement.firstChild : rootElement.lastChild; - rootElement.insertBefore(this.toastElement, elementToInsert); - Toastify2.reposition(); - if (this.options.duration > 0) { - this.toastElement.timeOutValue = window.setTimeout( - function() { - this.removeElement(this.toastElement); - }.bind(this), - this.options.duration - ); - } - return this; - }, - hideToast: function() { - if (this.toastElement.timeOutValue) { - clearTimeout(this.toastElement.timeOutValue); - } - this.removeElement(this.toastElement); - }, - // Removing the element from the DOM - removeElement: function(toastElement) { - toastElement.className = toastElement.className.replace(" on", ""); - window.setTimeout( - function() { - if (this.options.node && this.options.node.parentNode) { - this.options.node.parentNode.removeChild(this.options.node); - } - if (toastElement.parentNode) { - toastElement.parentNode.removeChild(toastElement); - } - this.options.callback.call(toastElement); - Toastify2.reposition(); - }.bind(this), - 400 - ); - } - }; - Toastify2.reposition = function() { - var topLeftOffsetSize = { - top: 15, - bottom: 15 - }; - var topRightOffsetSize = { - top: 15, - bottom: 15 - }; - var offsetSize = { - top: 15, - bottom: 15 - }; - var allToasts = document.getElementsByClassName("toastify"); - var classUsed; - for (var i = 0; i < allToasts.length; i++) { - if (containsClass(allToasts[i], "toastify-top") === true) { - classUsed = "toastify-top"; - } else { - classUsed = "toastify-bottom"; - } - var height = allToasts[i].offsetHeight; - classUsed = classUsed.substr(9, classUsed.length - 1); - var offset = 15; - var width = window.innerWidth > 0 ? window.innerWidth : screen.width; - if (width <= 360) { - allToasts[i].style[classUsed] = offsetSize[classUsed] + "px"; - offsetSize[classUsed] += height + offset; - } else { - if (containsClass(allToasts[i], "toastify-left") === true) { - allToasts[i].style[classUsed] = topLeftOffsetSize[classUsed] + "px"; - topLeftOffsetSize[classUsed] += height + offset; - } else { - allToasts[i].style[classUsed] = topRightOffsetSize[classUsed] + "px"; - topRightOffsetSize[classUsed] += height + offset; - } - } - } - return this; - }; - function getAxisOffsetAValue(axis, options) { - if (options.offset[axis]) { - if (isNaN(options.offset[axis])) { - return options.offset[axis]; - } else { - return options.offset[axis] + "px"; - } - } - return "0px"; - } - function containsClass(elem, yourClass) { - if (!elem || typeof yourClass !== "string") { - return false; - } else if (elem.className && elem.className.trim().split(/\s+/gi).indexOf(yourClass) > -1) { - return true; - } else { - return false; - } - } - Toastify2.lib.init.prototype = Toastify2.lib; - return Toastify2; - }); - } - }); - // node_modules/topbar/topbar.min.js var require_topbar_min = __commonJS({ "node_modules/topbar/topbar.min.js"(exports, module) { @@ -9236,8 +8936,24 @@ removing illegal node: "${(childNode.outerHTML || childNode.nodeValue).trim()}" // js/app.js var import_clipboard = __toESM(require_clipboard()); - var import_toastify_js = __toESM(require_toastify()); var import_topbar = __toESM(require_topbar_min()); + + // node_modules/phoenix-colocated/live_admin/LiveAdmin.Components.AlertBar/20_6fjnua5crhwniinis3b4qltd44.js + var fjnua5crhwniinis3b4qltd44_default = { + mounted() { + setTimeout(() => { + if (this.el.dataset["type"] !== "error") { + this.pushEvent("dismiss", { index: parseInt(this.el.dataset["index"]) }); + } + }, 3e3); + } + }; + + // node_modules/phoenix-colocated/live_admin/index.js + var imp_nbxw623t = {}; + imp_nbxw623t["LiveAdmin.Components.AlertBar.AlertItem"] = fjnua5crhwniinis3b4qltd44_default; + + // js/app.js import_topbar.default.config({ barColors: { 0: "rgb(67, 56, 202)" }, shadowColor: "rgba(0, 0, 0, .3)", @@ -9245,161 +8961,130 @@ removing illegal node: "${(childNode.outerHTML || childNode.nodeValue).trim()}" }); window.addEventListener("phx:page-loading-start", (info) => import_topbar.default.show()); window.addEventListener("phx:page-loading-stop", () => import_topbar.default.hide()); - window.addEventListener("phx:success", (e) => { - (0, import_toastify_js.default)({ - text: e.detail.msg, - className: "toast__container--success" - }).showToast(); - }); - window.addEventListener("phx:error", (e) => { - (0, import_toastify_js.default)({ - text: e.detail.msg, - className: "toast__container--error" - }).showToast(); - }); var Hooks2 = {}; - Hooks2.EmbedComponent = { + Hooks2.ArrayInput = { mounted() { - this.el.addEventListener("live_admin:move_embed", (e) => { - const embedEl = e.target.parentElement; - const indexEl = embedEl.querySelector(".embed__index"); - const fieldEl = embedEl.parentElement; - const newIndex = +indexEl.value + +e.target.dataset.dir; - indexEl.value = newIndex; - const targetEl = fieldEl.querySelectorAll(".embed__index")[newIndex]; - targetEl.value = +targetEl.value + +e.target.dataset.dir * -1; - indexEl.dispatchEvent( - new Event("input", { bubbles: true, cancelable: true }) - ); - }); - this.el.addEventListener("live_admin:embed_add", (e) => { - const sortInput = e.target.previousElementSibling; - sortInput.checked = true; - sortInput.dispatchEvent( - new Event("input", { bubbles: true, cancelable: true }) - ); - }); - this.el.addEventListener("live_admin:embed_drop", (e) => { - e.target.parentElement.classList.add("hidden"); - const deleteInput = e.target.previousElementSibling; - deleteInput.checked = true; - deleteInput.dispatchEvent( - new Event("input", { bubbles: true, cancelable: true }) - ); - }); - this.el.addEventListener("live_admin:embed_delete", (e) => { - e.target.parentElement.classList.add("hidden"); - const deleteInput = e.target.closest(".embed__group").querySelector('input[value=""]'); - deleteInput.disabled = false; - deleteInput.dispatchEvent( - new Event("input", { bubbles: true, cancelable: true }) - ); + this.el.querySelector("input").addEventListener("input", (e) => e.stopPropagation()); + this.el.addEventListener("keydown", (e) => { + if (e.key === "Enter") { + e.target.blur(); + e.preventDefault(); + } }); + }, + updated() { + this.el.querySelector("input").addEventListener("input", (e) => e.stopPropagation()); } }; - Hooks2.SearchSelect = { + Hooks2.Show = { + setTab(el) { + const urlHash = window.location.hash || "#main"; + for (tabLink of el.querySelectorAll(".tabs a")) { + const target = tabLink.getAttribute("href"); + if (target === urlHash) { + tabLink.classList.add("active"); + } else if (tabLink.getAttribute("href") !== "#main" && el.querySelector(target).querySelector(urlHash) || el.querySelector(target).parentNode === el.querySelector(urlHash).parentElement && !tabLink.parentNode.querySelector(`:scope > a[href="${urlHash}"]`)) { + tabLink.classList.add("active"); + } else { + tabLink.classList.remove("active"); + } + ; + } + ; + const currentTabContent = el.querySelector(urlHash); + for (const fieldSet of el.querySelectorAll(".card-section")) { + if (fieldSet.parentNode === currentTabContent) { + fieldSet.style.removeProperty("display"); + } else { + fieldSet.style.setProperty("display", "none"); + } + } + ; + for (const tabContent of currentTabContent.parentNode.querySelectorAll(".detail-view")) { + if (tabContent === currentTabContent) { + tabContent.style.removeProperty("display"); + } else { + tabContent.style.setProperty("display", "none"); + } + } + ; + }, mounted() { - this.handleEvent("change", () => { - this.el.querySelector("input").dispatchEvent(new Event("input", { bubbles: true, cancelable: true })); - }); + this.setTab(this.el); + window.addEventListener("hashchange", () => this.setTab(this.el)); } }; - Hooks2.ArrayInput = { + Hooks2.Form = { mounted() { - this.handleEvent("change", () => { - this.el.querySelector("input").dispatchEvent(new Event("input", { bubbles: true, cancelable: true })); + this.el.addEventListener("dragstart", (e) => { + e.target.classList.add("dragging"); + for (const btn of this.el.querySelectorAll(".add-section-btn")) { + btn.style.setProperty("display", "none"); + } + ; + for (const zone of this.el.querySelectorAll(`.drop-zone:not([data-idx="${e.target.dataset.idx}"]):not([data-idx="${+e.target.dataset.idx + 1}"])`)) { + zone.style.setProperty("display", "flex"); + } + ; + e.dataTransfer.setData("text/plain", e.target.dataset.idx); + }); + this.el.addEventListener("dragend", (e) => { + e.target.classList.remove("dragging"); + for (const btn of this.el.querySelectorAll(".add-section-btn")) { + btn.style.removeProperty("display"); + } + ; + for (const zone of this.el.querySelectorAll(".drop-zone")) { + zone.style.removeProperty("display"); + } + ; + }); + this.el.addEventListener("dragover", (e) => { + if (e.target.classList.contains("drop-zone")) { + e.target.style.setProperty("opacity", 1); + e.preventDefault(); + } + }); + this.el.addEventListener("dragleave", (e) => { + if (e.target.classList.contains("drop-zone")) { + e.target.style.removeProperty("opacity"); + e.preventDefault(); + } + }); + this.el.addEventListener("drop", (e) => { + if (e.target.classList.contains("drop-zone")) { + e.preventDefault(); + const embed = e.target.parentNode.querySelector(`.embed-section[data-idx="${e.dataTransfer.getData("text/plain")}"]`); + e.target.after(embed); + this.el.querySelector("input").dispatchEvent(new Event("change", { bubbles: true, cancelable: true })); + } + ; }); } }; - Hooks2.MapInput = { + Hooks2.SearchSelect = { mounted() { this.handleEvent("change", () => { this.el.querySelector("input").dispatchEvent(new Event("input", { bubbles: true, cancelable: true })); }); } }; - Hooks2.ViewPage = { + Hooks2.CopyField = { mounted() { - this.el.addEventListener("live_admin:action", (e) => { - if (e.target.tagName === "FORM") { - const params = [...new FormData(e.target)].reduce( - (params2, [key, val]) => { - if (key === "args[]") { - return __spreadProps(__spreadValues({}, params2), { args: [...params2.args, val] }); - } else { - return __spreadProps(__spreadValues({}, params2), { [key]: val }); - } - }, - { args: [] } - ); - e.target.reset(); - this.pushEventTo(this.el, "action", params); - } else { - this.pushEventTo(this.el, "action", { name: e.target.dataset.action }); - } - }); + new import_clipboard.default(this.el.querySelectorAll("[data-clipboard-target]")); } }; Hooks2.IndexPage = { mounted() { this.selected = []; - this.el.addEventListener("live_admin:action", (e) => { - if (e.target.tagName === "FORM") { - const params = [...new FormData(e.target)].reduce( - (params2, [key, val]) => { - if (key === "args[]") { - return __spreadProps(__spreadValues({}, params2), { args: [...params2.args, val] }); - } else { - return __spreadProps(__spreadValues({}, params2), { [key]: val }); - } - }, - { args: [] } - ); - this.pushEventTo(this.el, "action", __spreadProps(__spreadValues({}, params), { ids: this.selected })); - } else { - this.pushEventTo(this.el, "action", { - name: e.target.dataset.action, - ids: this.selected - }); - } - }); - this.el.addEventListener("live_admin:toggle_select", (e) => { - if (e.target.id === "select-all") { - this.el.querySelectorAll(".resource__select").forEach((box) => box.checked = e.target.checked); - } else { - this.el.querySelector("#select-all").checked = false; - } - this.selected = Array.from( - this.el.querySelectorAll("input[data-record-key]:checked"), - (e2) => e2.dataset.recordKey - ); - if (this.selected.length > 0) { - document.getElementById("footer-select").style.removeProperty("display"); - document.getElementById("footer-nav").style.display = "none"; - } else { - document.getElementById("footer-nav").style.removeProperty("display"); - document.getElementById("footer-select").style.display = "none"; - } - }); }, updated() { this.selected = []; - var clipboard = new import_clipboard.default(this.el.querySelectorAll(".cell__copy"), { - target: function(trigger) { - return trigger.closest(".resource__cell").firstElementChild; - } - }); - clipboard.on("success", function(e) { - (0, import_toastify_js.default)({ - text: e.trigger.dataset.message, - className: "toast__container" - }).showToast(); - }); } }; var csrfToken = document.querySelector("meta[name='csrf-token']").getAttribute("content"); var liveSocket = new LiveSocket2("/live", Socket, { - hooks: Hooks2, + hooks: __spreadValues(__spreadValues({}, Hooks2), imp_nbxw623t), params: { _csrf_token: csrfToken } }); liveSocket.connect(); @@ -9419,15 +9104,6 @@ clipboard/dist/clipboard.js: * Licensed MIT © Zeno Rocha *) -toastify-js/src/toastify.js: - (*! - * Toastify js 1.11.2 - * https://github.com/apvarun/toastify-js - * @license MIT licensed - * - * Copyright (C) 2018 Varun A P - *) - topbar/topbar.min.js: (** * @license MIT @@ -9436,4 +9112,4 @@ topbar/topbar.min.js: * Copyright (c) 2021 Buu Nguyen *) */ -//# sourceMappingURL=data:application/json;base64,ewogICJ2ZXJzaW9uIjogMywKICAic291cmNlcyI6IFsiLi4vLi4vYXNzZXRzL25vZGVfbW9kdWxlcy9jbGlwYm9hcmQvZGlzdC9jbGlwYm9hcmQuanMiLCAiLi4vLi4vYXNzZXRzL25vZGVfbW9kdWxlcy90b2FzdGlmeS1qcy9zcmMvdG9hc3RpZnkuanMiLCAiLi4vLi4vYXNzZXRzL25vZGVfbW9kdWxlcy90b3BiYXIvdG9wYmFyLm1pbi5qcyIsICIuLi8uLi9kZXBzL3Bob2VuaXhfaHRtbC9wcml2L3N0YXRpYy9waG9lbml4X2h0bWwuanMiLCAiLi4vLi4vZGVwcy9waG9lbml4L2Fzc2V0cy9qcy9waG9lbml4L3V0aWxzLmpzIiwgIi4uLy4uL2RlcHMvcGhvZW5peC9hc3NldHMvanMvcGhvZW5peC9jb25zdGFudHMuanMiLCAiLi4vLi4vZGVwcy9waG9lbml4L2Fzc2V0cy9qcy9waG9lbml4L3B1c2guanMiLCAiLi4vLi4vZGVwcy9waG9lbml4L2Fzc2V0cy9qcy9waG9lbml4L3RpbWVyLmpzIiwgIi4uLy4uL2RlcHMvcGhvZW5peC9hc3NldHMvanMvcGhvZW5peC9jaGFubmVsLmpzIiwgIi4uLy4uL2RlcHMvcGhvZW5peC9hc3NldHMvanMvcGhvZW5peC9hamF4LmpzIiwgIi4uLy4uL2RlcHMvcGhvZW5peC9hc3NldHMvanMvcGhvZW5peC9sb25ncG9sbC5qcyIsICIuLi8uLi9kZXBzL3Bob2VuaXgvYXNzZXRzL2pzL3Bob2VuaXgvcHJlc2VuY2UuanMiLCAiLi4vLi4vZGVwcy9waG9lbml4L2Fzc2V0cy9qcy9waG9lbml4L3NlcmlhbGl6ZXIuanMiLCAiLi4vLi4vZGVwcy9waG9lbml4L2Fzc2V0cy9qcy9waG9lbml4L3NvY2tldC5qcyIsICIuLi8uLi9kZXBzL3Bob2VuaXhfbGl2ZV92aWV3L2Fzc2V0cy9qcy9waG9lbml4X2xpdmVfdmlldy9jb25zdGFudHMuanMiLCAiLi4vLi4vZGVwcy9waG9lbml4X2xpdmVfdmlldy9hc3NldHMvanMvcGhvZW5peF9saXZlX3ZpZXcvZW50cnlfdXBsb2FkZXIuanMiLCAiLi4vLi4vZGVwcy9waG9lbml4X2xpdmVfdmlldy9hc3NldHMvanMvcGhvZW5peF9saXZlX3ZpZXcvdXRpbHMuanMiLCAiLi4vLi4vZGVwcy9waG9lbml4X2xpdmVfdmlldy9hc3NldHMvanMvcGhvZW5peF9saXZlX3ZpZXcvYnJvd3Nlci5qcyIsICIuLi8uLi9kZXBzL3Bob2VuaXhfbGl2ZV92aWV3L2Fzc2V0cy9qcy9waG9lbml4X2xpdmVfdmlldy9kb20uanMiLCAiLi4vLi4vZGVwcy9waG9lbml4X2xpdmVfdmlldy9hc3NldHMvanMvcGhvZW5peF9saXZlX3ZpZXcvdXBsb2FkX2VudHJ5LmpzIiwgIi4uLy4uL2RlcHMvcGhvZW5peF9saXZlX3ZpZXcvYXNzZXRzL2pzL3Bob2VuaXhfbGl2ZV92aWV3L2xpdmVfdXBsb2FkZXIuanMiLCAiLi4vLi4vZGVwcy9waG9lbml4X2xpdmVfdmlldy9hc3NldHMvanMvcGhvZW5peF9saXZlX3ZpZXcvYXJpYS5qcyIsICIuLi8uLi9kZXBzL3Bob2VuaXhfbGl2ZV92aWV3L2Fzc2V0cy9qcy9waG9lbml4X2xpdmVfdmlldy9ob29rcy5qcyIsICIuLi8uLi9kZXBzL3Bob2VuaXhfbGl2ZV92aWV3L2Fzc2V0cy9qcy9waG9lbml4X2xpdmVfdmlldy9lbGVtZW50X3JlZi5qcyIsICIuLi8uLi9kZXBzL3Bob2VuaXhfbGl2ZV92aWV3L2Fzc2V0cy9qcy9waG9lbml4X2xpdmVfdmlldy9kb21fcG9zdF9tb3JwaF9yZXN0b3Jlci5qcyIsICIuLi8uLi9kZXBzL3Bob2VuaXhfbGl2ZV92aWV3L25vZGVfbW9kdWxlcy9tb3JwaGRvbS9kaXN0L21vcnBoZG9tLWVzbS5qcyIsICIuLi8uLi9kZXBzL3Bob2VuaXhfbGl2ZV92aWV3L2Fzc2V0cy9qcy9waG9lbml4X2xpdmVfdmlldy9kb21fcGF0Y2guanMiLCAiLi4vLi4vZGVwcy9waG9lbml4X2xpdmVfdmlldy9hc3NldHMvanMvcGhvZW5peF9saXZlX3ZpZXcvcmVuZGVyZWQuanMiLCAiLi4vLi4vZGVwcy9waG9lbml4X2xpdmVfdmlldy9hc3NldHMvanMvcGhvZW5peF9saXZlX3ZpZXcvanMuanMiLCAiLi4vLi4vZGVwcy9waG9lbml4X2xpdmVfdmlldy9hc3NldHMvanMvcGhvZW5peF9saXZlX3ZpZXcvanNfY29tbWFuZHMudHMiLCAiLi4vLi4vZGVwcy9waG9lbml4X2xpdmVfdmlldy9hc3NldHMvanMvcGhvZW5peF9saXZlX3ZpZXcvdmlld19ob29rLnRzIiwgIi4uLy4uL2RlcHMvcGhvZW5peF9saXZlX3ZpZXcvYXNzZXRzL2pzL3Bob2VuaXhfbGl2ZV92aWV3L3ZpZXcuanMiLCAiLi4vLi4vZGVwcy9waG9lbml4X2xpdmVfdmlldy9hc3NldHMvanMvcGhvZW5peF9saXZlX3ZpZXcvbGl2ZV9zb2NrZXQuanMiLCAiLi4vLi4vZGVwcy9waG9lbml4X2xpdmVfdmlldy9hc3NldHMvanMvcGhvZW5peF9saXZlX3ZpZXcvaW5kZXgudHMiLCAiLi4vLi4vYXNzZXRzL2pzL2FwcC5qcyJdLAogICJzb3VyY2VzQ29udGVudCI6IFsiLyohXG4gKiBjbGlwYm9hcmQuanMgdjIuMC4xMFxuICogaHR0cHM6Ly9jbGlwYm9hcmRqcy5jb20vXG4gKlxuICogTGljZW5zZWQgTUlUIFx1MDBBOSBaZW5vIFJvY2hhXG4gKi9cbihmdW5jdGlvbiB3ZWJwYWNrVW5pdmVyc2FsTW9kdWxlRGVmaW5pdGlvbihyb290LCBmYWN0b3J5KSB7XG5cdGlmKHR5cGVvZiBleHBvcnRzID09PSAnb2JqZWN0JyAmJiB0eXBlb2YgbW9kdWxlID09PSAnb2JqZWN0Jylcblx0XHRtb2R1bGUuZXhwb3J0cyA9IGZhY3RvcnkoKTtcblx0ZWxzZSBpZih0eXBlb2YgZGVmaW5lID09PSAnZnVuY3Rpb24nICYmIGRlZmluZS5hbWQpXG5cdFx0ZGVmaW5lKFtdLCBmYWN0b3J5KTtcblx0ZWxzZSBpZih0eXBlb2YgZXhwb3J0cyA9PT0gJ29iamVjdCcpXG5cdFx0ZXhwb3J0c1tcIkNsaXBib2FyZEpTXCJdID0gZmFjdG9yeSgpO1xuXHRlbHNlXG5cdFx0cm9vdFtcIkNsaXBib2FyZEpTXCJdID0gZmFjdG9yeSgpO1xufSkodGhpcywgZnVuY3Rpb24oKSB7XG5yZXR1cm4gLyoqKioqKi8gKGZ1bmN0aW9uKCkgeyAvLyB3ZWJwYWNrQm9vdHN0cmFwXG4vKioqKioqLyBcdHZhciBfX3dlYnBhY2tfbW9kdWxlc19fID0gKHtcblxuLyoqKi8gNjg2OlxuLyoqKi8gKGZ1bmN0aW9uKF9fdW51c2VkX3dlYnBhY2tfbW9kdWxlLCBfX3dlYnBhY2tfZXhwb3J0c19fLCBfX3dlYnBhY2tfcmVxdWlyZV9fKSB7XG5cblwidXNlIHN0cmljdFwiO1xuXG4vLyBFWFBPUlRTXG5fX3dlYnBhY2tfcmVxdWlyZV9fLmQoX193ZWJwYWNrX2V4cG9ydHNfXywge1xuICBcImRlZmF1bHRcIjogZnVuY3Rpb24oKSB7IHJldHVybiAvKiBiaW5kaW5nICovIGNsaXBib2FyZDsgfVxufSk7XG5cbi8vIEVYVEVSTkFMIE1PRFVMRTogLi9ub2RlX21vZHVsZXMvdGlueS1lbWl0dGVyL2luZGV4LmpzXG52YXIgdGlueV9lbWl0dGVyID0gX193ZWJwYWNrX3JlcXVpcmVfXygyNzkpO1xudmFyIHRpbnlfZW1pdHRlcl9kZWZhdWx0ID0gLyojX19QVVJFX18qL19fd2VicGFja19yZXF1aXJlX18ubih0aW55X2VtaXR0ZXIpO1xuLy8gRVhURVJOQUwgTU9EVUxFOiAuL25vZGVfbW9kdWxlcy9nb29kLWxpc3RlbmVyL3NyYy9saXN0ZW4uanNcbnZhciBsaXN0ZW4gPSBfX3dlYnBhY2tfcmVxdWlyZV9fKDM3MCk7XG52YXIgbGlzdGVuX2RlZmF1bHQgPSAvKiNfX1BVUkVfXyovX193ZWJwYWNrX3JlcXVpcmVfXy5uKGxpc3Rlbik7XG4vLyBFWFRFUk5BTCBNT0RVTEU6IC4vbm9kZV9tb2R1bGVzL3NlbGVjdC9zcmMvc2VsZWN0LmpzXG52YXIgc3JjX3NlbGVjdCA9IF9fd2VicGFja19yZXF1aXJlX18oODE3KTtcbnZhciBzZWxlY3RfZGVmYXVsdCA9IC8qI19fUFVSRV9fKi9fX3dlYnBhY2tfcmVxdWlyZV9fLm4oc3JjX3NlbGVjdCk7XG47Ly8gQ09OQ0FURU5BVEVEIE1PRFVMRTogLi9zcmMvY29tbW9uL2NvbW1hbmQuanNcbi8qKlxuICogRXhlY3V0ZXMgYSBnaXZlbiBvcGVyYXRpb24gdHlwZS5cbiAqIEBwYXJhbSB7U3RyaW5nfSB0eXBlXG4gKiBAcmV0dXJuIHtCb29sZWFufVxuICovXG5mdW5jdGlvbiBjb21tYW5kKHR5cGUpIHtcbiAgdHJ5IHtcbiAgICByZXR1cm4gZG9jdW1lbnQuZXhlY0NvbW1hbmQodHlwZSk7XG4gIH0gY2F0Y2ggKGVycikge1xuICAgIHJldHVybiBmYWxzZTtcbiAgfVxufVxuOy8vIENPTkNBVEVOQVRFRCBNT0RVTEU6IC4vc3JjL2FjdGlvbnMvY3V0LmpzXG5cblxuLyoqXG4gKiBDdXQgYWN0aW9uIHdyYXBwZXIuXG4gKiBAcGFyYW0ge1N0cmluZ3xIVE1MRWxlbWVudH0gdGFyZ2V0XG4gKiBAcmV0dXJuIHtTdHJpbmd9XG4gKi9cblxudmFyIENsaXBib2FyZEFjdGlvbkN1dCA9IGZ1bmN0aW9uIENsaXBib2FyZEFjdGlvbkN1dCh0YXJnZXQpIHtcbiAgdmFyIHNlbGVjdGVkVGV4dCA9IHNlbGVjdF9kZWZhdWx0KCkodGFyZ2V0KTtcbiAgY29tbWFuZCgnY3V0Jyk7XG4gIHJldHVybiBzZWxlY3RlZFRleHQ7XG59O1xuXG4vKiBoYXJtb255IGRlZmF1bHQgZXhwb3J0ICovIHZhciBhY3Rpb25zX2N1dCA9IChDbGlwYm9hcmRBY3Rpb25DdXQpO1xuOy8vIENPTkNBVEVOQVRFRCBNT0RVTEU6IC4vc3JjL2NvbW1vbi9jcmVhdGUtZmFrZS1lbGVtZW50LmpzXG4vKipcbiAqIENyZWF0ZXMgYSBmYWtlIHRleHRhcmVhIGVsZW1lbnQgd2l0aCBhIHZhbHVlLlxuICogQHBhcmFtIHtTdHJpbmd9IHZhbHVlXG4gKiBAcmV0dXJuIHtIVE1MRWxlbWVudH1cbiAqL1xuZnVuY3Rpb24gY3JlYXRlRmFrZUVsZW1lbnQodmFsdWUpIHtcbiAgdmFyIGlzUlRMID0gZG9jdW1lbnQuZG9jdW1lbnRFbGVtZW50LmdldEF0dHJpYnV0ZSgnZGlyJykgPT09ICdydGwnO1xuICB2YXIgZmFrZUVsZW1lbnQgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCd0ZXh0YXJlYScpOyAvLyBQcmV2ZW50IHpvb21pbmcgb24gaU9TXG5cbiAgZmFrZUVsZW1lbnQuc3R5bGUuZm9udFNpemUgPSAnMTJwdCc7IC8vIFJlc2V0IGJveCBtb2RlbFxuXG4gIGZha2VFbGVtZW50LnN0eWxlLmJvcmRlciA9ICcwJztcbiAgZmFrZUVsZW1lbnQuc3R5bGUucGFkZGluZyA9ICcwJztcbiAgZmFrZUVsZW1lbnQuc3R5bGUubWFyZ2luID0gJzAnOyAvLyBNb3ZlIGVsZW1lbnQgb3V0IG9mIHNjcmVlbiBob3Jpem9udGFsbHlcblxuICBmYWtlRWxlbWVudC5zdHlsZS5wb3NpdGlvbiA9ICdhYnNvbHV0ZSc7XG4gIGZha2VFbGVtZW50LnN0eWxlW2lzUlRMID8gJ3JpZ2h0JyA6ICdsZWZ0J10gPSAnLTk5OTlweCc7IC8vIE1vdmUgZWxlbWVudCB0byB0aGUgc2FtZSBwb3NpdGlvbiB2ZXJ0aWNhbGx5XG5cbiAgdmFyIHlQb3NpdGlvbiA9IHdpbmRvdy5wYWdlWU9mZnNldCB8fCBkb2N1bWVudC5kb2N1bWVudEVsZW1lbnQuc2Nyb2xsVG9wO1xuICBmYWtlRWxlbWVudC5zdHlsZS50b3AgPSBcIlwiLmNvbmNhdCh5UG9zaXRpb24sIFwicHhcIik7XG4gIGZha2VFbGVtZW50LnNldEF0dHJpYnV0ZSgncmVhZG9ubHknLCAnJyk7XG4gIGZha2VFbGVtZW50LnZhbHVlID0gdmFsdWU7XG4gIHJldHVybiBmYWtlRWxlbWVudDtcbn1cbjsvLyBDT05DQVRFTkFURUQgTU9EVUxFOiAuL3NyYy9hY3Rpb25zL2NvcHkuanNcblxuXG5cbi8qKlxuICogQ29weSBhY3Rpb24gd3JhcHBlci5cbiAqIEBwYXJhbSB7U3RyaW5nfEhUTUxFbGVtZW50fSB0YXJnZXRcbiAqIEBwYXJhbSB7T2JqZWN0fSBvcHRpb25zXG4gKiBAcmV0dXJuIHtTdHJpbmd9XG4gKi9cblxudmFyIENsaXBib2FyZEFjdGlvbkNvcHkgPSBmdW5jdGlvbiBDbGlwYm9hcmRBY3Rpb25Db3B5KHRhcmdldCkge1xuICB2YXIgb3B0aW9ucyA9IGFyZ3VtZW50cy5sZW5ndGggPiAxICYmIGFyZ3VtZW50c1sxXSAhPT0gdW5kZWZpbmVkID8gYXJndW1lbnRzWzFdIDoge1xuICAgIGNvbnRhaW5lcjogZG9jdW1lbnQuYm9keVxuICB9O1xuICB2YXIgc2VsZWN0ZWRUZXh0ID0gJyc7XG5cbiAgaWYgKHR5cGVvZiB0YXJnZXQgPT09ICdzdHJpbmcnKSB7XG4gICAgdmFyIGZha2VFbGVtZW50ID0gY3JlYXRlRmFrZUVsZW1lbnQodGFyZ2V0KTtcbiAgICBvcHRpb25zLmNvbnRhaW5lci5hcHBlbmRDaGlsZChmYWtlRWxlbWVudCk7XG4gICAgc2VsZWN0ZWRUZXh0ID0gc2VsZWN0X2RlZmF1bHQoKShmYWtlRWxlbWVudCk7XG4gICAgY29tbWFuZCgnY29weScpO1xuICAgIGZha2VFbGVtZW50LnJlbW92ZSgpO1xuICB9IGVsc2Uge1xuICAgIHNlbGVjdGVkVGV4dCA9IHNlbGVjdF9kZWZhdWx0KCkodGFyZ2V0KTtcbiAgICBjb21tYW5kKCdjb3B5Jyk7XG4gIH1cblxuICByZXR1cm4gc2VsZWN0ZWRUZXh0O1xufTtcblxuLyogaGFybW9ueSBkZWZhdWx0IGV4cG9ydCAqLyB2YXIgYWN0aW9uc19jb3B5ID0gKENsaXBib2FyZEFjdGlvbkNvcHkpO1xuOy8vIENPTkNBVEVOQVRFRCBNT0RVTEU6IC4vc3JjL2FjdGlvbnMvZGVmYXVsdC5qc1xuZnVuY3Rpb24gX3R5cGVvZihvYmopIHsgXCJAYmFiZWwvaGVscGVycyAtIHR5cGVvZlwiOyBpZiAodHlwZW9mIFN5bWJvbCA9PT0gXCJmdW5jdGlvblwiICYmIHR5cGVvZiBTeW1ib2wuaXRlcmF0b3IgPT09IFwic3ltYm9sXCIpIHsgX3R5cGVvZiA9IGZ1bmN0aW9uIF90eXBlb2Yob2JqKSB7IHJldHVybiB0eXBlb2Ygb2JqOyB9OyB9IGVsc2UgeyBfdHlwZW9mID0gZnVuY3Rpb24gX3R5cGVvZihvYmopIHsgcmV0dXJuIG9iaiAmJiB0eXBlb2YgU3ltYm9sID09PSBcImZ1bmN0aW9uXCIgJiYgb2JqLmNvbnN0cnVjdG9yID09PSBTeW1ib2wgJiYgb2JqICE9PSBTeW1ib2wucHJvdG90eXBlID8gXCJzeW1ib2xcIiA6IHR5cGVvZiBvYmo7IH07IH0gcmV0dXJuIF90eXBlb2Yob2JqKTsgfVxuXG5cblxuLyoqXG4gKiBJbm5lciBmdW5jdGlvbiB3aGljaCBwZXJmb3JtcyBzZWxlY3Rpb24gZnJvbSBlaXRoZXIgYHRleHRgIG9yIGB0YXJnZXRgXG4gKiBwcm9wZXJ0aWVzIGFuZCB0aGVuIGV4ZWN1dGVzIGNvcHkgb3IgY3V0IG9wZXJhdGlvbnMuXG4gKiBAcGFyYW0ge09iamVjdH0gb3B0aW9uc1xuICovXG5cbnZhciBDbGlwYm9hcmRBY3Rpb25EZWZhdWx0ID0gZnVuY3Rpb24gQ2xpcGJvYXJkQWN0aW9uRGVmYXVsdCgpIHtcbiAgdmFyIG9wdGlvbnMgPSBhcmd1bWVudHMubGVuZ3RoID4gMCAmJiBhcmd1bWVudHNbMF0gIT09IHVuZGVmaW5lZCA/IGFyZ3VtZW50c1swXSA6IHt9O1xuICAvLyBEZWZpbmVzIGJhc2UgcHJvcGVydGllcyBwYXNzZWQgZnJvbSBjb25zdHJ1Y3Rvci5cbiAgdmFyIF9vcHRpb25zJGFjdGlvbiA9IG9wdGlvbnMuYWN0aW9uLFxuICAgICAgYWN0aW9uID0gX29wdGlvbnMkYWN0aW9uID09PSB2b2lkIDAgPyAnY29weScgOiBfb3B0aW9ucyRhY3Rpb24sXG4gICAgICBjb250YWluZXIgPSBvcHRpb25zLmNvbnRhaW5lcixcbiAgICAgIHRhcmdldCA9IG9wdGlvbnMudGFyZ2V0LFxuICAgICAgdGV4dCA9IG9wdGlvbnMudGV4dDsgLy8gU2V0cyB0aGUgYGFjdGlvbmAgdG8gYmUgcGVyZm9ybWVkIHdoaWNoIGNhbiBiZSBlaXRoZXIgJ2NvcHknIG9yICdjdXQnLlxuXG4gIGlmIChhY3Rpb24gIT09ICdjb3B5JyAmJiBhY3Rpb24gIT09ICdjdXQnKSB7XG4gICAgdGhyb3cgbmV3IEVycm9yKCdJbnZhbGlkIFwiYWN0aW9uXCIgdmFsdWUsIHVzZSBlaXRoZXIgXCJjb3B5XCIgb3IgXCJjdXRcIicpO1xuICB9IC8vIFNldHMgdGhlIGB0YXJnZXRgIHByb3BlcnR5IHVzaW5nIGFuIGVsZW1lbnQgdGhhdCB3aWxsIGJlIGhhdmUgaXRzIGNvbnRlbnQgY29waWVkLlxuXG5cbiAgaWYgKHRhcmdldCAhPT0gdW5kZWZpbmVkKSB7XG4gICAgaWYgKHRhcmdldCAmJiBfdHlwZW9mKHRhcmdldCkgPT09ICdvYmplY3QnICYmIHRhcmdldC5ub2RlVHlwZSA9PT0gMSkge1xuICAgICAgaWYgKGFjdGlvbiA9PT0gJ2NvcHknICYmIHRhcmdldC5oYXNBdHRyaWJ1dGUoJ2Rpc2FibGVkJykpIHtcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKCdJbnZhbGlkIFwidGFyZ2V0XCIgYXR0cmlidXRlLiBQbGVhc2UgdXNlIFwicmVhZG9ubHlcIiBpbnN0ZWFkIG9mIFwiZGlzYWJsZWRcIiBhdHRyaWJ1dGUnKTtcbiAgICAgIH1cblxuICAgICAgaWYgKGFjdGlvbiA9PT0gJ2N1dCcgJiYgKHRhcmdldC5oYXNBdHRyaWJ1dGUoJ3JlYWRvbmx5JykgfHwgdGFyZ2V0Lmhhc0F0dHJpYnV0ZSgnZGlzYWJsZWQnKSkpIHtcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKCdJbnZhbGlkIFwidGFyZ2V0XCIgYXR0cmlidXRlLiBZb3UgY2FuXFwndCBjdXQgdGV4dCBmcm9tIGVsZW1lbnRzIHdpdGggXCJyZWFkb25seVwiIG9yIFwiZGlzYWJsZWRcIiBhdHRyaWJ1dGVzJyk7XG4gICAgICB9XG4gICAgfSBlbHNlIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcignSW52YWxpZCBcInRhcmdldFwiIHZhbHVlLCB1c2UgYSB2YWxpZCBFbGVtZW50Jyk7XG4gICAgfVxuICB9IC8vIERlZmluZSBzZWxlY3Rpb24gc3RyYXRlZ3kgYmFzZWQgb24gYHRleHRgIHByb3BlcnR5LlxuXG5cbiAgaWYgKHRleHQpIHtcbiAgICByZXR1cm4gYWN0aW9uc19jb3B5KHRleHQsIHtcbiAgICAgIGNvbnRhaW5lcjogY29udGFpbmVyXG4gICAgfSk7XG4gIH0gLy8gRGVmaW5lcyB3aGljaCBzZWxlY3Rpb24gc3RyYXRlZ3kgYmFzZWQgb24gYHRhcmdldGAgcHJvcGVydHkuXG5cblxuICBpZiAodGFyZ2V0KSB7XG4gICAgcmV0dXJuIGFjdGlvbiA9PT0gJ2N1dCcgPyBhY3Rpb25zX2N1dCh0YXJnZXQpIDogYWN0aW9uc19jb3B5KHRhcmdldCwge1xuICAgICAgY29udGFpbmVyOiBjb250YWluZXJcbiAgICB9KTtcbiAgfVxufTtcblxuLyogaGFybW9ueSBkZWZhdWx0IGV4cG9ydCAqLyB2YXIgYWN0aW9uc19kZWZhdWx0ID0gKENsaXBib2FyZEFjdGlvbkRlZmF1bHQpO1xuOy8vIENPTkNBVEVOQVRFRCBNT0RVTEU6IC4vc3JjL2NsaXBib2FyZC5qc1xuZnVuY3Rpb24gY2xpcGJvYXJkX3R5cGVvZihvYmopIHsgXCJAYmFiZWwvaGVscGVycyAtIHR5cGVvZlwiOyBpZiAodHlwZW9mIFN5bWJvbCA9PT0gXCJmdW5jdGlvblwiICYmIHR5cGVvZiBTeW1ib2wuaXRlcmF0b3IgPT09IFwic3ltYm9sXCIpIHsgY2xpcGJvYXJkX3R5cGVvZiA9IGZ1bmN0aW9uIF90eXBlb2Yob2JqKSB7IHJldHVybiB0eXBlb2Ygb2JqOyB9OyB9IGVsc2UgeyBjbGlwYm9hcmRfdHlwZW9mID0gZnVuY3Rpb24gX3R5cGVvZihvYmopIHsgcmV0dXJuIG9iaiAmJiB0eXBlb2YgU3ltYm9sID09PSBcImZ1bmN0aW9uXCIgJiYgb2JqLmNvbnN0cnVjdG9yID09PSBTeW1ib2wgJiYgb2JqICE9PSBTeW1ib2wucHJvdG90eXBlID8gXCJzeW1ib2xcIiA6IHR5cGVvZiBvYmo7IH07IH0gcmV0dXJuIGNsaXBib2FyZF90eXBlb2Yob2JqKTsgfVxuXG5mdW5jdGlvbiBfY2xhc3NDYWxsQ2hlY2soaW5zdGFuY2UsIENvbnN0cnVjdG9yKSB7IGlmICghKGluc3RhbmNlIGluc3RhbmNlb2YgQ29uc3RydWN0b3IpKSB7IHRocm93IG5ldyBUeXBlRXJyb3IoXCJDYW5ub3QgY2FsbCBhIGNsYXNzIGFzIGEgZnVuY3Rpb25cIik7IH0gfVxuXG5mdW5jdGlvbiBfZGVmaW5lUHJvcGVydGllcyh0YXJnZXQsIHByb3BzKSB7IGZvciAodmFyIGkgPSAwOyBpIDwgcHJvcHMubGVuZ3RoOyBpKyspIHsgdmFyIGRlc2NyaXB0b3IgPSBwcm9wc1tpXTsgZGVzY3JpcHRvci5lbnVtZXJhYmxlID0gZGVzY3JpcHRvci5lbnVtZXJhYmxlIHx8IGZhbHNlOyBkZXNjcmlwdG9yLmNvbmZpZ3VyYWJsZSA9IHRydWU7IGlmIChcInZhbHVlXCIgaW4gZGVzY3JpcHRvcikgZGVzY3JpcHRvci53cml0YWJsZSA9IHRydWU7IE9iamVjdC5kZWZpbmVQcm9wZXJ0eSh0YXJnZXQsIGRlc2NyaXB0b3Iua2V5LCBkZXNjcmlwdG9yKTsgfSB9XG5cbmZ1bmN0aW9uIF9jcmVhdGVDbGFzcyhDb25zdHJ1Y3RvciwgcHJvdG9Qcm9wcywgc3RhdGljUHJvcHMpIHsgaWYgKHByb3RvUHJvcHMpIF9kZWZpbmVQcm9wZXJ0aWVzKENvbnN0cnVjdG9yLnByb3RvdHlwZSwgcHJvdG9Qcm9wcyk7IGlmIChzdGF0aWNQcm9wcykgX2RlZmluZVByb3BlcnRpZXMoQ29uc3RydWN0b3IsIHN0YXRpY1Byb3BzKTsgcmV0dXJuIENvbnN0cnVjdG9yOyB9XG5cbmZ1bmN0aW9uIF9pbmhlcml0cyhzdWJDbGFzcywgc3VwZXJDbGFzcykgeyBpZiAodHlwZW9mIHN1cGVyQ2xhc3MgIT09IFwiZnVuY3Rpb25cIiAmJiBzdXBlckNsYXNzICE9PSBudWxsKSB7IHRocm93IG5ldyBUeXBlRXJyb3IoXCJTdXBlciBleHByZXNzaW9uIG11c3QgZWl0aGVyIGJlIG51bGwgb3IgYSBmdW5jdGlvblwiKTsgfSBzdWJDbGFzcy5wcm90b3R5cGUgPSBPYmplY3QuY3JlYXRlKHN1cGVyQ2xhc3MgJiYgc3VwZXJDbGFzcy5wcm90b3R5cGUsIHsgY29uc3RydWN0b3I6IHsgdmFsdWU6IHN1YkNsYXNzLCB3cml0YWJsZTogdHJ1ZSwgY29uZmlndXJhYmxlOiB0cnVlIH0gfSk7IGlmIChzdXBlckNsYXNzKSBfc2V0UHJvdG90eXBlT2Yoc3ViQ2xhc3MsIHN1cGVyQ2xhc3MpOyB9XG5cbmZ1bmN0aW9uIF9zZXRQcm90b3R5cGVPZihvLCBwKSB7IF9zZXRQcm90b3R5cGVPZiA9IE9iamVjdC5zZXRQcm90b3R5cGVPZiB8fCBmdW5jdGlvbiBfc2V0UHJvdG90eXBlT2YobywgcCkgeyBvLl9fcHJvdG9fXyA9IHA7IHJldHVybiBvOyB9OyByZXR1cm4gX3NldFByb3RvdHlwZU9mKG8sIHApOyB9XG5cbmZ1bmN0aW9uIF9jcmVhdGVTdXBlcihEZXJpdmVkKSB7IHZhciBoYXNOYXRpdmVSZWZsZWN0Q29uc3RydWN0ID0gX2lzTmF0aXZlUmVmbGVjdENvbnN0cnVjdCgpOyByZXR1cm4gZnVuY3Rpb24gX2NyZWF0ZVN1cGVySW50ZXJuYWwoKSB7IHZhciBTdXBlciA9IF9nZXRQcm90b3R5cGVPZihEZXJpdmVkKSwgcmVzdWx0OyBpZiAoaGFzTmF0aXZlUmVmbGVjdENvbnN0cnVjdCkgeyB2YXIgTmV3VGFyZ2V0ID0gX2dldFByb3RvdHlwZU9mKHRoaXMpLmNvbnN0cnVjdG9yOyByZXN1bHQgPSBSZWZsZWN0LmNvbnN0cnVjdChTdXBlciwgYXJndW1lbnRzLCBOZXdUYXJnZXQpOyB9IGVsc2UgeyByZXN1bHQgPSBTdXBlci5hcHBseSh0aGlzLCBhcmd1bWVudHMpOyB9IHJldHVybiBfcG9zc2libGVDb25zdHJ1Y3RvclJldHVybih0aGlzLCByZXN1bHQpOyB9OyB9XG5cbmZ1bmN0aW9uIF9wb3NzaWJsZUNvbnN0cnVjdG9yUmV0dXJuKHNlbGYsIGNhbGwpIHsgaWYgKGNhbGwgJiYgKGNsaXBib2FyZF90eXBlb2YoY2FsbCkgPT09IFwib2JqZWN0XCIgfHwgdHlwZW9mIGNhbGwgPT09IFwiZnVuY3Rpb25cIikpIHsgcmV0dXJuIGNhbGw7IH0gcmV0dXJuIF9hc3NlcnRUaGlzSW5pdGlhbGl6ZWQoc2VsZik7IH1cblxuZnVuY3Rpb24gX2Fzc2VydFRoaXNJbml0aWFsaXplZChzZWxmKSB7IGlmIChzZWxmID09PSB2b2lkIDApIHsgdGhyb3cgbmV3IFJlZmVyZW5jZUVycm9yKFwidGhpcyBoYXNuJ3QgYmVlbiBpbml0aWFsaXNlZCAtIHN1cGVyKCkgaGFzbid0IGJlZW4gY2FsbGVkXCIpOyB9IHJldHVybiBzZWxmOyB9XG5cbmZ1bmN0aW9uIF9pc05hdGl2ZVJlZmxlY3RDb25zdHJ1Y3QoKSB7IGlmICh0eXBlb2YgUmVmbGVjdCA9PT0gXCJ1bmRlZmluZWRcIiB8fCAhUmVmbGVjdC5jb25zdHJ1Y3QpIHJldHVybiBmYWxzZTsgaWYgKFJlZmxlY3QuY29uc3RydWN0LnNoYW0pIHJldHVybiBmYWxzZTsgaWYgKHR5cGVvZiBQcm94eSA9PT0gXCJmdW5jdGlvblwiKSByZXR1cm4gdHJ1ZTsgdHJ5IHsgRGF0ZS5wcm90b3R5cGUudG9TdHJpbmcuY2FsbChSZWZsZWN0LmNvbnN0cnVjdChEYXRlLCBbXSwgZnVuY3Rpb24gKCkge30pKTsgcmV0dXJuIHRydWU7IH0gY2F0Y2ggKGUpIHsgcmV0dXJuIGZhbHNlOyB9IH1cblxuZnVuY3Rpb24gX2dldFByb3RvdHlwZU9mKG8pIHsgX2dldFByb3RvdHlwZU9mID0gT2JqZWN0LnNldFByb3RvdHlwZU9mID8gT2JqZWN0LmdldFByb3RvdHlwZU9mIDogZnVuY3Rpb24gX2dldFByb3RvdHlwZU9mKG8pIHsgcmV0dXJuIG8uX19wcm90b19fIHx8IE9iamVjdC5nZXRQcm90b3R5cGVPZihvKTsgfTsgcmV0dXJuIF9nZXRQcm90b3R5cGVPZihvKTsgfVxuXG5cblxuXG5cblxuLyoqXG4gKiBIZWxwZXIgZnVuY3Rpb24gdG8gcmV0cmlldmUgYXR0cmlidXRlIHZhbHVlLlxuICogQHBhcmFtIHtTdHJpbmd9IHN1ZmZpeFxuICogQHBhcmFtIHtFbGVtZW50fSBlbGVtZW50XG4gKi9cblxuZnVuY3Rpb24gZ2V0QXR0cmlidXRlVmFsdWUoc3VmZml4LCBlbGVtZW50KSB7XG4gIHZhciBhdHRyaWJ1dGUgPSBcImRhdGEtY2xpcGJvYXJkLVwiLmNvbmNhdChzdWZmaXgpO1xuXG4gIGlmICghZWxlbWVudC5oYXNBdHRyaWJ1dGUoYXR0cmlidXRlKSkge1xuICAgIHJldHVybjtcbiAgfVxuXG4gIHJldHVybiBlbGVtZW50LmdldEF0dHJpYnV0ZShhdHRyaWJ1dGUpO1xufVxuLyoqXG4gKiBCYXNlIGNsYXNzIHdoaWNoIHRha2VzIG9uZSBvciBtb3JlIGVsZW1lbnRzLCBhZGRzIGV2ZW50IGxpc3RlbmVycyB0byB0aGVtLFxuICogYW5kIGluc3RhbnRpYXRlcyBhIG5ldyBgQ2xpcGJvYXJkQWN0aW9uYCBvbiBlYWNoIGNsaWNrLlxuICovXG5cblxudmFyIENsaXBib2FyZCA9IC8qI19fUFVSRV9fKi9mdW5jdGlvbiAoX0VtaXR0ZXIpIHtcbiAgX2luaGVyaXRzKENsaXBib2FyZCwgX0VtaXR0ZXIpO1xuXG4gIHZhciBfc3VwZXIgPSBfY3JlYXRlU3VwZXIoQ2xpcGJvYXJkKTtcblxuICAvKipcbiAgICogQHBhcmFtIHtTdHJpbmd8SFRNTEVsZW1lbnR8SFRNTENvbGxlY3Rpb258Tm9kZUxpc3R9IHRyaWdnZXJcbiAgICogQHBhcmFtIHtPYmplY3R9IG9wdGlvbnNcbiAgICovXG4gIGZ1bmN0aW9uIENsaXBib2FyZCh0cmlnZ2VyLCBvcHRpb25zKSB7XG4gICAgdmFyIF90aGlzO1xuXG4gICAgX2NsYXNzQ2FsbENoZWNrKHRoaXMsIENsaXBib2FyZCk7XG5cbiAgICBfdGhpcyA9IF9zdXBlci5jYWxsKHRoaXMpO1xuXG4gICAgX3RoaXMucmVzb2x2ZU9wdGlvbnMob3B0aW9ucyk7XG5cbiAgICBfdGhpcy5saXN0ZW5DbGljayh0cmlnZ2VyKTtcblxuICAgIHJldHVybiBfdGhpcztcbiAgfVxuICAvKipcbiAgICogRGVmaW5lcyBpZiBhdHRyaWJ1dGVzIHdvdWxkIGJlIHJlc29sdmVkIHVzaW5nIGludGVybmFsIHNldHRlciBmdW5jdGlvbnNcbiAgICogb3IgY3VzdG9tIGZ1bmN0aW9ucyB0aGF0IHdlcmUgcGFzc2VkIGluIHRoZSBjb25zdHJ1Y3Rvci5cbiAgICogQHBhcmFtIHtPYmplY3R9IG9wdGlvbnNcbiAgICovXG5cblxuICBfY3JlYXRlQ2xhc3MoQ2xpcGJvYXJkLCBbe1xuICAgIGtleTogXCJyZXNvbHZlT3B0aW9uc1wiLFxuICAgIHZhbHVlOiBmdW5jdGlvbiByZXNvbHZlT3B0aW9ucygpIHtcbiAgICAgIHZhciBvcHRpb25zID0gYXJndW1lbnRzLmxlbmd0aCA+IDAgJiYgYXJndW1lbnRzWzBdICE9PSB1bmRlZmluZWQgPyBhcmd1bWVudHNbMF0gOiB7fTtcbiAgICAgIHRoaXMuYWN0aW9uID0gdHlwZW9mIG9wdGlvbnMuYWN0aW9uID09PSAnZnVuY3Rpb24nID8gb3B0aW9ucy5hY3Rpb24gOiB0aGlzLmRlZmF1bHRBY3Rpb247XG4gICAgICB0aGlzLnRhcmdldCA9IHR5cGVvZiBvcHRpb25zLnRhcmdldCA9PT0gJ2Z1bmN0aW9uJyA/IG9wdGlvbnMudGFyZ2V0IDogdGhpcy5kZWZhdWx0VGFyZ2V0O1xuICAgICAgdGhpcy50ZXh0ID0gdHlwZW9mIG9wdGlvbnMudGV4dCA9PT0gJ2Z1bmN0aW9uJyA/IG9wdGlvbnMudGV4dCA6IHRoaXMuZGVmYXVsdFRleHQ7XG4gICAgICB0aGlzLmNvbnRhaW5lciA9IGNsaXBib2FyZF90eXBlb2Yob3B0aW9ucy5jb250YWluZXIpID09PSAnb2JqZWN0JyA/IG9wdGlvbnMuY29udGFpbmVyIDogZG9jdW1lbnQuYm9keTtcbiAgICB9XG4gICAgLyoqXG4gICAgICogQWRkcyBhIGNsaWNrIGV2ZW50IGxpc3RlbmVyIHRvIHRoZSBwYXNzZWQgdHJpZ2dlci5cbiAgICAgKiBAcGFyYW0ge1N0cmluZ3xIVE1MRWxlbWVudHxIVE1MQ29sbGVjdGlvbnxOb2RlTGlzdH0gdHJpZ2dlclxuICAgICAqL1xuXG4gIH0sIHtcbiAgICBrZXk6IFwibGlzdGVuQ2xpY2tcIixcbiAgICB2YWx1ZTogZnVuY3Rpb24gbGlzdGVuQ2xpY2sodHJpZ2dlcikge1xuICAgICAgdmFyIF90aGlzMiA9IHRoaXM7XG5cbiAgICAgIHRoaXMubGlzdGVuZXIgPSBsaXN0ZW5fZGVmYXVsdCgpKHRyaWdnZXIsICdjbGljaycsIGZ1bmN0aW9uIChlKSB7XG4gICAgICAgIHJldHVybiBfdGhpczIub25DbGljayhlKTtcbiAgICAgIH0pO1xuICAgIH1cbiAgICAvKipcbiAgICAgKiBEZWZpbmVzIGEgbmV3IGBDbGlwYm9hcmRBY3Rpb25gIG9uIGVhY2ggY2xpY2sgZXZlbnQuXG4gICAgICogQHBhcmFtIHtFdmVudH0gZVxuICAgICAqL1xuXG4gIH0sIHtcbiAgICBrZXk6IFwib25DbGlja1wiLFxuICAgIHZhbHVlOiBmdW5jdGlvbiBvbkNsaWNrKGUpIHtcbiAgICAgIHZhciB0cmlnZ2VyID0gZS5kZWxlZ2F0ZVRhcmdldCB8fCBlLmN1cnJlbnRUYXJnZXQ7XG4gICAgICB2YXIgYWN0aW9uID0gdGhpcy5hY3Rpb24odHJpZ2dlcikgfHwgJ2NvcHknO1xuICAgICAgdmFyIHRleHQgPSBhY3Rpb25zX2RlZmF1bHQoe1xuICAgICAgICBhY3Rpb246IGFjdGlvbixcbiAgICAgICAgY29udGFpbmVyOiB0aGlzLmNvbnRhaW5lcixcbiAgICAgICAgdGFyZ2V0OiB0aGlzLnRhcmdldCh0cmlnZ2VyKSxcbiAgICAgICAgdGV4dDogdGhpcy50ZXh0KHRyaWdnZXIpXG4gICAgICB9KTsgLy8gRmlyZXMgYW4gZXZlbnQgYmFzZWQgb24gdGhlIGNvcHkgb3BlcmF0aW9uIHJlc3VsdC5cblxuICAgICAgdGhpcy5lbWl0KHRleHQgPyAnc3VjY2VzcycgOiAnZXJyb3InLCB7XG4gICAgICAgIGFjdGlvbjogYWN0aW9uLFxuICAgICAgICB0ZXh0OiB0ZXh0LFxuICAgICAgICB0cmlnZ2VyOiB0cmlnZ2VyLFxuICAgICAgICBjbGVhclNlbGVjdGlvbjogZnVuY3Rpb24gY2xlYXJTZWxlY3Rpb24oKSB7XG4gICAgICAgICAgaWYgKHRyaWdnZXIpIHtcbiAgICAgICAgICAgIHRyaWdnZXIuZm9jdXMoKTtcbiAgICAgICAgICB9XG5cbiAgICAgICAgICBkb2N1bWVudC5hY3RpdmVFbGVtZW50LmJsdXIoKTtcbiAgICAgICAgICB3aW5kb3cuZ2V0U2VsZWN0aW9uKCkucmVtb3ZlQWxsUmFuZ2VzKCk7XG4gICAgICAgIH1cbiAgICAgIH0pO1xuICAgIH1cbiAgICAvKipcbiAgICAgKiBEZWZhdWx0IGBhY3Rpb25gIGxvb2t1cCBmdW5jdGlvbi5cbiAgICAgKiBAcGFyYW0ge0VsZW1lbnR9IHRyaWdnZXJcbiAgICAgKi9cblxuICB9LCB7XG4gICAga2V5OiBcImRlZmF1bHRBY3Rpb25cIixcbiAgICB2YWx1ZTogZnVuY3Rpb24gZGVmYXVsdEFjdGlvbih0cmlnZ2VyKSB7XG4gICAgICByZXR1cm4gZ2V0QXR0cmlidXRlVmFsdWUoJ2FjdGlvbicsIHRyaWdnZXIpO1xuICAgIH1cbiAgICAvKipcbiAgICAgKiBEZWZhdWx0IGB0YXJnZXRgIGxvb2t1cCBmdW5jdGlvbi5cbiAgICAgKiBAcGFyYW0ge0VsZW1lbnR9IHRyaWdnZXJcbiAgICAgKi9cblxuICB9LCB7XG4gICAga2V5OiBcImRlZmF1bHRUYXJnZXRcIixcbiAgICB2YWx1ZTogZnVuY3Rpb24gZGVmYXVsdFRhcmdldCh0cmlnZ2VyKSB7XG4gICAgICB2YXIgc2VsZWN0b3IgPSBnZXRBdHRyaWJ1dGVWYWx1ZSgndGFyZ2V0JywgdHJpZ2dlcik7XG5cbiAgICAgIGlmIChzZWxlY3Rvcikge1xuICAgICAgICByZXR1cm4gZG9jdW1lbnQucXVlcnlTZWxlY3RvcihzZWxlY3Rvcik7XG4gICAgICB9XG4gICAgfVxuICAgIC8qKlxuICAgICAqIEFsbG93IGZpcmUgcHJvZ3JhbW1hdGljYWxseSBhIGNvcHkgYWN0aW9uXG4gICAgICogQHBhcmFtIHtTdHJpbmd8SFRNTEVsZW1lbnR9IHRhcmdldFxuICAgICAqIEBwYXJhbSB7T2JqZWN0fSBvcHRpb25zXG4gICAgICogQHJldHVybnMgVGV4dCBjb3BpZWQuXG4gICAgICovXG5cbiAgfSwge1xuICAgIGtleTogXCJkZWZhdWx0VGV4dFwiLFxuXG4gICAgLyoqXG4gICAgICogRGVmYXVsdCBgdGV4dGAgbG9va3VwIGZ1bmN0aW9uLlxuICAgICAqIEBwYXJhbSB7RWxlbWVudH0gdHJpZ2dlclxuICAgICAqL1xuICAgIHZhbHVlOiBmdW5jdGlvbiBkZWZhdWx0VGV4dCh0cmlnZ2VyKSB7XG4gICAgICByZXR1cm4gZ2V0QXR0cmlidXRlVmFsdWUoJ3RleHQnLCB0cmlnZ2VyKTtcbiAgICB9XG4gICAgLyoqXG4gICAgICogRGVzdHJveSBsaWZlY3ljbGUuXG4gICAgICovXG5cbiAgfSwge1xuICAgIGtleTogXCJkZXN0cm95XCIsXG4gICAgdmFsdWU6IGZ1bmN0aW9uIGRlc3Ryb3koKSB7XG4gICAgICB0aGlzLmxpc3RlbmVyLmRlc3Ryb3koKTtcbiAgICB9XG4gIH1dLCBbe1xuICAgIGtleTogXCJjb3B5XCIsXG4gICAgdmFsdWU6IGZ1bmN0aW9uIGNvcHkodGFyZ2V0KSB7XG4gICAgICB2YXIgb3B0aW9ucyA9IGFyZ3VtZW50cy5sZW5ndGggPiAxICYmIGFyZ3VtZW50c1sxXSAhPT0gdW5kZWZpbmVkID8gYXJndW1lbnRzWzFdIDoge1xuICAgICAgICBjb250YWluZXI6IGRvY3VtZW50LmJvZHlcbiAgICAgIH07XG4gICAgICByZXR1cm4gYWN0aW9uc19jb3B5KHRhcmdldCwgb3B0aW9ucyk7XG4gICAgfVxuICAgIC8qKlxuICAgICAqIEFsbG93IGZpcmUgcHJvZ3JhbW1hdGljYWxseSBhIGN1dCBhY3Rpb25cbiAgICAgKiBAcGFyYW0ge1N0cmluZ3xIVE1MRWxlbWVudH0gdGFyZ2V0XG4gICAgICogQHJldHVybnMgVGV4dCBjdXR0ZWQuXG4gICAgICovXG5cbiAgfSwge1xuICAgIGtleTogXCJjdXRcIixcbiAgICB2YWx1ZTogZnVuY3Rpb24gY3V0KHRhcmdldCkge1xuICAgICAgcmV0dXJuIGFjdGlvbnNfY3V0KHRhcmdldCk7XG4gICAgfVxuICAgIC8qKlxuICAgICAqIFJldHVybnMgdGhlIHN1cHBvcnQgb2YgdGhlIGdpdmVuIGFjdGlvbiwgb3IgYWxsIGFjdGlvbnMgaWYgbm8gYWN0aW9uIGlzXG4gICAgICogZ2l2ZW4uXG4gICAgICogQHBhcmFtIHtTdHJpbmd9IFthY3Rpb25dXG4gICAgICovXG5cbiAgfSwge1xuICAgIGtleTogXCJpc1N1cHBvcnRlZFwiLFxuICAgIHZhbHVlOiBmdW5jdGlvbiBpc1N1cHBvcnRlZCgpIHtcbiAgICAgIHZhciBhY3Rpb24gPSBhcmd1bWVudHMubGVuZ3RoID4gMCAmJiBhcmd1bWVudHNbMF0gIT09IHVuZGVmaW5lZCA/IGFyZ3VtZW50c1swXSA6IFsnY29weScsICdjdXQnXTtcbiAgICAgIHZhciBhY3Rpb25zID0gdHlwZW9mIGFjdGlvbiA9PT0gJ3N0cmluZycgPyBbYWN0aW9uXSA6IGFjdGlvbjtcbiAgICAgIHZhciBzdXBwb3J0ID0gISFkb2N1bWVudC5xdWVyeUNvbW1hbmRTdXBwb3J0ZWQ7XG4gICAgICBhY3Rpb25zLmZvckVhY2goZnVuY3Rpb24gKGFjdGlvbikge1xuICAgICAgICBzdXBwb3J0ID0gc3VwcG9ydCAmJiAhIWRvY3VtZW50LnF1ZXJ5Q29tbWFuZFN1cHBvcnRlZChhY3Rpb24pO1xuICAgICAgfSk7XG4gICAgICByZXR1cm4gc3VwcG9ydDtcbiAgICB9XG4gIH1dKTtcblxuICByZXR1cm4gQ2xpcGJvYXJkO1xufSgodGlueV9lbWl0dGVyX2RlZmF1bHQoKSkpO1xuXG4vKiBoYXJtb255IGRlZmF1bHQgZXhwb3J0ICovIHZhciBjbGlwYm9hcmQgPSAoQ2xpcGJvYXJkKTtcblxuLyoqKi8gfSksXG5cbi8qKiovIDgyODpcbi8qKiovIChmdW5jdGlvbihtb2R1bGUpIHtcblxudmFyIERPQ1VNRU5UX05PREVfVFlQRSA9IDk7XG5cbi8qKlxuICogQSBwb2x5ZmlsbCBmb3IgRWxlbWVudC5tYXRjaGVzKClcbiAqL1xuaWYgKHR5cGVvZiBFbGVtZW50ICE9PSAndW5kZWZpbmVkJyAmJiAhRWxlbWVudC5wcm90b3R5cGUubWF0Y2hlcykge1xuICAgIHZhciBwcm90byA9IEVsZW1lbnQucHJvdG90eXBlO1xuXG4gICAgcHJvdG8ubWF0Y2hlcyA9IHByb3RvLm1hdGNoZXNTZWxlY3RvciB8fFxuICAgICAgICAgICAgICAgICAgICBwcm90by5tb3pNYXRjaGVzU2VsZWN0b3IgfHxcbiAgICAgICAgICAgICAgICAgICAgcHJvdG8ubXNNYXRjaGVzU2VsZWN0b3IgfHxcbiAgICAgICAgICAgICAgICAgICAgcHJvdG8ub01hdGNoZXNTZWxlY3RvciB8fFxuICAgICAgICAgICAgICAgICAgICBwcm90by53ZWJraXRNYXRjaGVzU2VsZWN0b3I7XG59XG5cbi8qKlxuICogRmluZHMgdGhlIGNsb3Nlc3QgcGFyZW50IHRoYXQgbWF0Y2hlcyBhIHNlbGVjdG9yLlxuICpcbiAqIEBwYXJhbSB7RWxlbWVudH0gZWxlbWVudFxuICogQHBhcmFtIHtTdHJpbmd9IHNlbGVjdG9yXG4gKiBAcmV0dXJuIHtGdW5jdGlvbn1cbiAqL1xuZnVuY3Rpb24gY2xvc2VzdCAoZWxlbWVudCwgc2VsZWN0b3IpIHtcbiAgICB3aGlsZSAoZWxlbWVudCAmJiBlbGVtZW50Lm5vZGVUeXBlICE9PSBET0NVTUVOVF9OT0RFX1RZUEUpIHtcbiAgICAgICAgaWYgKHR5cGVvZiBlbGVtZW50Lm1hdGNoZXMgPT09ICdmdW5jdGlvbicgJiZcbiAgICAgICAgICAgIGVsZW1lbnQubWF0Y2hlcyhzZWxlY3RvcikpIHtcbiAgICAgICAgICByZXR1cm4gZWxlbWVudDtcbiAgICAgICAgfVxuICAgICAgICBlbGVtZW50ID0gZWxlbWVudC5wYXJlbnROb2RlO1xuICAgIH1cbn1cblxubW9kdWxlLmV4cG9ydHMgPSBjbG9zZXN0O1xuXG5cbi8qKiovIH0pLFxuXG4vKioqLyA0Mzg6XG4vKioqLyAoZnVuY3Rpb24obW9kdWxlLCBfX3VudXNlZF93ZWJwYWNrX2V4cG9ydHMsIF9fd2VicGFja19yZXF1aXJlX18pIHtcblxudmFyIGNsb3Nlc3QgPSBfX3dlYnBhY2tfcmVxdWlyZV9fKDgyOCk7XG5cbi8qKlxuICogRGVsZWdhdGVzIGV2ZW50IHRvIGEgc2VsZWN0b3IuXG4gKlxuICogQHBhcmFtIHtFbGVtZW50fSBlbGVtZW50XG4gKiBAcGFyYW0ge1N0cmluZ30gc2VsZWN0b3JcbiAqIEBwYXJhbSB7U3RyaW5nfSB0eXBlXG4gKiBAcGFyYW0ge0Z1bmN0aW9ufSBjYWxsYmFja1xuICogQHBhcmFtIHtCb29sZWFufSB1c2VDYXB0dXJlXG4gKiBAcmV0dXJuIHtPYmplY3R9XG4gKi9cbmZ1bmN0aW9uIF9kZWxlZ2F0ZShlbGVtZW50LCBzZWxlY3RvciwgdHlwZSwgY2FsbGJhY2ssIHVzZUNhcHR1cmUpIHtcbiAgICB2YXIgbGlzdGVuZXJGbiA9IGxpc3RlbmVyLmFwcGx5KHRoaXMsIGFyZ3VtZW50cyk7XG5cbiAgICBlbGVtZW50LmFkZEV2ZW50TGlzdGVuZXIodHlwZSwgbGlzdGVuZXJGbiwgdXNlQ2FwdHVyZSk7XG5cbiAgICByZXR1cm4ge1xuICAgICAgICBkZXN0cm95OiBmdW5jdGlvbigpIHtcbiAgICAgICAgICAgIGVsZW1lbnQucmVtb3ZlRXZlbnRMaXN0ZW5lcih0eXBlLCBsaXN0ZW5lckZuLCB1c2VDYXB0dXJlKTtcbiAgICAgICAgfVxuICAgIH1cbn1cblxuLyoqXG4gKiBEZWxlZ2F0ZXMgZXZlbnQgdG8gYSBzZWxlY3Rvci5cbiAqXG4gKiBAcGFyYW0ge0VsZW1lbnR8U3RyaW5nfEFycmF5fSBbZWxlbWVudHNdXG4gKiBAcGFyYW0ge1N0cmluZ30gc2VsZWN0b3JcbiAqIEBwYXJhbSB7U3RyaW5nfSB0eXBlXG4gKiBAcGFyYW0ge0Z1bmN0aW9ufSBjYWxsYmFja1xuICogQHBhcmFtIHtCb29sZWFufSB1c2VDYXB0dXJlXG4gKiBAcmV0dXJuIHtPYmplY3R9XG4gKi9cbmZ1bmN0aW9uIGRlbGVnYXRlKGVsZW1lbnRzLCBzZWxlY3RvciwgdHlwZSwgY2FsbGJhY2ssIHVzZUNhcHR1cmUpIHtcbiAgICAvLyBIYW5kbGUgdGhlIHJlZ3VsYXIgRWxlbWVudCB1c2FnZVxuICAgIGlmICh0eXBlb2YgZWxlbWVudHMuYWRkRXZlbnRMaXN0ZW5lciA9PT0gJ2Z1bmN0aW9uJykge1xuICAgICAgICByZXR1cm4gX2RlbGVnYXRlLmFwcGx5KG51bGwsIGFyZ3VtZW50cyk7XG4gICAgfVxuXG4gICAgLy8gSGFuZGxlIEVsZW1lbnQtbGVzcyB1c2FnZSwgaXQgZGVmYXVsdHMgdG8gZ2xvYmFsIGRlbGVnYXRpb25cbiAgICBpZiAodHlwZW9mIHR5cGUgPT09ICdmdW5jdGlvbicpIHtcbiAgICAgICAgLy8gVXNlIGBkb2N1bWVudGAgYXMgdGhlIGZpcnN0IHBhcmFtZXRlciwgdGhlbiBhcHBseSBhcmd1bWVudHNcbiAgICAgICAgLy8gVGhpcyBpcyBhIHNob3J0IHdheSB0byAudW5zaGlmdCBgYXJndW1lbnRzYCB3aXRob3V0IHJ1bm5pbmcgaW50byBkZW9wdGltaXphdGlvbnNcbiAgICAgICAgcmV0dXJuIF9kZWxlZ2F0ZS5iaW5kKG51bGwsIGRvY3VtZW50KS5hcHBseShudWxsLCBhcmd1bWVudHMpO1xuICAgIH1cblxuICAgIC8vIEhhbmRsZSBTZWxlY3Rvci1iYXNlZCB1c2FnZVxuICAgIGlmICh0eXBlb2YgZWxlbWVudHMgPT09ICdzdHJpbmcnKSB7XG4gICAgICAgIGVsZW1lbnRzID0gZG9jdW1lbnQucXVlcnlTZWxlY3RvckFsbChlbGVtZW50cyk7XG4gICAgfVxuXG4gICAgLy8gSGFuZGxlIEFycmF5LWxpa2UgYmFzZWQgdXNhZ2VcbiAgICByZXR1cm4gQXJyYXkucHJvdG90eXBlLm1hcC5jYWxsKGVsZW1lbnRzLCBmdW5jdGlvbiAoZWxlbWVudCkge1xuICAgICAgICByZXR1cm4gX2RlbGVnYXRlKGVsZW1lbnQsIHNlbGVjdG9yLCB0eXBlLCBjYWxsYmFjaywgdXNlQ2FwdHVyZSk7XG4gICAgfSk7XG59XG5cbi8qKlxuICogRmluZHMgY2xvc2VzdCBtYXRjaCBhbmQgaW52b2tlcyBjYWxsYmFjay5cbiAqXG4gKiBAcGFyYW0ge0VsZW1lbnR9IGVsZW1lbnRcbiAqIEBwYXJhbSB7U3RyaW5nfSBzZWxlY3RvclxuICogQHBhcmFtIHtTdHJpbmd9IHR5cGVcbiAqIEBwYXJhbSB7RnVuY3Rpb259IGNhbGxiYWNrXG4gKiBAcmV0dXJuIHtGdW5jdGlvbn1cbiAqL1xuZnVuY3Rpb24gbGlzdGVuZXIoZWxlbWVudCwgc2VsZWN0b3IsIHR5cGUsIGNhbGxiYWNrKSB7XG4gICAgcmV0dXJuIGZ1bmN0aW9uKGUpIHtcbiAgICAgICAgZS5kZWxlZ2F0ZVRhcmdldCA9IGNsb3Nlc3QoZS50YXJnZXQsIHNlbGVjdG9yKTtcblxuICAgICAgICBpZiAoZS5kZWxlZ2F0ZVRhcmdldCkge1xuICAgICAgICAgICAgY2FsbGJhY2suY2FsbChlbGVtZW50LCBlKTtcbiAgICAgICAgfVxuICAgIH1cbn1cblxubW9kdWxlLmV4cG9ydHMgPSBkZWxlZ2F0ZTtcblxuXG4vKioqLyB9KSxcblxuLyoqKi8gODc5OlxuLyoqKi8gKGZ1bmN0aW9uKF9fdW51c2VkX3dlYnBhY2tfbW9kdWxlLCBleHBvcnRzKSB7XG5cbi8qKlxuICogQ2hlY2sgaWYgYXJndW1lbnQgaXMgYSBIVE1MIGVsZW1lbnQuXG4gKlxuICogQHBhcmFtIHtPYmplY3R9IHZhbHVlXG4gKiBAcmV0dXJuIHtCb29sZWFufVxuICovXG5leHBvcnRzLm5vZGUgPSBmdW5jdGlvbih2YWx1ZSkge1xuICAgIHJldHVybiB2YWx1ZSAhPT0gdW5kZWZpbmVkXG4gICAgICAgICYmIHZhbHVlIGluc3RhbmNlb2YgSFRNTEVsZW1lbnRcbiAgICAgICAgJiYgdmFsdWUubm9kZVR5cGUgPT09IDE7XG59O1xuXG4vKipcbiAqIENoZWNrIGlmIGFyZ3VtZW50IGlzIGEgbGlzdCBvZiBIVE1MIGVsZW1lbnRzLlxuICpcbiAqIEBwYXJhbSB7T2JqZWN0fSB2YWx1ZVxuICogQHJldHVybiB7Qm9vbGVhbn1cbiAqL1xuZXhwb3J0cy5ub2RlTGlzdCA9IGZ1bmN0aW9uKHZhbHVlKSB7XG4gICAgdmFyIHR5cGUgPSBPYmplY3QucHJvdG90eXBlLnRvU3RyaW5nLmNhbGwodmFsdWUpO1xuXG4gICAgcmV0dXJuIHZhbHVlICE9PSB1bmRlZmluZWRcbiAgICAgICAgJiYgKHR5cGUgPT09ICdbb2JqZWN0IE5vZGVMaXN0XScgfHwgdHlwZSA9PT0gJ1tvYmplY3QgSFRNTENvbGxlY3Rpb25dJylcbiAgICAgICAgJiYgKCdsZW5ndGgnIGluIHZhbHVlKVxuICAgICAgICAmJiAodmFsdWUubGVuZ3RoID09PSAwIHx8IGV4cG9ydHMubm9kZSh2YWx1ZVswXSkpO1xufTtcblxuLyoqXG4gKiBDaGVjayBpZiBhcmd1bWVudCBpcyBhIHN0cmluZy5cbiAqXG4gKiBAcGFyYW0ge09iamVjdH0gdmFsdWVcbiAqIEByZXR1cm4ge0Jvb2xlYW59XG4gKi9cbmV4cG9ydHMuc3RyaW5nID0gZnVuY3Rpb24odmFsdWUpIHtcbiAgICByZXR1cm4gdHlwZW9mIHZhbHVlID09PSAnc3RyaW5nJ1xuICAgICAgICB8fCB2YWx1ZSBpbnN0YW5jZW9mIFN0cmluZztcbn07XG5cbi8qKlxuICogQ2hlY2sgaWYgYXJndW1lbnQgaXMgYSBmdW5jdGlvbi5cbiAqXG4gKiBAcGFyYW0ge09iamVjdH0gdmFsdWVcbiAqIEByZXR1cm4ge0Jvb2xlYW59XG4gKi9cbmV4cG9ydHMuZm4gPSBmdW5jdGlvbih2YWx1ZSkge1xuICAgIHZhciB0eXBlID0gT2JqZWN0LnByb3RvdHlwZS50b1N0cmluZy5jYWxsKHZhbHVlKTtcblxuICAgIHJldHVybiB0eXBlID09PSAnW29iamVjdCBGdW5jdGlvbl0nO1xufTtcblxuXG4vKioqLyB9KSxcblxuLyoqKi8gMzcwOlxuLyoqKi8gKGZ1bmN0aW9uKG1vZHVsZSwgX191bnVzZWRfd2VicGFja19leHBvcnRzLCBfX3dlYnBhY2tfcmVxdWlyZV9fKSB7XG5cbnZhciBpcyA9IF9fd2VicGFja19yZXF1aXJlX18oODc5KTtcbnZhciBkZWxlZ2F0ZSA9IF9fd2VicGFja19yZXF1aXJlX18oNDM4KTtcblxuLyoqXG4gKiBWYWxpZGF0ZXMgYWxsIHBhcmFtcyBhbmQgY2FsbHMgdGhlIHJpZ2h0XG4gKiBsaXN0ZW5lciBmdW5jdGlvbiBiYXNlZCBvbiBpdHMgdGFyZ2V0IHR5cGUuXG4gKlxuICogQHBhcmFtIHtTdHJpbmd8SFRNTEVsZW1lbnR8SFRNTENvbGxlY3Rpb258Tm9kZUxpc3R9IHRhcmdldFxuICogQHBhcmFtIHtTdHJpbmd9IHR5cGVcbiAqIEBwYXJhbSB7RnVuY3Rpb259IGNhbGxiYWNrXG4gKiBAcmV0dXJuIHtPYmplY3R9XG4gKi9cbmZ1bmN0aW9uIGxpc3Rlbih0YXJnZXQsIHR5cGUsIGNhbGxiYWNrKSB7XG4gICAgaWYgKCF0YXJnZXQgJiYgIXR5cGUgJiYgIWNhbGxiYWNrKSB7XG4gICAgICAgIHRocm93IG5ldyBFcnJvcignTWlzc2luZyByZXF1aXJlZCBhcmd1bWVudHMnKTtcbiAgICB9XG5cbiAgICBpZiAoIWlzLnN0cmluZyh0eXBlKSkge1xuICAgICAgICB0aHJvdyBuZXcgVHlwZUVycm9yKCdTZWNvbmQgYXJndW1lbnQgbXVzdCBiZSBhIFN0cmluZycpO1xuICAgIH1cblxuICAgIGlmICghaXMuZm4oY2FsbGJhY2spKSB7XG4gICAgICAgIHRocm93IG5ldyBUeXBlRXJyb3IoJ1RoaXJkIGFyZ3VtZW50IG11c3QgYmUgYSBGdW5jdGlvbicpO1xuICAgIH1cblxuICAgIGlmIChpcy5ub2RlKHRhcmdldCkpIHtcbiAgICAgICAgcmV0dXJuIGxpc3Rlbk5vZGUodGFyZ2V0LCB0eXBlLCBjYWxsYmFjayk7XG4gICAgfVxuICAgIGVsc2UgaWYgKGlzLm5vZGVMaXN0KHRhcmdldCkpIHtcbiAgICAgICAgcmV0dXJuIGxpc3Rlbk5vZGVMaXN0KHRhcmdldCwgdHlwZSwgY2FsbGJhY2spO1xuICAgIH1cbiAgICBlbHNlIGlmIChpcy5zdHJpbmcodGFyZ2V0KSkge1xuICAgICAgICByZXR1cm4gbGlzdGVuU2VsZWN0b3IodGFyZ2V0LCB0eXBlLCBjYWxsYmFjayk7XG4gICAgfVxuICAgIGVsc2Uge1xuICAgICAgICB0aHJvdyBuZXcgVHlwZUVycm9yKCdGaXJzdCBhcmd1bWVudCBtdXN0IGJlIGEgU3RyaW5nLCBIVE1MRWxlbWVudCwgSFRNTENvbGxlY3Rpb24sIG9yIE5vZGVMaXN0Jyk7XG4gICAgfVxufVxuXG4vKipcbiAqIEFkZHMgYW4gZXZlbnQgbGlzdGVuZXIgdG8gYSBIVE1MIGVsZW1lbnRcbiAqIGFuZCByZXR1cm5zIGEgcmVtb3ZlIGxpc3RlbmVyIGZ1bmN0aW9uLlxuICpcbiAqIEBwYXJhbSB7SFRNTEVsZW1lbnR9IG5vZGVcbiAqIEBwYXJhbSB7U3RyaW5nfSB0eXBlXG4gKiBAcGFyYW0ge0Z1bmN0aW9ufSBjYWxsYmFja1xuICogQHJldHVybiB7T2JqZWN0fVxuICovXG5mdW5jdGlvbiBsaXN0ZW5Ob2RlKG5vZGUsIHR5cGUsIGNhbGxiYWNrKSB7XG4gICAgbm9kZS5hZGRFdmVudExpc3RlbmVyKHR5cGUsIGNhbGxiYWNrKTtcblxuICAgIHJldHVybiB7XG4gICAgICAgIGRlc3Ryb3k6IGZ1bmN0aW9uKCkge1xuICAgICAgICAgICAgbm9kZS5yZW1vdmVFdmVudExpc3RlbmVyKHR5cGUsIGNhbGxiYWNrKTtcbiAgICAgICAgfVxuICAgIH1cbn1cblxuLyoqXG4gKiBBZGQgYW4gZXZlbnQgbGlzdGVuZXIgdG8gYSBsaXN0IG9mIEhUTUwgZWxlbWVudHNcbiAqIGFuZCByZXR1cm5zIGEgcmVtb3ZlIGxpc3RlbmVyIGZ1bmN0aW9uLlxuICpcbiAqIEBwYXJhbSB7Tm9kZUxpc3R8SFRNTENvbGxlY3Rpb259IG5vZGVMaXN0XG4gKiBAcGFyYW0ge1N0cmluZ30gdHlwZVxuICogQHBhcmFtIHtGdW5jdGlvbn0gY2FsbGJhY2tcbiAqIEByZXR1cm4ge09iamVjdH1cbiAqL1xuZnVuY3Rpb24gbGlzdGVuTm9kZUxpc3Qobm9kZUxpc3QsIHR5cGUsIGNhbGxiYWNrKSB7XG4gICAgQXJyYXkucHJvdG90eXBlLmZvckVhY2guY2FsbChub2RlTGlzdCwgZnVuY3Rpb24obm9kZSkge1xuICAgICAgICBub2RlLmFkZEV2ZW50TGlzdGVuZXIodHlwZSwgY2FsbGJhY2spO1xuICAgIH0pO1xuXG4gICAgcmV0dXJuIHtcbiAgICAgICAgZGVzdHJveTogZnVuY3Rpb24oKSB7XG4gICAgICAgICAgICBBcnJheS5wcm90b3R5cGUuZm9yRWFjaC5jYWxsKG5vZGVMaXN0LCBmdW5jdGlvbihub2RlKSB7XG4gICAgICAgICAgICAgICAgbm9kZS5yZW1vdmVFdmVudExpc3RlbmVyKHR5cGUsIGNhbGxiYWNrKTtcbiAgICAgICAgICAgIH0pO1xuICAgICAgICB9XG4gICAgfVxufVxuXG4vKipcbiAqIEFkZCBhbiBldmVudCBsaXN0ZW5lciB0byBhIHNlbGVjdG9yXG4gKiBhbmQgcmV0dXJucyBhIHJlbW92ZSBsaXN0ZW5lciBmdW5jdGlvbi5cbiAqXG4gKiBAcGFyYW0ge1N0cmluZ30gc2VsZWN0b3JcbiAqIEBwYXJhbSB7U3RyaW5nfSB0eXBlXG4gKiBAcGFyYW0ge0Z1bmN0aW9ufSBjYWxsYmFja1xuICogQHJldHVybiB7T2JqZWN0fVxuICovXG5mdW5jdGlvbiBsaXN0ZW5TZWxlY3RvcihzZWxlY3RvciwgdHlwZSwgY2FsbGJhY2spIHtcbiAgICByZXR1cm4gZGVsZWdhdGUoZG9jdW1lbnQuYm9keSwgc2VsZWN0b3IsIHR5cGUsIGNhbGxiYWNrKTtcbn1cblxubW9kdWxlLmV4cG9ydHMgPSBsaXN0ZW47XG5cblxuLyoqKi8gfSksXG5cbi8qKiovIDgxNzpcbi8qKiovIChmdW5jdGlvbihtb2R1bGUpIHtcblxuZnVuY3Rpb24gc2VsZWN0KGVsZW1lbnQpIHtcbiAgICB2YXIgc2VsZWN0ZWRUZXh0O1xuXG4gICAgaWYgKGVsZW1lbnQubm9kZU5hbWUgPT09ICdTRUxFQ1QnKSB7XG4gICAgICAgIGVsZW1lbnQuZm9jdXMoKTtcblxuICAgICAgICBzZWxlY3RlZFRleHQgPSBlbGVtZW50LnZhbHVlO1xuICAgIH1cbiAgICBlbHNlIGlmIChlbGVtZW50Lm5vZGVOYW1lID09PSAnSU5QVVQnIHx8IGVsZW1lbnQubm9kZU5hbWUgPT09ICdURVhUQVJFQScpIHtcbiAgICAgICAgdmFyIGlzUmVhZE9ubHkgPSBlbGVtZW50Lmhhc0F0dHJpYnV0ZSgncmVhZG9ubHknKTtcblxuICAgICAgICBpZiAoIWlzUmVhZE9ubHkpIHtcbiAgICAgICAgICAgIGVsZW1lbnQuc2V0QXR0cmlidXRlKCdyZWFkb25seScsICcnKTtcbiAgICAgICAgfVxuXG4gICAgICAgIGVsZW1lbnQuc2VsZWN0KCk7XG4gICAgICAgIGVsZW1lbnQuc2V0U2VsZWN0aW9uUmFuZ2UoMCwgZWxlbWVudC52YWx1ZS5sZW5ndGgpO1xuXG4gICAgICAgIGlmICghaXNSZWFkT25seSkge1xuICAgICAgICAgICAgZWxlbWVudC5yZW1vdmVBdHRyaWJ1dGUoJ3JlYWRvbmx5Jyk7XG4gICAgICAgIH1cblxuICAgICAgICBzZWxlY3RlZFRleHQgPSBlbGVtZW50LnZhbHVlO1xuICAgIH1cbiAgICBlbHNlIHtcbiAgICAgICAgaWYgKGVsZW1lbnQuaGFzQXR0cmlidXRlKCdjb250ZW50ZWRpdGFibGUnKSkge1xuICAgICAgICAgICAgZWxlbWVudC5mb2N1cygpO1xuICAgICAgICB9XG5cbiAgICAgICAgdmFyIHNlbGVjdGlvbiA9IHdpbmRvdy5nZXRTZWxlY3Rpb24oKTtcbiAgICAgICAgdmFyIHJhbmdlID0gZG9jdW1lbnQuY3JlYXRlUmFuZ2UoKTtcblxuICAgICAgICByYW5nZS5zZWxlY3ROb2RlQ29udGVudHMoZWxlbWVudCk7XG4gICAgICAgIHNlbGVjdGlvbi5yZW1vdmVBbGxSYW5nZXMoKTtcbiAgICAgICAgc2VsZWN0aW9uLmFkZFJhbmdlKHJhbmdlKTtcblxuICAgICAgICBzZWxlY3RlZFRleHQgPSBzZWxlY3Rpb24udG9TdHJpbmcoKTtcbiAgICB9XG5cbiAgICByZXR1cm4gc2VsZWN0ZWRUZXh0O1xufVxuXG5tb2R1bGUuZXhwb3J0cyA9IHNlbGVjdDtcblxuXG4vKioqLyB9KSxcblxuLyoqKi8gMjc5OlxuLyoqKi8gKGZ1bmN0aW9uKG1vZHVsZSkge1xuXG5mdW5jdGlvbiBFICgpIHtcbiAgLy8gS2VlcCB0aGlzIGVtcHR5IHNvIGl0J3MgZWFzaWVyIHRvIGluaGVyaXQgZnJvbVxuICAvLyAodmlhIGh0dHBzOi8vZ2l0aHViLmNvbS9saXBzbWFjayBmcm9tIGh0dHBzOi8vZ2l0aHViLmNvbS9zY290dGNvcmdhbi90aW55LWVtaXR0ZXIvaXNzdWVzLzMpXG59XG5cbkUucHJvdG90eXBlID0ge1xuICBvbjogZnVuY3Rpb24gKG5hbWUsIGNhbGxiYWNrLCBjdHgpIHtcbiAgICB2YXIgZSA9IHRoaXMuZSB8fCAodGhpcy5lID0ge30pO1xuXG4gICAgKGVbbmFtZV0gfHwgKGVbbmFtZV0gPSBbXSkpLnB1c2goe1xuICAgICAgZm46IGNhbGxiYWNrLFxuICAgICAgY3R4OiBjdHhcbiAgICB9KTtcblxuICAgIHJldHVybiB0aGlzO1xuICB9LFxuXG4gIG9uY2U6IGZ1bmN0aW9uIChuYW1lLCBjYWxsYmFjaywgY3R4KSB7XG4gICAgdmFyIHNlbGYgPSB0aGlzO1xuICAgIGZ1bmN0aW9uIGxpc3RlbmVyICgpIHtcbiAgICAgIHNlbGYub2ZmKG5hbWUsIGxpc3RlbmVyKTtcbiAgICAgIGNhbGxiYWNrLmFwcGx5KGN0eCwgYXJndW1lbnRzKTtcbiAgICB9O1xuXG4gICAgbGlzdGVuZXIuXyA9IGNhbGxiYWNrXG4gICAgcmV0dXJuIHRoaXMub24obmFtZSwgbGlzdGVuZXIsIGN0eCk7XG4gIH0sXG5cbiAgZW1pdDogZnVuY3Rpb24gKG5hbWUpIHtcbiAgICB2YXIgZGF0YSA9IFtdLnNsaWNlLmNhbGwoYXJndW1lbnRzLCAxKTtcbiAgICB2YXIgZXZ0QXJyID0gKCh0aGlzLmUgfHwgKHRoaXMuZSA9IHt9KSlbbmFtZV0gfHwgW10pLnNsaWNlKCk7XG4gICAgdmFyIGkgPSAwO1xuICAgIHZhciBsZW4gPSBldnRBcnIubGVuZ3RoO1xuXG4gICAgZm9yIChpOyBpIDwgbGVuOyBpKyspIHtcbiAgICAgIGV2dEFycltpXS5mbi5hcHBseShldnRBcnJbaV0uY3R4LCBkYXRhKTtcbiAgICB9XG5cbiAgICByZXR1cm4gdGhpcztcbiAgfSxcblxuICBvZmY6IGZ1bmN0aW9uIChuYW1lLCBjYWxsYmFjaykge1xuICAgIHZhciBlID0gdGhpcy5lIHx8ICh0aGlzLmUgPSB7fSk7XG4gICAgdmFyIGV2dHMgPSBlW25hbWVdO1xuICAgIHZhciBsaXZlRXZlbnRzID0gW107XG5cbiAgICBpZiAoZXZ0cyAmJiBjYWxsYmFjaykge1xuICAgICAgZm9yICh2YXIgaSA9IDAsIGxlbiA9IGV2dHMubGVuZ3RoOyBpIDwgbGVuOyBpKyspIHtcbiAgICAgICAgaWYgKGV2dHNbaV0uZm4gIT09IGNhbGxiYWNrICYmIGV2dHNbaV0uZm4uXyAhPT0gY2FsbGJhY2spXG4gICAgICAgICAgbGl2ZUV2ZW50cy5wdXNoKGV2dHNbaV0pO1xuICAgICAgfVxuICAgIH1cblxuICAgIC8vIFJlbW92ZSBldmVudCBmcm9tIHF1ZXVlIHRvIHByZXZlbnQgbWVtb3J5IGxlYWtcbiAgICAvLyBTdWdnZXN0ZWQgYnkgaHR0cHM6Ly9naXRodWIuY29tL2xhemRcbiAgICAvLyBSZWY6IGh0dHBzOi8vZ2l0aHViLmNvbS9zY290dGNvcmdhbi90aW55LWVtaXR0ZXIvY29tbWl0L2M2ZWJmYWE5YmM5NzNiMzNkMTEwYTg0YTMwNzc0MmI3Y2Y5NGM5NTMjY29tbWl0Y29tbWVudC01MDI0OTEwXG5cbiAgICAobGl2ZUV2ZW50cy5sZW5ndGgpXG4gICAgICA/IGVbbmFtZV0gPSBsaXZlRXZlbnRzXG4gICAgICA6IGRlbGV0ZSBlW25hbWVdO1xuXG4gICAgcmV0dXJuIHRoaXM7XG4gIH1cbn07XG5cbm1vZHVsZS5leHBvcnRzID0gRTtcbm1vZHVsZS5leHBvcnRzLlRpbnlFbWl0dGVyID0gRTtcblxuXG4vKioqLyB9KVxuXG4vKioqKioqLyBcdH0pO1xuLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi9cbi8qKioqKiovIFx0Ly8gVGhlIG1vZHVsZSBjYWNoZVxuLyoqKioqKi8gXHR2YXIgX193ZWJwYWNrX21vZHVsZV9jYWNoZV9fID0ge307XG4vKioqKioqLyBcdFxuLyoqKioqKi8gXHQvLyBUaGUgcmVxdWlyZSBmdW5jdGlvblxuLyoqKioqKi8gXHRmdW5jdGlvbiBfX3dlYnBhY2tfcmVxdWlyZV9fKG1vZHVsZUlkKSB7XG4vKioqKioqLyBcdFx0Ly8gQ2hlY2sgaWYgbW9kdWxlIGlzIGluIGNhY2hlXG4vKioqKioqLyBcdFx0aWYoX193ZWJwYWNrX21vZHVsZV9jYWNoZV9fW21vZHVsZUlkXSkge1xuLyoqKioqKi8gXHRcdFx0cmV0dXJuIF9fd2VicGFja19tb2R1bGVfY2FjaGVfX1ttb2R1bGVJZF0uZXhwb3J0cztcbi8qKioqKiovIFx0XHR9XG4vKioqKioqLyBcdFx0Ly8gQ3JlYXRlIGEgbmV3IG1vZHVsZSAoYW5kIHB1dCBpdCBpbnRvIHRoZSBjYWNoZSlcbi8qKioqKiovIFx0XHR2YXIgbW9kdWxlID0gX193ZWJwYWNrX21vZHVsZV9jYWNoZV9fW21vZHVsZUlkXSA9IHtcbi8qKioqKiovIFx0XHRcdC8vIG5vIG1vZHVsZS5pZCBuZWVkZWRcbi8qKioqKiovIFx0XHRcdC8vIG5vIG1vZHVsZS5sb2FkZWQgbmVlZGVkXG4vKioqKioqLyBcdFx0XHRleHBvcnRzOiB7fVxuLyoqKioqKi8gXHRcdH07XG4vKioqKioqLyBcdFxuLyoqKioqKi8gXHRcdC8vIEV4ZWN1dGUgdGhlIG1vZHVsZSBmdW5jdGlvblxuLyoqKioqKi8gXHRcdF9fd2VicGFja19tb2R1bGVzX19bbW9kdWxlSWRdKG1vZHVsZSwgbW9kdWxlLmV4cG9ydHMsIF9fd2VicGFja19yZXF1aXJlX18pO1xuLyoqKioqKi8gXHRcbi8qKioqKiovIFx0XHQvLyBSZXR1cm4gdGhlIGV4cG9ydHMgb2YgdGhlIG1vZHVsZVxuLyoqKioqKi8gXHRcdHJldHVybiBtb2R1bGUuZXhwb3J0cztcbi8qKioqKiovIFx0fVxuLyoqKioqKi8gXHRcbi8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovXG4vKioqKioqLyBcdC8qIHdlYnBhY2svcnVudGltZS9jb21wYXQgZ2V0IGRlZmF1bHQgZXhwb3J0ICovXG4vKioqKioqLyBcdCFmdW5jdGlvbigpIHtcbi8qKioqKiovIFx0XHQvLyBnZXREZWZhdWx0RXhwb3J0IGZ1bmN0aW9uIGZvciBjb21wYXRpYmlsaXR5IHdpdGggbm9uLWhhcm1vbnkgbW9kdWxlc1xuLyoqKioqKi8gXHRcdF9fd2VicGFja19yZXF1aXJlX18ubiA9IGZ1bmN0aW9uKG1vZHVsZSkge1xuLyoqKioqKi8gXHRcdFx0dmFyIGdldHRlciA9IG1vZHVsZSAmJiBtb2R1bGUuX19lc01vZHVsZSA/XG4vKioqKioqLyBcdFx0XHRcdGZ1bmN0aW9uKCkgeyByZXR1cm4gbW9kdWxlWydkZWZhdWx0J107IH0gOlxuLyoqKioqKi8gXHRcdFx0XHRmdW5jdGlvbigpIHsgcmV0dXJuIG1vZHVsZTsgfTtcbi8qKioqKiovIFx0XHRcdF9fd2VicGFja19yZXF1aXJlX18uZChnZXR0ZXIsIHsgYTogZ2V0dGVyIH0pO1xuLyoqKioqKi8gXHRcdFx0cmV0dXJuIGdldHRlcjtcbi8qKioqKiovIFx0XHR9O1xuLyoqKioqKi8gXHR9KCk7XG4vKioqKioqLyBcdFxuLyoqKioqKi8gXHQvKiB3ZWJwYWNrL3J1bnRpbWUvZGVmaW5lIHByb3BlcnR5IGdldHRlcnMgKi9cbi8qKioqKiovIFx0IWZ1bmN0aW9uKCkge1xuLyoqKioqKi8gXHRcdC8vIGRlZmluZSBnZXR0ZXIgZnVuY3Rpb25zIGZvciBoYXJtb255IGV4cG9ydHNcbi8qKioqKiovIFx0XHRfX3dlYnBhY2tfcmVxdWlyZV9fLmQgPSBmdW5jdGlvbihleHBvcnRzLCBkZWZpbml0aW9uKSB7XG4vKioqKioqLyBcdFx0XHRmb3IodmFyIGtleSBpbiBkZWZpbml0aW9uKSB7XG4vKioqKioqLyBcdFx0XHRcdGlmKF9fd2VicGFja19yZXF1aXJlX18ubyhkZWZpbml0aW9uLCBrZXkpICYmICFfX3dlYnBhY2tfcmVxdWlyZV9fLm8oZXhwb3J0cywga2V5KSkge1xuLyoqKioqKi8gXHRcdFx0XHRcdE9iamVjdC5kZWZpbmVQcm9wZXJ0eShleHBvcnRzLCBrZXksIHsgZW51bWVyYWJsZTogdHJ1ZSwgZ2V0OiBkZWZpbml0aW9uW2tleV0gfSk7XG4vKioqKioqLyBcdFx0XHRcdH1cbi8qKioqKiovIFx0XHRcdH1cbi8qKioqKiovIFx0XHR9O1xuLyoqKioqKi8gXHR9KCk7XG4vKioqKioqLyBcdFxuLyoqKioqKi8gXHQvKiB3ZWJwYWNrL3J1bnRpbWUvaGFzT3duUHJvcGVydHkgc2hvcnRoYW5kICovXG4vKioqKioqLyBcdCFmdW5jdGlvbigpIHtcbi8qKioqKiovIFx0XHRfX3dlYnBhY2tfcmVxdWlyZV9fLm8gPSBmdW5jdGlvbihvYmosIHByb3ApIHsgcmV0dXJuIE9iamVjdC5wcm90b3R5cGUuaGFzT3duUHJvcGVydHkuY2FsbChvYmosIHByb3ApOyB9XG4vKioqKioqLyBcdH0oKTtcbi8qKioqKiovIFx0XG4vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqL1xuLyoqKioqKi8gXHQvLyBtb2R1bGUgZXhwb3J0cyBtdXN0IGJlIHJldHVybmVkIGZyb20gcnVudGltZSBzbyBlbnRyeSBpbmxpbmluZyBpcyBkaXNhYmxlZFxuLyoqKioqKi8gXHQvLyBzdGFydHVwXG4vKioqKioqLyBcdC8vIExvYWQgZW50cnkgbW9kdWxlIGFuZCByZXR1cm4gZXhwb3J0c1xuLyoqKioqKi8gXHRyZXR1cm4gX193ZWJwYWNrX3JlcXVpcmVfXyg2ODYpO1xuLyoqKioqKi8gfSkoKVxuLmRlZmF1bHQ7XG59KTsiLCAiLyohXG4gKiBUb2FzdGlmeSBqcyAxLjExLjJcbiAqIGh0dHBzOi8vZ2l0aHViLmNvbS9hcHZhcnVuL3RvYXN0aWZ5LWpzXG4gKiBAbGljZW5zZSBNSVQgbGljZW5zZWRcbiAqXG4gKiBDb3B5cmlnaHQgKEMpIDIwMTggVmFydW4gQSBQXG4gKi9cbihmdW5jdGlvbihyb290LCBmYWN0b3J5KSB7XG4gIGlmICh0eXBlb2YgbW9kdWxlID09PSBcIm9iamVjdFwiICYmIG1vZHVsZS5leHBvcnRzKSB7XG4gICAgbW9kdWxlLmV4cG9ydHMgPSBmYWN0b3J5KCk7XG4gIH0gZWxzZSB7XG4gICAgcm9vdC5Ub2FzdGlmeSA9IGZhY3RvcnkoKTtcbiAgfVxufSkodGhpcywgZnVuY3Rpb24oZ2xvYmFsKSB7XG4gIC8vIE9iamVjdCBpbml0aWFsaXphdGlvblxuICB2YXIgVG9hc3RpZnkgPSBmdW5jdGlvbihvcHRpb25zKSB7XG4gICAgICAvLyBSZXR1cm5pbmcgYSBuZXcgaW5pdCBvYmplY3RcbiAgICAgIHJldHVybiBuZXcgVG9hc3RpZnkubGliLmluaXQob3B0aW9ucyk7XG4gICAgfSxcbiAgICAvLyBMaWJyYXJ5IHZlcnNpb25cbiAgICB2ZXJzaW9uID0gXCIxLjExLjJcIjtcblxuICAvLyBTZXQgdGhlIGRlZmF1bHQgZ2xvYmFsIG9wdGlvbnNcbiAgVG9hc3RpZnkuZGVmYXVsdHMgPSB7XG4gICAgb2xkZXN0Rmlyc3Q6IHRydWUsXG4gICAgdGV4dDogXCJUb2FzdGlmeSBpcyBhd2Vzb21lIVwiLFxuICAgIG5vZGU6IHVuZGVmaW5lZCxcbiAgICBkdXJhdGlvbjogMzAwMCxcbiAgICBzZWxlY3RvcjogdW5kZWZpbmVkLFxuICAgIGNhbGxiYWNrOiBmdW5jdGlvbiAoKSB7XG4gICAgfSxcbiAgICBkZXN0aW5hdGlvbjogdW5kZWZpbmVkLFxuICAgIG5ld1dpbmRvdzogZmFsc2UsXG4gICAgY2xvc2U6IGZhbHNlLFxuICAgIGdyYXZpdHk6IFwidG9hc3RpZnktdG9wXCIsXG4gICAgcG9zaXRpb25MZWZ0OiBmYWxzZSxcbiAgICBwb3NpdGlvbjogJycsXG4gICAgYmFja2dyb3VuZENvbG9yOiAnJyxcbiAgICBhdmF0YXI6IFwiXCIsXG4gICAgY2xhc3NOYW1lOiBcIlwiLFxuICAgIHN0b3BPbkZvY3VzOiB0cnVlLFxuICAgIG9uQ2xpY2s6IGZ1bmN0aW9uICgpIHtcbiAgICB9LFxuICAgIG9mZnNldDoge3g6IDAsIHk6IDB9LFxuICAgIGVzY2FwZU1hcmt1cDogdHJ1ZSxcbiAgICBzdHlsZToge2JhY2tncm91bmQ6ICcnfVxuICB9O1xuXG4gIC8vIERlZmluaW5nIHRoZSBwcm90b3R5cGUgb2YgdGhlIG9iamVjdFxuICBUb2FzdGlmeS5saWIgPSBUb2FzdGlmeS5wcm90b3R5cGUgPSB7XG4gICAgdG9hc3RpZnk6IHZlcnNpb24sXG5cbiAgICBjb25zdHJ1Y3RvcjogVG9hc3RpZnksXG5cbiAgICAvLyBJbml0aWFsaXppbmcgdGhlIG9iamVjdCB3aXRoIHJlcXVpcmVkIHBhcmFtZXRlcnNcbiAgICBpbml0OiBmdW5jdGlvbihvcHRpb25zKSB7XG4gICAgICAvLyBWZXJpZnlpbmcgYW5kIHZhbGlkYXRpbmcgdGhlIGlucHV0IG9iamVjdFxuICAgICAgaWYgKCFvcHRpb25zKSB7XG4gICAgICAgIG9wdGlvbnMgPSB7fTtcbiAgICAgIH1cblxuICAgICAgLy8gQ3JlYXRpbmcgdGhlIG9wdGlvbnMgb2JqZWN0XG4gICAgICB0aGlzLm9wdGlvbnMgPSB7fTtcblxuICAgICAgdGhpcy50b2FzdEVsZW1lbnQgPSBudWxsO1xuXG4gICAgICAvLyBWYWxpZGF0aW5nIHRoZSBvcHRpb25zXG4gICAgICB0aGlzLm9wdGlvbnMudGV4dCA9IG9wdGlvbnMudGV4dCB8fCBUb2FzdGlmeS5kZWZhdWx0cy50ZXh0OyAvLyBEaXNwbGF5IG1lc3NhZ2VcbiAgICAgIHRoaXMub3B0aW9ucy5ub2RlID0gb3B0aW9ucy5ub2RlIHx8IFRvYXN0aWZ5LmRlZmF1bHRzLm5vZGU7ICAvLyBEaXNwbGF5IGNvbnRlbnQgYXMgbm9kZVxuICAgICAgdGhpcy5vcHRpb25zLmR1cmF0aW9uID0gb3B0aW9ucy5kdXJhdGlvbiA9PT0gMCA/IDAgOiBvcHRpb25zLmR1cmF0aW9uIHx8IFRvYXN0aWZ5LmRlZmF1bHRzLmR1cmF0aW9uOyAvLyBEaXNwbGF5IGR1cmF0aW9uXG4gICAgICB0aGlzLm9wdGlvbnMuc2VsZWN0b3IgPSBvcHRpb25zLnNlbGVjdG9yIHx8IFRvYXN0aWZ5LmRlZmF1bHRzLnNlbGVjdG9yOyAvLyBQYXJlbnQgc2VsZWN0b3JcbiAgICAgIHRoaXMub3B0aW9ucy5jYWxsYmFjayA9IG9wdGlvbnMuY2FsbGJhY2sgfHwgVG9hc3RpZnkuZGVmYXVsdHMuY2FsbGJhY2s7IC8vIENhbGxiYWNrIGFmdGVyIGRpc3BsYXlcbiAgICAgIHRoaXMub3B0aW9ucy5kZXN0aW5hdGlvbiA9IG9wdGlvbnMuZGVzdGluYXRpb24gfHwgVG9hc3RpZnkuZGVmYXVsdHMuZGVzdGluYXRpb247IC8vIE9uLWNsaWNrIGRlc3RpbmF0aW9uXG4gICAgICB0aGlzLm9wdGlvbnMubmV3V2luZG93ID0gb3B0aW9ucy5uZXdXaW5kb3cgfHwgVG9hc3RpZnkuZGVmYXVsdHMubmV3V2luZG93OyAvLyBPcGVuIGRlc3RpbmF0aW9uIGluIG5ldyB3aW5kb3dcbiAgICAgIHRoaXMub3B0aW9ucy5jbG9zZSA9IG9wdGlvbnMuY2xvc2UgfHwgVG9hc3RpZnkuZGVmYXVsdHMuY2xvc2U7IC8vIFNob3cgdG9hc3QgY2xvc2UgaWNvblxuICAgICAgdGhpcy5vcHRpb25zLmdyYXZpdHkgPSBvcHRpb25zLmdyYXZpdHkgPT09IFwiYm90dG9tXCIgPyBcInRvYXN0aWZ5LWJvdHRvbVwiIDogVG9hc3RpZnkuZGVmYXVsdHMuZ3Jhdml0eTsgLy8gdG9hc3QgcG9zaXRpb24gLSB0b3Agb3IgYm90dG9tXG4gICAgICB0aGlzLm9wdGlvbnMucG9zaXRpb25MZWZ0ID0gb3B0aW9ucy5wb3NpdGlvbkxlZnQgfHwgVG9hc3RpZnkuZGVmYXVsdHMucG9zaXRpb25MZWZ0OyAvLyB0b2FzdCBwb3NpdGlvbiAtIGxlZnQgb3IgcmlnaHRcbiAgICAgIHRoaXMub3B0aW9ucy5wb3NpdGlvbiA9IG9wdGlvbnMucG9zaXRpb24gfHwgVG9hc3RpZnkuZGVmYXVsdHMucG9zaXRpb247IC8vIHRvYXN0IHBvc2l0aW9uIC0gbGVmdCBvciByaWdodFxuICAgICAgdGhpcy5vcHRpb25zLmJhY2tncm91bmRDb2xvciA9IG9wdGlvbnMuYmFja2dyb3VuZENvbG9yIHx8IFRvYXN0aWZ5LmRlZmF1bHRzLmJhY2tncm91bmRDb2xvcjsgLy8gdG9hc3QgYmFja2dyb3VuZCBjb2xvclxuICAgICAgdGhpcy5vcHRpb25zLmF2YXRhciA9IG9wdGlvbnMuYXZhdGFyIHx8IFRvYXN0aWZ5LmRlZmF1bHRzLmF2YXRhcjsgLy8gaW1nIGVsZW1lbnQgc3JjIC0gdXJsIG9yIGEgcGF0aFxuICAgICAgdGhpcy5vcHRpb25zLmNsYXNzTmFtZSA9IG9wdGlvbnMuY2xhc3NOYW1lIHx8IFRvYXN0aWZ5LmRlZmF1bHRzLmNsYXNzTmFtZTsgLy8gYWRkaXRpb25hbCBjbGFzcyBuYW1lcyBmb3IgdGhlIHRvYXN0XG4gICAgICB0aGlzLm9wdGlvbnMuc3RvcE9uRm9jdXMgPSBvcHRpb25zLnN0b3BPbkZvY3VzID09PSB1bmRlZmluZWQgPyBUb2FzdGlmeS5kZWZhdWx0cy5zdG9wT25Gb2N1cyA6IG9wdGlvbnMuc3RvcE9uRm9jdXM7IC8vIHN0b3AgdGltZW91dCBvbiBmb2N1c1xuICAgICAgdGhpcy5vcHRpb25zLm9uQ2xpY2sgPSBvcHRpb25zLm9uQ2xpY2sgfHwgVG9hc3RpZnkuZGVmYXVsdHMub25DbGljazsgLy8gQ2FsbGJhY2sgYWZ0ZXIgY2xpY2tcbiAgICAgIHRoaXMub3B0aW9ucy5vZmZzZXQgPSBvcHRpb25zLm9mZnNldCB8fCBUb2FzdGlmeS5kZWZhdWx0cy5vZmZzZXQ7IC8vIHRvYXN0IG9mZnNldFxuICAgICAgdGhpcy5vcHRpb25zLmVzY2FwZU1hcmt1cCA9IG9wdGlvbnMuZXNjYXBlTWFya3VwICE9PSB1bmRlZmluZWQgPyBvcHRpb25zLmVzY2FwZU1hcmt1cCA6IFRvYXN0aWZ5LmRlZmF1bHRzLmVzY2FwZU1hcmt1cDtcbiAgICAgIHRoaXMub3B0aW9ucy5zdHlsZSA9IG9wdGlvbnMuc3R5bGUgfHwgVG9hc3RpZnkuZGVmYXVsdHMuc3R5bGU7XG4gICAgICBpZihvcHRpb25zLmJhY2tncm91bmRDb2xvcikge1xuICAgICAgICB0aGlzLm9wdGlvbnMuc3R5bGUuYmFja2dyb3VuZCA9IG9wdGlvbnMuYmFja2dyb3VuZENvbG9yO1xuICAgICAgfVxuXG4gICAgICAvLyBSZXR1cm5pbmcgdGhlIGN1cnJlbnQgb2JqZWN0IGZvciBjaGFpbmluZyBmdW5jdGlvbnNcbiAgICAgIHJldHVybiB0aGlzO1xuICAgIH0sXG5cbiAgICAvLyBCdWlsZGluZyB0aGUgRE9NIGVsZW1lbnRcbiAgICBidWlsZFRvYXN0OiBmdW5jdGlvbigpIHtcbiAgICAgIC8vIFZhbGlkYXRpbmcgaWYgdGhlIG9wdGlvbnMgYXJlIGRlZmluZWRcbiAgICAgIGlmICghdGhpcy5vcHRpb25zKSB7XG4gICAgICAgIHRocm93IFwiVG9hc3RpZnkgaXMgbm90IGluaXRpYWxpemVkXCI7XG4gICAgICB9XG5cbiAgICAgIC8vIENyZWF0aW5nIHRoZSBET00gb2JqZWN0XG4gICAgICB2YXIgZGl2RWxlbWVudCA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoXCJkaXZcIik7XG4gICAgICBkaXZFbGVtZW50LmNsYXNzTmFtZSA9IFwidG9hc3RpZnkgb24gXCIgKyB0aGlzLm9wdGlvbnMuY2xhc3NOYW1lO1xuXG4gICAgICAvLyBQb3NpdGlvbmluZyB0b2FzdCB0byBsZWZ0IG9yIHJpZ2h0IG9yIGNlbnRlclxuICAgICAgaWYgKCEhdGhpcy5vcHRpb25zLnBvc2l0aW9uKSB7XG4gICAgICAgIGRpdkVsZW1lbnQuY2xhc3NOYW1lICs9IFwiIHRvYXN0aWZ5LVwiICsgdGhpcy5vcHRpb25zLnBvc2l0aW9uO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgLy8gVG8gYmUgZGVwcmVjaWF0ZWQgaW4gZnVydGhlciB2ZXJzaW9uc1xuICAgICAgICBpZiAodGhpcy5vcHRpb25zLnBvc2l0aW9uTGVmdCA9PT0gdHJ1ZSkge1xuICAgICAgICAgIGRpdkVsZW1lbnQuY2xhc3NOYW1lICs9IFwiIHRvYXN0aWZ5LWxlZnRcIjtcbiAgICAgICAgICBjb25zb2xlLndhcm4oJ1Byb3BlcnR5IGBwb3NpdGlvbkxlZnRgIHdpbGwgYmUgZGVwcmVjaWF0ZWQgaW4gZnVydGhlciB2ZXJzaW9ucy4gUGxlYXNlIHVzZSBgcG9zaXRpb25gIGluc3RlYWQuJylcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAvLyBEZWZhdWx0IHBvc2l0aW9uXG4gICAgICAgICAgZGl2RWxlbWVudC5jbGFzc05hbWUgKz0gXCIgdG9hc3RpZnktcmlnaHRcIjtcbiAgICAgICAgfVxuICAgICAgfVxuXG4gICAgICAvLyBBc3NpZ25pbmcgZ3Jhdml0eSBvZiBlbGVtZW50XG4gICAgICBkaXZFbGVtZW50LmNsYXNzTmFtZSArPSBcIiBcIiArIHRoaXMub3B0aW9ucy5ncmF2aXR5O1xuXG4gICAgICBpZiAodGhpcy5vcHRpb25zLmJhY2tncm91bmRDb2xvcikge1xuICAgICAgICAvLyBUaGlzIGlzIGJlaW5nIGRlcHJlY2F0ZWQgaW4gZmF2b3Igb2YgdXNpbmcgdGhlIHN0eWxlIEhUTUwgRE9NIHByb3BlcnR5XG4gICAgICAgIGNvbnNvbGUud2FybignREVQUkVDQVRJT04gTk9USUNFOiBcImJhY2tncm91bmRDb2xvclwiIGlzIGJlaW5nIGRlcHJlY2F0ZWQuIFBsZWFzZSB1c2UgdGhlIFwic3R5bGUuYmFja2dyb3VuZFwiIHByb3BlcnR5LicpO1xuICAgICAgfVxuXG4gICAgICAvLyBMb29wIHRocm91Z2ggb3VyIHN0eWxlIG9iamVjdCBhbmQgYXBwbHkgc3R5bGVzIHRvIGRpdkVsZW1lbnRcbiAgICAgIGZvciAodmFyIHByb3BlcnR5IGluIHRoaXMub3B0aW9ucy5zdHlsZSkge1xuICAgICAgICBkaXZFbGVtZW50LnN0eWxlW3Byb3BlcnR5XSA9IHRoaXMub3B0aW9ucy5zdHlsZVtwcm9wZXJ0eV07XG4gICAgICB9XG5cbiAgICAgIC8vIEFkZGluZyB0aGUgdG9hc3QgbWVzc2FnZS9ub2RlXG4gICAgICBpZiAodGhpcy5vcHRpb25zLm5vZGUgJiYgdGhpcy5vcHRpb25zLm5vZGUubm9kZVR5cGUgPT09IE5vZGUuRUxFTUVOVF9OT0RFKSB7XG4gICAgICAgIC8vIElmIHdlIGhhdmUgYSB2YWxpZCBub2RlLCB3ZSBpbnNlcnQgaXRcbiAgICAgICAgZGl2RWxlbWVudC5hcHBlbmRDaGlsZCh0aGlzLm9wdGlvbnMubm9kZSlcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIGlmICh0aGlzLm9wdGlvbnMuZXNjYXBlTWFya3VwKSB7XG4gICAgICAgICAgZGl2RWxlbWVudC5pbm5lclRleHQgPSB0aGlzLm9wdGlvbnMudGV4dDtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICBkaXZFbGVtZW50LmlubmVySFRNTCA9IHRoaXMub3B0aW9ucy50ZXh0O1xuICAgICAgICB9XG5cbiAgICAgICAgaWYgKHRoaXMub3B0aW9ucy5hdmF0YXIgIT09IFwiXCIpIHtcbiAgICAgICAgICB2YXIgYXZhdGFyRWxlbWVudCA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoXCJpbWdcIik7XG4gICAgICAgICAgYXZhdGFyRWxlbWVudC5zcmMgPSB0aGlzLm9wdGlvbnMuYXZhdGFyO1xuXG4gICAgICAgICAgYXZhdGFyRWxlbWVudC5jbGFzc05hbWUgPSBcInRvYXN0aWZ5LWF2YXRhclwiO1xuXG4gICAgICAgICAgaWYgKHRoaXMub3B0aW9ucy5wb3NpdGlvbiA9PSBcImxlZnRcIiB8fCB0aGlzLm9wdGlvbnMucG9zaXRpb25MZWZ0ID09PSB0cnVlKSB7XG4gICAgICAgICAgICAvLyBBZGRpbmcgY2xvc2UgaWNvbiBvbiB0aGUgbGVmdCBvZiBjb250ZW50XG4gICAgICAgICAgICBkaXZFbGVtZW50LmFwcGVuZENoaWxkKGF2YXRhckVsZW1lbnQpO1xuICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAvLyBBZGRpbmcgY2xvc2UgaWNvbiBvbiB0aGUgcmlnaHQgb2YgY29udGVudFxuICAgICAgICAgICAgZGl2RWxlbWVudC5pbnNlcnRBZGphY2VudEVsZW1lbnQoXCJhZnRlcmJlZ2luXCIsIGF2YXRhckVsZW1lbnQpO1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgfVxuXG4gICAgICAvLyBBZGRpbmcgYSBjbG9zZSBpY29uIHRvIHRoZSB0b2FzdFxuICAgICAgaWYgKHRoaXMub3B0aW9ucy5jbG9zZSA9PT0gdHJ1ZSkge1xuICAgICAgICAvLyBDcmVhdGUgYSBzcGFuIGZvciBjbG9zZSBlbGVtZW50XG4gICAgICAgIHZhciBjbG9zZUVsZW1lbnQgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KFwic3BhblwiKTtcbiAgICAgICAgY2xvc2VFbGVtZW50LmlubmVySFRNTCA9IFwiJiMxMDAwNjtcIjtcblxuICAgICAgICBjbG9zZUVsZW1lbnQuY2xhc3NOYW1lID0gXCJ0b2FzdC1jbG9zZVwiO1xuXG4gICAgICAgIC8vIFRyaWdnZXJpbmcgdGhlIHJlbW92YWwgb2YgdG9hc3QgZnJvbSBET00gb24gY2xvc2UgY2xpY2tcbiAgICAgICAgY2xvc2VFbGVtZW50LmFkZEV2ZW50TGlzdGVuZXIoXG4gICAgICAgICAgXCJjbGlja1wiLFxuICAgICAgICAgIGZ1bmN0aW9uKGV2ZW50KSB7XG4gICAgICAgICAgICBldmVudC5zdG9wUHJvcGFnYXRpb24oKTtcbiAgICAgICAgICAgIHRoaXMucmVtb3ZlRWxlbWVudCh0aGlzLnRvYXN0RWxlbWVudCk7XG4gICAgICAgICAgICB3aW5kb3cuY2xlYXJUaW1lb3V0KHRoaXMudG9hc3RFbGVtZW50LnRpbWVPdXRWYWx1ZSk7XG4gICAgICAgICAgfS5iaW5kKHRoaXMpXG4gICAgICAgICk7XG5cbiAgICAgICAgLy9DYWxjdWxhdGluZyBzY3JlZW4gd2lkdGhcbiAgICAgICAgdmFyIHdpZHRoID0gd2luZG93LmlubmVyV2lkdGggPiAwID8gd2luZG93LmlubmVyV2lkdGggOiBzY3JlZW4ud2lkdGg7XG5cbiAgICAgICAgLy8gQWRkaW5nIHRoZSBjbG9zZSBpY29uIHRvIHRoZSB0b2FzdCBlbGVtZW50XG4gICAgICAgIC8vIERpc3BsYXkgb24gdGhlIHJpZ2h0IGlmIHNjcmVlbiB3aWR0aCBpcyBsZXNzIHRoYW4gb3IgZXF1YWwgdG8gMzYwcHhcbiAgICAgICAgaWYgKCh0aGlzLm9wdGlvbnMucG9zaXRpb24gPT0gXCJsZWZ0XCIgfHwgdGhpcy5vcHRpb25zLnBvc2l0aW9uTGVmdCA9PT0gdHJ1ZSkgJiYgd2lkdGggPiAzNjApIHtcbiAgICAgICAgICAvLyBBZGRpbmcgY2xvc2UgaWNvbiBvbiB0aGUgbGVmdCBvZiBjb250ZW50XG4gICAgICAgICAgZGl2RWxlbWVudC5pbnNlcnRBZGphY2VudEVsZW1lbnQoXCJhZnRlcmJlZ2luXCIsIGNsb3NlRWxlbWVudCk7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgLy8gQWRkaW5nIGNsb3NlIGljb24gb24gdGhlIHJpZ2h0IG9mIGNvbnRlbnRcbiAgICAgICAgICBkaXZFbGVtZW50LmFwcGVuZENoaWxkKGNsb3NlRWxlbWVudCk7XG4gICAgICAgIH1cbiAgICAgIH1cblxuICAgICAgLy8gQ2xlYXIgdGltZW91dCB3aGlsZSB0b2FzdCBpcyBmb2N1c2VkXG4gICAgICBpZiAodGhpcy5vcHRpb25zLnN0b3BPbkZvY3VzICYmIHRoaXMub3B0aW9ucy5kdXJhdGlvbiA+IDApIHtcbiAgICAgICAgdmFyIHNlbGYgPSB0aGlzO1xuICAgICAgICAvLyBzdG9wIGNvdW50ZG93blxuICAgICAgICBkaXZFbGVtZW50LmFkZEV2ZW50TGlzdGVuZXIoXG4gICAgICAgICAgXCJtb3VzZW92ZXJcIixcbiAgICAgICAgICBmdW5jdGlvbihldmVudCkge1xuICAgICAgICAgICAgd2luZG93LmNsZWFyVGltZW91dChkaXZFbGVtZW50LnRpbWVPdXRWYWx1ZSk7XG4gICAgICAgICAgfVxuICAgICAgICApXG4gICAgICAgIC8vIGFkZCBiYWNrIHRoZSB0aW1lb3V0XG4gICAgICAgIGRpdkVsZW1lbnQuYWRkRXZlbnRMaXN0ZW5lcihcbiAgICAgICAgICBcIm1vdXNlbGVhdmVcIixcbiAgICAgICAgICBmdW5jdGlvbigpIHtcbiAgICAgICAgICAgIGRpdkVsZW1lbnQudGltZU91dFZhbHVlID0gd2luZG93LnNldFRpbWVvdXQoXG4gICAgICAgICAgICAgIGZ1bmN0aW9uKCkge1xuICAgICAgICAgICAgICAgIC8vIFJlbW92ZSB0aGUgdG9hc3QgZnJvbSBET01cbiAgICAgICAgICAgICAgICBzZWxmLnJlbW92ZUVsZW1lbnQoZGl2RWxlbWVudCk7XG4gICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAgIHNlbGYub3B0aW9ucy5kdXJhdGlvblxuICAgICAgICAgICAgKVxuICAgICAgICAgIH1cbiAgICAgICAgKVxuICAgICAgfVxuXG4gICAgICAvLyBBZGRpbmcgYW4gb24tY2xpY2sgZGVzdGluYXRpb24gcGF0aFxuICAgICAgaWYgKHR5cGVvZiB0aGlzLm9wdGlvbnMuZGVzdGluYXRpb24gIT09IFwidW5kZWZpbmVkXCIpIHtcbiAgICAgICAgZGl2RWxlbWVudC5hZGRFdmVudExpc3RlbmVyKFxuICAgICAgICAgIFwiY2xpY2tcIixcbiAgICAgICAgICBmdW5jdGlvbihldmVudCkge1xuICAgICAgICAgICAgZXZlbnQuc3RvcFByb3BhZ2F0aW9uKCk7XG4gICAgICAgICAgICBpZiAodGhpcy5vcHRpb25zLm5ld1dpbmRvdyA9PT0gdHJ1ZSkge1xuICAgICAgICAgICAgICB3aW5kb3cub3Blbih0aGlzLm9wdGlvbnMuZGVzdGluYXRpb24sIFwiX2JsYW5rXCIpO1xuICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgd2luZG93LmxvY2F0aW9uID0gdGhpcy5vcHRpb25zLmRlc3RpbmF0aW9uO1xuICAgICAgICAgICAgfVxuICAgICAgICAgIH0uYmluZCh0aGlzKVxuICAgICAgICApO1xuICAgICAgfVxuXG4gICAgICBpZiAodHlwZW9mIHRoaXMub3B0aW9ucy5vbkNsaWNrID09PSBcImZ1bmN0aW9uXCIgJiYgdHlwZW9mIHRoaXMub3B0aW9ucy5kZXN0aW5hdGlvbiA9PT0gXCJ1bmRlZmluZWRcIikge1xuICAgICAgICBkaXZFbGVtZW50LmFkZEV2ZW50TGlzdGVuZXIoXG4gICAgICAgICAgXCJjbGlja1wiLFxuICAgICAgICAgIGZ1bmN0aW9uKGV2ZW50KSB7XG4gICAgICAgICAgICBldmVudC5zdG9wUHJvcGFnYXRpb24oKTtcbiAgICAgICAgICAgIHRoaXMub3B0aW9ucy5vbkNsaWNrKCk7XG4gICAgICAgICAgfS5iaW5kKHRoaXMpXG4gICAgICAgICk7XG4gICAgICB9XG5cbiAgICAgIC8vIEFkZGluZyBvZmZzZXRcbiAgICAgIGlmKHR5cGVvZiB0aGlzLm9wdGlvbnMub2Zmc2V0ID09PSBcIm9iamVjdFwiKSB7XG5cbiAgICAgICAgdmFyIHggPSBnZXRBeGlzT2Zmc2V0QVZhbHVlKFwieFwiLCB0aGlzLm9wdGlvbnMpO1xuICAgICAgICB2YXIgeSA9IGdldEF4aXNPZmZzZXRBVmFsdWUoXCJ5XCIsIHRoaXMub3B0aW9ucyk7XG5cbiAgICAgICAgdmFyIHhPZmZzZXQgPSB0aGlzLm9wdGlvbnMucG9zaXRpb24gPT0gXCJsZWZ0XCIgPyB4IDogXCItXCIgKyB4O1xuICAgICAgICB2YXIgeU9mZnNldCA9IHRoaXMub3B0aW9ucy5ncmF2aXR5ID09IFwidG9hc3RpZnktdG9wXCIgPyB5IDogXCItXCIgKyB5O1xuXG4gICAgICAgIGRpdkVsZW1lbnQuc3R5bGUudHJhbnNmb3JtID0gXCJ0cmFuc2xhdGUoXCIgKyB4T2Zmc2V0ICsgXCIsXCIgKyB5T2Zmc2V0ICsgXCIpXCI7XG5cbiAgICAgIH1cblxuICAgICAgLy8gUmV0dXJuaW5nIHRoZSBnZW5lcmF0ZWQgZWxlbWVudFxuICAgICAgcmV0dXJuIGRpdkVsZW1lbnQ7XG4gICAgfSxcblxuICAgIC8vIERpc3BsYXlpbmcgdGhlIHRvYXN0XG4gICAgc2hvd1RvYXN0OiBmdW5jdGlvbigpIHtcbiAgICAgIC8vIENyZWF0aW5nIHRoZSBET00gb2JqZWN0IGZvciB0aGUgdG9hc3RcbiAgICAgIHRoaXMudG9hc3RFbGVtZW50ID0gdGhpcy5idWlsZFRvYXN0KCk7XG5cbiAgICAgIC8vIEdldHRpbmcgdGhlIHJvb3QgZWxlbWVudCB0byB3aXRoIHRoZSB0b2FzdCBuZWVkcyB0byBiZSBhZGRlZFxuICAgICAgdmFyIHJvb3RFbGVtZW50O1xuICAgICAgaWYgKHR5cGVvZiB0aGlzLm9wdGlvbnMuc2VsZWN0b3IgPT09IFwic3RyaW5nXCIpIHtcbiAgICAgICAgcm9vdEVsZW1lbnQgPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCh0aGlzLm9wdGlvbnMuc2VsZWN0b3IpO1xuICAgICAgfSBlbHNlIGlmICh0aGlzLm9wdGlvbnMuc2VsZWN0b3IgaW5zdGFuY2VvZiBIVE1MRWxlbWVudCB8fCAodHlwZW9mIFNoYWRvd1Jvb3QgIT09ICd1bmRlZmluZWQnICYmIHRoaXMub3B0aW9ucy5zZWxlY3RvciBpbnN0YW5jZW9mIFNoYWRvd1Jvb3QpKSB7XG4gICAgICAgIHJvb3RFbGVtZW50ID0gdGhpcy5vcHRpb25zLnNlbGVjdG9yO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgcm9vdEVsZW1lbnQgPSBkb2N1bWVudC5ib2R5O1xuICAgICAgfVxuXG4gICAgICAvLyBWYWxpZGF0aW5nIGlmIHJvb3QgZWxlbWVudCBpcyBwcmVzZW50IGluIERPTVxuICAgICAgaWYgKCFyb290RWxlbWVudCkge1xuICAgICAgICB0aHJvdyBcIlJvb3QgZWxlbWVudCBpcyBub3QgZGVmaW5lZFwiO1xuICAgICAgfVxuXG4gICAgICAvLyBBZGRpbmcgdGhlIERPTSBlbGVtZW50XG4gICAgICB2YXIgZWxlbWVudFRvSW5zZXJ0ID0gVG9hc3RpZnkuZGVmYXVsdHMub2xkZXN0Rmlyc3QgPyByb290RWxlbWVudC5maXJzdENoaWxkIDogcm9vdEVsZW1lbnQubGFzdENoaWxkO1xuICAgICAgcm9vdEVsZW1lbnQuaW5zZXJ0QmVmb3JlKHRoaXMudG9hc3RFbGVtZW50LCBlbGVtZW50VG9JbnNlcnQpO1xuXG4gICAgICAvLyBSZXBvc2l0aW9uaW5nIHRoZSB0b2FzdHMgaW4gY2FzZSBtdWx0aXBsZSB0b2FzdHMgYXJlIHByZXNlbnRcbiAgICAgIFRvYXN0aWZ5LnJlcG9zaXRpb24oKTtcblxuICAgICAgaWYgKHRoaXMub3B0aW9ucy5kdXJhdGlvbiA+IDApIHtcbiAgICAgICAgdGhpcy50b2FzdEVsZW1lbnQudGltZU91dFZhbHVlID0gd2luZG93LnNldFRpbWVvdXQoXG4gICAgICAgICAgZnVuY3Rpb24oKSB7XG4gICAgICAgICAgICAvLyBSZW1vdmUgdGhlIHRvYXN0IGZyb20gRE9NXG4gICAgICAgICAgICB0aGlzLnJlbW92ZUVsZW1lbnQodGhpcy50b2FzdEVsZW1lbnQpO1xuICAgICAgICAgIH0uYmluZCh0aGlzKSxcbiAgICAgICAgICB0aGlzLm9wdGlvbnMuZHVyYXRpb25cbiAgICAgICAgKTsgLy8gQmluZGluZyBgdGhpc2AgZm9yIGZ1bmN0aW9uIGludm9jYXRpb25cbiAgICAgIH1cblxuICAgICAgLy8gU3VwcG9ydGluZyBmdW5jdGlvbiBjaGFpbmluZ1xuICAgICAgcmV0dXJuIHRoaXM7XG4gICAgfSxcblxuICAgIGhpZGVUb2FzdDogZnVuY3Rpb24oKSB7XG4gICAgICBpZiAodGhpcy50b2FzdEVsZW1lbnQudGltZU91dFZhbHVlKSB7XG4gICAgICAgIGNsZWFyVGltZW91dCh0aGlzLnRvYXN0RWxlbWVudC50aW1lT3V0VmFsdWUpO1xuICAgICAgfVxuICAgICAgdGhpcy5yZW1vdmVFbGVtZW50KHRoaXMudG9hc3RFbGVtZW50KTtcbiAgICB9LFxuXG4gICAgLy8gUmVtb3ZpbmcgdGhlIGVsZW1lbnQgZnJvbSB0aGUgRE9NXG4gICAgcmVtb3ZlRWxlbWVudDogZnVuY3Rpb24odG9hc3RFbGVtZW50KSB7XG4gICAgICAvLyBIaWRpbmcgdGhlIGVsZW1lbnRcbiAgICAgIC8vIHRvYXN0RWxlbWVudC5jbGFzc0xpc3QucmVtb3ZlKFwib25cIik7XG4gICAgICB0b2FzdEVsZW1lbnQuY2xhc3NOYW1lID0gdG9hc3RFbGVtZW50LmNsYXNzTmFtZS5yZXBsYWNlKFwiIG9uXCIsIFwiXCIpO1xuXG4gICAgICAvLyBSZW1vdmluZyB0aGUgZWxlbWVudCBmcm9tIERPTSBhZnRlciB0cmFuc2l0aW9uIGVuZFxuICAgICAgd2luZG93LnNldFRpbWVvdXQoXG4gICAgICAgIGZ1bmN0aW9uKCkge1xuICAgICAgICAgIC8vIHJlbW92ZSBvcHRpb25zIG5vZGUgaWYgYW55XG4gICAgICAgICAgaWYgKHRoaXMub3B0aW9ucy5ub2RlICYmIHRoaXMub3B0aW9ucy5ub2RlLnBhcmVudE5vZGUpIHtcbiAgICAgICAgICAgIHRoaXMub3B0aW9ucy5ub2RlLnBhcmVudE5vZGUucmVtb3ZlQ2hpbGQodGhpcy5vcHRpb25zLm5vZGUpO1xuICAgICAgICAgIH1cblxuICAgICAgICAgIC8vIFJlbW92ZSB0aGUgZWxlbWVudCBmcm9tIHRoZSBET00sIG9ubHkgd2hlbiB0aGUgcGFyZW50IG5vZGUgd2FzIG5vdCByZW1vdmVkIGJlZm9yZS5cbiAgICAgICAgICBpZiAodG9hc3RFbGVtZW50LnBhcmVudE5vZGUpIHtcbiAgICAgICAgICAgIHRvYXN0RWxlbWVudC5wYXJlbnROb2RlLnJlbW92ZUNoaWxkKHRvYXN0RWxlbWVudCk7XG4gICAgICAgICAgfVxuXG4gICAgICAgICAgLy8gQ2FsbGluZyB0aGUgY2FsbGJhY2sgZnVuY3Rpb25cbiAgICAgICAgICB0aGlzLm9wdGlvbnMuY2FsbGJhY2suY2FsbCh0b2FzdEVsZW1lbnQpO1xuXG4gICAgICAgICAgLy8gUmVwb3NpdGlvbmluZyB0aGUgdG9hc3RzIGFnYWluXG4gICAgICAgICAgVG9hc3RpZnkucmVwb3NpdGlvbigpO1xuICAgICAgICB9LmJpbmQodGhpcyksXG4gICAgICAgIDQwMFxuICAgICAgKTsgLy8gQmluZGluZyBgdGhpc2AgZm9yIGZ1bmN0aW9uIGludm9jYXRpb25cbiAgICB9LFxuICB9O1xuXG4gIC8vIFBvc2l0aW9uaW5nIHRoZSB0b2FzdHMgb24gdGhlIERPTVxuICBUb2FzdGlmeS5yZXBvc2l0aW9uID0gZnVuY3Rpb24oKSB7XG5cbiAgICAvLyBUb3AgbWFyZ2lucyB3aXRoIGdyYXZpdHlcbiAgICB2YXIgdG9wTGVmdE9mZnNldFNpemUgPSB7XG4gICAgICB0b3A6IDE1LFxuICAgICAgYm90dG9tOiAxNSxcbiAgICB9O1xuICAgIHZhciB0b3BSaWdodE9mZnNldFNpemUgPSB7XG4gICAgICB0b3A6IDE1LFxuICAgICAgYm90dG9tOiAxNSxcbiAgICB9O1xuICAgIHZhciBvZmZzZXRTaXplID0ge1xuICAgICAgdG9wOiAxNSxcbiAgICAgIGJvdHRvbTogMTUsXG4gICAgfTtcblxuICAgIC8vIEdldCBhbGwgdG9hc3QgbWVzc2FnZXMgb24gdGhlIERPTVxuICAgIHZhciBhbGxUb2FzdHMgPSBkb2N1bWVudC5nZXRFbGVtZW50c0J5Q2xhc3NOYW1lKFwidG9hc3RpZnlcIik7XG5cbiAgICB2YXIgY2xhc3NVc2VkO1xuXG4gICAgLy8gTW9kaWZ5aW5nIHRoZSBwb3NpdGlvbiBvZiBlYWNoIHRvYXN0IGVsZW1lbnRcbiAgICBmb3IgKHZhciBpID0gMDsgaSA8IGFsbFRvYXN0cy5sZW5ndGg7IGkrKykge1xuICAgICAgLy8gR2V0dGluZyB0aGUgYXBwbGllZCBncmF2aXR5XG4gICAgICBpZiAoY29udGFpbnNDbGFzcyhhbGxUb2FzdHNbaV0sIFwidG9hc3RpZnktdG9wXCIpID09PSB0cnVlKSB7XG4gICAgICAgIGNsYXNzVXNlZCA9IFwidG9hc3RpZnktdG9wXCI7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBjbGFzc1VzZWQgPSBcInRvYXN0aWZ5LWJvdHRvbVwiO1xuICAgICAgfVxuXG4gICAgICB2YXIgaGVpZ2h0ID0gYWxsVG9hc3RzW2ldLm9mZnNldEhlaWdodDtcbiAgICAgIGNsYXNzVXNlZCA9IGNsYXNzVXNlZC5zdWJzdHIoOSwgY2xhc3NVc2VkLmxlbmd0aC0xKVxuICAgICAgLy8gU3BhY2luZyBiZXR3ZWVuIHRvYXN0c1xuICAgICAgdmFyIG9mZnNldCA9IDE1O1xuXG4gICAgICB2YXIgd2lkdGggPSB3aW5kb3cuaW5uZXJXaWR0aCA+IDAgPyB3aW5kb3cuaW5uZXJXaWR0aCA6IHNjcmVlbi53aWR0aDtcblxuICAgICAgLy8gU2hvdyB0b2FzdCBpbiBjZW50ZXIgaWYgc2NyZWVuIHdpdGggbGVzcyB0aGFuIG9yIGVxdWFsIHRvIDM2MHB4XG4gICAgICBpZiAod2lkdGggPD0gMzYwKSB7XG4gICAgICAgIC8vIFNldHRpbmcgdGhlIHBvc2l0aW9uXG4gICAgICAgIGFsbFRvYXN0c1tpXS5zdHlsZVtjbGFzc1VzZWRdID0gb2Zmc2V0U2l6ZVtjbGFzc1VzZWRdICsgXCJweFwiO1xuXG4gICAgICAgIG9mZnNldFNpemVbY2xhc3NVc2VkXSArPSBoZWlnaHQgKyBvZmZzZXQ7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBpZiAoY29udGFpbnNDbGFzcyhhbGxUb2FzdHNbaV0sIFwidG9hc3RpZnktbGVmdFwiKSA9PT0gdHJ1ZSkge1xuICAgICAgICAgIC8vIFNldHRpbmcgdGhlIHBvc2l0aW9uXG4gICAgICAgICAgYWxsVG9hc3RzW2ldLnN0eWxlW2NsYXNzVXNlZF0gPSB0b3BMZWZ0T2Zmc2V0U2l6ZVtjbGFzc1VzZWRdICsgXCJweFwiO1xuXG4gICAgICAgICAgdG9wTGVmdE9mZnNldFNpemVbY2xhc3NVc2VkXSArPSBoZWlnaHQgKyBvZmZzZXQ7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgLy8gU2V0dGluZyB0aGUgcG9zaXRpb25cbiAgICAgICAgICBhbGxUb2FzdHNbaV0uc3R5bGVbY2xhc3NVc2VkXSA9IHRvcFJpZ2h0T2Zmc2V0U2l6ZVtjbGFzc1VzZWRdICsgXCJweFwiO1xuXG4gICAgICAgICAgdG9wUmlnaHRPZmZzZXRTaXplW2NsYXNzVXNlZF0gKz0gaGVpZ2h0ICsgb2Zmc2V0O1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfVxuXG4gICAgLy8gU3VwcG9ydGluZyBmdW5jdGlvbiBjaGFpbmluZ1xuICAgIHJldHVybiB0aGlzO1xuICB9O1xuXG4gIC8vIEhlbHBlciBmdW5jdGlvbiB0byBnZXQgb2Zmc2V0LlxuICBmdW5jdGlvbiBnZXRBeGlzT2Zmc2V0QVZhbHVlKGF4aXMsIG9wdGlvbnMpIHtcblxuICAgIGlmKG9wdGlvbnMub2Zmc2V0W2F4aXNdKSB7XG4gICAgICBpZihpc05hTihvcHRpb25zLm9mZnNldFtheGlzXSkpIHtcbiAgICAgICAgcmV0dXJuIG9wdGlvbnMub2Zmc2V0W2F4aXNdO1xuICAgICAgfVxuICAgICAgZWxzZSB7XG4gICAgICAgIHJldHVybiBvcHRpb25zLm9mZnNldFtheGlzXSArICdweCc7XG4gICAgICB9XG4gICAgfVxuXG4gICAgcmV0dXJuICcwcHgnO1xuXG4gIH1cblxuICBmdW5jdGlvbiBjb250YWluc0NsYXNzKGVsZW0sIHlvdXJDbGFzcykge1xuICAgIGlmICghZWxlbSB8fCB0eXBlb2YgeW91ckNsYXNzICE9PSBcInN0cmluZ1wiKSB7XG4gICAgICByZXR1cm4gZmFsc2U7XG4gICAgfSBlbHNlIGlmIChcbiAgICAgIGVsZW0uY2xhc3NOYW1lICYmXG4gICAgICBlbGVtLmNsYXNzTmFtZVxuICAgICAgICAudHJpbSgpXG4gICAgICAgIC5zcGxpdCgvXFxzKy9naSlcbiAgICAgICAgLmluZGV4T2YoeW91ckNsYXNzKSA+IC0xXG4gICAgKSB7XG4gICAgICByZXR1cm4gdHJ1ZTtcbiAgICB9IGVsc2Uge1xuICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH1cbiAgfVxuXG4gIC8vIFNldHRpbmcgdXAgdGhlIHByb3RvdHlwZSBmb3IgdGhlIGluaXQgb2JqZWN0XG4gIFRvYXN0aWZ5LmxpYi5pbml0LnByb3RvdHlwZSA9IFRvYXN0aWZ5LmxpYjtcblxuICAvLyBSZXR1cm5pbmcgdGhlIFRvYXN0aWZ5IGZ1bmN0aW9uIHRvIGJlIGFzc2lnbmVkIHRvIHRoZSB3aW5kb3cgb2JqZWN0L21vZHVsZVxuICByZXR1cm4gVG9hc3RpZnk7XG59KTtcbiIsICIvKipcbiAqIEBsaWNlbnNlIE1JVFxuICogdG9wYmFyIDEuMC4wLCAyMDIxLTAxLTA2XG4gKiBodHRwOi8vYnV1bmd1eWVuLmdpdGh1Yi5pby90b3BiYXJcbiAqIENvcHlyaWdodCAoYykgMjAyMSBCdXUgTmd1eWVuXG4gKi9cbihmdW5jdGlvbih3aW5kb3csZG9jdW1lbnQpe1widXNlIHN0cmljdFwiOyFmdW5jdGlvbigpe2Zvcih2YXIgbGFzdFRpbWU9MCx2ZW5kb3JzPVtcIm1zXCIsXCJtb3pcIixcIndlYmtpdFwiLFwib1wiXSx4PTA7eDx2ZW5kb3JzLmxlbmd0aCYmIXdpbmRvdy5yZXF1ZXN0QW5pbWF0aW9uRnJhbWU7Kyt4KXdpbmRvdy5yZXF1ZXN0QW5pbWF0aW9uRnJhbWU9d2luZG93W3ZlbmRvcnNbeF0rXCJSZXF1ZXN0QW5pbWF0aW9uRnJhbWVcIl0sd2luZG93LmNhbmNlbEFuaW1hdGlvbkZyYW1lPXdpbmRvd1t2ZW5kb3JzW3hdK1wiQ2FuY2VsQW5pbWF0aW9uRnJhbWVcIl18fHdpbmRvd1t2ZW5kb3JzW3hdK1wiQ2FuY2VsUmVxdWVzdEFuaW1hdGlvbkZyYW1lXCJdO3dpbmRvdy5yZXF1ZXN0QW5pbWF0aW9uRnJhbWV8fCh3aW5kb3cucmVxdWVzdEFuaW1hdGlvbkZyYW1lPWZ1bmN0aW9uKGNhbGxiYWNrLGVsZW1lbnQpe3ZhciBjdXJyVGltZT0obmV3IERhdGUpLmdldFRpbWUoKSx0aW1lVG9DYWxsPU1hdGgubWF4KDAsMTYtKGN1cnJUaW1lLWxhc3RUaW1lKSksaWQ9d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXtjYWxsYmFjayhjdXJyVGltZSt0aW1lVG9DYWxsKX0sdGltZVRvQ2FsbCk7cmV0dXJuIGxhc3RUaW1lPWN1cnJUaW1lK3RpbWVUb0NhbGwsaWR9KSx3aW5kb3cuY2FuY2VsQW5pbWF0aW9uRnJhbWV8fCh3aW5kb3cuY2FuY2VsQW5pbWF0aW9uRnJhbWU9ZnVuY3Rpb24oaWQpe2NsZWFyVGltZW91dChpZCl9KX0oKTtmdW5jdGlvbiByZXBhaW50KCl7Y2FudmFzLndpZHRoPXdpbmRvdy5pbm5lcldpZHRoLGNhbnZhcy5oZWlnaHQ9NSpvcHRpb25zLmJhclRoaWNrbmVzczt2YXIgY3R4PWNhbnZhcy5nZXRDb250ZXh0KFwiMmRcIik7Y3R4LnNoYWRvd0JsdXI9b3B0aW9ucy5zaGFkb3dCbHVyLGN0eC5zaGFkb3dDb2xvcj1vcHRpb25zLnNoYWRvd0NvbG9yO3ZhciBzdG9wLGxpbmVHcmFkaWVudD1jdHguY3JlYXRlTGluZWFyR3JhZGllbnQoMCwwLGNhbnZhcy53aWR0aCwwKTtmb3Ioc3RvcCBpbiBvcHRpb25zLmJhckNvbG9ycylsaW5lR3JhZGllbnQuYWRkQ29sb3JTdG9wKHN0b3Asb3B0aW9ucy5iYXJDb2xvcnNbc3RvcF0pO2N0eC5saW5lV2lkdGg9b3B0aW9ucy5iYXJUaGlja25lc3MsY3R4LmJlZ2luUGF0aCgpLGN0eC5tb3ZlVG8oMCxvcHRpb25zLmJhclRoaWNrbmVzcy8yKSxjdHgubGluZVRvKE1hdGguY2VpbChjdXJyZW50UHJvZ3Jlc3MqY2FudmFzLndpZHRoKSxvcHRpb25zLmJhclRoaWNrbmVzcy8yKSxjdHguc3Ryb2tlU3R5bGU9bGluZUdyYWRpZW50LGN0eC5zdHJva2UoKX12YXIgY2FudmFzLHByb2dyZXNzVGltZXJJZCxmYWRlVGltZXJJZCxjdXJyZW50UHJvZ3Jlc3Msc2hvd2luZyxvcHRpb25zPXthdXRvUnVuOiEwLGJhclRoaWNrbmVzczozLGJhckNvbG9yczp7MDpcInJnYmEoMjYsICAxODgsIDE1NiwgLjkpXCIsXCIuMjVcIjpcInJnYmEoNTIsICAxNTIsIDIxOSwgLjkpXCIsXCIuNTBcIjpcInJnYmEoMjQxLCAxOTYsIDE1LCAgLjkpXCIsXCIuNzVcIjpcInJnYmEoMjMwLCAxMjYsIDM0LCAgLjkpXCIsXCIxLjBcIjpcInJnYmEoMjExLCA4NCwgIDAsICAgLjkpXCJ9LHNoYWRvd0JsdXI6MTAsc2hhZG93Q29sb3I6XCJyZ2JhKDAsICAgMCwgICAwLCAgIC42KVwiLGNsYXNzTmFtZTpudWxsfSx0b3BiYXI9e2NvbmZpZzpmdW5jdGlvbihvcHRzKXtmb3IodmFyIGtleSBpbiBvcHRzKW9wdGlvbnMuaGFzT3duUHJvcGVydHkoa2V5KSYmKG9wdGlvbnNba2V5XT1vcHRzW2tleV0pfSxzaG93OmZ1bmN0aW9uKCl7dmFyIHR5cGUsaGFuZGxlcixlbGVtO3Nob3dpbmd8fChzaG93aW5nPSEwLG51bGwhPT1mYWRlVGltZXJJZCYmd2luZG93LmNhbmNlbEFuaW1hdGlvbkZyYW1lKGZhZGVUaW1lcklkKSxjYW52YXN8fCgoZWxlbT0oY2FudmFzPWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoXCJjYW52YXNcIikpLnN0eWxlKS5wb3NpdGlvbj1cImZpeGVkXCIsZWxlbS50b3A9ZWxlbS5sZWZ0PWVsZW0ucmlnaHQ9ZWxlbS5tYXJnaW49ZWxlbS5wYWRkaW5nPTAsZWxlbS56SW5kZXg9MTAwMDAxLGVsZW0uZGlzcGxheT1cIm5vbmVcIixvcHRpb25zLmNsYXNzTmFtZSYmY2FudmFzLmNsYXNzTGlzdC5hZGQob3B0aW9ucy5jbGFzc05hbWUpLGRvY3VtZW50LmJvZHkuYXBwZW5kQ2hpbGQoY2FudmFzKSx0eXBlPVwicmVzaXplXCIsaGFuZGxlcj1yZXBhaW50LChlbGVtPXdpbmRvdykuYWRkRXZlbnRMaXN0ZW5lcj9lbGVtLmFkZEV2ZW50TGlzdGVuZXIodHlwZSxoYW5kbGVyLCExKTplbGVtLmF0dGFjaEV2ZW50P2VsZW0uYXR0YWNoRXZlbnQoXCJvblwiK3R5cGUsaGFuZGxlcik6ZWxlbVtcIm9uXCIrdHlwZV09aGFuZGxlciksY2FudmFzLnN0eWxlLm9wYWNpdHk9MSxjYW52YXMuc3R5bGUuZGlzcGxheT1cImJsb2NrXCIsdG9wYmFyLnByb2dyZXNzKDApLG9wdGlvbnMuYXV0b1J1biYmZnVuY3Rpb24gbG9vcCgpe3Byb2dyZXNzVGltZXJJZD13aW5kb3cucmVxdWVzdEFuaW1hdGlvbkZyYW1lKGxvb3ApLHRvcGJhci5wcm9ncmVzcyhcIitcIisuMDUqTWF0aC5wb3coMS1NYXRoLnNxcnQoY3VycmVudFByb2dyZXNzKSwyKSl9KCkpfSxwcm9ncmVzczpmdW5jdGlvbih0byl7cmV0dXJuIHZvaWQgMD09PXRvfHwoXCJzdHJpbmdcIj09dHlwZW9mIHRvJiYodG89KDA8PXRvLmluZGV4T2YoXCIrXCIpfHwwPD10by5pbmRleE9mKFwiLVwiKT9jdXJyZW50UHJvZ3Jlc3M6MCkrcGFyc2VGbG9hdCh0bykpLGN1cnJlbnRQcm9ncmVzcz0xPHRvPzE6dG8scmVwYWludCgpKSxjdXJyZW50UHJvZ3Jlc3N9LGhpZGU6ZnVuY3Rpb24oKXtzaG93aW5nJiYoc2hvd2luZz0hMSxudWxsIT1wcm9ncmVzc1RpbWVySWQmJih3aW5kb3cuY2FuY2VsQW5pbWF0aW9uRnJhbWUocHJvZ3Jlc3NUaW1lcklkKSxwcm9ncmVzc1RpbWVySWQ9bnVsbCksZnVuY3Rpb24gbG9vcCgpe3JldHVybiAxPD10b3BiYXIucHJvZ3Jlc3MoXCIrLjFcIikmJihjYW52YXMuc3R5bGUub3BhY2l0eS09LjA1LGNhbnZhcy5zdHlsZS5vcGFjaXR5PD0uMDUpPyhjYW52YXMuc3R5bGUuZGlzcGxheT1cIm5vbmVcIix2b2lkKGZhZGVUaW1lcklkPW51bGwpKTp2b2lkKGZhZGVUaW1lcklkPXdpbmRvdy5yZXF1ZXN0QW5pbWF0aW9uRnJhbWUobG9vcCkpfSgpKX19O1wib2JqZWN0XCI9PXR5cGVvZiBtb2R1bGUmJlwib2JqZWN0XCI9PXR5cGVvZiBtb2R1bGUuZXhwb3J0cz9tb2R1bGUuZXhwb3J0cz10b3BiYXI6XCJmdW5jdGlvblwiPT10eXBlb2YgZGVmaW5lJiZkZWZpbmUuYW1kP2RlZmluZShmdW5jdGlvbigpe3JldHVybiB0b3BiYXJ9KTp0aGlzLnRvcGJhcj10b3BiYXJ9KS5jYWxsKHRoaXMsd2luZG93LGRvY3VtZW50KTsiLCAiXCJ1c2Ugc3RyaWN0XCI7XG5cbihmdW5jdGlvbigpIHtcbiAgdmFyIFBvbHlmaWxsRXZlbnQgPSBldmVudENvbnN0cnVjdG9yKCk7XG5cbiAgZnVuY3Rpb24gZXZlbnRDb25zdHJ1Y3RvcigpIHtcbiAgICBpZiAodHlwZW9mIHdpbmRvdy5DdXN0b21FdmVudCA9PT0gXCJmdW5jdGlvblwiKSByZXR1cm4gd2luZG93LkN1c3RvbUV2ZW50O1xuICAgIC8vIElFPD05IFN1cHBvcnRcbiAgICBmdW5jdGlvbiBDdXN0b21FdmVudChldmVudCwgcGFyYW1zKSB7XG4gICAgICBwYXJhbXMgPSBwYXJhbXMgfHwge2J1YmJsZXM6IGZhbHNlLCBjYW5jZWxhYmxlOiBmYWxzZSwgZGV0YWlsOiB1bmRlZmluZWR9O1xuICAgICAgdmFyIGV2dCA9IGRvY3VtZW50LmNyZWF0ZUV2ZW50KCdDdXN0b21FdmVudCcpO1xuICAgICAgZXZ0LmluaXRDdXN0b21FdmVudChldmVudCwgcGFyYW1zLmJ1YmJsZXMsIHBhcmFtcy5jYW5jZWxhYmxlLCBwYXJhbXMuZGV0YWlsKTtcbiAgICAgIHJldHVybiBldnQ7XG4gICAgfVxuICAgIEN1c3RvbUV2ZW50LnByb3RvdHlwZSA9IHdpbmRvdy5FdmVudC5wcm90b3R5cGU7XG4gICAgcmV0dXJuIEN1c3RvbUV2ZW50O1xuICB9XG5cbiAgZnVuY3Rpb24gYnVpbGRIaWRkZW5JbnB1dChuYW1lLCB2YWx1ZSkge1xuICAgIHZhciBpbnB1dCA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoXCJpbnB1dFwiKTtcbiAgICBpbnB1dC50eXBlID0gXCJoaWRkZW5cIjtcbiAgICBpbnB1dC5uYW1lID0gbmFtZTtcbiAgICBpbnB1dC52YWx1ZSA9IHZhbHVlO1xuICAgIHJldHVybiBpbnB1dDtcbiAgfVxuXG4gIGZ1bmN0aW9uIGhhbmRsZUNsaWNrKGVsZW1lbnQsIHRhcmdldE1vZGlmaWVyS2V5KSB7XG4gICAgdmFyIHRvID0gZWxlbWVudC5nZXRBdHRyaWJ1dGUoXCJkYXRhLXRvXCIpLFxuICAgICAgICBtZXRob2QgPSBidWlsZEhpZGRlbklucHV0KFwiX21ldGhvZFwiLCBlbGVtZW50LmdldEF0dHJpYnV0ZShcImRhdGEtbWV0aG9kXCIpKSxcbiAgICAgICAgY3NyZiA9IGJ1aWxkSGlkZGVuSW5wdXQoXCJfY3NyZl90b2tlblwiLCBlbGVtZW50LmdldEF0dHJpYnV0ZShcImRhdGEtY3NyZlwiKSksXG4gICAgICAgIGZvcm0gPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KFwiZm9ybVwiKSxcbiAgICAgICAgc3VibWl0ID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudChcImlucHV0XCIpLFxuICAgICAgICB0YXJnZXQgPSBlbGVtZW50LmdldEF0dHJpYnV0ZShcInRhcmdldFwiKTtcblxuICAgIGZvcm0ubWV0aG9kID0gKGVsZW1lbnQuZ2V0QXR0cmlidXRlKFwiZGF0YS1tZXRob2RcIikgPT09IFwiZ2V0XCIpID8gXCJnZXRcIiA6IFwicG9zdFwiO1xuICAgIGZvcm0uYWN0aW9uID0gdG87XG4gICAgZm9ybS5zdHlsZS5kaXNwbGF5ID0gXCJub25lXCI7XG5cbiAgICBpZiAodGFyZ2V0KSBmb3JtLnRhcmdldCA9IHRhcmdldDtcbiAgICBlbHNlIGlmICh0YXJnZXRNb2RpZmllcktleSkgZm9ybS50YXJnZXQgPSBcIl9ibGFua1wiO1xuXG4gICAgZm9ybS5hcHBlbmRDaGlsZChjc3JmKTtcbiAgICBmb3JtLmFwcGVuZENoaWxkKG1ldGhvZCk7XG4gICAgZG9jdW1lbnQuYm9keS5hcHBlbmRDaGlsZChmb3JtKTtcblxuICAgIC8vIEluc2VydCBhIGJ1dHRvbiBhbmQgY2xpY2sgaXQgaW5zdGVhZCBvZiB1c2luZyBgZm9ybS5zdWJtaXRgXG4gICAgLy8gYmVjYXVzZSB0aGUgYHN1Ym1pdGAgZnVuY3Rpb24gZG9lcyBub3QgZW1pdCBhIGBzdWJtaXRgIGV2ZW50LlxuICAgIHN1Ym1pdC50eXBlID0gXCJzdWJtaXRcIjtcbiAgICBmb3JtLmFwcGVuZENoaWxkKHN1Ym1pdCk7XG4gICAgc3VibWl0LmNsaWNrKCk7XG4gIH1cblxuICB3aW5kb3cuYWRkRXZlbnRMaXN0ZW5lcihcImNsaWNrXCIsIGZ1bmN0aW9uKGUpIHtcbiAgICB2YXIgZWxlbWVudCA9IGUudGFyZ2V0O1xuICAgIGlmIChlLmRlZmF1bHRQcmV2ZW50ZWQpIHJldHVybjtcblxuICAgIHdoaWxlIChlbGVtZW50ICYmIGVsZW1lbnQuZ2V0QXR0cmlidXRlKSB7XG4gICAgICB2YXIgcGhvZW5peExpbmtFdmVudCA9IG5ldyBQb2x5ZmlsbEV2ZW50KCdwaG9lbml4LmxpbmsuY2xpY2snLCB7XG4gICAgICAgIFwiYnViYmxlc1wiOiB0cnVlLCBcImNhbmNlbGFibGVcIjogdHJ1ZVxuICAgICAgfSk7XG5cbiAgICAgIGlmICghZWxlbWVudC5kaXNwYXRjaEV2ZW50KHBob2VuaXhMaW5rRXZlbnQpKSB7XG4gICAgICAgIGUucHJldmVudERlZmF1bHQoKTtcbiAgICAgICAgZS5zdG9wSW1tZWRpYXRlUHJvcGFnYXRpb24oKTtcbiAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgfVxuXG4gICAgICBpZiAoZWxlbWVudC5nZXRBdHRyaWJ1dGUoXCJkYXRhLW1ldGhvZFwiKSAmJiBlbGVtZW50LmdldEF0dHJpYnV0ZShcImRhdGEtdG9cIikpIHtcbiAgICAgICAgaGFuZGxlQ2xpY2soZWxlbWVudCwgZS5tZXRhS2V5IHx8IGUuc2hpZnRLZXkpO1xuICAgICAgICBlLnByZXZlbnREZWZhdWx0KCk7XG4gICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIGVsZW1lbnQgPSBlbGVtZW50LnBhcmVudE5vZGU7XG4gICAgICB9XG4gICAgfVxuICB9LCBmYWxzZSk7XG5cbiAgd2luZG93LmFkZEV2ZW50TGlzdGVuZXIoJ3Bob2VuaXgubGluay5jbGljaycsIGZ1bmN0aW9uIChlKSB7XG4gICAgdmFyIG1lc3NhZ2UgPSBlLnRhcmdldC5nZXRBdHRyaWJ1dGUoXCJkYXRhLWNvbmZpcm1cIik7XG4gICAgaWYobWVzc2FnZSAmJiAhd2luZG93LmNvbmZpcm0obWVzc2FnZSkpIHtcbiAgICAgIGUucHJldmVudERlZmF1bHQoKTtcbiAgICB9XG4gIH0sIGZhbHNlKTtcbn0pKCk7XG4iLCAiLy8gd3JhcHMgdmFsdWUgaW4gY2xvc3VyZSBvciByZXR1cm5zIGNsb3N1cmVcbmV4cG9ydCBsZXQgY2xvc3VyZSA9ICh2YWx1ZSkgPT4ge1xuICBpZih0eXBlb2YgdmFsdWUgPT09IFwiZnVuY3Rpb25cIil7XG4gICAgcmV0dXJuIHZhbHVlXG4gIH0gZWxzZSB7XG4gICAgbGV0IGNsb3N1cmUgPSBmdW5jdGlvbiAoKXsgcmV0dXJuIHZhbHVlIH1cbiAgICByZXR1cm4gY2xvc3VyZVxuICB9XG59XG4iLCAiZXhwb3J0IGNvbnN0IGdsb2JhbFNlbGYgPSB0eXBlb2Ygc2VsZiAhPT0gXCJ1bmRlZmluZWRcIiA/IHNlbGYgOiBudWxsXG5leHBvcnQgY29uc3QgcGh4V2luZG93ID0gdHlwZW9mIHdpbmRvdyAhPT0gXCJ1bmRlZmluZWRcIiA/IHdpbmRvdyA6IG51bGxcbmV4cG9ydCBjb25zdCBnbG9iYWwgPSBnbG9iYWxTZWxmIHx8IHBoeFdpbmRvdyB8fCBnbG9iYWxUaGlzXG5leHBvcnQgY29uc3QgREVGQVVMVF9WU04gPSBcIjIuMC4wXCJcbmV4cG9ydCBjb25zdCBTT0NLRVRfU1RBVEVTID0ge2Nvbm5lY3Rpbmc6IDAsIG9wZW46IDEsIGNsb3Npbmc6IDIsIGNsb3NlZDogM31cbmV4cG9ydCBjb25zdCBERUZBVUxUX1RJTUVPVVQgPSAxMDAwMFxuZXhwb3J0IGNvbnN0IFdTX0NMT1NFX05PUk1BTCA9IDEwMDBcbmV4cG9ydCBjb25zdCBDSEFOTkVMX1NUQVRFUyA9IHtcbiAgY2xvc2VkOiBcImNsb3NlZFwiLFxuICBlcnJvcmVkOiBcImVycm9yZWRcIixcbiAgam9pbmVkOiBcImpvaW5lZFwiLFxuICBqb2luaW5nOiBcImpvaW5pbmdcIixcbiAgbGVhdmluZzogXCJsZWF2aW5nXCIsXG59XG5leHBvcnQgY29uc3QgQ0hBTk5FTF9FVkVOVFMgPSB7XG4gIGNsb3NlOiBcInBoeF9jbG9zZVwiLFxuICBlcnJvcjogXCJwaHhfZXJyb3JcIixcbiAgam9pbjogXCJwaHhfam9pblwiLFxuICByZXBseTogXCJwaHhfcmVwbHlcIixcbiAgbGVhdmU6IFwicGh4X2xlYXZlXCJcbn1cblxuZXhwb3J0IGNvbnN0IFRSQU5TUE9SVFMgPSB7XG4gIGxvbmdwb2xsOiBcImxvbmdwb2xsXCIsXG4gIHdlYnNvY2tldDogXCJ3ZWJzb2NrZXRcIlxufVxuZXhwb3J0IGNvbnN0IFhIUl9TVEFURVMgPSB7XG4gIGNvbXBsZXRlOiA0XG59XG5leHBvcnQgY29uc3QgQVVUSF9UT0tFTl9QUkVGSVggPSBcImJhc2U2NHVybC5iZWFyZXIucGh4LlwiXG4iLCAiLyoqXG4gKiBJbml0aWFsaXplcyB0aGUgUHVzaFxuICogQHBhcmFtIHtDaGFubmVsfSBjaGFubmVsIC0gVGhlIENoYW5uZWxcbiAqIEBwYXJhbSB7c3RyaW5nfSBldmVudCAtIFRoZSBldmVudCwgZm9yIGV4YW1wbGUgYFwicGh4X2pvaW5cImBcbiAqIEBwYXJhbSB7T2JqZWN0fSBwYXlsb2FkIC0gVGhlIHBheWxvYWQsIGZvciBleGFtcGxlIGB7dXNlcl9pZDogMTIzfWBcbiAqIEBwYXJhbSB7bnVtYmVyfSB0aW1lb3V0IC0gVGhlIHB1c2ggdGltZW91dCBpbiBtaWxsaXNlY29uZHNcbiAqL1xuZXhwb3J0IGRlZmF1bHQgY2xhc3MgUHVzaCB7XG4gIGNvbnN0cnVjdG9yKGNoYW5uZWwsIGV2ZW50LCBwYXlsb2FkLCB0aW1lb3V0KXtcbiAgICB0aGlzLmNoYW5uZWwgPSBjaGFubmVsXG4gICAgdGhpcy5ldmVudCA9IGV2ZW50XG4gICAgdGhpcy5wYXlsb2FkID0gcGF5bG9hZCB8fCBmdW5jdGlvbiAoKXsgcmV0dXJuIHt9IH1cbiAgICB0aGlzLnJlY2VpdmVkUmVzcCA9IG51bGxcbiAgICB0aGlzLnRpbWVvdXQgPSB0aW1lb3V0XG4gICAgdGhpcy50aW1lb3V0VGltZXIgPSBudWxsXG4gICAgdGhpcy5yZWNIb29rcyA9IFtdXG4gICAgdGhpcy5zZW50ID0gZmFsc2VcbiAgfVxuXG4gIC8qKlxuICAgKlxuICAgKiBAcGFyYW0ge251bWJlcn0gdGltZW91dFxuICAgKi9cbiAgcmVzZW5kKHRpbWVvdXQpe1xuICAgIHRoaXMudGltZW91dCA9IHRpbWVvdXRcbiAgICB0aGlzLnJlc2V0KClcbiAgICB0aGlzLnNlbmQoKVxuICB9XG5cbiAgLyoqXG4gICAqXG4gICAqL1xuICBzZW5kKCl7XG4gICAgaWYodGhpcy5oYXNSZWNlaXZlZChcInRpbWVvdXRcIikpeyByZXR1cm4gfVxuICAgIHRoaXMuc3RhcnRUaW1lb3V0KClcbiAgICB0aGlzLnNlbnQgPSB0cnVlXG4gICAgdGhpcy5jaGFubmVsLnNvY2tldC5wdXNoKHtcbiAgICAgIHRvcGljOiB0aGlzLmNoYW5uZWwudG9waWMsXG4gICAgICBldmVudDogdGhpcy5ldmVudCxcbiAgICAgIHBheWxvYWQ6IHRoaXMucGF5bG9hZCgpLFxuICAgICAgcmVmOiB0aGlzLnJlZixcbiAgICAgIGpvaW5fcmVmOiB0aGlzLmNoYW5uZWwuam9pblJlZigpXG4gICAgfSlcbiAgfVxuXG4gIC8qKlxuICAgKlxuICAgKiBAcGFyYW0geyp9IHN0YXR1c1xuICAgKiBAcGFyYW0geyp9IGNhbGxiYWNrXG4gICAqL1xuICByZWNlaXZlKHN0YXR1cywgY2FsbGJhY2spe1xuICAgIGlmKHRoaXMuaGFzUmVjZWl2ZWQoc3RhdHVzKSl7XG4gICAgICBjYWxsYmFjayh0aGlzLnJlY2VpdmVkUmVzcC5yZXNwb25zZSlcbiAgICB9XG5cbiAgICB0aGlzLnJlY0hvb2tzLnB1c2goe3N0YXR1cywgY2FsbGJhY2t9KVxuICAgIHJldHVybiB0aGlzXG4gIH1cblxuICAvKipcbiAgICogQHByaXZhdGVcbiAgICovXG4gIHJlc2V0KCl7XG4gICAgdGhpcy5jYW5jZWxSZWZFdmVudCgpXG4gICAgdGhpcy5yZWYgPSBudWxsXG4gICAgdGhpcy5yZWZFdmVudCA9IG51bGxcbiAgICB0aGlzLnJlY2VpdmVkUmVzcCA9IG51bGxcbiAgICB0aGlzLnNlbnQgPSBmYWxzZVxuICB9XG5cbiAgLyoqXG4gICAqIEBwcml2YXRlXG4gICAqL1xuICBtYXRjaFJlY2VpdmUoe3N0YXR1cywgcmVzcG9uc2UsIF9yZWZ9KXtcbiAgICB0aGlzLnJlY0hvb2tzLmZpbHRlcihoID0+IGguc3RhdHVzID09PSBzdGF0dXMpXG4gICAgICAuZm9yRWFjaChoID0+IGguY2FsbGJhY2socmVzcG9uc2UpKVxuICB9XG5cbiAgLyoqXG4gICAqIEBwcml2YXRlXG4gICAqL1xuICBjYW5jZWxSZWZFdmVudCgpe1xuICAgIGlmKCF0aGlzLnJlZkV2ZW50KXsgcmV0dXJuIH1cbiAgICB0aGlzLmNoYW5uZWwub2ZmKHRoaXMucmVmRXZlbnQpXG4gIH1cblxuICAvKipcbiAgICogQHByaXZhdGVcbiAgICovXG4gIGNhbmNlbFRpbWVvdXQoKXtcbiAgICBjbGVhclRpbWVvdXQodGhpcy50aW1lb3V0VGltZXIpXG4gICAgdGhpcy50aW1lb3V0VGltZXIgPSBudWxsXG4gIH1cblxuICAvKipcbiAgICogQHByaXZhdGVcbiAgICovXG4gIHN0YXJ0VGltZW91dCgpe1xuICAgIGlmKHRoaXMudGltZW91dFRpbWVyKXsgdGhpcy5jYW5jZWxUaW1lb3V0KCkgfVxuICAgIHRoaXMucmVmID0gdGhpcy5jaGFubmVsLnNvY2tldC5tYWtlUmVmKClcbiAgICB0aGlzLnJlZkV2ZW50ID0gdGhpcy5jaGFubmVsLnJlcGx5RXZlbnROYW1lKHRoaXMucmVmKVxuXG4gICAgdGhpcy5jaGFubmVsLm9uKHRoaXMucmVmRXZlbnQsIHBheWxvYWQgPT4ge1xuICAgICAgdGhpcy5jYW5jZWxSZWZFdmVudCgpXG4gICAgICB0aGlzLmNhbmNlbFRpbWVvdXQoKVxuICAgICAgdGhpcy5yZWNlaXZlZFJlc3AgPSBwYXlsb2FkXG4gICAgICB0aGlzLm1hdGNoUmVjZWl2ZShwYXlsb2FkKVxuICAgIH0pXG5cbiAgICB0aGlzLnRpbWVvdXRUaW1lciA9IHNldFRpbWVvdXQoKCkgPT4ge1xuICAgICAgdGhpcy50cmlnZ2VyKFwidGltZW91dFwiLCB7fSlcbiAgICB9LCB0aGlzLnRpbWVvdXQpXG4gIH1cblxuICAvKipcbiAgICogQHByaXZhdGVcbiAgICovXG4gIGhhc1JlY2VpdmVkKHN0YXR1cyl7XG4gICAgcmV0dXJuIHRoaXMucmVjZWl2ZWRSZXNwICYmIHRoaXMucmVjZWl2ZWRSZXNwLnN0YXR1cyA9PT0gc3RhdHVzXG4gIH1cblxuICAvKipcbiAgICogQHByaXZhdGVcbiAgICovXG4gIHRyaWdnZXIoc3RhdHVzLCByZXNwb25zZSl7XG4gICAgdGhpcy5jaGFubmVsLnRyaWdnZXIodGhpcy5yZWZFdmVudCwge3N0YXR1cywgcmVzcG9uc2V9KVxuICB9XG59XG4iLCAiLyoqXG4gKlxuICogQ3JlYXRlcyBhIHRpbWVyIHRoYXQgYWNjZXB0cyBhIGB0aW1lckNhbGNgIGZ1bmN0aW9uIHRvIHBlcmZvcm1cbiAqIGNhbGN1bGF0ZWQgdGltZW91dCByZXRyaWVzLCBzdWNoIGFzIGV4cG9uZW50aWFsIGJhY2tvZmYuXG4gKlxuICogQGV4YW1wbGVcbiAqIGxldCByZWNvbm5lY3RUaW1lciA9IG5ldyBUaW1lcigoKSA9PiB0aGlzLmNvbm5lY3QoKSwgZnVuY3Rpb24odHJpZXMpe1xuICogICByZXR1cm4gWzEwMDAsIDUwMDAsIDEwMDAwXVt0cmllcyAtIDFdIHx8IDEwMDAwXG4gKiB9KVxuICogcmVjb25uZWN0VGltZXIuc2NoZWR1bGVUaW1lb3V0KCkgLy8gZmlyZXMgYWZ0ZXIgMTAwMFxuICogcmVjb25uZWN0VGltZXIuc2NoZWR1bGVUaW1lb3V0KCkgLy8gZmlyZXMgYWZ0ZXIgNTAwMFxuICogcmVjb25uZWN0VGltZXIucmVzZXQoKVxuICogcmVjb25uZWN0VGltZXIuc2NoZWR1bGVUaW1lb3V0KCkgLy8gZmlyZXMgYWZ0ZXIgMTAwMFxuICpcbiAqIEBwYXJhbSB7RnVuY3Rpb259IGNhbGxiYWNrXG4gKiBAcGFyYW0ge0Z1bmN0aW9ufSB0aW1lckNhbGNcbiAqL1xuZXhwb3J0IGRlZmF1bHQgY2xhc3MgVGltZXIge1xuICBjb25zdHJ1Y3RvcihjYWxsYmFjaywgdGltZXJDYWxjKXtcbiAgICB0aGlzLmNhbGxiYWNrID0gY2FsbGJhY2tcbiAgICB0aGlzLnRpbWVyQ2FsYyA9IHRpbWVyQ2FsY1xuICAgIHRoaXMudGltZXIgPSBudWxsXG4gICAgdGhpcy50cmllcyA9IDBcbiAgfVxuXG4gIHJlc2V0KCl7XG4gICAgdGhpcy50cmllcyA9IDBcbiAgICBjbGVhclRpbWVvdXQodGhpcy50aW1lcilcbiAgfVxuXG4gIC8qKlxuICAgKiBDYW5jZWxzIGFueSBwcmV2aW91cyBzY2hlZHVsZVRpbWVvdXQgYW5kIHNjaGVkdWxlcyBjYWxsYmFja1xuICAgKi9cbiAgc2NoZWR1bGVUaW1lb3V0KCl7XG4gICAgY2xlYXJUaW1lb3V0KHRoaXMudGltZXIpXG5cbiAgICB0aGlzLnRpbWVyID0gc2V0VGltZW91dCgoKSA9PiB7XG4gICAgICB0aGlzLnRyaWVzID0gdGhpcy50cmllcyArIDFcbiAgICAgIHRoaXMuY2FsbGJhY2soKVxuICAgIH0sIHRoaXMudGltZXJDYWxjKHRoaXMudHJpZXMgKyAxKSlcbiAgfVxufVxuIiwgImltcG9ydCB7Y2xvc3VyZX0gZnJvbSBcIi4vdXRpbHNcIlxuaW1wb3J0IHtcbiAgQ0hBTk5FTF9FVkVOVFMsXG4gIENIQU5ORUxfU1RBVEVTLFxufSBmcm9tIFwiLi9jb25zdGFudHNcIlxuXG5pbXBvcnQgUHVzaCBmcm9tIFwiLi9wdXNoXCJcbmltcG9ydCBUaW1lciBmcm9tIFwiLi90aW1lclwiXG5cbi8qKlxuICpcbiAqIEBwYXJhbSB7c3RyaW5nfSB0b3BpY1xuICogQHBhcmFtIHsoT2JqZWN0fGZ1bmN0aW9uKX0gcGFyYW1zXG4gKiBAcGFyYW0ge1NvY2tldH0gc29ja2V0XG4gKi9cbmV4cG9ydCBkZWZhdWx0IGNsYXNzIENoYW5uZWwge1xuICBjb25zdHJ1Y3Rvcih0b3BpYywgcGFyYW1zLCBzb2NrZXQpe1xuICAgIHRoaXMuc3RhdGUgPSBDSEFOTkVMX1NUQVRFUy5jbG9zZWRcbiAgICB0aGlzLnRvcGljID0gdG9waWNcbiAgICB0aGlzLnBhcmFtcyA9IGNsb3N1cmUocGFyYW1zIHx8IHt9KVxuICAgIHRoaXMuc29ja2V0ID0gc29ja2V0XG4gICAgdGhpcy5iaW5kaW5ncyA9IFtdXG4gICAgdGhpcy5iaW5kaW5nUmVmID0gMFxuICAgIHRoaXMudGltZW91dCA9IHRoaXMuc29ja2V0LnRpbWVvdXRcbiAgICB0aGlzLmpvaW5lZE9uY2UgPSBmYWxzZVxuICAgIHRoaXMuam9pblB1c2ggPSBuZXcgUHVzaCh0aGlzLCBDSEFOTkVMX0VWRU5UUy5qb2luLCB0aGlzLnBhcmFtcywgdGhpcy50aW1lb3V0KVxuICAgIHRoaXMucHVzaEJ1ZmZlciA9IFtdXG4gICAgdGhpcy5zdGF0ZUNoYW5nZVJlZnMgPSBbXVxuXG4gICAgdGhpcy5yZWpvaW5UaW1lciA9IG5ldyBUaW1lcigoKSA9PiB7XG4gICAgICBpZih0aGlzLnNvY2tldC5pc0Nvbm5lY3RlZCgpKXsgdGhpcy5yZWpvaW4oKSB9XG4gICAgfSwgdGhpcy5zb2NrZXQucmVqb2luQWZ0ZXJNcylcbiAgICB0aGlzLnN0YXRlQ2hhbmdlUmVmcy5wdXNoKHRoaXMuc29ja2V0Lm9uRXJyb3IoKCkgPT4gdGhpcy5yZWpvaW5UaW1lci5yZXNldCgpKSlcbiAgICB0aGlzLnN0YXRlQ2hhbmdlUmVmcy5wdXNoKHRoaXMuc29ja2V0Lm9uT3BlbigoKSA9PiB7XG4gICAgICB0aGlzLnJlam9pblRpbWVyLnJlc2V0KClcbiAgICAgIGlmKHRoaXMuaXNFcnJvcmVkKCkpeyB0aGlzLnJlam9pbigpIH1cbiAgICB9KVxuICAgIClcbiAgICB0aGlzLmpvaW5QdXNoLnJlY2VpdmUoXCJva1wiLCAoKSA9PiB7XG4gICAgICB0aGlzLnN0YXRlID0gQ0hBTk5FTF9TVEFURVMuam9pbmVkXG4gICAgICB0aGlzLnJlam9pblRpbWVyLnJlc2V0KClcbiAgICAgIHRoaXMucHVzaEJ1ZmZlci5mb3JFYWNoKHB1c2hFdmVudCA9PiBwdXNoRXZlbnQuc2VuZCgpKVxuICAgICAgdGhpcy5wdXNoQnVmZmVyID0gW11cbiAgICB9KVxuICAgIHRoaXMuam9pblB1c2gucmVjZWl2ZShcImVycm9yXCIsICgpID0+IHtcbiAgICAgIHRoaXMuc3RhdGUgPSBDSEFOTkVMX1NUQVRFUy5lcnJvcmVkXG4gICAgICBpZih0aGlzLnNvY2tldC5pc0Nvbm5lY3RlZCgpKXsgdGhpcy5yZWpvaW5UaW1lci5zY2hlZHVsZVRpbWVvdXQoKSB9XG4gICAgfSlcbiAgICB0aGlzLm9uQ2xvc2UoKCkgPT4ge1xuICAgICAgdGhpcy5yZWpvaW5UaW1lci5yZXNldCgpXG4gICAgICBpZih0aGlzLnNvY2tldC5oYXNMb2dnZXIoKSkgdGhpcy5zb2NrZXQubG9nKFwiY2hhbm5lbFwiLCBgY2xvc2UgJHt0aGlzLnRvcGljfSAke3RoaXMuam9pblJlZigpfWApXG4gICAgICB0aGlzLnN0YXRlID0gQ0hBTk5FTF9TVEFURVMuY2xvc2VkXG4gICAgICB0aGlzLnNvY2tldC5yZW1vdmUodGhpcylcbiAgICB9KVxuICAgIHRoaXMub25FcnJvcihyZWFzb24gPT4ge1xuICAgICAgaWYodGhpcy5zb2NrZXQuaGFzTG9nZ2VyKCkpIHRoaXMuc29ja2V0LmxvZyhcImNoYW5uZWxcIiwgYGVycm9yICR7dGhpcy50b3BpY31gLCByZWFzb24pXG4gICAgICBpZih0aGlzLmlzSm9pbmluZygpKXsgdGhpcy5qb2luUHVzaC5yZXNldCgpIH1cbiAgICAgIHRoaXMuc3RhdGUgPSBDSEFOTkVMX1NUQVRFUy5lcnJvcmVkXG4gICAgICBpZih0aGlzLnNvY2tldC5pc0Nvbm5lY3RlZCgpKXsgdGhpcy5yZWpvaW5UaW1lci5zY2hlZHVsZVRpbWVvdXQoKSB9XG4gICAgfSlcbiAgICB0aGlzLmpvaW5QdXNoLnJlY2VpdmUoXCJ0aW1lb3V0XCIsICgpID0+IHtcbiAgICAgIGlmKHRoaXMuc29ja2V0Lmhhc0xvZ2dlcigpKSB0aGlzLnNvY2tldC5sb2coXCJjaGFubmVsXCIsIGB0aW1lb3V0ICR7dGhpcy50b3BpY30gKCR7dGhpcy5qb2luUmVmKCl9KWAsIHRoaXMuam9pblB1c2gudGltZW91dClcbiAgICAgIGxldCBsZWF2ZVB1c2ggPSBuZXcgUHVzaCh0aGlzLCBDSEFOTkVMX0VWRU5UUy5sZWF2ZSwgY2xvc3VyZSh7fSksIHRoaXMudGltZW91dClcbiAgICAgIGxlYXZlUHVzaC5zZW5kKClcbiAgICAgIHRoaXMuc3RhdGUgPSBDSEFOTkVMX1NUQVRFUy5lcnJvcmVkXG4gICAgICB0aGlzLmpvaW5QdXNoLnJlc2V0KClcbiAgICAgIGlmKHRoaXMuc29ja2V0LmlzQ29ubmVjdGVkKCkpeyB0aGlzLnJlam9pblRpbWVyLnNjaGVkdWxlVGltZW91dCgpIH1cbiAgICB9KVxuICAgIHRoaXMub24oQ0hBTk5FTF9FVkVOVFMucmVwbHksIChwYXlsb2FkLCByZWYpID0+IHtcbiAgICAgIHRoaXMudHJpZ2dlcih0aGlzLnJlcGx5RXZlbnROYW1lKHJlZiksIHBheWxvYWQpXG4gICAgfSlcbiAgfVxuXG4gIC8qKlxuICAgKiBKb2luIHRoZSBjaGFubmVsXG4gICAqIEBwYXJhbSB7aW50ZWdlcn0gdGltZW91dFxuICAgKiBAcmV0dXJucyB7UHVzaH1cbiAgICovXG4gIGpvaW4odGltZW91dCA9IHRoaXMudGltZW91dCl7XG4gICAgaWYodGhpcy5qb2luZWRPbmNlKXtcbiAgICAgIHRocm93IG5ldyBFcnJvcihcInRyaWVkIHRvIGpvaW4gbXVsdGlwbGUgdGltZXMuICdqb2luJyBjYW4gb25seSBiZSBjYWxsZWQgYSBzaW5nbGUgdGltZSBwZXIgY2hhbm5lbCBpbnN0YW5jZVwiKVxuICAgIH0gZWxzZSB7XG4gICAgICB0aGlzLnRpbWVvdXQgPSB0aW1lb3V0XG4gICAgICB0aGlzLmpvaW5lZE9uY2UgPSB0cnVlXG4gICAgICB0aGlzLnJlam9pbigpXG4gICAgICByZXR1cm4gdGhpcy5qb2luUHVzaFxuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBIb29rIGludG8gY2hhbm5lbCBjbG9zZVxuICAgKiBAcGFyYW0ge0Z1bmN0aW9ufSBjYWxsYmFja1xuICAgKi9cbiAgb25DbG9zZShjYWxsYmFjayl7XG4gICAgdGhpcy5vbihDSEFOTkVMX0VWRU5UUy5jbG9zZSwgY2FsbGJhY2spXG4gIH1cblxuICAvKipcbiAgICogSG9vayBpbnRvIGNoYW5uZWwgZXJyb3JzXG4gICAqIEBwYXJhbSB7RnVuY3Rpb259IGNhbGxiYWNrXG4gICAqL1xuICBvbkVycm9yKGNhbGxiYWNrKXtcbiAgICByZXR1cm4gdGhpcy5vbihDSEFOTkVMX0VWRU5UUy5lcnJvciwgcmVhc29uID0+IGNhbGxiYWNrKHJlYXNvbikpXG4gIH1cblxuICAvKipcbiAgICogU3Vic2NyaWJlcyBvbiBjaGFubmVsIGV2ZW50c1xuICAgKlxuICAgKiBTdWJzY3JpcHRpb24gcmV0dXJucyBhIHJlZiBjb3VudGVyLCB3aGljaCBjYW4gYmUgdXNlZCBsYXRlciB0b1xuICAgKiB1bnN1YnNjcmliZSB0aGUgZXhhY3QgZXZlbnQgbGlzdGVuZXJcbiAgICpcbiAgICogQGV4YW1wbGVcbiAgICogY29uc3QgcmVmMSA9IGNoYW5uZWwub24oXCJldmVudFwiLCBkb19zdHVmZilcbiAgICogY29uc3QgcmVmMiA9IGNoYW5uZWwub24oXCJldmVudFwiLCBkb19vdGhlcl9zdHVmZilcbiAgICogY2hhbm5lbC5vZmYoXCJldmVudFwiLCByZWYxKVxuICAgKiAvLyBTaW5jZSB1bnN1YnNjcmlwdGlvbiwgZG9fc3R1ZmYgd29uJ3QgZmlyZSxcbiAgICogLy8gd2hpbGUgZG9fb3RoZXJfc3R1ZmYgd2lsbCBrZWVwIGZpcmluZyBvbiB0aGUgXCJldmVudFwiXG4gICAqXG4gICAqIEBwYXJhbSB7c3RyaW5nfSBldmVudFxuICAgKiBAcGFyYW0ge0Z1bmN0aW9ufSBjYWxsYmFja1xuICAgKiBAcmV0dXJucyB7aW50ZWdlcn0gcmVmXG4gICAqL1xuICBvbihldmVudCwgY2FsbGJhY2spe1xuICAgIGxldCByZWYgPSB0aGlzLmJpbmRpbmdSZWYrK1xuICAgIHRoaXMuYmluZGluZ3MucHVzaCh7ZXZlbnQsIHJlZiwgY2FsbGJhY2t9KVxuICAgIHJldHVybiByZWZcbiAgfVxuXG4gIC8qKlxuICAgKiBVbnN1YnNjcmliZXMgb2ZmIG9mIGNoYW5uZWwgZXZlbnRzXG4gICAqXG4gICAqIFVzZSB0aGUgcmVmIHJldHVybmVkIGZyb20gYSBjaGFubmVsLm9uKCkgdG8gdW5zdWJzY3JpYmUgb25lXG4gICAqIGhhbmRsZXIsIG9yIHBhc3Mgbm90aGluZyBmb3IgdGhlIHJlZiB0byB1bnN1YnNjcmliZSBhbGxcbiAgICogaGFuZGxlcnMgZm9yIHRoZSBnaXZlbiBldmVudC5cbiAgICpcbiAgICogQGV4YW1wbGVcbiAgICogLy8gVW5zdWJzY3JpYmUgdGhlIGRvX3N0dWZmIGhhbmRsZXJcbiAgICogY29uc3QgcmVmMSA9IGNoYW5uZWwub24oXCJldmVudFwiLCBkb19zdHVmZilcbiAgICogY2hhbm5lbC5vZmYoXCJldmVudFwiLCByZWYxKVxuICAgKlxuICAgKiAvLyBVbnN1YnNjcmliZSBhbGwgaGFuZGxlcnMgZnJvbSBldmVudFxuICAgKiBjaGFubmVsLm9mZihcImV2ZW50XCIpXG4gICAqXG4gICAqIEBwYXJhbSB7c3RyaW5nfSBldmVudFxuICAgKiBAcGFyYW0ge2ludGVnZXJ9IHJlZlxuICAgKi9cbiAgb2ZmKGV2ZW50LCByZWYpe1xuICAgIHRoaXMuYmluZGluZ3MgPSB0aGlzLmJpbmRpbmdzLmZpbHRlcigoYmluZCkgPT4ge1xuICAgICAgcmV0dXJuICEoYmluZC5ldmVudCA9PT0gZXZlbnQgJiYgKHR5cGVvZiByZWYgPT09IFwidW5kZWZpbmVkXCIgfHwgcmVmID09PSBiaW5kLnJlZikpXG4gICAgfSlcbiAgfVxuXG4gIC8qKlxuICAgKiBAcHJpdmF0ZVxuICAgKi9cbiAgY2FuUHVzaCgpeyByZXR1cm4gdGhpcy5zb2NrZXQuaXNDb25uZWN0ZWQoKSAmJiB0aGlzLmlzSm9pbmVkKCkgfVxuXG4gIC8qKlxuICAgKiBTZW5kcyBhIG1lc3NhZ2UgYGV2ZW50YCB0byBwaG9lbml4IHdpdGggdGhlIHBheWxvYWQgYHBheWxvYWRgLlxuICAgKiBQaG9lbml4IHJlY2VpdmVzIHRoaXMgaW4gdGhlIGBoYW5kbGVfaW4oZXZlbnQsIHBheWxvYWQsIHNvY2tldClgXG4gICAqIGZ1bmN0aW9uLiBpZiBwaG9lbml4IHJlcGxpZXMgb3IgaXQgdGltZXMgb3V0IChkZWZhdWx0IDEwMDAwbXMpLFxuICAgKiB0aGVuIG9wdGlvbmFsbHkgdGhlIHJlcGx5IGNhbiBiZSByZWNlaXZlZC5cbiAgICpcbiAgICogQGV4YW1wbGVcbiAgICogY2hhbm5lbC5wdXNoKFwiZXZlbnRcIilcbiAgICogICAucmVjZWl2ZShcIm9rXCIsIHBheWxvYWQgPT4gY29uc29sZS5sb2coXCJwaG9lbml4IHJlcGxpZWQ6XCIsIHBheWxvYWQpKVxuICAgKiAgIC5yZWNlaXZlKFwiZXJyb3JcIiwgZXJyID0+IGNvbnNvbGUubG9nKFwicGhvZW5peCBlcnJvcmVkXCIsIGVycikpXG4gICAqICAgLnJlY2VpdmUoXCJ0aW1lb3V0XCIsICgpID0+IGNvbnNvbGUubG9nKFwidGltZWQgb3V0IHB1c2hpbmdcIikpXG4gICAqIEBwYXJhbSB7c3RyaW5nfSBldmVudFxuICAgKiBAcGFyYW0ge09iamVjdH0gcGF5bG9hZFxuICAgKiBAcGFyYW0ge251bWJlcn0gW3RpbWVvdXRdXG4gICAqIEByZXR1cm5zIHtQdXNofVxuICAgKi9cbiAgcHVzaChldmVudCwgcGF5bG9hZCwgdGltZW91dCA9IHRoaXMudGltZW91dCl7XG4gICAgcGF5bG9hZCA9IHBheWxvYWQgfHwge31cbiAgICBpZighdGhpcy5qb2luZWRPbmNlKXtcbiAgICAgIHRocm93IG5ldyBFcnJvcihgdHJpZWQgdG8gcHVzaCAnJHtldmVudH0nIHRvICcke3RoaXMudG9waWN9JyBiZWZvcmUgam9pbmluZy4gVXNlIGNoYW5uZWwuam9pbigpIGJlZm9yZSBwdXNoaW5nIGV2ZW50c2ApXG4gICAgfVxuICAgIGxldCBwdXNoRXZlbnQgPSBuZXcgUHVzaCh0aGlzLCBldmVudCwgZnVuY3Rpb24gKCl7IHJldHVybiBwYXlsb2FkIH0sIHRpbWVvdXQpXG4gICAgaWYodGhpcy5jYW5QdXNoKCkpe1xuICAgICAgcHVzaEV2ZW50LnNlbmQoKVxuICAgIH0gZWxzZSB7XG4gICAgICBwdXNoRXZlbnQuc3RhcnRUaW1lb3V0KClcbiAgICAgIHRoaXMucHVzaEJ1ZmZlci5wdXNoKHB1c2hFdmVudClcbiAgICB9XG5cbiAgICByZXR1cm4gcHVzaEV2ZW50XG4gIH1cblxuICAvKiogTGVhdmVzIHRoZSBjaGFubmVsXG4gICAqXG4gICAqIFVuc3Vic2NyaWJlcyBmcm9tIHNlcnZlciBldmVudHMsIGFuZFxuICAgKiBpbnN0cnVjdHMgY2hhbm5lbCB0byB0ZXJtaW5hdGUgb24gc2VydmVyXG4gICAqXG4gICAqIFRyaWdnZXJzIG9uQ2xvc2UoKSBob29rc1xuICAgKlxuICAgKiBUbyByZWNlaXZlIGxlYXZlIGFja25vd2xlZGdlbWVudHMsIHVzZSB0aGUgYHJlY2VpdmVgXG4gICAqIGhvb2sgdG8gYmluZCB0byB0aGUgc2VydmVyIGFjaywgaWU6XG4gICAqXG4gICAqIEBleGFtcGxlXG4gICAqIGNoYW5uZWwubGVhdmUoKS5yZWNlaXZlKFwib2tcIiwgKCkgPT4gYWxlcnQoXCJsZWZ0IVwiKSApXG4gICAqXG4gICAqIEBwYXJhbSB7aW50ZWdlcn0gdGltZW91dFxuICAgKiBAcmV0dXJucyB7UHVzaH1cbiAgICovXG4gIGxlYXZlKHRpbWVvdXQgPSB0aGlzLnRpbWVvdXQpe1xuICAgIHRoaXMucmVqb2luVGltZXIucmVzZXQoKVxuICAgIHRoaXMuam9pblB1c2guY2FuY2VsVGltZW91dCgpXG5cbiAgICB0aGlzLnN0YXRlID0gQ0hBTk5FTF9TVEFURVMubGVhdmluZ1xuICAgIGxldCBvbkNsb3NlID0gKCkgPT4ge1xuICAgICAgaWYodGhpcy5zb2NrZXQuaGFzTG9nZ2VyKCkpIHRoaXMuc29ja2V0LmxvZyhcImNoYW5uZWxcIiwgYGxlYXZlICR7dGhpcy50b3BpY31gKVxuICAgICAgdGhpcy50cmlnZ2VyKENIQU5ORUxfRVZFTlRTLmNsb3NlLCBcImxlYXZlXCIpXG4gICAgfVxuICAgIGxldCBsZWF2ZVB1c2ggPSBuZXcgUHVzaCh0aGlzLCBDSEFOTkVMX0VWRU5UUy5sZWF2ZSwgY2xvc3VyZSh7fSksIHRpbWVvdXQpXG4gICAgbGVhdmVQdXNoLnJlY2VpdmUoXCJva1wiLCAoKSA9PiBvbkNsb3NlKCkpXG4gICAgICAucmVjZWl2ZShcInRpbWVvdXRcIiwgKCkgPT4gb25DbG9zZSgpKVxuICAgIGxlYXZlUHVzaC5zZW5kKClcbiAgICBpZighdGhpcy5jYW5QdXNoKCkpeyBsZWF2ZVB1c2gudHJpZ2dlcihcIm9rXCIsIHt9KSB9XG5cbiAgICByZXR1cm4gbGVhdmVQdXNoXG4gIH1cblxuICAvKipcbiAgICogT3ZlcnJpZGFibGUgbWVzc2FnZSBob29rXG4gICAqXG4gICAqIFJlY2VpdmVzIGFsbCBldmVudHMgZm9yIHNwZWNpYWxpemVkIG1lc3NhZ2UgaGFuZGxpbmdcbiAgICogYmVmb3JlIGRpc3BhdGNoaW5nIHRvIHRoZSBjaGFubmVsIGNhbGxiYWNrcy5cbiAgICpcbiAgICogTXVzdCByZXR1cm4gdGhlIHBheWxvYWQsIG1vZGlmaWVkIG9yIHVubW9kaWZpZWRcbiAgICogQHBhcmFtIHtzdHJpbmd9IGV2ZW50XG4gICAqIEBwYXJhbSB7T2JqZWN0fSBwYXlsb2FkXG4gICAqIEBwYXJhbSB7aW50ZWdlcn0gcmVmXG4gICAqIEByZXR1cm5zIHtPYmplY3R9XG4gICAqL1xuICBvbk1lc3NhZ2UoX2V2ZW50LCBwYXlsb2FkLCBfcmVmKXsgcmV0dXJuIHBheWxvYWQgfVxuXG4gIC8qKlxuICAgKiBAcHJpdmF0ZVxuICAgKi9cbiAgaXNNZW1iZXIodG9waWMsIGV2ZW50LCBwYXlsb2FkLCBqb2luUmVmKXtcbiAgICBpZih0aGlzLnRvcGljICE9PSB0b3BpYyl7IHJldHVybiBmYWxzZSB9XG5cbiAgICBpZihqb2luUmVmICYmIGpvaW5SZWYgIT09IHRoaXMuam9pblJlZigpKXtcbiAgICAgIGlmKHRoaXMuc29ja2V0Lmhhc0xvZ2dlcigpKSB0aGlzLnNvY2tldC5sb2coXCJjaGFubmVsXCIsIFwiZHJvcHBpbmcgb3V0ZGF0ZWQgbWVzc2FnZVwiLCB7dG9waWMsIGV2ZW50LCBwYXlsb2FkLCBqb2luUmVmfSlcbiAgICAgIHJldHVybiBmYWxzZVxuICAgIH0gZWxzZSB7XG4gICAgICByZXR1cm4gdHJ1ZVxuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBAcHJpdmF0ZVxuICAgKi9cbiAgam9pblJlZigpeyByZXR1cm4gdGhpcy5qb2luUHVzaC5yZWYgfVxuXG4gIC8qKlxuICAgKiBAcHJpdmF0ZVxuICAgKi9cbiAgcmVqb2luKHRpbWVvdXQgPSB0aGlzLnRpbWVvdXQpe1xuICAgIGlmKHRoaXMuaXNMZWF2aW5nKCkpeyByZXR1cm4gfVxuICAgIHRoaXMuc29ja2V0LmxlYXZlT3BlblRvcGljKHRoaXMudG9waWMpXG4gICAgdGhpcy5zdGF0ZSA9IENIQU5ORUxfU1RBVEVTLmpvaW5pbmdcbiAgICB0aGlzLmpvaW5QdXNoLnJlc2VuZCh0aW1lb3V0KVxuICB9XG5cbiAgLyoqXG4gICAqIEBwcml2YXRlXG4gICAqL1xuICB0cmlnZ2VyKGV2ZW50LCBwYXlsb2FkLCByZWYsIGpvaW5SZWYpe1xuICAgIGxldCBoYW5kbGVkUGF5bG9hZCA9IHRoaXMub25NZXNzYWdlKGV2ZW50LCBwYXlsb2FkLCByZWYsIGpvaW5SZWYpXG4gICAgaWYocGF5bG9hZCAmJiAhaGFuZGxlZFBheWxvYWQpeyB0aHJvdyBuZXcgRXJyb3IoXCJjaGFubmVsIG9uTWVzc2FnZSBjYWxsYmFja3MgbXVzdCByZXR1cm4gdGhlIHBheWxvYWQsIG1vZGlmaWVkIG9yIHVubW9kaWZpZWRcIikgfVxuXG4gICAgbGV0IGV2ZW50QmluZGluZ3MgPSB0aGlzLmJpbmRpbmdzLmZpbHRlcihiaW5kID0+IGJpbmQuZXZlbnQgPT09IGV2ZW50KVxuXG4gICAgZm9yKGxldCBpID0gMDsgaSA8IGV2ZW50QmluZGluZ3MubGVuZ3RoOyBpKyspe1xuICAgICAgbGV0IGJpbmQgPSBldmVudEJpbmRpbmdzW2ldXG4gICAgICBiaW5kLmNhbGxiYWNrKGhhbmRsZWRQYXlsb2FkLCByZWYsIGpvaW5SZWYgfHwgdGhpcy5qb2luUmVmKCkpXG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIEBwcml2YXRlXG4gICAqL1xuICByZXBseUV2ZW50TmFtZShyZWYpeyByZXR1cm4gYGNoYW5fcmVwbHlfJHtyZWZ9YCB9XG5cbiAgLyoqXG4gICAqIEBwcml2YXRlXG4gICAqL1xuICBpc0Nsb3NlZCgpeyByZXR1cm4gdGhpcy5zdGF0ZSA9PT0gQ0hBTk5FTF9TVEFURVMuY2xvc2VkIH1cblxuICAvKipcbiAgICogQHByaXZhdGVcbiAgICovXG4gIGlzRXJyb3JlZCgpeyByZXR1cm4gdGhpcy5zdGF0ZSA9PT0gQ0hBTk5FTF9TVEFURVMuZXJyb3JlZCB9XG5cbiAgLyoqXG4gICAqIEBwcml2YXRlXG4gICAqL1xuICBpc0pvaW5lZCgpeyByZXR1cm4gdGhpcy5zdGF0ZSA9PT0gQ0hBTk5FTF9TVEFURVMuam9pbmVkIH1cblxuICAvKipcbiAgICogQHByaXZhdGVcbiAgICovXG4gIGlzSm9pbmluZygpeyByZXR1cm4gdGhpcy5zdGF0ZSA9PT0gQ0hBTk5FTF9TVEFURVMuam9pbmluZyB9XG5cbiAgLyoqXG4gICAqIEBwcml2YXRlXG4gICAqL1xuICBpc0xlYXZpbmcoKXsgcmV0dXJuIHRoaXMuc3RhdGUgPT09IENIQU5ORUxfU1RBVEVTLmxlYXZpbmcgfVxufVxuIiwgImltcG9ydCB7XG4gIGdsb2JhbCxcbiAgWEhSX1NUQVRFU1xufSBmcm9tIFwiLi9jb25zdGFudHNcIlxuXG5leHBvcnQgZGVmYXVsdCBjbGFzcyBBamF4IHtcblxuICBzdGF0aWMgcmVxdWVzdChtZXRob2QsIGVuZFBvaW50LCBoZWFkZXJzLCBib2R5LCB0aW1lb3V0LCBvbnRpbWVvdXQsIGNhbGxiYWNrKXtcbiAgICBpZihnbG9iYWwuWERvbWFpblJlcXVlc3Qpe1xuICAgICAgbGV0IHJlcSA9IG5ldyBnbG9iYWwuWERvbWFpblJlcXVlc3QoKSAvLyBJRTgsIElFOVxuICAgICAgcmV0dXJuIHRoaXMueGRvbWFpblJlcXVlc3QocmVxLCBtZXRob2QsIGVuZFBvaW50LCBib2R5LCB0aW1lb3V0LCBvbnRpbWVvdXQsIGNhbGxiYWNrKVxuICAgIH0gZWxzZSBpZihnbG9iYWwuWE1MSHR0cFJlcXVlc3Qpe1xuICAgICAgbGV0IHJlcSA9IG5ldyBnbG9iYWwuWE1MSHR0cFJlcXVlc3QoKSAvLyBJRTcrLCBGaXJlZm94LCBDaHJvbWUsIE9wZXJhLCBTYWZhcmlcbiAgICAgIHJldHVybiB0aGlzLnhoclJlcXVlc3QocmVxLCBtZXRob2QsIGVuZFBvaW50LCBoZWFkZXJzLCBib2R5LCB0aW1lb3V0LCBvbnRpbWVvdXQsIGNhbGxiYWNrKVxuICAgIH0gZWxzZSBpZihnbG9iYWwuZmV0Y2ggJiYgZ2xvYmFsLkFib3J0Q29udHJvbGxlcil7XG4gICAgICAvLyBGZXRjaCB3aXRoIEFib3J0Q29udHJvbGxlciBmb3IgbW9kZXJuIGJyb3dzZXJzXG4gICAgICByZXR1cm4gdGhpcy5mZXRjaFJlcXVlc3QobWV0aG9kLCBlbmRQb2ludCwgaGVhZGVycywgYm9keSwgdGltZW91dCwgb250aW1lb3V0LCBjYWxsYmFjaylcbiAgICB9IGVsc2Uge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKFwiTm8gc3VpdGFibGUgWE1MSHR0cFJlcXVlc3QgaW1wbGVtZW50YXRpb24gZm91bmRcIilcbiAgICB9XG4gIH1cblxuICBzdGF0aWMgZmV0Y2hSZXF1ZXN0KG1ldGhvZCwgZW5kUG9pbnQsIGhlYWRlcnMsIGJvZHksIHRpbWVvdXQsIG9udGltZW91dCwgY2FsbGJhY2spe1xuICAgIGxldCBvcHRpb25zID0ge1xuICAgICAgbWV0aG9kLFxuICAgICAgaGVhZGVycyxcbiAgICAgIGJvZHksXG4gICAgfVxuICAgIGxldCBjb250cm9sbGVyID0gbnVsbFxuICAgIGlmKHRpbWVvdXQpe1xuICAgICAgY29udHJvbGxlciA9IG5ldyBBYm9ydENvbnRyb2xsZXIoKVxuICAgICAgY29uc3QgX3RpbWVvdXRJZCA9IHNldFRpbWVvdXQoKCkgPT4gY29udHJvbGxlci5hYm9ydCgpLCB0aW1lb3V0KVxuICAgICAgb3B0aW9ucy5zaWduYWwgPSBjb250cm9sbGVyLnNpZ25hbFxuICAgIH1cbiAgICBnbG9iYWwuZmV0Y2goZW5kUG9pbnQsIG9wdGlvbnMpXG4gICAgICAudGhlbihyZXNwb25zZSA9PiByZXNwb25zZS50ZXh0KCkpXG4gICAgICAudGhlbihkYXRhID0+IHRoaXMucGFyc2VKU09OKGRhdGEpKVxuICAgICAgLnRoZW4oZGF0YSA9PiBjYWxsYmFjayAmJiBjYWxsYmFjayhkYXRhKSlcbiAgICAgIC5jYXRjaChlcnIgPT4ge1xuICAgICAgICBpZihlcnIubmFtZSA9PT0gXCJBYm9ydEVycm9yXCIgJiYgb250aW1lb3V0KXtcbiAgICAgICAgICBvbnRpbWVvdXQoKVxuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIGNhbGxiYWNrICYmIGNhbGxiYWNrKG51bGwpXG4gICAgICAgIH1cbiAgICAgIH0pXG4gICAgcmV0dXJuIGNvbnRyb2xsZXJcbiAgfVxuXG4gIHN0YXRpYyB4ZG9tYWluUmVxdWVzdChyZXEsIG1ldGhvZCwgZW5kUG9pbnQsIGJvZHksIHRpbWVvdXQsIG9udGltZW91dCwgY2FsbGJhY2spe1xuICAgIHJlcS50aW1lb3V0ID0gdGltZW91dFxuICAgIHJlcS5vcGVuKG1ldGhvZCwgZW5kUG9pbnQpXG4gICAgcmVxLm9ubG9hZCA9ICgpID0+IHtcbiAgICAgIGxldCByZXNwb25zZSA9IHRoaXMucGFyc2VKU09OKHJlcS5yZXNwb25zZVRleHQpXG4gICAgICBjYWxsYmFjayAmJiBjYWxsYmFjayhyZXNwb25zZSlcbiAgICB9XG4gICAgaWYob250aW1lb3V0KXsgcmVxLm9udGltZW91dCA9IG9udGltZW91dCB9XG5cbiAgICAvLyBXb3JrIGFyb3VuZCBidWcgaW4gSUU5IHRoYXQgcmVxdWlyZXMgYW4gYXR0YWNoZWQgb25wcm9ncmVzcyBoYW5kbGVyXG4gICAgcmVxLm9ucHJvZ3Jlc3MgPSAoKSA9PiB7IH1cblxuICAgIHJlcS5zZW5kKGJvZHkpXG4gICAgcmV0dXJuIHJlcVxuICB9XG5cbiAgc3RhdGljIHhoclJlcXVlc3QocmVxLCBtZXRob2QsIGVuZFBvaW50LCBoZWFkZXJzLCBib2R5LCB0aW1lb3V0LCBvbnRpbWVvdXQsIGNhbGxiYWNrKXtcbiAgICByZXEub3BlbihtZXRob2QsIGVuZFBvaW50LCB0cnVlKVxuICAgIHJlcS50aW1lb3V0ID0gdGltZW91dFxuICAgIGZvcihsZXQgW2tleSwgdmFsdWVdIG9mIE9iamVjdC5lbnRyaWVzKGhlYWRlcnMpKXtcbiAgICAgIHJlcS5zZXRSZXF1ZXN0SGVhZGVyKGtleSwgdmFsdWUpXG4gICAgfVxuICAgIHJlcS5vbmVycm9yID0gKCkgPT4gY2FsbGJhY2sgJiYgY2FsbGJhY2sobnVsbClcbiAgICByZXEub25yZWFkeXN0YXRlY2hhbmdlID0gKCkgPT4ge1xuICAgICAgaWYocmVxLnJlYWR5U3RhdGUgPT09IFhIUl9TVEFURVMuY29tcGxldGUgJiYgY2FsbGJhY2spe1xuICAgICAgICBsZXQgcmVzcG9uc2UgPSB0aGlzLnBhcnNlSlNPTihyZXEucmVzcG9uc2VUZXh0KVxuICAgICAgICBjYWxsYmFjayhyZXNwb25zZSlcbiAgICAgIH1cbiAgICB9XG4gICAgaWYob250aW1lb3V0KXsgcmVxLm9udGltZW91dCA9IG9udGltZW91dCB9XG5cbiAgICByZXEuc2VuZChib2R5KVxuICAgIHJldHVybiByZXFcbiAgfVxuXG4gIHN0YXRpYyBwYXJzZUpTT04ocmVzcCl7XG4gICAgaWYoIXJlc3AgfHwgcmVzcCA9PT0gXCJcIil7IHJldHVybiBudWxsIH1cblxuICAgIHRyeSB7XG4gICAgICByZXR1cm4gSlNPTi5wYXJzZShyZXNwKVxuICAgIH0gY2F0Y2gge1xuICAgICAgY29uc29sZSAmJiBjb25zb2xlLmxvZyhcImZhaWxlZCB0byBwYXJzZSBKU09OIHJlc3BvbnNlXCIsIHJlc3ApXG4gICAgICByZXR1cm4gbnVsbFxuICAgIH1cbiAgfVxuXG4gIHN0YXRpYyBzZXJpYWxpemUob2JqLCBwYXJlbnRLZXkpe1xuICAgIGxldCBxdWVyeVN0ciA9IFtdXG4gICAgZm9yKHZhciBrZXkgaW4gb2JqKXtcbiAgICAgIGlmKCFPYmplY3QucHJvdG90eXBlLmhhc093blByb3BlcnR5LmNhbGwob2JqLCBrZXkpKXsgY29udGludWUgfVxuICAgICAgbGV0IHBhcmFtS2V5ID0gcGFyZW50S2V5ID8gYCR7cGFyZW50S2V5fVske2tleX1dYCA6IGtleVxuICAgICAgbGV0IHBhcmFtVmFsID0gb2JqW2tleV1cbiAgICAgIGlmKHR5cGVvZiBwYXJhbVZhbCA9PT0gXCJvYmplY3RcIil7XG4gICAgICAgIHF1ZXJ5U3RyLnB1c2godGhpcy5zZXJpYWxpemUocGFyYW1WYWwsIHBhcmFtS2V5KSlcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHF1ZXJ5U3RyLnB1c2goZW5jb2RlVVJJQ29tcG9uZW50KHBhcmFtS2V5KSArIFwiPVwiICsgZW5jb2RlVVJJQ29tcG9uZW50KHBhcmFtVmFsKSlcbiAgICAgIH1cbiAgICB9XG4gICAgcmV0dXJuIHF1ZXJ5U3RyLmpvaW4oXCImXCIpXG4gIH1cblxuICBzdGF0aWMgYXBwZW5kUGFyYW1zKHVybCwgcGFyYW1zKXtcbiAgICBpZihPYmplY3Qua2V5cyhwYXJhbXMpLmxlbmd0aCA9PT0gMCl7IHJldHVybiB1cmwgfVxuXG4gICAgbGV0IHByZWZpeCA9IHVybC5tYXRjaCgvXFw/LykgPyBcIiZcIiA6IFwiP1wiXG4gICAgcmV0dXJuIGAke3VybH0ke3ByZWZpeH0ke3RoaXMuc2VyaWFsaXplKHBhcmFtcyl9YFxuICB9XG59XG4iLCAiaW1wb3J0IHtcbiAgU09DS0VUX1NUQVRFUyxcbiAgVFJBTlNQT1JUUyxcbiAgQVVUSF9UT0tFTl9QUkVGSVhcbn0gZnJvbSBcIi4vY29uc3RhbnRzXCJcblxuaW1wb3J0IEFqYXggZnJvbSBcIi4vYWpheFwiXG5cbmxldCBhcnJheUJ1ZmZlclRvQmFzZTY0ID0gKGJ1ZmZlcikgPT4ge1xuICBsZXQgYmluYXJ5ID0gXCJcIlxuICBsZXQgYnl0ZXMgPSBuZXcgVWludDhBcnJheShidWZmZXIpXG4gIGxldCBsZW4gPSBieXRlcy5ieXRlTGVuZ3RoXG4gIGZvcihsZXQgaSA9IDA7IGkgPCBsZW47IGkrKyl7IGJpbmFyeSArPSBTdHJpbmcuZnJvbUNoYXJDb2RlKGJ5dGVzW2ldKSB9XG4gIHJldHVybiBidG9hKGJpbmFyeSlcbn1cblxuZXhwb3J0IGRlZmF1bHQgY2xhc3MgTG9uZ1BvbGwge1xuXG4gIGNvbnN0cnVjdG9yKGVuZFBvaW50LCBwcm90b2NvbHMpe1xuICAgIC8vIHdlIG9ubHkgc3VwcG9ydCBzdWJwcm90b2NvbHMgZm9yIGF1dGhUb2tlblxuICAgIC8vIFtcInBob2VuaXhcIiwgXCJiYXNlNjR1cmwuYmVhcmVyLnBoeC5CQVNFNjRfRU5DT0RFRF9UT0tFTlwiXVxuICAgIGlmKHByb3RvY29scyAmJiBwcm90b2NvbHMubGVuZ3RoID09PSAyICYmIHByb3RvY29sc1sxXS5zdGFydHNXaXRoKEFVVEhfVE9LRU5fUFJFRklYKSl7XG4gICAgICB0aGlzLmF1dGhUb2tlbiA9IGF0b2IocHJvdG9jb2xzWzFdLnNsaWNlKEFVVEhfVE9LRU5fUFJFRklYLmxlbmd0aCkpXG4gICAgfVxuICAgIHRoaXMuZW5kUG9pbnQgPSBudWxsXG4gICAgdGhpcy50b2tlbiA9IG51bGxcbiAgICB0aGlzLnNraXBIZWFydGJlYXQgPSB0cnVlXG4gICAgdGhpcy5yZXFzID0gbmV3IFNldCgpXG4gICAgdGhpcy5hd2FpdGluZ0JhdGNoQWNrID0gZmFsc2VcbiAgICB0aGlzLmN1cnJlbnRCYXRjaCA9IG51bGxcbiAgICB0aGlzLmN1cnJlbnRCYXRjaFRpbWVyID0gbnVsbFxuICAgIHRoaXMuYmF0Y2hCdWZmZXIgPSBbXVxuICAgIHRoaXMub25vcGVuID0gZnVuY3Rpb24gKCl7IH0gLy8gbm9vcFxuICAgIHRoaXMub25lcnJvciA9IGZ1bmN0aW9uICgpeyB9IC8vIG5vb3BcbiAgICB0aGlzLm9ubWVzc2FnZSA9IGZ1bmN0aW9uICgpeyB9IC8vIG5vb3BcbiAgICB0aGlzLm9uY2xvc2UgPSBmdW5jdGlvbiAoKXsgfSAvLyBub29wXG4gICAgdGhpcy5wb2xsRW5kcG9pbnQgPSB0aGlzLm5vcm1hbGl6ZUVuZHBvaW50KGVuZFBvaW50KVxuICAgIHRoaXMucmVhZHlTdGF0ZSA9IFNPQ0tFVF9TVEFURVMuY29ubmVjdGluZ1xuICAgIC8vIHdlIG11c3Qgd2FpdCBmb3IgdGhlIGNhbGxlciB0byBmaW5pc2ggc2V0dGluZyB1cCBvdXIgY2FsbGJhY2tzIGFuZCB0aW1lb3V0IHByb3BlcnRpZXNcbiAgICBzZXRUaW1lb3V0KCgpID0+IHRoaXMucG9sbCgpLCAwKVxuICB9XG5cbiAgbm9ybWFsaXplRW5kcG9pbnQoZW5kUG9pbnQpe1xuICAgIHJldHVybiAoZW5kUG9pbnRcbiAgICAgIC5yZXBsYWNlKFwid3M6Ly9cIiwgXCJodHRwOi8vXCIpXG4gICAgICAucmVwbGFjZShcIndzczovL1wiLCBcImh0dHBzOi8vXCIpXG4gICAgICAucmVwbGFjZShuZXcgUmVnRXhwKFwiKC4qKVxcL1wiICsgVFJBTlNQT1JUUy53ZWJzb2NrZXQpLCBcIiQxL1wiICsgVFJBTlNQT1JUUy5sb25ncG9sbCkpXG4gIH1cblxuICBlbmRwb2ludFVSTCgpe1xuICAgIHJldHVybiBBamF4LmFwcGVuZFBhcmFtcyh0aGlzLnBvbGxFbmRwb2ludCwge3Rva2VuOiB0aGlzLnRva2VufSlcbiAgfVxuXG4gIGNsb3NlQW5kUmV0cnkoY29kZSwgcmVhc29uLCB3YXNDbGVhbil7XG4gICAgdGhpcy5jbG9zZShjb2RlLCByZWFzb24sIHdhc0NsZWFuKVxuICAgIHRoaXMucmVhZHlTdGF0ZSA9IFNPQ0tFVF9TVEFURVMuY29ubmVjdGluZ1xuICB9XG5cbiAgb250aW1lb3V0KCl7XG4gICAgdGhpcy5vbmVycm9yKFwidGltZW91dFwiKVxuICAgIHRoaXMuY2xvc2VBbmRSZXRyeSgxMDA1LCBcInRpbWVvdXRcIiwgZmFsc2UpXG4gIH1cblxuICBpc0FjdGl2ZSgpeyByZXR1cm4gdGhpcy5yZWFkeVN0YXRlID09PSBTT0NLRVRfU1RBVEVTLm9wZW4gfHwgdGhpcy5yZWFkeVN0YXRlID09PSBTT0NLRVRfU1RBVEVTLmNvbm5lY3RpbmcgfVxuXG4gIHBvbGwoKXtcbiAgICBjb25zdCBoZWFkZXJzID0ge1wiQWNjZXB0XCI6IFwiYXBwbGljYXRpb24vanNvblwifVxuICAgIGlmKHRoaXMuYXV0aFRva2VuKXtcbiAgICAgIGhlYWRlcnNbXCJYLVBob2VuaXgtQXV0aFRva2VuXCJdID0gdGhpcy5hdXRoVG9rZW5cbiAgICB9XG4gICAgdGhpcy5hamF4KFwiR0VUXCIsIGhlYWRlcnMsIG51bGwsICgpID0+IHRoaXMub250aW1lb3V0KCksIHJlc3AgPT4ge1xuICAgICAgaWYocmVzcCl7XG4gICAgICAgIHZhciB7c3RhdHVzLCB0b2tlbiwgbWVzc2FnZXN9ID0gcmVzcFxuICAgICAgICB0aGlzLnRva2VuID0gdG9rZW5cbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHN0YXR1cyA9IDBcbiAgICAgIH1cblxuICAgICAgc3dpdGNoKHN0YXR1cyl7XG4gICAgICAgIGNhc2UgMjAwOlxuICAgICAgICAgIG1lc3NhZ2VzLmZvckVhY2gobXNnID0+IHtcbiAgICAgICAgICAgIC8vIFRhc2tzIGFyZSB3aGF0IHRoaW5ncyBsaWtlIGV2ZW50IGhhbmRsZXJzLCBzZXRUaW1lb3V0IGNhbGxiYWNrcyxcbiAgICAgICAgICAgIC8vIHByb21pc2UgcmVzb2x2ZXMgYW5kIG1vcmUgYXJlIHJ1biB3aXRoaW4uXG4gICAgICAgICAgICAvLyBJbiBtb2Rlcm4gYnJvd3NlcnMsIHRoZXJlIGFyZSB0d28gZGlmZmVyZW50IGtpbmRzIG9mIHRhc2tzLFxuICAgICAgICAgICAgLy8gbWljcm90YXNrcyBhbmQgbWFjcm90YXNrcy5cbiAgICAgICAgICAgIC8vIE1pY3JvdGFza3MgYXJlIG1haW5seSB1c2VkIGZvciBQcm9taXNlcywgd2hpbGUgbWFjcm90YXNrcyBhcmVcbiAgICAgICAgICAgIC8vIHVzZWQgZm9yIGV2ZXJ5dGhpbmcgZWxzZS5cbiAgICAgICAgICAgIC8vIE1pY3JvdGFza3MgYWx3YXlzIGhhdmUgcHJpb3JpdHkgb3ZlciBtYWNyb3Rhc2tzLiBJZiB0aGUgSlMgZW5naW5lXG4gICAgICAgICAgICAvLyBpcyBsb29raW5nIGZvciBhIHRhc2sgdG8gcnVuLCBpdCB3aWxsIGFsd2F5cyB0cnkgdG8gZW1wdHkgdGhlXG4gICAgICAgICAgICAvLyBtaWNyb3Rhc2sgcXVldWUgYmVmb3JlIGF0dGVtcHRpbmcgdG8gcnVuIGFueXRoaW5nIGZyb20gdGhlXG4gICAgICAgICAgICAvLyBtYWNyb3Rhc2sgcXVldWUuXG4gICAgICAgICAgICAvL1xuICAgICAgICAgICAgLy8gRm9yIHRoZSBXZWJTb2NrZXQgdHJhbnNwb3J0LCBtZXNzYWdlcyBhbHdheXMgYXJyaXZlIGluIHRoZWlyIG93blxuICAgICAgICAgICAgLy8gZXZlbnQuIFRoaXMgbWVhbnMgdGhhdCBpZiBhbnkgcHJvbWlzZXMgYXJlIHJlc29sdmVkIGZyb20gd2l0aGluLFxuICAgICAgICAgICAgLy8gdGhlaXIgY2FsbGJhY2tzIHdpbGwgYWx3YXlzIGZpbmlzaCBleGVjdXRpb24gYnkgdGhlIHRpbWUgdGhlXG4gICAgICAgICAgICAvLyBuZXh0IG1lc3NhZ2UgZXZlbnQgaGFuZGxlciBpcyBydW4uXG4gICAgICAgICAgICAvL1xuICAgICAgICAgICAgLy8gSW4gb3JkZXIgdG8gZW11bGF0ZSB0aGlzIGJlaGF2aW91ciwgd2UgbmVlZCB0byBtYWtlIHN1cmUgZWFjaFxuICAgICAgICAgICAgLy8gb25tZXNzYWdlIGhhbmRsZXIgaXMgcnVuIHdpdGhpbiBpdHMgb3duIG1hY3JvdGFzay5cbiAgICAgICAgICAgIHNldFRpbWVvdXQoKCkgPT4gdGhpcy5vbm1lc3NhZ2Uoe2RhdGE6IG1zZ30pLCAwKVxuICAgICAgICAgIH0pXG4gICAgICAgICAgdGhpcy5wb2xsKClcbiAgICAgICAgICBicmVha1xuICAgICAgICBjYXNlIDIwNDpcbiAgICAgICAgICB0aGlzLnBvbGwoKVxuICAgICAgICAgIGJyZWFrXG4gICAgICAgIGNhc2UgNDEwOlxuICAgICAgICAgIHRoaXMucmVhZHlTdGF0ZSA9IFNPQ0tFVF9TVEFURVMub3BlblxuICAgICAgICAgIHRoaXMub25vcGVuKHt9KVxuICAgICAgICAgIHRoaXMucG9sbCgpXG4gICAgICAgICAgYnJlYWtcbiAgICAgICAgY2FzZSA0MDM6XG4gICAgICAgICAgdGhpcy5vbmVycm9yKDQwMylcbiAgICAgICAgICB0aGlzLmNsb3NlKDEwMDgsIFwiZm9yYmlkZGVuXCIsIGZhbHNlKVxuICAgICAgICAgIGJyZWFrXG4gICAgICAgIGNhc2UgMDpcbiAgICAgICAgY2FzZSA1MDA6XG4gICAgICAgICAgdGhpcy5vbmVycm9yKDUwMClcbiAgICAgICAgICB0aGlzLmNsb3NlQW5kUmV0cnkoMTAxMSwgXCJpbnRlcm5hbCBzZXJ2ZXIgZXJyb3JcIiwgNTAwKVxuICAgICAgICAgIGJyZWFrXG4gICAgICAgIGRlZmF1bHQ6IHRocm93IG5ldyBFcnJvcihgdW5oYW5kbGVkIHBvbGwgc3RhdHVzICR7c3RhdHVzfWApXG4gICAgICB9XG4gICAgfSlcbiAgfVxuXG4gIC8vIHdlIGNvbGxlY3QgYWxsIHB1c2hlcyB3aXRoaW4gdGhlIGN1cnJlbnQgZXZlbnQgbG9vcCBieVxuICAvLyBzZXRUaW1lb3V0IDAsIHdoaWNoIG9wdGltaXplcyBiYWNrLXRvLWJhY2sgcHJvY2VkdXJhbFxuICAvLyBwdXNoZXMgYWdhaW5zdCBhbiBlbXB0eSBidWZmZXJcblxuICBzZW5kKGJvZHkpe1xuICAgIGlmKHR5cGVvZihib2R5KSAhPT0gXCJzdHJpbmdcIil7IGJvZHkgPSBhcnJheUJ1ZmZlclRvQmFzZTY0KGJvZHkpIH1cbiAgICBpZih0aGlzLmN1cnJlbnRCYXRjaCl7XG4gICAgICB0aGlzLmN1cnJlbnRCYXRjaC5wdXNoKGJvZHkpXG4gICAgfSBlbHNlIGlmKHRoaXMuYXdhaXRpbmdCYXRjaEFjayl7XG4gICAgICB0aGlzLmJhdGNoQnVmZmVyLnB1c2goYm9keSlcbiAgICB9IGVsc2Uge1xuICAgICAgdGhpcy5jdXJyZW50QmF0Y2ggPSBbYm9keV1cbiAgICAgIHRoaXMuY3VycmVudEJhdGNoVGltZXIgPSBzZXRUaW1lb3V0KCgpID0+IHtcbiAgICAgICAgdGhpcy5iYXRjaFNlbmQodGhpcy5jdXJyZW50QmF0Y2gpXG4gICAgICAgIHRoaXMuY3VycmVudEJhdGNoID0gbnVsbFxuICAgICAgfSwgMClcbiAgICB9XG4gIH1cblxuICBiYXRjaFNlbmQobWVzc2FnZXMpe1xuICAgIHRoaXMuYXdhaXRpbmdCYXRjaEFjayA9IHRydWVcbiAgICB0aGlzLmFqYXgoXCJQT1NUXCIsIHtcIkNvbnRlbnQtVHlwZVwiOiBcImFwcGxpY2F0aW9uL3gtbmRqc29uXCJ9LCBtZXNzYWdlcy5qb2luKFwiXFxuXCIpLCAoKSA9PiB0aGlzLm9uZXJyb3IoXCJ0aW1lb3V0XCIpLCByZXNwID0+IHtcbiAgICAgIHRoaXMuYXdhaXRpbmdCYXRjaEFjayA9IGZhbHNlXG4gICAgICBpZighcmVzcCB8fCByZXNwLnN0YXR1cyAhPT0gMjAwKXtcbiAgICAgICAgdGhpcy5vbmVycm9yKHJlc3AgJiYgcmVzcC5zdGF0dXMpXG4gICAgICAgIHRoaXMuY2xvc2VBbmRSZXRyeSgxMDExLCBcImludGVybmFsIHNlcnZlciBlcnJvclwiLCBmYWxzZSlcbiAgICAgIH0gZWxzZSBpZih0aGlzLmJhdGNoQnVmZmVyLmxlbmd0aCA+IDApe1xuICAgICAgICB0aGlzLmJhdGNoU2VuZCh0aGlzLmJhdGNoQnVmZmVyKVxuICAgICAgICB0aGlzLmJhdGNoQnVmZmVyID0gW11cbiAgICAgIH1cbiAgICB9KVxuICB9XG5cbiAgY2xvc2UoY29kZSwgcmVhc29uLCB3YXNDbGVhbil7XG4gICAgZm9yKGxldCByZXEgb2YgdGhpcy5yZXFzKXsgcmVxLmFib3J0KCkgfVxuICAgIHRoaXMucmVhZHlTdGF0ZSA9IFNPQ0tFVF9TVEFURVMuY2xvc2VkXG4gICAgbGV0IG9wdHMgPSBPYmplY3QuYXNzaWduKHtjb2RlOiAxMDAwLCByZWFzb246IHVuZGVmaW5lZCwgd2FzQ2xlYW46IHRydWV9LCB7Y29kZSwgcmVhc29uLCB3YXNDbGVhbn0pXG4gICAgdGhpcy5iYXRjaEJ1ZmZlciA9IFtdXG4gICAgY2xlYXJUaW1lb3V0KHRoaXMuY3VycmVudEJhdGNoVGltZXIpXG4gICAgdGhpcy5jdXJyZW50QmF0Y2hUaW1lciA9IG51bGxcbiAgICBpZih0eXBlb2YoQ2xvc2VFdmVudCkgIT09IFwidW5kZWZpbmVkXCIpe1xuICAgICAgdGhpcy5vbmNsb3NlKG5ldyBDbG9zZUV2ZW50KFwiY2xvc2VcIiwgb3B0cykpXG4gICAgfSBlbHNlIHtcbiAgICAgIHRoaXMub25jbG9zZShvcHRzKVxuICAgIH1cbiAgfVxuXG4gIGFqYXgobWV0aG9kLCBoZWFkZXJzLCBib2R5LCBvbkNhbGxlclRpbWVvdXQsIGNhbGxiYWNrKXtcbiAgICBsZXQgcmVxXG4gICAgbGV0IG9udGltZW91dCA9ICgpID0+IHtcbiAgICAgIHRoaXMucmVxcy5kZWxldGUocmVxKVxuICAgICAgb25DYWxsZXJUaW1lb3V0KClcbiAgICB9XG4gICAgcmVxID0gQWpheC5yZXF1ZXN0KG1ldGhvZCwgdGhpcy5lbmRwb2ludFVSTCgpLCBoZWFkZXJzLCBib2R5LCB0aGlzLnRpbWVvdXQsIG9udGltZW91dCwgcmVzcCA9PiB7XG4gICAgICB0aGlzLnJlcXMuZGVsZXRlKHJlcSlcbiAgICAgIGlmKHRoaXMuaXNBY3RpdmUoKSl7IGNhbGxiYWNrKHJlc3ApIH1cbiAgICB9KVxuICAgIHRoaXMucmVxcy5hZGQocmVxKVxuICB9XG59XG4iLCAiLyoqXG4gKiBJbml0aWFsaXplcyB0aGUgUHJlc2VuY2VcbiAqIEBwYXJhbSB7Q2hhbm5lbH0gY2hhbm5lbCAtIFRoZSBDaGFubmVsXG4gKiBAcGFyYW0ge09iamVjdH0gb3B0cyAtIFRoZSBvcHRpb25zLFxuICogICAgICAgIGZvciBleGFtcGxlIGB7ZXZlbnRzOiB7c3RhdGU6IFwic3RhdGVcIiwgZGlmZjogXCJkaWZmXCJ9fWBcbiAqL1xuZXhwb3J0IGRlZmF1bHQgY2xhc3MgUHJlc2VuY2Uge1xuXG4gIGNvbnN0cnVjdG9yKGNoYW5uZWwsIG9wdHMgPSB7fSl7XG4gICAgbGV0IGV2ZW50cyA9IG9wdHMuZXZlbnRzIHx8IHtzdGF0ZTogXCJwcmVzZW5jZV9zdGF0ZVwiLCBkaWZmOiBcInByZXNlbmNlX2RpZmZcIn1cbiAgICB0aGlzLnN0YXRlID0ge31cbiAgICB0aGlzLnBlbmRpbmdEaWZmcyA9IFtdXG4gICAgdGhpcy5jaGFubmVsID0gY2hhbm5lbFxuICAgIHRoaXMuam9pblJlZiA9IG51bGxcbiAgICB0aGlzLmNhbGxlciA9IHtcbiAgICAgIG9uSm9pbjogZnVuY3Rpb24gKCl7IH0sXG4gICAgICBvbkxlYXZlOiBmdW5jdGlvbiAoKXsgfSxcbiAgICAgIG9uU3luYzogZnVuY3Rpb24gKCl7IH1cbiAgICB9XG5cbiAgICB0aGlzLmNoYW5uZWwub24oZXZlbnRzLnN0YXRlLCBuZXdTdGF0ZSA9PiB7XG4gICAgICBsZXQge29uSm9pbiwgb25MZWF2ZSwgb25TeW5jfSA9IHRoaXMuY2FsbGVyXG5cbiAgICAgIHRoaXMuam9pblJlZiA9IHRoaXMuY2hhbm5lbC5qb2luUmVmKClcbiAgICAgIHRoaXMuc3RhdGUgPSBQcmVzZW5jZS5zeW5jU3RhdGUodGhpcy5zdGF0ZSwgbmV3U3RhdGUsIG9uSm9pbiwgb25MZWF2ZSlcblxuICAgICAgdGhpcy5wZW5kaW5nRGlmZnMuZm9yRWFjaChkaWZmID0+IHtcbiAgICAgICAgdGhpcy5zdGF0ZSA9IFByZXNlbmNlLnN5bmNEaWZmKHRoaXMuc3RhdGUsIGRpZmYsIG9uSm9pbiwgb25MZWF2ZSlcbiAgICAgIH0pXG4gICAgICB0aGlzLnBlbmRpbmdEaWZmcyA9IFtdXG4gICAgICBvblN5bmMoKVxuICAgIH0pXG5cbiAgICB0aGlzLmNoYW5uZWwub24oZXZlbnRzLmRpZmYsIGRpZmYgPT4ge1xuICAgICAgbGV0IHtvbkpvaW4sIG9uTGVhdmUsIG9uU3luY30gPSB0aGlzLmNhbGxlclxuXG4gICAgICBpZih0aGlzLmluUGVuZGluZ1N5bmNTdGF0ZSgpKXtcbiAgICAgICAgdGhpcy5wZW5kaW5nRGlmZnMucHVzaChkaWZmKVxuICAgICAgfSBlbHNlIHtcbiAgICAgICAgdGhpcy5zdGF0ZSA9IFByZXNlbmNlLnN5bmNEaWZmKHRoaXMuc3RhdGUsIGRpZmYsIG9uSm9pbiwgb25MZWF2ZSlcbiAgICAgICAgb25TeW5jKClcbiAgICAgIH1cbiAgICB9KVxuICB9XG5cbiAgb25Kb2luKGNhbGxiYWNrKXsgdGhpcy5jYWxsZXIub25Kb2luID0gY2FsbGJhY2sgfVxuXG4gIG9uTGVhdmUoY2FsbGJhY2speyB0aGlzLmNhbGxlci5vbkxlYXZlID0gY2FsbGJhY2sgfVxuXG4gIG9uU3luYyhjYWxsYmFjayl7IHRoaXMuY2FsbGVyLm9uU3luYyA9IGNhbGxiYWNrIH1cblxuICBsaXN0KGJ5KXsgcmV0dXJuIFByZXNlbmNlLmxpc3QodGhpcy5zdGF0ZSwgYnkpIH1cblxuICBpblBlbmRpbmdTeW5jU3RhdGUoKXtcbiAgICByZXR1cm4gIXRoaXMuam9pblJlZiB8fCAodGhpcy5qb2luUmVmICE9PSB0aGlzLmNoYW5uZWwuam9pblJlZigpKVxuICB9XG5cbiAgLy8gbG93ZXItbGV2ZWwgcHVibGljIHN0YXRpYyBBUElcblxuICAvKipcbiAgICogVXNlZCB0byBzeW5jIHRoZSBsaXN0IG9mIHByZXNlbmNlcyBvbiB0aGUgc2VydmVyXG4gICAqIHdpdGggdGhlIGNsaWVudCdzIHN0YXRlLiBBbiBvcHRpb25hbCBgb25Kb2luYCBhbmQgYG9uTGVhdmVgIGNhbGxiYWNrIGNhblxuICAgKiBiZSBwcm92aWRlZCB0byByZWFjdCB0byBjaGFuZ2VzIGluIHRoZSBjbGllbnQncyBsb2NhbCBwcmVzZW5jZXMgYWNyb3NzXG4gICAqIGRpc2Nvbm5lY3RzIGFuZCByZWNvbm5lY3RzIHdpdGggdGhlIHNlcnZlci5cbiAgICpcbiAgICogQHJldHVybnMge1ByZXNlbmNlfVxuICAgKi9cbiAgc3RhdGljIHN5bmNTdGF0ZShjdXJyZW50U3RhdGUsIG5ld1N0YXRlLCBvbkpvaW4sIG9uTGVhdmUpe1xuICAgIGxldCBzdGF0ZSA9IHRoaXMuY2xvbmUoY3VycmVudFN0YXRlKVxuICAgIGxldCBqb2lucyA9IHt9XG4gICAgbGV0IGxlYXZlcyA9IHt9XG5cbiAgICB0aGlzLm1hcChzdGF0ZSwgKGtleSwgcHJlc2VuY2UpID0+IHtcbiAgICAgIGlmKCFuZXdTdGF0ZVtrZXldKXtcbiAgICAgICAgbGVhdmVzW2tleV0gPSBwcmVzZW5jZVxuICAgICAgfVxuICAgIH0pXG4gICAgdGhpcy5tYXAobmV3U3RhdGUsIChrZXksIG5ld1ByZXNlbmNlKSA9PiB7XG4gICAgICBsZXQgY3VycmVudFByZXNlbmNlID0gc3RhdGVba2V5XVxuICAgICAgaWYoY3VycmVudFByZXNlbmNlKXtcbiAgICAgICAgbGV0IG5ld1JlZnMgPSBuZXdQcmVzZW5jZS5tZXRhcy5tYXAobSA9PiBtLnBoeF9yZWYpXG4gICAgICAgIGxldCBjdXJSZWZzID0gY3VycmVudFByZXNlbmNlLm1ldGFzLm1hcChtID0+IG0ucGh4X3JlZilcbiAgICAgICAgbGV0IGpvaW5lZE1ldGFzID0gbmV3UHJlc2VuY2UubWV0YXMuZmlsdGVyKG0gPT4gY3VyUmVmcy5pbmRleE9mKG0ucGh4X3JlZikgPCAwKVxuICAgICAgICBsZXQgbGVmdE1ldGFzID0gY3VycmVudFByZXNlbmNlLm1ldGFzLmZpbHRlcihtID0+IG5ld1JlZnMuaW5kZXhPZihtLnBoeF9yZWYpIDwgMClcbiAgICAgICAgaWYoam9pbmVkTWV0YXMubGVuZ3RoID4gMCl7XG4gICAgICAgICAgam9pbnNba2V5XSA9IG5ld1ByZXNlbmNlXG4gICAgICAgICAgam9pbnNba2V5XS5tZXRhcyA9IGpvaW5lZE1ldGFzXG4gICAgICAgIH1cbiAgICAgICAgaWYobGVmdE1ldGFzLmxlbmd0aCA+IDApe1xuICAgICAgICAgIGxlYXZlc1trZXldID0gdGhpcy5jbG9uZShjdXJyZW50UHJlc2VuY2UpXG4gICAgICAgICAgbGVhdmVzW2tleV0ubWV0YXMgPSBsZWZ0TWV0YXNcbiAgICAgICAgfVxuICAgICAgfSBlbHNlIHtcbiAgICAgICAgam9pbnNba2V5XSA9IG5ld1ByZXNlbmNlXG4gICAgICB9XG4gICAgfSlcbiAgICByZXR1cm4gdGhpcy5zeW5jRGlmZihzdGF0ZSwge2pvaW5zOiBqb2lucywgbGVhdmVzOiBsZWF2ZXN9LCBvbkpvaW4sIG9uTGVhdmUpXG4gIH1cblxuICAvKipcbiAgICpcbiAgICogVXNlZCB0byBzeW5jIGEgZGlmZiBvZiBwcmVzZW5jZSBqb2luIGFuZCBsZWF2ZVxuICAgKiBldmVudHMgZnJvbSB0aGUgc2VydmVyLCBhcyB0aGV5IGhhcHBlbi4gTGlrZSBgc3luY1N0YXRlYCwgYHN5bmNEaWZmYFxuICAgKiBhY2NlcHRzIG9wdGlvbmFsIGBvbkpvaW5gIGFuZCBgb25MZWF2ZWAgY2FsbGJhY2tzIHRvIHJlYWN0IHRvIGEgdXNlclxuICAgKiBqb2luaW5nIG9yIGxlYXZpbmcgZnJvbSBhIGRldmljZS5cbiAgICpcbiAgICogQHJldHVybnMge1ByZXNlbmNlfVxuICAgKi9cbiAgc3RhdGljIHN5bmNEaWZmKHN0YXRlLCBkaWZmLCBvbkpvaW4sIG9uTGVhdmUpe1xuICAgIGxldCB7am9pbnMsIGxlYXZlc30gPSB0aGlzLmNsb25lKGRpZmYpXG4gICAgaWYoIW9uSm9pbil7IG9uSm9pbiA9IGZ1bmN0aW9uICgpeyB9IH1cbiAgICBpZighb25MZWF2ZSl7IG9uTGVhdmUgPSBmdW5jdGlvbiAoKXsgfSB9XG5cbiAgICB0aGlzLm1hcChqb2lucywgKGtleSwgbmV3UHJlc2VuY2UpID0+IHtcbiAgICAgIGxldCBjdXJyZW50UHJlc2VuY2UgPSBzdGF0ZVtrZXldXG4gICAgICBzdGF0ZVtrZXldID0gdGhpcy5jbG9uZShuZXdQcmVzZW5jZSlcbiAgICAgIGlmKGN1cnJlbnRQcmVzZW5jZSl7XG4gICAgICAgIGxldCBqb2luZWRSZWZzID0gc3RhdGVba2V5XS5tZXRhcy5tYXAobSA9PiBtLnBoeF9yZWYpXG4gICAgICAgIGxldCBjdXJNZXRhcyA9IGN1cnJlbnRQcmVzZW5jZS5tZXRhcy5maWx0ZXIobSA9PiBqb2luZWRSZWZzLmluZGV4T2YobS5waHhfcmVmKSA8IDApXG4gICAgICAgIHN0YXRlW2tleV0ubWV0YXMudW5zaGlmdCguLi5jdXJNZXRhcylcbiAgICAgIH1cbiAgICAgIG9uSm9pbihrZXksIGN1cnJlbnRQcmVzZW5jZSwgbmV3UHJlc2VuY2UpXG4gICAgfSlcbiAgICB0aGlzLm1hcChsZWF2ZXMsIChrZXksIGxlZnRQcmVzZW5jZSkgPT4ge1xuICAgICAgbGV0IGN1cnJlbnRQcmVzZW5jZSA9IHN0YXRlW2tleV1cbiAgICAgIGlmKCFjdXJyZW50UHJlc2VuY2UpeyByZXR1cm4gfVxuICAgICAgbGV0IHJlZnNUb1JlbW92ZSA9IGxlZnRQcmVzZW5jZS5tZXRhcy5tYXAobSA9PiBtLnBoeF9yZWYpXG4gICAgICBjdXJyZW50UHJlc2VuY2UubWV0YXMgPSBjdXJyZW50UHJlc2VuY2UubWV0YXMuZmlsdGVyKHAgPT4ge1xuICAgICAgICByZXR1cm4gcmVmc1RvUmVtb3ZlLmluZGV4T2YocC5waHhfcmVmKSA8IDBcbiAgICAgIH0pXG4gICAgICBvbkxlYXZlKGtleSwgY3VycmVudFByZXNlbmNlLCBsZWZ0UHJlc2VuY2UpXG4gICAgICBpZihjdXJyZW50UHJlc2VuY2UubWV0YXMubGVuZ3RoID09PSAwKXtcbiAgICAgICAgZGVsZXRlIHN0YXRlW2tleV1cbiAgICAgIH1cbiAgICB9KVxuICAgIHJldHVybiBzdGF0ZVxuICB9XG5cbiAgLyoqXG4gICAqIFJldHVybnMgdGhlIGFycmF5IG9mIHByZXNlbmNlcywgd2l0aCBzZWxlY3RlZCBtZXRhZGF0YS5cbiAgICpcbiAgICogQHBhcmFtIHtPYmplY3R9IHByZXNlbmNlc1xuICAgKiBAcGFyYW0ge0Z1bmN0aW9ufSBjaG9vc2VyXG4gICAqXG4gICAqIEByZXR1cm5zIHtQcmVzZW5jZX1cbiAgICovXG4gIHN0YXRpYyBsaXN0KHByZXNlbmNlcywgY2hvb3Nlcil7XG4gICAgaWYoIWNob29zZXIpeyBjaG9vc2VyID0gZnVuY3Rpb24gKGtleSwgcHJlcyl7IHJldHVybiBwcmVzIH0gfVxuXG4gICAgcmV0dXJuIHRoaXMubWFwKHByZXNlbmNlcywgKGtleSwgcHJlc2VuY2UpID0+IHtcbiAgICAgIHJldHVybiBjaG9vc2VyKGtleSwgcHJlc2VuY2UpXG4gICAgfSlcbiAgfVxuXG4gIC8vIHByaXZhdGVcblxuICBzdGF0aWMgbWFwKG9iaiwgZnVuYyl7XG4gICAgcmV0dXJuIE9iamVjdC5nZXRPd25Qcm9wZXJ0eU5hbWVzKG9iaikubWFwKGtleSA9PiBmdW5jKGtleSwgb2JqW2tleV0pKVxuICB9XG5cbiAgc3RhdGljIGNsb25lKG9iail7IHJldHVybiBKU09OLnBhcnNlKEpTT04uc3RyaW5naWZ5KG9iaikpIH1cbn1cbiIsICIvKiBUaGUgZGVmYXVsdCBzZXJpYWxpemVyIGZvciBlbmNvZGluZyBhbmQgZGVjb2RpbmcgbWVzc2FnZXMgKi9cbmltcG9ydCB7XG4gIENIQU5ORUxfRVZFTlRTXG59IGZyb20gXCIuL2NvbnN0YW50c1wiXG5cbmV4cG9ydCBkZWZhdWx0IHtcbiAgSEVBREVSX0xFTkdUSDogMSxcbiAgTUVUQV9MRU5HVEg6IDQsXG4gIEtJTkRTOiB7cHVzaDogMCwgcmVwbHk6IDEsIGJyb2FkY2FzdDogMn0sXG5cbiAgZW5jb2RlKG1zZywgY2FsbGJhY2spe1xuICAgIGlmKG1zZy5wYXlsb2FkLmNvbnN0cnVjdG9yID09PSBBcnJheUJ1ZmZlcil7XG4gICAgICByZXR1cm4gY2FsbGJhY2sodGhpcy5iaW5hcnlFbmNvZGUobXNnKSlcbiAgICB9IGVsc2Uge1xuICAgICAgbGV0IHBheWxvYWQgPSBbbXNnLmpvaW5fcmVmLCBtc2cucmVmLCBtc2cudG9waWMsIG1zZy5ldmVudCwgbXNnLnBheWxvYWRdXG4gICAgICByZXR1cm4gY2FsbGJhY2soSlNPTi5zdHJpbmdpZnkocGF5bG9hZCkpXG4gICAgfVxuICB9LFxuXG4gIGRlY29kZShyYXdQYXlsb2FkLCBjYWxsYmFjayl7XG4gICAgaWYocmF3UGF5bG9hZC5jb25zdHJ1Y3RvciA9PT0gQXJyYXlCdWZmZXIpe1xuICAgICAgcmV0dXJuIGNhbGxiYWNrKHRoaXMuYmluYXJ5RGVjb2RlKHJhd1BheWxvYWQpKVxuICAgIH0gZWxzZSB7XG4gICAgICBsZXQgW2pvaW5fcmVmLCByZWYsIHRvcGljLCBldmVudCwgcGF5bG9hZF0gPSBKU09OLnBhcnNlKHJhd1BheWxvYWQpXG4gICAgICByZXR1cm4gY2FsbGJhY2soe2pvaW5fcmVmLCByZWYsIHRvcGljLCBldmVudCwgcGF5bG9hZH0pXG4gICAgfVxuICB9LFxuXG4gIC8vIHByaXZhdGVcblxuICBiaW5hcnlFbmNvZGUobWVzc2FnZSl7XG4gICAgbGV0IHtqb2luX3JlZiwgcmVmLCBldmVudCwgdG9waWMsIHBheWxvYWR9ID0gbWVzc2FnZVxuICAgIGxldCBtZXRhTGVuZ3RoID0gdGhpcy5NRVRBX0xFTkdUSCArIGpvaW5fcmVmLmxlbmd0aCArIHJlZi5sZW5ndGggKyB0b3BpYy5sZW5ndGggKyBldmVudC5sZW5ndGhcbiAgICBsZXQgaGVhZGVyID0gbmV3IEFycmF5QnVmZmVyKHRoaXMuSEVBREVSX0xFTkdUSCArIG1ldGFMZW5ndGgpXG4gICAgbGV0IHZpZXcgPSBuZXcgRGF0YVZpZXcoaGVhZGVyKVxuICAgIGxldCBvZmZzZXQgPSAwXG5cbiAgICB2aWV3LnNldFVpbnQ4KG9mZnNldCsrLCB0aGlzLktJTkRTLnB1c2gpIC8vIGtpbmRcbiAgICB2aWV3LnNldFVpbnQ4KG9mZnNldCsrLCBqb2luX3JlZi5sZW5ndGgpXG4gICAgdmlldy5zZXRVaW50OChvZmZzZXQrKywgcmVmLmxlbmd0aClcbiAgICB2aWV3LnNldFVpbnQ4KG9mZnNldCsrLCB0b3BpYy5sZW5ndGgpXG4gICAgdmlldy5zZXRVaW50OChvZmZzZXQrKywgZXZlbnQubGVuZ3RoKVxuICAgIEFycmF5LmZyb20oam9pbl9yZWYsIGNoYXIgPT4gdmlldy5zZXRVaW50OChvZmZzZXQrKywgY2hhci5jaGFyQ29kZUF0KDApKSlcbiAgICBBcnJheS5mcm9tKHJlZiwgY2hhciA9PiB2aWV3LnNldFVpbnQ4KG9mZnNldCsrLCBjaGFyLmNoYXJDb2RlQXQoMCkpKVxuICAgIEFycmF5LmZyb20odG9waWMsIGNoYXIgPT4gdmlldy5zZXRVaW50OChvZmZzZXQrKywgY2hhci5jaGFyQ29kZUF0KDApKSlcbiAgICBBcnJheS5mcm9tKGV2ZW50LCBjaGFyID0+IHZpZXcuc2V0VWludDgob2Zmc2V0KyssIGNoYXIuY2hhckNvZGVBdCgwKSkpXG5cbiAgICB2YXIgY29tYmluZWQgPSBuZXcgVWludDhBcnJheShoZWFkZXIuYnl0ZUxlbmd0aCArIHBheWxvYWQuYnl0ZUxlbmd0aClcbiAgICBjb21iaW5lZC5zZXQobmV3IFVpbnQ4QXJyYXkoaGVhZGVyKSwgMClcbiAgICBjb21iaW5lZC5zZXQobmV3IFVpbnQ4QXJyYXkocGF5bG9hZCksIGhlYWRlci5ieXRlTGVuZ3RoKVxuXG4gICAgcmV0dXJuIGNvbWJpbmVkLmJ1ZmZlclxuICB9LFxuXG4gIGJpbmFyeURlY29kZShidWZmZXIpe1xuICAgIGxldCB2aWV3ID0gbmV3IERhdGFWaWV3KGJ1ZmZlcilcbiAgICBsZXQga2luZCA9IHZpZXcuZ2V0VWludDgoMClcbiAgICBsZXQgZGVjb2RlciA9IG5ldyBUZXh0RGVjb2RlcigpXG4gICAgc3dpdGNoKGtpbmQpe1xuICAgICAgY2FzZSB0aGlzLktJTkRTLnB1c2g6IHJldHVybiB0aGlzLmRlY29kZVB1c2goYnVmZmVyLCB2aWV3LCBkZWNvZGVyKVxuICAgICAgY2FzZSB0aGlzLktJTkRTLnJlcGx5OiByZXR1cm4gdGhpcy5kZWNvZGVSZXBseShidWZmZXIsIHZpZXcsIGRlY29kZXIpXG4gICAgICBjYXNlIHRoaXMuS0lORFMuYnJvYWRjYXN0OiByZXR1cm4gdGhpcy5kZWNvZGVCcm9hZGNhc3QoYnVmZmVyLCB2aWV3LCBkZWNvZGVyKVxuICAgIH1cbiAgfSxcblxuICBkZWNvZGVQdXNoKGJ1ZmZlciwgdmlldywgZGVjb2Rlcil7XG4gICAgbGV0IGpvaW5SZWZTaXplID0gdmlldy5nZXRVaW50OCgxKVxuICAgIGxldCB0b3BpY1NpemUgPSB2aWV3LmdldFVpbnQ4KDIpXG4gICAgbGV0IGV2ZW50U2l6ZSA9IHZpZXcuZ2V0VWludDgoMylcbiAgICBsZXQgb2Zmc2V0ID0gdGhpcy5IRUFERVJfTEVOR1RIICsgdGhpcy5NRVRBX0xFTkdUSCAtIDEgLy8gcHVzaGVzIGhhdmUgbm8gcmVmXG4gICAgbGV0IGpvaW5SZWYgPSBkZWNvZGVyLmRlY29kZShidWZmZXIuc2xpY2Uob2Zmc2V0LCBvZmZzZXQgKyBqb2luUmVmU2l6ZSkpXG4gICAgb2Zmc2V0ID0gb2Zmc2V0ICsgam9pblJlZlNpemVcbiAgICBsZXQgdG9waWMgPSBkZWNvZGVyLmRlY29kZShidWZmZXIuc2xpY2Uob2Zmc2V0LCBvZmZzZXQgKyB0b3BpY1NpemUpKVxuICAgIG9mZnNldCA9IG9mZnNldCArIHRvcGljU2l6ZVxuICAgIGxldCBldmVudCA9IGRlY29kZXIuZGVjb2RlKGJ1ZmZlci5zbGljZShvZmZzZXQsIG9mZnNldCArIGV2ZW50U2l6ZSkpXG4gICAgb2Zmc2V0ID0gb2Zmc2V0ICsgZXZlbnRTaXplXG4gICAgbGV0IGRhdGEgPSBidWZmZXIuc2xpY2Uob2Zmc2V0LCBidWZmZXIuYnl0ZUxlbmd0aClcbiAgICByZXR1cm4ge2pvaW5fcmVmOiBqb2luUmVmLCByZWY6IG51bGwsIHRvcGljOiB0b3BpYywgZXZlbnQ6IGV2ZW50LCBwYXlsb2FkOiBkYXRhfVxuICB9LFxuXG4gIGRlY29kZVJlcGx5KGJ1ZmZlciwgdmlldywgZGVjb2Rlcil7XG4gICAgbGV0IGpvaW5SZWZTaXplID0gdmlldy5nZXRVaW50OCgxKVxuICAgIGxldCByZWZTaXplID0gdmlldy5nZXRVaW50OCgyKVxuICAgIGxldCB0b3BpY1NpemUgPSB2aWV3LmdldFVpbnQ4KDMpXG4gICAgbGV0IGV2ZW50U2l6ZSA9IHZpZXcuZ2V0VWludDgoNClcbiAgICBsZXQgb2Zmc2V0ID0gdGhpcy5IRUFERVJfTEVOR1RIICsgdGhpcy5NRVRBX0xFTkdUSFxuICAgIGxldCBqb2luUmVmID0gZGVjb2Rlci5kZWNvZGUoYnVmZmVyLnNsaWNlKG9mZnNldCwgb2Zmc2V0ICsgam9pblJlZlNpemUpKVxuICAgIG9mZnNldCA9IG9mZnNldCArIGpvaW5SZWZTaXplXG4gICAgbGV0IHJlZiA9IGRlY29kZXIuZGVjb2RlKGJ1ZmZlci5zbGljZShvZmZzZXQsIG9mZnNldCArIHJlZlNpemUpKVxuICAgIG9mZnNldCA9IG9mZnNldCArIHJlZlNpemVcbiAgICBsZXQgdG9waWMgPSBkZWNvZGVyLmRlY29kZShidWZmZXIuc2xpY2Uob2Zmc2V0LCBvZmZzZXQgKyB0b3BpY1NpemUpKVxuICAgIG9mZnNldCA9IG9mZnNldCArIHRvcGljU2l6ZVxuICAgIGxldCBldmVudCA9IGRlY29kZXIuZGVjb2RlKGJ1ZmZlci5zbGljZShvZmZzZXQsIG9mZnNldCArIGV2ZW50U2l6ZSkpXG4gICAgb2Zmc2V0ID0gb2Zmc2V0ICsgZXZlbnRTaXplXG4gICAgbGV0IGRhdGEgPSBidWZmZXIuc2xpY2Uob2Zmc2V0LCBidWZmZXIuYnl0ZUxlbmd0aClcbiAgICBsZXQgcGF5bG9hZCA9IHtzdGF0dXM6IGV2ZW50LCByZXNwb25zZTogZGF0YX1cbiAgICByZXR1cm4ge2pvaW5fcmVmOiBqb2luUmVmLCByZWY6IHJlZiwgdG9waWM6IHRvcGljLCBldmVudDogQ0hBTk5FTF9FVkVOVFMucmVwbHksIHBheWxvYWQ6IHBheWxvYWR9XG4gIH0sXG5cbiAgZGVjb2RlQnJvYWRjYXN0KGJ1ZmZlciwgdmlldywgZGVjb2Rlcil7XG4gICAgbGV0IHRvcGljU2l6ZSA9IHZpZXcuZ2V0VWludDgoMSlcbiAgICBsZXQgZXZlbnRTaXplID0gdmlldy5nZXRVaW50OCgyKVxuICAgIGxldCBvZmZzZXQgPSB0aGlzLkhFQURFUl9MRU5HVEggKyAyXG4gICAgbGV0IHRvcGljID0gZGVjb2Rlci5kZWNvZGUoYnVmZmVyLnNsaWNlKG9mZnNldCwgb2Zmc2V0ICsgdG9waWNTaXplKSlcbiAgICBvZmZzZXQgPSBvZmZzZXQgKyB0b3BpY1NpemVcbiAgICBsZXQgZXZlbnQgPSBkZWNvZGVyLmRlY29kZShidWZmZXIuc2xpY2Uob2Zmc2V0LCBvZmZzZXQgKyBldmVudFNpemUpKVxuICAgIG9mZnNldCA9IG9mZnNldCArIGV2ZW50U2l6ZVxuICAgIGxldCBkYXRhID0gYnVmZmVyLnNsaWNlKG9mZnNldCwgYnVmZmVyLmJ5dGVMZW5ndGgpXG5cbiAgICByZXR1cm4ge2pvaW5fcmVmOiBudWxsLCByZWY6IG51bGwsIHRvcGljOiB0b3BpYywgZXZlbnQ6IGV2ZW50LCBwYXlsb2FkOiBkYXRhfVxuICB9XG59XG4iLCAiaW1wb3J0IHtcbiAgZ2xvYmFsLFxuICBwaHhXaW5kb3csXG4gIENIQU5ORUxfRVZFTlRTLFxuICBERUZBVUxUX1RJTUVPVVQsXG4gIERFRkFVTFRfVlNOLFxuICBTT0NLRVRfU1RBVEVTLFxuICBUUkFOU1BPUlRTLFxuICBXU19DTE9TRV9OT1JNQUwsXG4gIEFVVEhfVE9LRU5fUFJFRklYXG59IGZyb20gXCIuL2NvbnN0YW50c1wiXG5cbmltcG9ydCB7XG4gIGNsb3N1cmVcbn0gZnJvbSBcIi4vdXRpbHNcIlxuXG5pbXBvcnQgQWpheCBmcm9tIFwiLi9hamF4XCJcbmltcG9ydCBDaGFubmVsIGZyb20gXCIuL2NoYW5uZWxcIlxuaW1wb3J0IExvbmdQb2xsIGZyb20gXCIuL2xvbmdwb2xsXCJcbmltcG9ydCBTZXJpYWxpemVyIGZyb20gXCIuL3NlcmlhbGl6ZXJcIlxuaW1wb3J0IFRpbWVyIGZyb20gXCIuL3RpbWVyXCJcblxuLyoqIEluaXRpYWxpemVzIHRoZSBTb2NrZXQgKlxuICpcbiAqIEZvciBJRTggc3VwcG9ydCB1c2UgYW4gRVM1LXNoaW0gKGh0dHBzOi8vZ2l0aHViLmNvbS9lcy1zaGltcy9lczUtc2hpbSlcbiAqXG4gKiBAcGFyYW0ge3N0cmluZ30gZW5kUG9pbnQgLSBUaGUgc3RyaW5nIFdlYlNvY2tldCBlbmRwb2ludCwgaWUsIGBcIndzOi8vZXhhbXBsZS5jb20vc29ja2V0XCJgLFxuICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGBcIndzczovL2V4YW1wbGUuY29tXCJgXG4gKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYFwiL3NvY2tldFwiYCAoaW5oZXJpdGVkIGhvc3QgJiBwcm90b2NvbClcbiAqIEBwYXJhbSB7T2JqZWN0fSBbb3B0c10gLSBPcHRpb25hbCBjb25maWd1cmF0aW9uXG4gKiBAcGFyYW0ge0Z1bmN0aW9ufSBbb3B0cy50cmFuc3BvcnRdIC0gVGhlIFdlYnNvY2tldCBUcmFuc3BvcnQsIGZvciBleGFtcGxlIFdlYlNvY2tldCBvciBQaG9lbml4LkxvbmdQb2xsLlxuICpcbiAqIERlZmF1bHRzIHRvIFdlYlNvY2tldCB3aXRoIGF1dG9tYXRpYyBMb25nUG9sbCBmYWxsYmFjayBpZiBXZWJTb2NrZXQgaXMgbm90IGRlZmluZWQuXG4gKiBUbyBmYWxsYmFjayB0byBMb25nUG9sbCB3aGVuIFdlYlNvY2tldCBhdHRlbXB0cyBmYWlsLCB1c2UgYGxvbmdQb2xsRmFsbGJhY2tNczogMjUwMGAuXG4gKlxuICogQHBhcmFtIHtudW1iZXJ9IFtvcHRzLmxvbmdQb2xsRmFsbGJhY2tNc10gLSBUaGUgbWlsbGlzZWNvbmQgdGltZSB0byBhdHRlbXB0IHRoZSBwcmltYXJ5IHRyYW5zcG9ydFxuICogYmVmb3JlIGZhbGxpbmcgYmFjayB0byB0aGUgTG9uZ1BvbGwgdHJhbnNwb3J0LiBEaXNhYmxlZCBieSBkZWZhdWx0LlxuICpcbiAqIEBwYXJhbSB7Ym9vbGVhbn0gW29wdHMuZGVidWddIC0gV2hlbiB0cnVlLCBlbmFibGVzIGRlYnVnIGxvZ2dpbmcuIERlZmF1bHQgZmFsc2UuXG4gKlxuICogQHBhcmFtIHtGdW5jdGlvbn0gW29wdHMuZW5jb2RlXSAtIFRoZSBmdW5jdGlvbiB0byBlbmNvZGUgb3V0Z29pbmcgbWVzc2FnZXMuXG4gKlxuICogRGVmYXVsdHMgdG8gSlNPTiBlbmNvZGVyLlxuICpcbiAqIEBwYXJhbSB7RnVuY3Rpb259IFtvcHRzLmRlY29kZV0gLSBUaGUgZnVuY3Rpb24gdG8gZGVjb2RlIGluY29taW5nIG1lc3NhZ2VzLlxuICpcbiAqIERlZmF1bHRzIHRvIEpTT046XG4gKlxuICogYGBgamF2YXNjcmlwdFxuICogKHBheWxvYWQsIGNhbGxiYWNrKSA9PiBjYWxsYmFjayhKU09OLnBhcnNlKHBheWxvYWQpKVxuICogYGBgXG4gKlxuICogQHBhcmFtIHtudW1iZXJ9IFtvcHRzLnRpbWVvdXRdIC0gVGhlIGRlZmF1bHQgdGltZW91dCBpbiBtaWxsaXNlY29uZHMgdG8gdHJpZ2dlciBwdXNoIHRpbWVvdXRzLlxuICpcbiAqIERlZmF1bHRzIGBERUZBVUxUX1RJTUVPVVRgXG4gKiBAcGFyYW0ge251bWJlcn0gW29wdHMuaGVhcnRiZWF0SW50ZXJ2YWxNc10gLSBUaGUgbWlsbGlzZWMgaW50ZXJ2YWwgdG8gc2VuZCBhIGhlYXJ0YmVhdCBtZXNzYWdlXG4gKiBAcGFyYW0ge0Z1bmN0aW9ufSBbb3B0cy5yZWNvbm5lY3RBZnRlck1zXSAtIFRoZSBvcHRpb25hbCBmdW5jdGlvbiB0aGF0IHJldHVybnMgdGhlXG4gKiBzb2NrZXQgcmVjb25uZWN0IGludGVydmFsLCBpbiBtaWxsaXNlY29uZHMuXG4gKlxuICogRGVmYXVsdHMgdG8gc3RlcHBlZCBiYWNrb2ZmIG9mOlxuICpcbiAqIGBgYGphdmFzY3JpcHRcbiAqIGZ1bmN0aW9uKHRyaWVzKXtcbiAqICAgcmV0dXJuIFsxMCwgNTAsIDEwMCwgMTUwLCAyMDAsIDI1MCwgNTAwLCAxMDAwLCAyMDAwXVt0cmllcyAtIDFdIHx8IDUwMDBcbiAqIH1cbiAqIGBgYGBcbiAqXG4gKiBAcGFyYW0ge0Z1bmN0aW9ufSBbb3B0cy5yZWpvaW5BZnRlck1zXSAtIFRoZSBvcHRpb25hbCBmdW5jdGlvbiB0aGF0IHJldHVybnMgdGhlIG1pbGxpc2VjXG4gKiByZWpvaW4gaW50ZXJ2YWwgZm9yIGluZGl2aWR1YWwgY2hhbm5lbHMuXG4gKlxuICogYGBgamF2YXNjcmlwdFxuICogZnVuY3Rpb24odHJpZXMpe1xuICogICByZXR1cm4gWzEwMDAsIDIwMDAsIDUwMDBdW3RyaWVzIC0gMV0gfHwgMTAwMDBcbiAqIH1cbiAqIGBgYGBcbiAqXG4gKiBAcGFyYW0ge0Z1bmN0aW9ufSBbb3B0cy5sb2dnZXJdIC0gVGhlIG9wdGlvbmFsIGZ1bmN0aW9uIGZvciBzcGVjaWFsaXplZCBsb2dnaW5nLCBpZTpcbiAqXG4gKiBgYGBqYXZhc2NyaXB0XG4gKiBmdW5jdGlvbihraW5kLCBtc2csIGRhdGEpIHtcbiAqICAgY29uc29sZS5sb2coYCR7a2luZH06ICR7bXNnfWAsIGRhdGEpXG4gKiB9XG4gKiBgYGBcbiAqXG4gKiBAcGFyYW0ge251bWJlcn0gW29wdHMubG9uZ3BvbGxlclRpbWVvdXRdIC0gVGhlIG1heGltdW0gdGltZW91dCBvZiBhIGxvbmcgcG9sbCBBSkFYIHJlcXVlc3QuXG4gKlxuICogRGVmYXVsdHMgdG8gMjBzIChkb3VibGUgdGhlIHNlcnZlciBsb25nIHBvbGwgdGltZXIpLlxuICpcbiAqIEBwYXJhbSB7KE9iamVjdHxmdW5jdGlvbil9IFtvcHRzLnBhcmFtc10gLSBUaGUgb3B0aW9uYWwgcGFyYW1zIHRvIHBhc3Mgd2hlbiBjb25uZWN0aW5nXG4gKiBAcGFyYW0ge3N0cmluZ30gW29wdHMuYXV0aFRva2VuXSAtIHRoZSBvcHRpb25hbCBhdXRoZW50aWNhdGlvbiB0b2tlbiB0byBiZSBleHBvc2VkIG9uIHRoZSBzZXJ2ZXJcbiAqIHVuZGVyIHRoZSBgOmF1dGhfdG9rZW5gIGNvbm5lY3RfaW5mbyBrZXkuXG4gKiBAcGFyYW0ge3N0cmluZ30gW29wdHMuYmluYXJ5VHlwZV0gLSBUaGUgYmluYXJ5IHR5cGUgdG8gdXNlIGZvciBiaW5hcnkgV2ViU29ja2V0IGZyYW1lcy5cbiAqXG4gKiBEZWZhdWx0cyB0byBcImFycmF5YnVmZmVyXCJcbiAqXG4gKiBAcGFyYW0ge3Zzbn0gW29wdHMudnNuXSAtIFRoZSBzZXJpYWxpemVyJ3MgcHJvdG9jb2wgdmVyc2lvbiB0byBzZW5kIG9uIGNvbm5lY3QuXG4gKlxuICogRGVmYXVsdHMgdG8gREVGQVVMVF9WU04uXG4gKlxuICogQHBhcmFtIHtPYmplY3R9IFtvcHRzLnNlc3Npb25TdG9yYWdlXSAtIEFuIG9wdGlvbmFsIFN0b3JhZ2UgY29tcGF0aWJsZSBvYmplY3RcbiAqIFBob2VuaXggdXNlcyBzZXNzaW9uU3RvcmFnZSBmb3IgbG9uZ3BvbGwgZmFsbGJhY2sgaGlzdG9yeS4gT3ZlcnJpZGluZyB0aGUgc3RvcmUgaXNcbiAqIHVzZWZ1bCB3aGVuIFBob2VuaXggd29uJ3QgaGF2ZSBhY2Nlc3MgdG8gYHNlc3Npb25TdG9yYWdlYC4gRm9yIGV4YW1wbGUsIFRoaXMgY291bGRcbiAqIGhhcHBlbiBpZiBhIHNpdGUgbG9hZHMgYSBjcm9zcy1kb21haW4gY2hhbm5lbCBpbiBhbiBpZnJhbWUuIEV4YW1wbGUgdXNhZ2U6XG4gKlxuICogICAgIGNsYXNzIEluTWVtb3J5U3RvcmFnZSB7XG4gKiAgICAgICBjb25zdHJ1Y3RvcigpIHsgdGhpcy5zdG9yYWdlID0ge30gfVxuICogICAgICAgZ2V0SXRlbShrZXlOYW1lKSB7IHJldHVybiB0aGlzLnN0b3JhZ2Vba2V5TmFtZV0gfHwgbnVsbCB9XG4gKiAgICAgICByZW1vdmVJdGVtKGtleU5hbWUpIHsgZGVsZXRlIHRoaXMuc3RvcmFnZVtrZXlOYW1lXSB9XG4gKiAgICAgICBzZXRJdGVtKGtleU5hbWUsIGtleVZhbHVlKSB7IHRoaXMuc3RvcmFnZVtrZXlOYW1lXSA9IGtleVZhbHVlIH1cbiAqICAgICB9XG4gKlxuKi9cbmV4cG9ydCBkZWZhdWx0IGNsYXNzIFNvY2tldCB7XG4gIGNvbnN0cnVjdG9yKGVuZFBvaW50LCBvcHRzID0ge30pe1xuICAgIHRoaXMuc3RhdGVDaGFuZ2VDYWxsYmFja3MgPSB7b3BlbjogW10sIGNsb3NlOiBbXSwgZXJyb3I6IFtdLCBtZXNzYWdlOiBbXX1cbiAgICB0aGlzLmNoYW5uZWxzID0gW11cbiAgICB0aGlzLnNlbmRCdWZmZXIgPSBbXVxuICAgIHRoaXMucmVmID0gMFxuICAgIHRoaXMudGltZW91dCA9IG9wdHMudGltZW91dCB8fCBERUZBVUxUX1RJTUVPVVRcbiAgICB0aGlzLnRyYW5zcG9ydCA9IG9wdHMudHJhbnNwb3J0IHx8IGdsb2JhbC5XZWJTb2NrZXQgfHwgTG9uZ1BvbGxcbiAgICB0aGlzLnByaW1hcnlQYXNzZWRIZWFsdGhDaGVjayA9IGZhbHNlXG4gICAgdGhpcy5sb25nUG9sbEZhbGxiYWNrTXMgPSBvcHRzLmxvbmdQb2xsRmFsbGJhY2tNc1xuICAgIHRoaXMuZmFsbGJhY2tUaW1lciA9IG51bGxcbiAgICB0aGlzLnNlc3Npb25TdG9yZSA9IG9wdHMuc2Vzc2lvblN0b3JhZ2UgfHwgKGdsb2JhbCAmJiBnbG9iYWwuc2Vzc2lvblN0b3JhZ2UpXG4gICAgdGhpcy5lc3RhYmxpc2hlZENvbm5lY3Rpb25zID0gMFxuICAgIHRoaXMuZGVmYXVsdEVuY29kZXIgPSBTZXJpYWxpemVyLmVuY29kZS5iaW5kKFNlcmlhbGl6ZXIpXG4gICAgdGhpcy5kZWZhdWx0RGVjb2RlciA9IFNlcmlhbGl6ZXIuZGVjb2RlLmJpbmQoU2VyaWFsaXplcilcbiAgICB0aGlzLmNsb3NlV2FzQ2xlYW4gPSBmYWxzZVxuICAgIHRoaXMuZGlzY29ubmVjdGluZyA9IGZhbHNlXG4gICAgdGhpcy5iaW5hcnlUeXBlID0gb3B0cy5iaW5hcnlUeXBlIHx8IFwiYXJyYXlidWZmZXJcIlxuICAgIHRoaXMuY29ubmVjdENsb2NrID0gMVxuICAgIGlmKHRoaXMudHJhbnNwb3J0ICE9PSBMb25nUG9sbCl7XG4gICAgICB0aGlzLmVuY29kZSA9IG9wdHMuZW5jb2RlIHx8IHRoaXMuZGVmYXVsdEVuY29kZXJcbiAgICAgIHRoaXMuZGVjb2RlID0gb3B0cy5kZWNvZGUgfHwgdGhpcy5kZWZhdWx0RGVjb2RlclxuICAgIH0gZWxzZSB7XG4gICAgICB0aGlzLmVuY29kZSA9IHRoaXMuZGVmYXVsdEVuY29kZXJcbiAgICAgIHRoaXMuZGVjb2RlID0gdGhpcy5kZWZhdWx0RGVjb2RlclxuICAgIH1cbiAgICBsZXQgYXdhaXRpbmdDb25uZWN0aW9uT25QYWdlU2hvdyA9IG51bGxcbiAgICBpZihwaHhXaW5kb3cgJiYgcGh4V2luZG93LmFkZEV2ZW50TGlzdGVuZXIpe1xuICAgICAgcGh4V2luZG93LmFkZEV2ZW50TGlzdGVuZXIoXCJwYWdlaGlkZVwiLCBfZSA9PiB7XG4gICAgICAgIGlmKHRoaXMuY29ubil7XG4gICAgICAgICAgdGhpcy5kaXNjb25uZWN0KClcbiAgICAgICAgICBhd2FpdGluZ0Nvbm5lY3Rpb25PblBhZ2VTaG93ID0gdGhpcy5jb25uZWN0Q2xvY2tcbiAgICAgICAgfVxuICAgICAgfSlcbiAgICAgIHBoeFdpbmRvdy5hZGRFdmVudExpc3RlbmVyKFwicGFnZXNob3dcIiwgX2UgPT4ge1xuICAgICAgICBpZihhd2FpdGluZ0Nvbm5lY3Rpb25PblBhZ2VTaG93ID09PSB0aGlzLmNvbm5lY3RDbG9jayl7XG4gICAgICAgICAgYXdhaXRpbmdDb25uZWN0aW9uT25QYWdlU2hvdyA9IG51bGxcbiAgICAgICAgICB0aGlzLmNvbm5lY3QoKVxuICAgICAgICB9XG4gICAgICB9KVxuICAgIH1cbiAgICB0aGlzLmhlYXJ0YmVhdEludGVydmFsTXMgPSBvcHRzLmhlYXJ0YmVhdEludGVydmFsTXMgfHwgMzAwMDBcbiAgICB0aGlzLnJlam9pbkFmdGVyTXMgPSAodHJpZXMpID0+IHtcbiAgICAgIGlmKG9wdHMucmVqb2luQWZ0ZXJNcyl7XG4gICAgICAgIHJldHVybiBvcHRzLnJlam9pbkFmdGVyTXModHJpZXMpXG4gICAgICB9IGVsc2Uge1xuICAgICAgICByZXR1cm4gWzEwMDAsIDIwMDAsIDUwMDBdW3RyaWVzIC0gMV0gfHwgMTAwMDBcbiAgICAgIH1cbiAgICB9XG4gICAgdGhpcy5yZWNvbm5lY3RBZnRlck1zID0gKHRyaWVzKSA9PiB7XG4gICAgICBpZihvcHRzLnJlY29ubmVjdEFmdGVyTXMpe1xuICAgICAgICByZXR1cm4gb3B0cy5yZWNvbm5lY3RBZnRlck1zKHRyaWVzKVxuICAgICAgfSBlbHNlIHtcbiAgICAgICAgcmV0dXJuIFsxMCwgNTAsIDEwMCwgMTUwLCAyMDAsIDI1MCwgNTAwLCAxMDAwLCAyMDAwXVt0cmllcyAtIDFdIHx8IDUwMDBcbiAgICAgIH1cbiAgICB9XG4gICAgdGhpcy5sb2dnZXIgPSBvcHRzLmxvZ2dlciB8fCBudWxsXG4gICAgaWYoIXRoaXMubG9nZ2VyICYmIG9wdHMuZGVidWcpe1xuICAgICAgdGhpcy5sb2dnZXIgPSAoa2luZCwgbXNnLCBkYXRhKSA9PiB7IGNvbnNvbGUubG9nKGAke2tpbmR9OiAke21zZ31gLCBkYXRhKSB9XG4gICAgfVxuICAgIHRoaXMubG9uZ3BvbGxlclRpbWVvdXQgPSBvcHRzLmxvbmdwb2xsZXJUaW1lb3V0IHx8IDIwMDAwXG4gICAgdGhpcy5wYXJhbXMgPSBjbG9zdXJlKG9wdHMucGFyYW1zIHx8IHt9KVxuICAgIHRoaXMuZW5kUG9pbnQgPSBgJHtlbmRQb2ludH0vJHtUUkFOU1BPUlRTLndlYnNvY2tldH1gXG4gICAgdGhpcy52c24gPSBvcHRzLnZzbiB8fCBERUZBVUxUX1ZTTlxuICAgIHRoaXMuaGVhcnRiZWF0VGltZW91dFRpbWVyID0gbnVsbFxuICAgIHRoaXMuaGVhcnRiZWF0VGltZXIgPSBudWxsXG4gICAgdGhpcy5wZW5kaW5nSGVhcnRiZWF0UmVmID0gbnVsbFxuICAgIHRoaXMucmVjb25uZWN0VGltZXIgPSBuZXcgVGltZXIoKCkgPT4ge1xuICAgICAgdGhpcy50ZWFyZG93bigoKSA9PiB0aGlzLmNvbm5lY3QoKSlcbiAgICB9LCB0aGlzLnJlY29ubmVjdEFmdGVyTXMpXG4gICAgdGhpcy5hdXRoVG9rZW4gPSBvcHRzLmF1dGhUb2tlblxuICB9XG5cbiAgLyoqXG4gICAqIFJldHVybnMgdGhlIExvbmdQb2xsIHRyYW5zcG9ydCByZWZlcmVuY2VcbiAgICovXG4gIGdldExvbmdQb2xsVHJhbnNwb3J0KCl7IHJldHVybiBMb25nUG9sbCB9XG5cbiAgLyoqXG4gICAqIERpc2Nvbm5lY3RzIGFuZCByZXBsYWNlcyB0aGUgYWN0aXZlIHRyYW5zcG9ydFxuICAgKlxuICAgKiBAcGFyYW0ge0Z1bmN0aW9ufSBuZXdUcmFuc3BvcnQgLSBUaGUgbmV3IHRyYW5zcG9ydCBjbGFzcyB0byBpbnN0YW50aWF0ZVxuICAgKlxuICAgKi9cbiAgcmVwbGFjZVRyYW5zcG9ydChuZXdUcmFuc3BvcnQpe1xuICAgIHRoaXMuY29ubmVjdENsb2NrKytcbiAgICB0aGlzLmNsb3NlV2FzQ2xlYW4gPSB0cnVlXG4gICAgY2xlYXJUaW1lb3V0KHRoaXMuZmFsbGJhY2tUaW1lcilcbiAgICB0aGlzLnJlY29ubmVjdFRpbWVyLnJlc2V0KClcbiAgICBpZih0aGlzLmNvbm4pe1xuICAgICAgdGhpcy5jb25uLmNsb3NlKClcbiAgICAgIHRoaXMuY29ubiA9IG51bGxcbiAgICB9XG4gICAgdGhpcy50cmFuc3BvcnQgPSBuZXdUcmFuc3BvcnRcbiAgfVxuXG4gIC8qKlxuICAgKiBSZXR1cm5zIHRoZSBzb2NrZXQgcHJvdG9jb2xcbiAgICpcbiAgICogQHJldHVybnMge3N0cmluZ31cbiAgICovXG4gIHByb3RvY29sKCl7IHJldHVybiBsb2NhdGlvbi5wcm90b2NvbC5tYXRjaCgvXmh0dHBzLykgPyBcIndzc1wiIDogXCJ3c1wiIH1cblxuICAvKipcbiAgICogVGhlIGZ1bGx5IHF1YWxpZmllZCBzb2NrZXQgdXJsXG4gICAqXG4gICAqIEByZXR1cm5zIHtzdHJpbmd9XG4gICAqL1xuICBlbmRQb2ludFVSTCgpe1xuICAgIGxldCB1cmkgPSBBamF4LmFwcGVuZFBhcmFtcyhcbiAgICAgIEFqYXguYXBwZW5kUGFyYW1zKHRoaXMuZW5kUG9pbnQsIHRoaXMucGFyYW1zKCkpLCB7dnNuOiB0aGlzLnZzbn0pXG4gICAgaWYodXJpLmNoYXJBdCgwKSAhPT0gXCIvXCIpeyByZXR1cm4gdXJpIH1cbiAgICBpZih1cmkuY2hhckF0KDEpID09PSBcIi9cIil7IHJldHVybiBgJHt0aGlzLnByb3RvY29sKCl9OiR7dXJpfWAgfVxuXG4gICAgcmV0dXJuIGAke3RoaXMucHJvdG9jb2woKX06Ly8ke2xvY2F0aW9uLmhvc3R9JHt1cml9YFxuICB9XG5cbiAgLyoqXG4gICAqIERpc2Nvbm5lY3RzIHRoZSBzb2NrZXRcbiAgICpcbiAgICogU2VlIGh0dHBzOi8vZGV2ZWxvcGVyLm1vemlsbGEub3JnL2VuLVVTL2RvY3MvV2ViL0FQSS9DbG9zZUV2ZW50I1N0YXR1c19jb2RlcyBmb3IgdmFsaWQgc3RhdHVzIGNvZGVzLlxuICAgKlxuICAgKiBAcGFyYW0ge0Z1bmN0aW9ufSBjYWxsYmFjayAtIE9wdGlvbmFsIGNhbGxiYWNrIHdoaWNoIGlzIGNhbGxlZCBhZnRlciBzb2NrZXQgaXMgZGlzY29ubmVjdGVkLlxuICAgKiBAcGFyYW0ge2ludGVnZXJ9IGNvZGUgLSBBIHN0YXR1cyBjb2RlIGZvciBkaXNjb25uZWN0aW9uIChPcHRpb25hbCkuXG4gICAqIEBwYXJhbSB7c3RyaW5nfSByZWFzb24gLSBBIHRleHR1YWwgZGVzY3JpcHRpb24gb2YgdGhlIHJlYXNvbiB0byBkaXNjb25uZWN0LiAoT3B0aW9uYWwpXG4gICAqL1xuICBkaXNjb25uZWN0KGNhbGxiYWNrLCBjb2RlLCByZWFzb24pe1xuICAgIHRoaXMuY29ubmVjdENsb2NrKytcbiAgICB0aGlzLmRpc2Nvbm5lY3RpbmcgPSB0cnVlXG4gICAgdGhpcy5jbG9zZVdhc0NsZWFuID0gdHJ1ZVxuICAgIGNsZWFyVGltZW91dCh0aGlzLmZhbGxiYWNrVGltZXIpXG4gICAgdGhpcy5yZWNvbm5lY3RUaW1lci5yZXNldCgpXG4gICAgdGhpcy50ZWFyZG93bigoKSA9PiB7XG4gICAgICB0aGlzLmRpc2Nvbm5lY3RpbmcgPSBmYWxzZVxuICAgICAgY2FsbGJhY2sgJiYgY2FsbGJhY2soKVxuICAgIH0sIGNvZGUsIHJlYXNvbilcbiAgfVxuXG4gIC8qKlxuICAgKlxuICAgKiBAcGFyYW0ge09iamVjdH0gcGFyYW1zIC0gVGhlIHBhcmFtcyB0byBzZW5kIHdoZW4gY29ubmVjdGluZywgZm9yIGV4YW1wbGUgYHt1c2VyX2lkOiB1c2VyVG9rZW59YFxuICAgKlxuICAgKiBQYXNzaW5nIHBhcmFtcyB0byBjb25uZWN0IGlzIGRlcHJlY2F0ZWQ7IHBhc3MgdGhlbSBpbiB0aGUgU29ja2V0IGNvbnN0cnVjdG9yIGluc3RlYWQ6XG4gICAqIGBuZXcgU29ja2V0KFwiL3NvY2tldFwiLCB7cGFyYW1zOiB7dXNlcl9pZDogdXNlclRva2VufX0pYC5cbiAgICovXG4gIGNvbm5lY3QocGFyYW1zKXtcbiAgICBpZihwYXJhbXMpe1xuICAgICAgY29uc29sZSAmJiBjb25zb2xlLmxvZyhcInBhc3NpbmcgcGFyYW1zIHRvIGNvbm5lY3QgaXMgZGVwcmVjYXRlZC4gSW5zdGVhZCBwYXNzIDpwYXJhbXMgdG8gdGhlIFNvY2tldCBjb25zdHJ1Y3RvclwiKVxuICAgICAgdGhpcy5wYXJhbXMgPSBjbG9zdXJlKHBhcmFtcylcbiAgICB9XG4gICAgaWYodGhpcy5jb25uICYmICF0aGlzLmRpc2Nvbm5lY3RpbmcpeyByZXR1cm4gfVxuICAgIGlmKHRoaXMubG9uZ1BvbGxGYWxsYmFja01zICYmIHRoaXMudHJhbnNwb3J0ICE9PSBMb25nUG9sbCl7XG4gICAgICB0aGlzLmNvbm5lY3RXaXRoRmFsbGJhY2soTG9uZ1BvbGwsIHRoaXMubG9uZ1BvbGxGYWxsYmFja01zKVxuICAgIH0gZWxzZSB7XG4gICAgICB0aGlzLnRyYW5zcG9ydENvbm5lY3QoKVxuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBMb2dzIHRoZSBtZXNzYWdlLiBPdmVycmlkZSBgdGhpcy5sb2dnZXJgIGZvciBzcGVjaWFsaXplZCBsb2dnaW5nLiBub29wcyBieSBkZWZhdWx0XG4gICAqIEBwYXJhbSB7c3RyaW5nfSBraW5kXG4gICAqIEBwYXJhbSB7c3RyaW5nfSBtc2dcbiAgICogQHBhcmFtIHtPYmplY3R9IGRhdGFcbiAgICovXG4gIGxvZyhraW5kLCBtc2csIGRhdGEpeyB0aGlzLmxvZ2dlciAmJiB0aGlzLmxvZ2dlcihraW5kLCBtc2csIGRhdGEpIH1cblxuICAvKipcbiAgICogUmV0dXJucyB0cnVlIGlmIGEgbG9nZ2VyIGhhcyBiZWVuIHNldCBvbiB0aGlzIHNvY2tldC5cbiAgICovXG4gIGhhc0xvZ2dlcigpeyByZXR1cm4gdGhpcy5sb2dnZXIgIT09IG51bGwgfVxuXG4gIC8qKlxuICAgKiBSZWdpc3RlcnMgY2FsbGJhY2tzIGZvciBjb25uZWN0aW9uIG9wZW4gZXZlbnRzXG4gICAqXG4gICAqIEBleGFtcGxlIHNvY2tldC5vbk9wZW4oZnVuY3Rpb24oKXsgY29uc29sZS5pbmZvKFwidGhlIHNvY2tldCB3YXMgb3BlbmVkXCIpIH0pXG4gICAqXG4gICAqIEBwYXJhbSB7RnVuY3Rpb259IGNhbGxiYWNrXG4gICAqL1xuICBvbk9wZW4oY2FsbGJhY2spe1xuICAgIGxldCByZWYgPSB0aGlzLm1ha2VSZWYoKVxuICAgIHRoaXMuc3RhdGVDaGFuZ2VDYWxsYmFja3Mub3Blbi5wdXNoKFtyZWYsIGNhbGxiYWNrXSlcbiAgICByZXR1cm4gcmVmXG4gIH1cblxuICAvKipcbiAgICogUmVnaXN0ZXJzIGNhbGxiYWNrcyBmb3IgY29ubmVjdGlvbiBjbG9zZSBldmVudHNcbiAgICogQHBhcmFtIHtGdW5jdGlvbn0gY2FsbGJhY2tcbiAgICovXG4gIG9uQ2xvc2UoY2FsbGJhY2spe1xuICAgIGxldCByZWYgPSB0aGlzLm1ha2VSZWYoKVxuICAgIHRoaXMuc3RhdGVDaGFuZ2VDYWxsYmFja3MuY2xvc2UucHVzaChbcmVmLCBjYWxsYmFja10pXG4gICAgcmV0dXJuIHJlZlxuICB9XG5cbiAgLyoqXG4gICAqIFJlZ2lzdGVycyBjYWxsYmFja3MgZm9yIGNvbm5lY3Rpb24gZXJyb3IgZXZlbnRzXG4gICAqXG4gICAqIEBleGFtcGxlIHNvY2tldC5vbkVycm9yKGZ1bmN0aW9uKGVycm9yKXsgYWxlcnQoXCJBbiBlcnJvciBvY2N1cnJlZFwiKSB9KVxuICAgKlxuICAgKiBAcGFyYW0ge0Z1bmN0aW9ufSBjYWxsYmFja1xuICAgKi9cbiAgb25FcnJvcihjYWxsYmFjayl7XG4gICAgbGV0IHJlZiA9IHRoaXMubWFrZVJlZigpXG4gICAgdGhpcy5zdGF0ZUNoYW5nZUNhbGxiYWNrcy5lcnJvci5wdXNoKFtyZWYsIGNhbGxiYWNrXSlcbiAgICByZXR1cm4gcmVmXG4gIH1cblxuICAvKipcbiAgICogUmVnaXN0ZXJzIGNhbGxiYWNrcyBmb3IgY29ubmVjdGlvbiBtZXNzYWdlIGV2ZW50c1xuICAgKiBAcGFyYW0ge0Z1bmN0aW9ufSBjYWxsYmFja1xuICAgKi9cbiAgb25NZXNzYWdlKGNhbGxiYWNrKXtcbiAgICBsZXQgcmVmID0gdGhpcy5tYWtlUmVmKClcbiAgICB0aGlzLnN0YXRlQ2hhbmdlQ2FsbGJhY2tzLm1lc3NhZ2UucHVzaChbcmVmLCBjYWxsYmFja10pXG4gICAgcmV0dXJuIHJlZlxuICB9XG5cbiAgLyoqXG4gICAqIFBpbmdzIHRoZSBzZXJ2ZXIgYW5kIGludm9rZXMgdGhlIGNhbGxiYWNrIHdpdGggdGhlIFJUVCBpbiBtaWxsaXNlY29uZHNcbiAgICogQHBhcmFtIHtGdW5jdGlvbn0gY2FsbGJhY2tcbiAgICpcbiAgICogUmV0dXJucyB0cnVlIGlmIHRoZSBwaW5nIHdhcyBwdXNoZWQgb3IgZmFsc2UgaWYgdW5hYmxlIHRvIGJlIHB1c2hlZC5cbiAgICovXG4gIHBpbmcoY2FsbGJhY2spe1xuICAgIGlmKCF0aGlzLmlzQ29ubmVjdGVkKCkpeyByZXR1cm4gZmFsc2UgfVxuICAgIGxldCByZWYgPSB0aGlzLm1ha2VSZWYoKVxuICAgIGxldCBzdGFydFRpbWUgPSBEYXRlLm5vdygpXG4gICAgdGhpcy5wdXNoKHt0b3BpYzogXCJwaG9lbml4XCIsIGV2ZW50OiBcImhlYXJ0YmVhdFwiLCBwYXlsb2FkOiB7fSwgcmVmOiByZWZ9KVxuICAgIGxldCBvbk1zZ1JlZiA9IHRoaXMub25NZXNzYWdlKG1zZyA9PiB7XG4gICAgICBpZihtc2cucmVmID09PSByZWYpe1xuICAgICAgICB0aGlzLm9mZihbb25Nc2dSZWZdKVxuICAgICAgICBjYWxsYmFjayhEYXRlLm5vdygpIC0gc3RhcnRUaW1lKVxuICAgICAgfVxuICAgIH0pXG4gICAgcmV0dXJuIHRydWVcbiAgfVxuXG4gIC8qKlxuICAgKiBAcHJpdmF0ZVxuICAgKi9cblxuICB0cmFuc3BvcnRDb25uZWN0KCl7XG4gICAgdGhpcy5jb25uZWN0Q2xvY2srK1xuICAgIHRoaXMuY2xvc2VXYXNDbGVhbiA9IGZhbHNlXG4gICAgbGV0IHByb3RvY29scyA9IHVuZGVmaW5lZFxuICAgIC8vIFNlYy1XZWJTb2NrZXQtUHJvdG9jb2wgYmFzZWQgdG9rZW5cbiAgICAvLyAobG9uZ3BvbGwgdXNlcyBBdXRob3JpemF0aW9uIGhlYWRlciBpbnN0ZWFkKVxuICAgIGlmKHRoaXMuYXV0aFRva2VuKXtcbiAgICAgIHByb3RvY29scyA9IFtcInBob2VuaXhcIiwgYCR7QVVUSF9UT0tFTl9QUkVGSVh9JHtidG9hKHRoaXMuYXV0aFRva2VuKS5yZXBsYWNlKC89L2csIFwiXCIpfWBdXG4gICAgfVxuICAgIHRoaXMuY29ubiA9IG5ldyB0aGlzLnRyYW5zcG9ydCh0aGlzLmVuZFBvaW50VVJMKCksIHByb3RvY29scylcbiAgICB0aGlzLmNvbm4uYmluYXJ5VHlwZSA9IHRoaXMuYmluYXJ5VHlwZVxuICAgIHRoaXMuY29ubi50aW1lb3V0ID0gdGhpcy5sb25ncG9sbGVyVGltZW91dFxuICAgIHRoaXMuY29ubi5vbm9wZW4gPSAoKSA9PiB0aGlzLm9uQ29ubk9wZW4oKVxuICAgIHRoaXMuY29ubi5vbmVycm9yID0gZXJyb3IgPT4gdGhpcy5vbkNvbm5FcnJvcihlcnJvcilcbiAgICB0aGlzLmNvbm4ub25tZXNzYWdlID0gZXZlbnQgPT4gdGhpcy5vbkNvbm5NZXNzYWdlKGV2ZW50KVxuICAgIHRoaXMuY29ubi5vbmNsb3NlID0gZXZlbnQgPT4gdGhpcy5vbkNvbm5DbG9zZShldmVudClcbiAgfVxuXG4gIGdldFNlc3Npb24oa2V5KXsgcmV0dXJuIHRoaXMuc2Vzc2lvblN0b3JlICYmIHRoaXMuc2Vzc2lvblN0b3JlLmdldEl0ZW0oa2V5KSB9XG5cbiAgc3RvcmVTZXNzaW9uKGtleSwgdmFsKXsgdGhpcy5zZXNzaW9uU3RvcmUgJiYgdGhpcy5zZXNzaW9uU3RvcmUuc2V0SXRlbShrZXksIHZhbCkgfVxuXG4gIGNvbm5lY3RXaXRoRmFsbGJhY2soZmFsbGJhY2tUcmFuc3BvcnQsIGZhbGxiYWNrVGhyZXNob2xkID0gMjUwMCl7XG4gICAgY2xlYXJUaW1lb3V0KHRoaXMuZmFsbGJhY2tUaW1lcilcbiAgICBsZXQgZXN0YWJsaXNoZWQgPSBmYWxzZVxuICAgIGxldCBwcmltYXJ5VHJhbnNwb3J0ID0gdHJ1ZVxuICAgIGxldCBvcGVuUmVmLCBlcnJvclJlZlxuICAgIGxldCBmYWxsYmFjayA9IChyZWFzb24pID0+IHtcbiAgICAgIHRoaXMubG9nKFwidHJhbnNwb3J0XCIsIGBmYWxsaW5nIGJhY2sgdG8gJHtmYWxsYmFja1RyYW5zcG9ydC5uYW1lfS4uLmAsIHJlYXNvbilcbiAgICAgIHRoaXMub2ZmKFtvcGVuUmVmLCBlcnJvclJlZl0pXG4gICAgICBwcmltYXJ5VHJhbnNwb3J0ID0gZmFsc2VcbiAgICAgIHRoaXMucmVwbGFjZVRyYW5zcG9ydChmYWxsYmFja1RyYW5zcG9ydClcbiAgICAgIHRoaXMudHJhbnNwb3J0Q29ubmVjdCgpXG4gICAgfVxuICAgIGlmKHRoaXMuZ2V0U2Vzc2lvbihgcGh4OmZhbGxiYWNrOiR7ZmFsbGJhY2tUcmFuc3BvcnQubmFtZX1gKSl7IHJldHVybiBmYWxsYmFjayhcIm1lbW9yaXplZFwiKSB9XG5cbiAgICB0aGlzLmZhbGxiYWNrVGltZXIgPSBzZXRUaW1lb3V0KGZhbGxiYWNrLCBmYWxsYmFja1RocmVzaG9sZClcblxuICAgIGVycm9yUmVmID0gdGhpcy5vbkVycm9yKHJlYXNvbiA9PiB7XG4gICAgICB0aGlzLmxvZyhcInRyYW5zcG9ydFwiLCBcImVycm9yXCIsIHJlYXNvbilcbiAgICAgIGlmKHByaW1hcnlUcmFuc3BvcnQgJiYgIWVzdGFibGlzaGVkKXtcbiAgICAgICAgY2xlYXJUaW1lb3V0KHRoaXMuZmFsbGJhY2tUaW1lcilcbiAgICAgICAgZmFsbGJhY2socmVhc29uKVxuICAgICAgfVxuICAgIH0pXG4gICAgdGhpcy5vbk9wZW4oKCkgPT4ge1xuICAgICAgZXN0YWJsaXNoZWQgPSB0cnVlXG4gICAgICBpZighcHJpbWFyeVRyYW5zcG9ydCl7XG4gICAgICAgIC8vIG9ubHkgbWVtb3JpemUgTFAgaWYgd2UgbmV2ZXIgY29ubmVjdGVkIHRvIHByaW1hcnlcbiAgICAgICAgaWYoIXRoaXMucHJpbWFyeVBhc3NlZEhlYWx0aENoZWNrKXsgdGhpcy5zdG9yZVNlc3Npb24oYHBoeDpmYWxsYmFjazoke2ZhbGxiYWNrVHJhbnNwb3J0Lm5hbWV9YCwgXCJ0cnVlXCIpIH1cbiAgICAgICAgcmV0dXJuIHRoaXMubG9nKFwidHJhbnNwb3J0XCIsIGBlc3RhYmxpc2hlZCAke2ZhbGxiYWNrVHJhbnNwb3J0Lm5hbWV9IGZhbGxiYWNrYClcbiAgICAgIH1cbiAgICAgIC8vIGlmIHdlJ3ZlIGVzdGFibGlzaGVkIHByaW1hcnksIGdpdmUgdGhlIGZhbGxiYWNrIGEgbmV3IHBlcmlvZCB0byBhdHRlbXB0IHBpbmdcbiAgICAgIGNsZWFyVGltZW91dCh0aGlzLmZhbGxiYWNrVGltZXIpXG4gICAgICB0aGlzLmZhbGxiYWNrVGltZXIgPSBzZXRUaW1lb3V0KGZhbGxiYWNrLCBmYWxsYmFja1RocmVzaG9sZClcbiAgICAgIHRoaXMucGluZyhydHQgPT4ge1xuICAgICAgICB0aGlzLmxvZyhcInRyYW5zcG9ydFwiLCBcImNvbm5lY3RlZCB0byBwcmltYXJ5IGFmdGVyXCIsIHJ0dClcbiAgICAgICAgdGhpcy5wcmltYXJ5UGFzc2VkSGVhbHRoQ2hlY2sgPSB0cnVlXG4gICAgICAgIGNsZWFyVGltZW91dCh0aGlzLmZhbGxiYWNrVGltZXIpXG4gICAgICB9KVxuICAgIH0pXG4gICAgdGhpcy50cmFuc3BvcnRDb25uZWN0KClcbiAgfVxuXG4gIGNsZWFySGVhcnRiZWF0cygpe1xuICAgIGNsZWFyVGltZW91dCh0aGlzLmhlYXJ0YmVhdFRpbWVyKVxuICAgIGNsZWFyVGltZW91dCh0aGlzLmhlYXJ0YmVhdFRpbWVvdXRUaW1lcilcbiAgfVxuXG4gIG9uQ29ubk9wZW4oKXtcbiAgICBpZih0aGlzLmhhc0xvZ2dlcigpKSB0aGlzLmxvZyhcInRyYW5zcG9ydFwiLCBgJHt0aGlzLnRyYW5zcG9ydC5uYW1lfSBjb25uZWN0ZWQgdG8gJHt0aGlzLmVuZFBvaW50VVJMKCl9YClcbiAgICB0aGlzLmNsb3NlV2FzQ2xlYW4gPSBmYWxzZVxuICAgIHRoaXMuZGlzY29ubmVjdGluZyA9IGZhbHNlXG4gICAgdGhpcy5lc3RhYmxpc2hlZENvbm5lY3Rpb25zKytcbiAgICB0aGlzLmZsdXNoU2VuZEJ1ZmZlcigpXG4gICAgdGhpcy5yZWNvbm5lY3RUaW1lci5yZXNldCgpXG4gICAgdGhpcy5yZXNldEhlYXJ0YmVhdCgpXG4gICAgdGhpcy5zdGF0ZUNoYW5nZUNhbGxiYWNrcy5vcGVuLmZvckVhY2goKFssIGNhbGxiYWNrXSkgPT4gY2FsbGJhY2soKSlcbiAgfVxuXG4gIC8qKlxuICAgKiBAcHJpdmF0ZVxuICAgKi9cblxuICBoZWFydGJlYXRUaW1lb3V0KCl7XG4gICAgaWYodGhpcy5wZW5kaW5nSGVhcnRiZWF0UmVmKXtcbiAgICAgIHRoaXMucGVuZGluZ0hlYXJ0YmVhdFJlZiA9IG51bGxcbiAgICAgIGlmKHRoaXMuaGFzTG9nZ2VyKCkpeyB0aGlzLmxvZyhcInRyYW5zcG9ydFwiLCBcImhlYXJ0YmVhdCB0aW1lb3V0LiBBdHRlbXB0aW5nIHRvIHJlLWVzdGFibGlzaCBjb25uZWN0aW9uXCIpIH1cbiAgICAgIHRoaXMudHJpZ2dlckNoYW5FcnJvcigpXG4gICAgICB0aGlzLmNsb3NlV2FzQ2xlYW4gPSBmYWxzZVxuICAgICAgdGhpcy50ZWFyZG93bigoKSA9PiB0aGlzLnJlY29ubmVjdFRpbWVyLnNjaGVkdWxlVGltZW91dCgpLCBXU19DTE9TRV9OT1JNQUwsIFwiaGVhcnRiZWF0IHRpbWVvdXRcIilcbiAgICB9XG4gIH1cblxuICByZXNldEhlYXJ0YmVhdCgpe1xuICAgIGlmKHRoaXMuY29ubiAmJiB0aGlzLmNvbm4uc2tpcEhlYXJ0YmVhdCl7IHJldHVybiB9XG4gICAgdGhpcy5wZW5kaW5nSGVhcnRiZWF0UmVmID0gbnVsbFxuICAgIHRoaXMuY2xlYXJIZWFydGJlYXRzKClcbiAgICB0aGlzLmhlYXJ0YmVhdFRpbWVyID0gc2V0VGltZW91dCgoKSA9PiB0aGlzLnNlbmRIZWFydGJlYXQoKSwgdGhpcy5oZWFydGJlYXRJbnRlcnZhbE1zKVxuICB9XG5cbiAgdGVhcmRvd24oY2FsbGJhY2ssIGNvZGUsIHJlYXNvbil7XG4gICAgaWYoIXRoaXMuY29ubil7XG4gICAgICByZXR1cm4gY2FsbGJhY2sgJiYgY2FsbGJhY2soKVxuICAgIH1cbiAgICBsZXQgY29ubmVjdENsb2NrID0gdGhpcy5jb25uZWN0Q2xvY2tcblxuICAgIHRoaXMud2FpdEZvckJ1ZmZlckRvbmUoKCkgPT4ge1xuICAgICAgaWYoY29ubmVjdENsb2NrICE9PSB0aGlzLmNvbm5lY3RDbG9jayl7IHJldHVybiB9XG4gICAgICBpZih0aGlzLmNvbm4pe1xuICAgICAgICBpZihjb2RlKXsgdGhpcy5jb25uLmNsb3NlKGNvZGUsIHJlYXNvbiB8fCBcIlwiKSB9IGVsc2UgeyB0aGlzLmNvbm4uY2xvc2UoKSB9XG4gICAgICB9XG5cbiAgICAgIHRoaXMud2FpdEZvclNvY2tldENsb3NlZCgoKSA9PiB7XG4gICAgICAgIGlmKGNvbm5lY3RDbG9jayAhPT0gdGhpcy5jb25uZWN0Q2xvY2speyByZXR1cm4gfVxuICAgICAgICBpZih0aGlzLmNvbm4pe1xuICAgICAgICAgIHRoaXMuY29ubi5vbm9wZW4gPSBmdW5jdGlvbiAoKXsgfSAvLyBub29wXG4gICAgICAgICAgdGhpcy5jb25uLm9uZXJyb3IgPSBmdW5jdGlvbiAoKXsgfSAvLyBub29wXG4gICAgICAgICAgdGhpcy5jb25uLm9ubWVzc2FnZSA9IGZ1bmN0aW9uICgpeyB9IC8vIG5vb3BcbiAgICAgICAgICB0aGlzLmNvbm4ub25jbG9zZSA9IGZ1bmN0aW9uICgpeyB9IC8vIG5vb3BcbiAgICAgICAgICB0aGlzLmNvbm4gPSBudWxsXG4gICAgICAgIH1cblxuICAgICAgICBjYWxsYmFjayAmJiBjYWxsYmFjaygpXG4gICAgICB9KVxuICAgIH0pXG4gIH1cblxuICB3YWl0Rm9yQnVmZmVyRG9uZShjYWxsYmFjaywgdHJpZXMgPSAxKXtcbiAgICBpZih0cmllcyA9PT0gNSB8fCAhdGhpcy5jb25uIHx8ICF0aGlzLmNvbm4uYnVmZmVyZWRBbW91bnQpe1xuICAgICAgY2FsbGJhY2soKVxuICAgICAgcmV0dXJuXG4gICAgfVxuXG4gICAgc2V0VGltZW91dCgoKSA9PiB7XG4gICAgICB0aGlzLndhaXRGb3JCdWZmZXJEb25lKGNhbGxiYWNrLCB0cmllcyArIDEpXG4gICAgfSwgMTUwICogdHJpZXMpXG4gIH1cblxuICB3YWl0Rm9yU29ja2V0Q2xvc2VkKGNhbGxiYWNrLCB0cmllcyA9IDEpe1xuICAgIGlmKHRyaWVzID09PSA1IHx8ICF0aGlzLmNvbm4gfHwgdGhpcy5jb25uLnJlYWR5U3RhdGUgPT09IFNPQ0tFVF9TVEFURVMuY2xvc2VkKXtcbiAgICAgIGNhbGxiYWNrKClcbiAgICAgIHJldHVyblxuICAgIH1cblxuICAgIHNldFRpbWVvdXQoKCkgPT4ge1xuICAgICAgdGhpcy53YWl0Rm9yU29ja2V0Q2xvc2VkKGNhbGxiYWNrLCB0cmllcyArIDEpXG4gICAgfSwgMTUwICogdHJpZXMpXG4gIH1cblxuICBvbkNvbm5DbG9zZShldmVudCl7XG4gICAgbGV0IGNsb3NlQ29kZSA9IGV2ZW50ICYmIGV2ZW50LmNvZGVcbiAgICBpZih0aGlzLmhhc0xvZ2dlcigpKSB0aGlzLmxvZyhcInRyYW5zcG9ydFwiLCBcImNsb3NlXCIsIGV2ZW50KVxuICAgIHRoaXMudHJpZ2dlckNoYW5FcnJvcigpXG4gICAgdGhpcy5jbGVhckhlYXJ0YmVhdHMoKVxuICAgIGlmKCF0aGlzLmNsb3NlV2FzQ2xlYW4gJiYgY2xvc2VDb2RlICE9PSAxMDAwKXtcbiAgICAgIHRoaXMucmVjb25uZWN0VGltZXIuc2NoZWR1bGVUaW1lb3V0KClcbiAgICB9XG4gICAgdGhpcy5zdGF0ZUNoYW5nZUNhbGxiYWNrcy5jbG9zZS5mb3JFYWNoKChbLCBjYWxsYmFja10pID0+IGNhbGxiYWNrKGV2ZW50KSlcbiAgfVxuXG4gIC8qKlxuICAgKiBAcHJpdmF0ZVxuICAgKi9cbiAgb25Db25uRXJyb3IoZXJyb3Ipe1xuICAgIGlmKHRoaXMuaGFzTG9nZ2VyKCkpIHRoaXMubG9nKFwidHJhbnNwb3J0XCIsIGVycm9yKVxuICAgIGxldCB0cmFuc3BvcnRCZWZvcmUgPSB0aGlzLnRyYW5zcG9ydFxuICAgIGxldCBlc3RhYmxpc2hlZEJlZm9yZSA9IHRoaXMuZXN0YWJsaXNoZWRDb25uZWN0aW9uc1xuICAgIHRoaXMuc3RhdGVDaGFuZ2VDYWxsYmFja3MuZXJyb3IuZm9yRWFjaCgoWywgY2FsbGJhY2tdKSA9PiB7XG4gICAgICBjYWxsYmFjayhlcnJvciwgdHJhbnNwb3J0QmVmb3JlLCBlc3RhYmxpc2hlZEJlZm9yZSlcbiAgICB9KVxuICAgIGlmKHRyYW5zcG9ydEJlZm9yZSA9PT0gdGhpcy50cmFuc3BvcnQgfHwgZXN0YWJsaXNoZWRCZWZvcmUgPiAwKXtcbiAgICAgIHRoaXMudHJpZ2dlckNoYW5FcnJvcigpXG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIEBwcml2YXRlXG4gICAqL1xuICB0cmlnZ2VyQ2hhbkVycm9yKCl7XG4gICAgdGhpcy5jaGFubmVscy5mb3JFYWNoKGNoYW5uZWwgPT4ge1xuICAgICAgaWYoIShjaGFubmVsLmlzRXJyb3JlZCgpIHx8IGNoYW5uZWwuaXNMZWF2aW5nKCkgfHwgY2hhbm5lbC5pc0Nsb3NlZCgpKSl7XG4gICAgICAgIGNoYW5uZWwudHJpZ2dlcihDSEFOTkVMX0VWRU5UUy5lcnJvcilcbiAgICAgIH1cbiAgICB9KVxuICB9XG5cbiAgLyoqXG4gICAqIEByZXR1cm5zIHtzdHJpbmd9XG4gICAqL1xuICBjb25uZWN0aW9uU3RhdGUoKXtcbiAgICBzd2l0Y2godGhpcy5jb25uICYmIHRoaXMuY29ubi5yZWFkeVN0YXRlKXtcbiAgICAgIGNhc2UgU09DS0VUX1NUQVRFUy5jb25uZWN0aW5nOiByZXR1cm4gXCJjb25uZWN0aW5nXCJcbiAgICAgIGNhc2UgU09DS0VUX1NUQVRFUy5vcGVuOiByZXR1cm4gXCJvcGVuXCJcbiAgICAgIGNhc2UgU09DS0VUX1NUQVRFUy5jbG9zaW5nOiByZXR1cm4gXCJjbG9zaW5nXCJcbiAgICAgIGRlZmF1bHQ6IHJldHVybiBcImNsb3NlZFwiXG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIEByZXR1cm5zIHtib29sZWFufVxuICAgKi9cbiAgaXNDb25uZWN0ZWQoKXsgcmV0dXJuIHRoaXMuY29ubmVjdGlvblN0YXRlKCkgPT09IFwib3BlblwiIH1cblxuICAvKipcbiAgICogQHByaXZhdGVcbiAgICpcbiAgICogQHBhcmFtIHtDaGFubmVsfVxuICAgKi9cbiAgcmVtb3ZlKGNoYW5uZWwpe1xuICAgIHRoaXMub2ZmKGNoYW5uZWwuc3RhdGVDaGFuZ2VSZWZzKVxuICAgIHRoaXMuY2hhbm5lbHMgPSB0aGlzLmNoYW5uZWxzLmZpbHRlcihjID0+IGMgIT09IGNoYW5uZWwpXG4gIH1cblxuICAvKipcbiAgICogUmVtb3ZlcyBgb25PcGVuYCwgYG9uQ2xvc2VgLCBgb25FcnJvcixgIGFuZCBgb25NZXNzYWdlYCByZWdpc3RyYXRpb25zLlxuICAgKlxuICAgKiBAcGFyYW0ge3JlZnN9IC0gbGlzdCBvZiByZWZzIHJldHVybmVkIGJ5IGNhbGxzIHRvXG4gICAqICAgICAgICAgICAgICAgICBgb25PcGVuYCwgYG9uQ2xvc2VgLCBgb25FcnJvcixgIGFuZCBgb25NZXNzYWdlYFxuICAgKi9cbiAgb2ZmKHJlZnMpe1xuICAgIGZvcihsZXQga2V5IGluIHRoaXMuc3RhdGVDaGFuZ2VDYWxsYmFja3Mpe1xuICAgICAgdGhpcy5zdGF0ZUNoYW5nZUNhbGxiYWNrc1trZXldID0gdGhpcy5zdGF0ZUNoYW5nZUNhbGxiYWNrc1trZXldLmZpbHRlcigoW3JlZl0pID0+IHtcbiAgICAgICAgcmV0dXJuIHJlZnMuaW5kZXhPZihyZWYpID09PSAtMVxuICAgICAgfSlcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogSW5pdGlhdGVzIGEgbmV3IGNoYW5uZWwgZm9yIHRoZSBnaXZlbiB0b3BpY1xuICAgKlxuICAgKiBAcGFyYW0ge3N0cmluZ30gdG9waWNcbiAgICogQHBhcmFtIHtPYmplY3R9IGNoYW5QYXJhbXMgLSBQYXJhbWV0ZXJzIGZvciB0aGUgY2hhbm5lbFxuICAgKiBAcmV0dXJucyB7Q2hhbm5lbH1cbiAgICovXG4gIGNoYW5uZWwodG9waWMsIGNoYW5QYXJhbXMgPSB7fSl7XG4gICAgbGV0IGNoYW4gPSBuZXcgQ2hhbm5lbCh0b3BpYywgY2hhblBhcmFtcywgdGhpcylcbiAgICB0aGlzLmNoYW5uZWxzLnB1c2goY2hhbilcbiAgICByZXR1cm4gY2hhblxuICB9XG5cbiAgLyoqXG4gICAqIEBwYXJhbSB7T2JqZWN0fSBkYXRhXG4gICAqL1xuICBwdXNoKGRhdGEpe1xuICAgIGlmKHRoaXMuaGFzTG9nZ2VyKCkpe1xuICAgICAgbGV0IHt0b3BpYywgZXZlbnQsIHBheWxvYWQsIHJlZiwgam9pbl9yZWZ9ID0gZGF0YVxuICAgICAgdGhpcy5sb2coXCJwdXNoXCIsIGAke3RvcGljfSAke2V2ZW50fSAoJHtqb2luX3JlZn0sICR7cmVmfSlgLCBwYXlsb2FkKVxuICAgIH1cblxuICAgIGlmKHRoaXMuaXNDb25uZWN0ZWQoKSl7XG4gICAgICB0aGlzLmVuY29kZShkYXRhLCByZXN1bHQgPT4gdGhpcy5jb25uLnNlbmQocmVzdWx0KSlcbiAgICB9IGVsc2Uge1xuICAgICAgdGhpcy5zZW5kQnVmZmVyLnB1c2goKCkgPT4gdGhpcy5lbmNvZGUoZGF0YSwgcmVzdWx0ID0+IHRoaXMuY29ubi5zZW5kKHJlc3VsdCkpKVxuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBSZXR1cm4gdGhlIG5leHQgbWVzc2FnZSByZWYsIGFjY291bnRpbmcgZm9yIG92ZXJmbG93c1xuICAgKiBAcmV0dXJucyB7c3RyaW5nfVxuICAgKi9cbiAgbWFrZVJlZigpe1xuICAgIGxldCBuZXdSZWYgPSB0aGlzLnJlZiArIDFcbiAgICBpZihuZXdSZWYgPT09IHRoaXMucmVmKXsgdGhpcy5yZWYgPSAwIH0gZWxzZSB7IHRoaXMucmVmID0gbmV3UmVmIH1cblxuICAgIHJldHVybiB0aGlzLnJlZi50b1N0cmluZygpXG4gIH1cblxuICBzZW5kSGVhcnRiZWF0KCl7XG4gICAgaWYodGhpcy5wZW5kaW5nSGVhcnRiZWF0UmVmICYmICF0aGlzLmlzQ29ubmVjdGVkKCkpeyByZXR1cm4gfVxuICAgIHRoaXMucGVuZGluZ0hlYXJ0YmVhdFJlZiA9IHRoaXMubWFrZVJlZigpXG4gICAgdGhpcy5wdXNoKHt0b3BpYzogXCJwaG9lbml4XCIsIGV2ZW50OiBcImhlYXJ0YmVhdFwiLCBwYXlsb2FkOiB7fSwgcmVmOiB0aGlzLnBlbmRpbmdIZWFydGJlYXRSZWZ9KVxuICAgIHRoaXMuaGVhcnRiZWF0VGltZW91dFRpbWVyID0gc2V0VGltZW91dCgoKSA9PiB0aGlzLmhlYXJ0YmVhdFRpbWVvdXQoKSwgdGhpcy5oZWFydGJlYXRJbnRlcnZhbE1zKVxuICB9XG5cbiAgZmx1c2hTZW5kQnVmZmVyKCl7XG4gICAgaWYodGhpcy5pc0Nvbm5lY3RlZCgpICYmIHRoaXMuc2VuZEJ1ZmZlci5sZW5ndGggPiAwKXtcbiAgICAgIHRoaXMuc2VuZEJ1ZmZlci5mb3JFYWNoKGNhbGxiYWNrID0+IGNhbGxiYWNrKCkpXG4gICAgICB0aGlzLnNlbmRCdWZmZXIgPSBbXVxuICAgIH1cbiAgfVxuXG4gIG9uQ29ubk1lc3NhZ2UocmF3TWVzc2FnZSl7XG4gICAgdGhpcy5kZWNvZGUocmF3TWVzc2FnZS5kYXRhLCBtc2cgPT4ge1xuICAgICAgbGV0IHt0b3BpYywgZXZlbnQsIHBheWxvYWQsIHJlZiwgam9pbl9yZWZ9ID0gbXNnXG4gICAgICBpZihyZWYgJiYgcmVmID09PSB0aGlzLnBlbmRpbmdIZWFydGJlYXRSZWYpe1xuICAgICAgICB0aGlzLmNsZWFySGVhcnRiZWF0cygpXG4gICAgICAgIHRoaXMucGVuZGluZ0hlYXJ0YmVhdFJlZiA9IG51bGxcbiAgICAgICAgdGhpcy5oZWFydGJlYXRUaW1lciA9IHNldFRpbWVvdXQoKCkgPT4gdGhpcy5zZW5kSGVhcnRiZWF0KCksIHRoaXMuaGVhcnRiZWF0SW50ZXJ2YWxNcylcbiAgICAgIH1cblxuICAgICAgaWYodGhpcy5oYXNMb2dnZXIoKSkgdGhpcy5sb2coXCJyZWNlaXZlXCIsIGAke3BheWxvYWQuc3RhdHVzIHx8IFwiXCJ9ICR7dG9waWN9ICR7ZXZlbnR9ICR7cmVmICYmIFwiKFwiICsgcmVmICsgXCIpXCIgfHwgXCJcIn1gLCBwYXlsb2FkKVxuXG4gICAgICBmb3IobGV0IGkgPSAwOyBpIDwgdGhpcy5jaGFubmVscy5sZW5ndGg7IGkrKyl7XG4gICAgICAgIGNvbnN0IGNoYW5uZWwgPSB0aGlzLmNoYW5uZWxzW2ldXG4gICAgICAgIGlmKCFjaGFubmVsLmlzTWVtYmVyKHRvcGljLCBldmVudCwgcGF5bG9hZCwgam9pbl9yZWYpKXsgY29udGludWUgfVxuICAgICAgICBjaGFubmVsLnRyaWdnZXIoZXZlbnQsIHBheWxvYWQsIHJlZiwgam9pbl9yZWYpXG4gICAgICB9XG5cbiAgICAgIGZvcihsZXQgaSA9IDA7IGkgPCB0aGlzLnN0YXRlQ2hhbmdlQ2FsbGJhY2tzLm1lc3NhZ2UubGVuZ3RoOyBpKyspe1xuICAgICAgICBsZXQgWywgY2FsbGJhY2tdID0gdGhpcy5zdGF0ZUNoYW5nZUNhbGxiYWNrcy5tZXNzYWdlW2ldXG4gICAgICAgIGNhbGxiYWNrKG1zZylcbiAgICAgIH1cbiAgICB9KVxuICB9XG5cbiAgbGVhdmVPcGVuVG9waWModG9waWMpe1xuICAgIGxldCBkdXBDaGFubmVsID0gdGhpcy5jaGFubmVscy5maW5kKGMgPT4gYy50b3BpYyA9PT0gdG9waWMgJiYgKGMuaXNKb2luZWQoKSB8fCBjLmlzSm9pbmluZygpKSlcbiAgICBpZihkdXBDaGFubmVsKXtcbiAgICAgIGlmKHRoaXMuaGFzTG9nZ2VyKCkpIHRoaXMubG9nKFwidHJhbnNwb3J0XCIsIGBsZWF2aW5nIGR1cGxpY2F0ZSB0b3BpYyBcIiR7dG9waWN9XCJgKVxuICAgICAgZHVwQ2hhbm5lbC5sZWF2ZSgpXG4gICAgfVxuICB9XG59XG4iLCAiZXhwb3J0IGNvbnN0IENPTlNFQ1VUSVZFX1JFTE9BRFMgPSBcImNvbnNlY3V0aXZlLXJlbG9hZHNcIjtcbmV4cG9ydCBjb25zdCBNQVhfUkVMT0FEUyA9IDEwO1xuZXhwb3J0IGNvbnN0IFJFTE9BRF9KSVRURVJfTUlOID0gNTAwMDtcbmV4cG9ydCBjb25zdCBSRUxPQURfSklUVEVSX01BWCA9IDEwMDAwO1xuZXhwb3J0IGNvbnN0IEZBSUxTQUZFX0pJVFRFUiA9IDMwMDAwO1xuZXhwb3J0IGNvbnN0IFBIWF9FVkVOVF9DTEFTU0VTID0gW1xuICBcInBoeC1jbGljay1sb2FkaW5nXCIsXG4gIFwicGh4LWNoYW5nZS1sb2FkaW5nXCIsXG4gIFwicGh4LXN1Ym1pdC1sb2FkaW5nXCIsXG4gIFwicGh4LWtleWRvd24tbG9hZGluZ1wiLFxuICBcInBoeC1rZXl1cC1sb2FkaW5nXCIsXG4gIFwicGh4LWJsdXItbG9hZGluZ1wiLFxuICBcInBoeC1mb2N1cy1sb2FkaW5nXCIsXG4gIFwicGh4LWhvb2stbG9hZGluZ1wiLFxuXTtcbmV4cG9ydCBjb25zdCBQSFhfQ09NUE9ORU5UID0gXCJkYXRhLXBoeC1jb21wb25lbnRcIjtcbmV4cG9ydCBjb25zdCBQSFhfVklFV19SRUYgPSBcImRhdGEtcGh4LXZpZXdcIjtcbmV4cG9ydCBjb25zdCBQSFhfTElWRV9MSU5LID0gXCJkYXRhLXBoeC1saW5rXCI7XG5leHBvcnQgY29uc3QgUEhYX1RSQUNLX1NUQVRJQyA9IFwidHJhY2stc3RhdGljXCI7XG5leHBvcnQgY29uc3QgUEhYX0xJTktfU1RBVEUgPSBcImRhdGEtcGh4LWxpbmstc3RhdGVcIjtcbmV4cG9ydCBjb25zdCBQSFhfUkVGX0xPQURJTkcgPSBcImRhdGEtcGh4LXJlZi1sb2FkaW5nXCI7XG5leHBvcnQgY29uc3QgUEhYX1JFRl9TUkMgPSBcImRhdGEtcGh4LXJlZi1zcmNcIjtcbmV4cG9ydCBjb25zdCBQSFhfUkVGX0xPQ0sgPSBcImRhdGEtcGh4LXJlZi1sb2NrXCI7XG5leHBvcnQgY29uc3QgUEhYX1BFTkRJTkdfUkVGUyA9IFwicGh4LXBlbmRpbmctcmVmc1wiO1xuZXhwb3J0IGNvbnN0IFBIWF9UUkFDS19VUExPQURTID0gXCJ0cmFjay11cGxvYWRzXCI7XG5leHBvcnQgY29uc3QgUEhYX1VQTE9BRF9SRUYgPSBcImRhdGEtcGh4LXVwbG9hZC1yZWZcIjtcbmV4cG9ydCBjb25zdCBQSFhfUFJFRkxJR0hURURfUkVGUyA9IFwiZGF0YS1waHgtcHJlZmxpZ2h0ZWQtcmVmc1wiO1xuZXhwb3J0IGNvbnN0IFBIWF9ET05FX1JFRlMgPSBcImRhdGEtcGh4LWRvbmUtcmVmc1wiO1xuZXhwb3J0IGNvbnN0IFBIWF9EUk9QX1RBUkdFVCA9IFwiZHJvcC10YXJnZXRcIjtcbmV4cG9ydCBjb25zdCBQSFhfQUNUSVZFX0VOVFJZX1JFRlMgPSBcImRhdGEtcGh4LWFjdGl2ZS1yZWZzXCI7XG5leHBvcnQgY29uc3QgUEhYX0xJVkVfRklMRV9VUERBVEVEID0gXCJwaHg6bGl2ZS1maWxlOnVwZGF0ZWRcIjtcbmV4cG9ydCBjb25zdCBQSFhfU0tJUCA9IFwiZGF0YS1waHgtc2tpcFwiO1xuZXhwb3J0IGNvbnN0IFBIWF9NQUdJQ19JRCA9IFwiZGF0YS1waHgtaWRcIjtcbmV4cG9ydCBjb25zdCBQSFhfUFJVTkUgPSBcImRhdGEtcGh4LXBydW5lXCI7XG5leHBvcnQgY29uc3QgUEhYX0NPTk5FQ1RFRF9DTEFTUyA9IFwicGh4LWNvbm5lY3RlZFwiO1xuZXhwb3J0IGNvbnN0IFBIWF9MT0FESU5HX0NMQVNTID0gXCJwaHgtbG9hZGluZ1wiO1xuZXhwb3J0IGNvbnN0IFBIWF9FUlJPUl9DTEFTUyA9IFwicGh4LWVycm9yXCI7XG5leHBvcnQgY29uc3QgUEhYX0NMSUVOVF9FUlJPUl9DTEFTUyA9IFwicGh4LWNsaWVudC1lcnJvclwiO1xuZXhwb3J0IGNvbnN0IFBIWF9TRVJWRVJfRVJST1JfQ0xBU1MgPSBcInBoeC1zZXJ2ZXItZXJyb3JcIjtcbmV4cG9ydCBjb25zdCBQSFhfUEFSRU5UX0lEID0gXCJkYXRhLXBoeC1wYXJlbnQtaWRcIjtcbmV4cG9ydCBjb25zdCBQSFhfTUFJTiA9IFwiZGF0YS1waHgtbWFpblwiO1xuZXhwb3J0IGNvbnN0IFBIWF9ST09UX0lEID0gXCJkYXRhLXBoeC1yb290LWlkXCI7XG5leHBvcnQgY29uc3QgUEhYX1ZJRVdQT1JUX1RPUCA9IFwidmlld3BvcnQtdG9wXCI7XG5leHBvcnQgY29uc3QgUEhYX1ZJRVdQT1JUX0JPVFRPTSA9IFwidmlld3BvcnQtYm90dG9tXCI7XG5leHBvcnQgY29uc3QgUEhYX1RSSUdHRVJfQUNUSU9OID0gXCJ0cmlnZ2VyLWFjdGlvblwiO1xuZXhwb3J0IGNvbnN0IFBIWF9IQVNfRk9DVVNFRCA9IFwicGh4LWhhcy1mb2N1c2VkXCI7XG5leHBvcnQgY29uc3QgRk9DVVNBQkxFX0lOUFVUUyA9IFtcbiAgXCJ0ZXh0XCIsXG4gIFwidGV4dGFyZWFcIixcbiAgXCJudW1iZXJcIixcbiAgXCJlbWFpbFwiLFxuICBcInBhc3N3b3JkXCIsXG4gIFwic2VhcmNoXCIsXG4gIFwidGVsXCIsXG4gIFwidXJsXCIsXG4gIFwiZGF0ZVwiLFxuICBcInRpbWVcIixcbiAgXCJkYXRldGltZS1sb2NhbFwiLFxuICBcImNvbG9yXCIsXG4gIFwicmFuZ2VcIixcbl07XG5leHBvcnQgY29uc3QgQ0hFQ0tBQkxFX0lOUFVUUyA9IFtcImNoZWNrYm94XCIsIFwicmFkaW9cIl07XG5leHBvcnQgY29uc3QgUEhYX0hBU19TVUJNSVRURUQgPSBcInBoeC1oYXMtc3VibWl0dGVkXCI7XG5leHBvcnQgY29uc3QgUEhYX1NFU1NJT04gPSBcImRhdGEtcGh4LXNlc3Npb25cIjtcbmV4cG9ydCBjb25zdCBQSFhfVklFV19TRUxFQ1RPUiA9IGBbJHtQSFhfU0VTU0lPTn1dYDtcbmV4cG9ydCBjb25zdCBQSFhfU1RJQ0tZID0gXCJkYXRhLXBoeC1zdGlja3lcIjtcbmV4cG9ydCBjb25zdCBQSFhfU1RBVElDID0gXCJkYXRhLXBoeC1zdGF0aWNcIjtcbmV4cG9ydCBjb25zdCBQSFhfUkVBRE9OTFkgPSBcImRhdGEtcGh4LXJlYWRvbmx5XCI7XG5leHBvcnQgY29uc3QgUEhYX0RJU0FCTEVEID0gXCJkYXRhLXBoeC1kaXNhYmxlZFwiO1xuZXhwb3J0IGNvbnN0IFBIWF9ESVNBQkxFX1dJVEggPSBcImRpc2FibGUtd2l0aFwiO1xuZXhwb3J0IGNvbnN0IFBIWF9ESVNBQkxFX1dJVEhfUkVTVE9SRSA9IFwiZGF0YS1waHgtZGlzYWJsZS13aXRoLXJlc3RvcmVcIjtcbmV4cG9ydCBjb25zdCBQSFhfSE9PSyA9IFwiaG9va1wiO1xuZXhwb3J0IGNvbnN0IFBIWF9ERUJPVU5DRSA9IFwiZGVib3VuY2VcIjtcbmV4cG9ydCBjb25zdCBQSFhfVEhST1RUTEUgPSBcInRocm90dGxlXCI7XG5leHBvcnQgY29uc3QgUEhYX1VQREFURSA9IFwidXBkYXRlXCI7XG5leHBvcnQgY29uc3QgUEhYX1NUUkVBTSA9IFwic3RyZWFtXCI7XG5leHBvcnQgY29uc3QgUEhYX1NUUkVBTV9SRUYgPSBcImRhdGEtcGh4LXN0cmVhbVwiO1xuZXhwb3J0IGNvbnN0IFBIWF9QT1JUQUwgPSBcImRhdGEtcGh4LXBvcnRhbFwiO1xuZXhwb3J0IGNvbnN0IFBIWF9URUxFUE9SVEVEX1JFRiA9IFwiZGF0YS1waHgtdGVsZXBvcnRlZFwiO1xuZXhwb3J0IGNvbnN0IFBIWF9URUxFUE9SVEVEX1NSQyA9IFwiZGF0YS1waHgtdGVsZXBvcnRlZC1zcmNcIjtcbmV4cG9ydCBjb25zdCBQSFhfUlVOVElNRV9IT09LID0gXCJkYXRhLXBoeC1ydW50aW1lLWhvb2tcIjtcbmV4cG9ydCBjb25zdCBQSFhfTFZfUElEID0gXCJkYXRhLXBoeC1waWRcIjtcbmV4cG9ydCBjb25zdCBQSFhfS0VZID0gXCJrZXlcIjtcbmV4cG9ydCBjb25zdCBQSFhfUFJJVkFURSA9IFwicGh4UHJpdmF0ZVwiO1xuZXhwb3J0IGNvbnN0IFBIWF9BVVRPX1JFQ09WRVIgPSBcImF1dG8tcmVjb3ZlclwiO1xuZXhwb3J0IGNvbnN0IFBIWF9MVl9ERUJVRyA9IFwicGh4OmxpdmUtc29ja2V0OmRlYnVnXCI7XG5leHBvcnQgY29uc3QgUEhYX0xWX1BST0ZJTEUgPSBcInBoeDpsaXZlLXNvY2tldDpwcm9maWxpbmdcIjtcbmV4cG9ydCBjb25zdCBQSFhfTFZfTEFURU5DWV9TSU0gPSBcInBoeDpsaXZlLXNvY2tldDpsYXRlbmN5LXNpbVwiO1xuZXhwb3J0IGNvbnN0IFBIWF9MVl9ISVNUT1JZX1BPU0lUSU9OID0gXCJwaHg6bmF2LWhpc3RvcnktcG9zaXRpb25cIjtcbmV4cG9ydCBjb25zdCBQSFhfUFJPR1JFU1MgPSBcInByb2dyZXNzXCI7XG5leHBvcnQgY29uc3QgUEhYX01PVU5URUQgPSBcIm1vdW50ZWRcIjtcbmV4cG9ydCBjb25zdCBQSFhfUkVMT0FEX1NUQVRVUyA9IFwiX19waG9lbml4X3JlbG9hZF9zdGF0dXNfX1wiO1xuZXhwb3J0IGNvbnN0IExPQURFUl9USU1FT1VUID0gMTtcbmV4cG9ydCBjb25zdCBNQVhfQ0hJTERfSk9JTl9BVFRFTVBUUyA9IDM7XG5leHBvcnQgY29uc3QgQkVGT1JFX1VOTE9BRF9MT0FERVJfVElNRU9VVCA9IDIwMDtcbmV4cG9ydCBjb25zdCBESVNDT05ORUNURURfVElNRU9VVCA9IDUwMDtcbmV4cG9ydCBjb25zdCBCSU5ESU5HX1BSRUZJWCA9IFwicGh4LVwiO1xuZXhwb3J0IGNvbnN0IFBVU0hfVElNRU9VVCA9IDMwMDAwO1xuZXhwb3J0IGNvbnN0IExJTktfSEVBREVSID0gXCJ4LXJlcXVlc3RlZC13aXRoXCI7XG5leHBvcnQgY29uc3QgUkVTUE9OU0VfVVJMX0hFQURFUiA9IFwieC1yZXNwb25zZS11cmxcIjtcbmV4cG9ydCBjb25zdCBERUJPVU5DRV9UUklHR0VSID0gXCJkZWJvdW5jZS10cmlnZ2VyXCI7XG5leHBvcnQgY29uc3QgVEhST1RUTEVEID0gXCJ0aHJvdHRsZWRcIjtcbmV4cG9ydCBjb25zdCBERUJPVU5DRV9QUkVWX0tFWSA9IFwiZGVib3VuY2UtcHJldi1rZXlcIjtcbmV4cG9ydCBjb25zdCBERUZBVUxUUyA9IHtcbiAgZGVib3VuY2U6IDMwMCxcbiAgdGhyb3R0bGU6IDMwMCxcbn07XG5leHBvcnQgY29uc3QgUEhYX1BFTkRJTkdfQVRUUlMgPSBbUEhYX1JFRl9MT0FESU5HLCBQSFhfUkVGX1NSQywgUEhYX1JFRl9MT0NLXTtcbi8vIFJlbmRlcmVkXG5leHBvcnQgY29uc3QgU1RBVElDID0gXCJzXCI7XG5leHBvcnQgY29uc3QgUk9PVCA9IFwiclwiO1xuZXhwb3J0IGNvbnN0IENPTVBPTkVOVFMgPSBcImNcIjtcbmV4cG9ydCBjb25zdCBLRVlFRCA9IFwia1wiO1xuZXhwb3J0IGNvbnN0IEtFWUVEX0NPVU5UID0gXCJrY1wiO1xuZXhwb3J0IGNvbnN0IEVWRU5UUyA9IFwiZVwiO1xuZXhwb3J0IGNvbnN0IFJFUExZID0gXCJyXCI7XG5leHBvcnQgY29uc3QgVElUTEUgPSBcInRcIjtcbmV4cG9ydCBjb25zdCBURU1QTEFURVMgPSBcInBcIjtcbmV4cG9ydCBjb25zdCBTVFJFQU0gPSBcInN0cmVhbVwiO1xuIiwgImltcG9ydCB7IGxvZ0Vycm9yIH0gZnJvbSBcIi4vdXRpbHNcIjtcblxuZXhwb3J0IGRlZmF1bHQgY2xhc3MgRW50cnlVcGxvYWRlciB7XG4gIGNvbnN0cnVjdG9yKGVudHJ5LCBjb25maWcsIGxpdmVTb2NrZXQpIHtcbiAgICBjb25zdCB7IGNodW5rX3NpemUsIGNodW5rX3RpbWVvdXQgfSA9IGNvbmZpZztcbiAgICB0aGlzLmxpdmVTb2NrZXQgPSBsaXZlU29ja2V0O1xuICAgIHRoaXMuZW50cnkgPSBlbnRyeTtcbiAgICB0aGlzLm9mZnNldCA9IDA7XG4gICAgdGhpcy5jaHVua1NpemUgPSBjaHVua19zaXplO1xuICAgIHRoaXMuY2h1bmtUaW1lb3V0ID0gY2h1bmtfdGltZW91dDtcbiAgICB0aGlzLmNodW5rVGltZXIgPSBudWxsO1xuICAgIHRoaXMuZXJyb3JlZCA9IGZhbHNlO1xuICAgIHRoaXMudXBsb2FkQ2hhbm5lbCA9IGxpdmVTb2NrZXQuY2hhbm5lbChgbHZ1OiR7ZW50cnkucmVmfWAsIHtcbiAgICAgIHRva2VuOiBlbnRyeS5tZXRhZGF0YSgpLFxuICAgIH0pO1xuICB9XG5cbiAgZXJyb3IocmVhc29uKSB7XG4gICAgaWYgKHRoaXMuZXJyb3JlZCkge1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICB0aGlzLnVwbG9hZENoYW5uZWwubGVhdmUoKTtcbiAgICB0aGlzLmVycm9yZWQgPSB0cnVlO1xuICAgIGNsZWFyVGltZW91dCh0aGlzLmNodW5rVGltZXIpO1xuICAgIHRoaXMuZW50cnkuZXJyb3IocmVhc29uKTtcbiAgfVxuXG4gIHVwbG9hZCgpIHtcbiAgICB0aGlzLnVwbG9hZENoYW5uZWwub25FcnJvcigocmVhc29uKSA9PiB0aGlzLmVycm9yKHJlYXNvbikpO1xuICAgIHRoaXMudXBsb2FkQ2hhbm5lbFxuICAgICAgLmpvaW4oKVxuICAgICAgLnJlY2VpdmUoXCJva1wiLCAoX2RhdGEpID0+IHRoaXMucmVhZE5leHRDaHVuaygpKVxuICAgICAgLnJlY2VpdmUoXCJlcnJvclwiLCAocmVhc29uKSA9PiB0aGlzLmVycm9yKHJlYXNvbikpO1xuICB9XG5cbiAgaXNEb25lKCkge1xuICAgIHJldHVybiB0aGlzLm9mZnNldCA+PSB0aGlzLmVudHJ5LmZpbGUuc2l6ZTtcbiAgfVxuXG4gIHJlYWROZXh0Q2h1bmsoKSB7XG4gICAgY29uc3QgcmVhZGVyID0gbmV3IHdpbmRvdy5GaWxlUmVhZGVyKCk7XG4gICAgY29uc3QgYmxvYiA9IHRoaXMuZW50cnkuZmlsZS5zbGljZShcbiAgICAgIHRoaXMub2Zmc2V0LFxuICAgICAgdGhpcy5jaHVua1NpemUgKyB0aGlzLm9mZnNldCxcbiAgICApO1xuICAgIHJlYWRlci5vbmxvYWQgPSAoZSkgPT4ge1xuICAgICAgaWYgKGUudGFyZ2V0LmVycm9yID09PSBudWxsKSB7XG4gICAgICAgIHRoaXMub2Zmc2V0ICs9IC8qKiBAdHlwZSB7QXJyYXlCdWZmZXJ9ICovIChlLnRhcmdldC5yZXN1bHQpLmJ5dGVMZW5ndGg7XG4gICAgICAgIHRoaXMucHVzaENodW5rKC8qKiBAdHlwZSB7QXJyYXlCdWZmZXJ9ICovIChlLnRhcmdldC5yZXN1bHQpKTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHJldHVybiBsb2dFcnJvcihcIlJlYWQgZXJyb3I6IFwiICsgZS50YXJnZXQuZXJyb3IpO1xuICAgICAgfVxuICAgIH07XG4gICAgcmVhZGVyLnJlYWRBc0FycmF5QnVmZmVyKGJsb2IpO1xuICB9XG5cbiAgcHVzaENodW5rKGNodW5rKSB7XG4gICAgaWYgKCF0aGlzLnVwbG9hZENoYW5uZWwuaXNKb2luZWQoKSkge1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICB0aGlzLnVwbG9hZENoYW5uZWxcbiAgICAgIC5wdXNoKFwiY2h1bmtcIiwgY2h1bmssIHRoaXMuY2h1bmtUaW1lb3V0KVxuICAgICAgLnJlY2VpdmUoXCJva1wiLCAoKSA9PiB7XG4gICAgICAgIHRoaXMuZW50cnkucHJvZ3Jlc3MoKHRoaXMub2Zmc2V0IC8gdGhpcy5lbnRyeS5maWxlLnNpemUpICogMTAwKTtcbiAgICAgICAgaWYgKCF0aGlzLmlzRG9uZSgpKSB7XG4gICAgICAgICAgdGhpcy5jaHVua1RpbWVyID0gc2V0VGltZW91dChcbiAgICAgICAgICAgICgpID0+IHRoaXMucmVhZE5leHRDaHVuaygpLFxuICAgICAgICAgICAgdGhpcy5saXZlU29ja2V0LmdldExhdGVuY3lTaW0oKSB8fCAwLFxuICAgICAgICAgICk7XG4gICAgICAgIH1cbiAgICAgIH0pXG4gICAgICAucmVjZWl2ZShcImVycm9yXCIsICh7IHJlYXNvbiB9KSA9PiB0aGlzLmVycm9yKHJlYXNvbikpO1xuICB9XG59XG4iLCAiaW1wb3J0IHsgUEhYX1ZJRVdfU0VMRUNUT1IgfSBmcm9tIFwiLi9jb25zdGFudHNcIjtcblxuaW1wb3J0IEVudHJ5VXBsb2FkZXIgZnJvbSBcIi4vZW50cnlfdXBsb2FkZXJcIjtcblxuZXhwb3J0IGNvbnN0IGxvZ0Vycm9yID0gKG1zZywgb2JqKSA9PiBjb25zb2xlLmVycm9yICYmIGNvbnNvbGUuZXJyb3IobXNnLCBvYmopO1xuXG5leHBvcnQgY29uc3QgaXNDaWQgPSAoY2lkKSA9PiB7XG4gIGNvbnN0IHR5cGUgPSB0eXBlb2YgY2lkO1xuICByZXR1cm4gdHlwZSA9PT0gXCJudW1iZXJcIiB8fCAodHlwZSA9PT0gXCJzdHJpbmdcIiAmJiAvXigwfFsxLTldXFxkKikkLy50ZXN0KGNpZCkpO1xufTtcblxuZXhwb3J0IGZ1bmN0aW9uIGRldGVjdER1cGxpY2F0ZUlkcygpIHtcbiAgY29uc3QgaWRzID0gbmV3IFNldCgpO1xuICBjb25zdCBlbGVtcyA9IGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3JBbGwoXCIqW2lkXVwiKTtcbiAgZm9yIChsZXQgaSA9IDAsIGxlbiA9IGVsZW1zLmxlbmd0aDsgaSA8IGxlbjsgaSsrKSB7XG4gICAgaWYgKGlkcy5oYXMoZWxlbXNbaV0uaWQpKSB7XG4gICAgICBjb25zb2xlLmVycm9yKFxuICAgICAgICBgTXVsdGlwbGUgSURzIGRldGVjdGVkOiAke2VsZW1zW2ldLmlkfS4gRW5zdXJlIHVuaXF1ZSBlbGVtZW50IGlkcy5gLFxuICAgICAgKTtcbiAgICB9IGVsc2Uge1xuICAgICAgaWRzLmFkZChlbGVtc1tpXS5pZCk7XG4gICAgfVxuICB9XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBkZXRlY3RJbnZhbGlkU3RyZWFtSW5zZXJ0cyhpbnNlcnRzKSB7XG4gIGNvbnN0IGVycm9ycyA9IG5ldyBTZXQoKTtcbiAgT2JqZWN0LmtleXMoaW5zZXJ0cykuZm9yRWFjaCgoaWQpID0+IHtcbiAgICBjb25zdCBzdHJlYW1FbCA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKGlkKTtcbiAgICBpZiAoXG4gICAgICBzdHJlYW1FbCAmJlxuICAgICAgc3RyZWFtRWwucGFyZW50RWxlbWVudCAmJlxuICAgICAgc3RyZWFtRWwucGFyZW50RWxlbWVudC5nZXRBdHRyaWJ1dGUoXCJwaHgtdXBkYXRlXCIpICE9PSBcInN0cmVhbVwiXG4gICAgKSB7XG4gICAgICBlcnJvcnMuYWRkKFxuICAgICAgICBgVGhlIHN0cmVhbSBjb250YWluZXIgd2l0aCBpZCBcIiR7c3RyZWFtRWwucGFyZW50RWxlbWVudC5pZH1cIiBpcyBtaXNzaW5nIHRoZSBwaHgtdXBkYXRlPVwic3RyZWFtXCIgYXR0cmlidXRlLiBFbnN1cmUgaXQgaXMgc2V0IGZvciBzdHJlYW1zIHRvIHdvcmsgcHJvcGVybHkuYCxcbiAgICAgICk7XG4gICAgfVxuICB9KTtcbiAgZXJyb3JzLmZvckVhY2goKGVycm9yKSA9PiBjb25zb2xlLmVycm9yKGVycm9yKSk7XG59XG5cbmV4cG9ydCBjb25zdCBkZWJ1ZyA9ICh2aWV3LCBraW5kLCBtc2csIG9iaikgPT4ge1xuICBpZiAodmlldy5saXZlU29ja2V0LmlzRGVidWdFbmFibGVkKCkpIHtcbiAgICBjb25zb2xlLmxvZyhgJHt2aWV3LmlkfSAke2tpbmR9OiAke21zZ30gLSBgLCBvYmopO1xuICB9XG59O1xuXG4vLyB3cmFwcyB2YWx1ZSBpbiBjbG9zdXJlIG9yIHJldHVybnMgY2xvc3VyZVxuZXhwb3J0IGNvbnN0IGNsb3N1cmUgPSAodmFsKSA9PlxuICB0eXBlb2YgdmFsID09PSBcImZ1bmN0aW9uXCJcbiAgICA/IHZhbFxuICAgIDogZnVuY3Rpb24gKCkge1xuICAgICAgICByZXR1cm4gdmFsO1xuICAgICAgfTtcblxuZXhwb3J0IGNvbnN0IGNsb25lID0gKG9iaikgPT4ge1xuICByZXR1cm4gSlNPTi5wYXJzZShKU09OLnN0cmluZ2lmeShvYmopKTtcbn07XG5cbmV4cG9ydCBjb25zdCBjbG9zZXN0UGh4QmluZGluZyA9IChlbCwgYmluZGluZywgYm9yZGVyRWwpID0+IHtcbiAgZG8ge1xuICAgIGlmIChlbC5tYXRjaGVzKGBbJHtiaW5kaW5nfV1gKSAmJiAhZWwuZGlzYWJsZWQpIHtcbiAgICAgIHJldHVybiBlbDtcbiAgICB9XG4gICAgZWwgPSBlbC5wYXJlbnRFbGVtZW50IHx8IGVsLnBhcmVudE5vZGU7XG4gIH0gd2hpbGUgKFxuICAgIGVsICE9PSBudWxsICYmXG4gICAgZWwubm9kZVR5cGUgPT09IDEgJiZcbiAgICAhKChib3JkZXJFbCAmJiBib3JkZXJFbC5pc1NhbWVOb2RlKGVsKSkgfHwgZWwubWF0Y2hlcyhQSFhfVklFV19TRUxFQ1RPUikpXG4gICk7XG4gIHJldHVybiBudWxsO1xufTtcblxuZXhwb3J0IGNvbnN0IGlzT2JqZWN0ID0gKG9iaikgPT4ge1xuICByZXR1cm4gb2JqICE9PSBudWxsICYmIHR5cGVvZiBvYmogPT09IFwib2JqZWN0XCIgJiYgIShvYmogaW5zdGFuY2VvZiBBcnJheSk7XG59O1xuXG5leHBvcnQgY29uc3QgaXNFcXVhbE9iaiA9IChvYmoxLCBvYmoyKSA9PlxuICBKU09OLnN0cmluZ2lmeShvYmoxKSA9PT0gSlNPTi5zdHJpbmdpZnkob2JqMik7XG5cbmV4cG9ydCBjb25zdCBpc0VtcHR5ID0gKG9iaikgPT4ge1xuICBmb3IgKGNvbnN0IHggaW4gb2JqKSB7XG4gICAgcmV0dXJuIGZhbHNlO1xuICB9XG4gIHJldHVybiB0cnVlO1xufTtcblxuZXhwb3J0IGNvbnN0IG1heWJlID0gKGVsLCBjYWxsYmFjaykgPT4gZWwgJiYgY2FsbGJhY2soZWwpO1xuXG5leHBvcnQgY29uc3QgY2hhbm5lbFVwbG9hZGVyID0gZnVuY3Rpb24gKGVudHJpZXMsIG9uRXJyb3IsIHJlc3AsIGxpdmVTb2NrZXQpIHtcbiAgZW50cmllcy5mb3JFYWNoKChlbnRyeSkgPT4ge1xuICAgIGNvbnN0IGVudHJ5VXBsb2FkZXIgPSBuZXcgRW50cnlVcGxvYWRlcihlbnRyeSwgcmVzcC5jb25maWcsIGxpdmVTb2NrZXQpO1xuICAgIGVudHJ5VXBsb2FkZXIudXBsb2FkKCk7XG4gIH0pO1xufTtcbiIsICJjb25zdCBCcm93c2VyID0ge1xuICBjYW5QdXNoU3RhdGUoKSB7XG4gICAgcmV0dXJuIHR5cGVvZiBoaXN0b3J5LnB1c2hTdGF0ZSAhPT0gXCJ1bmRlZmluZWRcIjtcbiAgfSxcblxuICBkcm9wTG9jYWwobG9jYWxTdG9yYWdlLCBuYW1lc3BhY2UsIHN1YmtleSkge1xuICAgIHJldHVybiBsb2NhbFN0b3JhZ2UucmVtb3ZlSXRlbSh0aGlzLmxvY2FsS2V5KG5hbWVzcGFjZSwgc3Via2V5KSk7XG4gIH0sXG5cbiAgdXBkYXRlTG9jYWwobG9jYWxTdG9yYWdlLCBuYW1lc3BhY2UsIHN1YmtleSwgaW5pdGlhbCwgZnVuYykge1xuICAgIGNvbnN0IGN1cnJlbnQgPSB0aGlzLmdldExvY2FsKGxvY2FsU3RvcmFnZSwgbmFtZXNwYWNlLCBzdWJrZXkpO1xuICAgIGNvbnN0IGtleSA9IHRoaXMubG9jYWxLZXkobmFtZXNwYWNlLCBzdWJrZXkpO1xuICAgIGNvbnN0IG5ld1ZhbCA9IGN1cnJlbnQgPT09IG51bGwgPyBpbml0aWFsIDogZnVuYyhjdXJyZW50KTtcbiAgICBsb2NhbFN0b3JhZ2Uuc2V0SXRlbShrZXksIEpTT04uc3RyaW5naWZ5KG5ld1ZhbCkpO1xuICAgIHJldHVybiBuZXdWYWw7XG4gIH0sXG5cbiAgZ2V0TG9jYWwobG9jYWxTdG9yYWdlLCBuYW1lc3BhY2UsIHN1YmtleSkge1xuICAgIHJldHVybiBKU09OLnBhcnNlKGxvY2FsU3RvcmFnZS5nZXRJdGVtKHRoaXMubG9jYWxLZXkobmFtZXNwYWNlLCBzdWJrZXkpKSk7XG4gIH0sXG5cbiAgdXBkYXRlQ3VycmVudFN0YXRlKGNhbGxiYWNrKSB7XG4gICAgaWYgKCF0aGlzLmNhblB1c2hTdGF0ZSgpKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIGhpc3RvcnkucmVwbGFjZVN0YXRlKFxuICAgICAgY2FsbGJhY2soaGlzdG9yeS5zdGF0ZSB8fCB7fSksXG4gICAgICBcIlwiLFxuICAgICAgd2luZG93LmxvY2F0aW9uLmhyZWYsXG4gICAgKTtcbiAgfSxcblxuICBwdXNoU3RhdGUoa2luZCwgbWV0YSwgdG8pIHtcbiAgICBpZiAodGhpcy5jYW5QdXNoU3RhdGUoKSkge1xuICAgICAgaWYgKHRvICE9PSB3aW5kb3cubG9jYXRpb24uaHJlZikge1xuICAgICAgICBpZiAobWV0YS50eXBlID09IFwicmVkaXJlY3RcIiAmJiBtZXRhLnNjcm9sbCkge1xuICAgICAgICAgIC8vIElmIHdlJ3JlIHJlZGlyZWN0aW5nIHN0b3JlIHRoZSBjdXJyZW50IHNjcm9sbFkgZm9yIHRoZSBjdXJyZW50IGhpc3Rvcnkgc3RhdGUuXG4gICAgICAgICAgY29uc3QgY3VycmVudFN0YXRlID0gaGlzdG9yeS5zdGF0ZSB8fCB7fTtcbiAgICAgICAgICBjdXJyZW50U3RhdGUuc2Nyb2xsID0gbWV0YS5zY3JvbGw7XG4gICAgICAgICAgaGlzdG9yeS5yZXBsYWNlU3RhdGUoY3VycmVudFN0YXRlLCBcIlwiLCB3aW5kb3cubG9jYXRpb24uaHJlZik7XG4gICAgICAgIH1cblxuICAgICAgICBkZWxldGUgbWV0YS5zY3JvbGw7IC8vIE9ubHkgc3RvcmUgdGhlIHNjcm9sbCBpbiB0aGUgcmVkaXJlY3QgY2FzZS5cbiAgICAgICAgaGlzdG9yeVtraW5kICsgXCJTdGF0ZVwiXShtZXRhLCBcIlwiLCB0byB8fCBudWxsKTsgLy8gSUUgd2lsbCBjb2VyY2UgdW5kZWZpbmVkIHRvIHN0cmluZ1xuXG4gICAgICAgIC8vIHdoZW4gdXNpbmcgbmF2aWdhdGUsIHdlJ2QgY2FsbCBwdXNoU3RhdGUgaW1tZWRpYXRlbHkgYmVmb3JlIHBhdGNoaW5nIHRoZSBET00sXG4gICAgICAgIC8vIGp1bXBpbmcgYmFjayB0byB0aGUgdG9wIG9mIHRoZSBwYWdlLCBlZmZlY3RpdmVseSBpZ25vcmluZyB0aGUgc2Nyb2xsSW50b1ZpZXc7XG4gICAgICAgIC8vIHRoZXJlZm9yZSB3ZSB3YWl0IGZvciB0aGUgbmV4dCBmcmFtZSAoYWZ0ZXIgdGhlIERPTSBwYXRjaCkgYW5kIG9ubHkgdGhlbiB0cnlcbiAgICAgICAgLy8gdG8gc2Nyb2xsIHRvIHRoZSBoYXNoRWxcbiAgICAgICAgd2luZG93LnJlcXVlc3RBbmltYXRpb25GcmFtZSgoKSA9PiB7XG4gICAgICAgICAgY29uc3QgaGFzaEVsID0gdGhpcy5nZXRIYXNoVGFyZ2V0RWwod2luZG93LmxvY2F0aW9uLmhhc2gpO1xuXG4gICAgICAgICAgaWYgKGhhc2hFbCkge1xuICAgICAgICAgICAgaGFzaEVsLnNjcm9sbEludG9WaWV3KCk7XG4gICAgICAgICAgfSBlbHNlIGlmIChtZXRhLnR5cGUgPT09IFwicmVkaXJlY3RcIikge1xuICAgICAgICAgICAgd2luZG93LnNjcm9sbCgwLCAwKTtcbiAgICAgICAgICB9XG4gICAgICAgIH0pO1xuICAgICAgfVxuICAgIH0gZWxzZSB7XG4gICAgICB0aGlzLnJlZGlyZWN0KHRvKTtcbiAgICB9XG4gIH0sXG5cbiAgc2V0Q29va2llKG5hbWUsIHZhbHVlLCBtYXhBZ2VTZWNvbmRzKSB7XG4gICAgY29uc3QgZXhwaXJlcyA9XG4gICAgICB0eXBlb2YgbWF4QWdlU2Vjb25kcyA9PT0gXCJudW1iZXJcIiA/IGAgbWF4LWFnZT0ke21heEFnZVNlY29uZHN9O2AgOiBcIlwiO1xuICAgIGRvY3VtZW50LmNvb2tpZSA9IGAke25hbWV9PSR7dmFsdWV9OyR7ZXhwaXJlc30gcGF0aD0vYDtcbiAgfSxcblxuICBnZXRDb29raWUobmFtZSkge1xuICAgIHJldHVybiBkb2N1bWVudC5jb29raWUucmVwbGFjZShcbiAgICAgIG5ldyBSZWdFeHAoYCg/Oig/Ol58Lio7XFxzKikke25hbWV9XFxzKlxcPVxccyooW147XSopLiokKXxeLiokYCksXG4gICAgICBcIiQxXCIsXG4gICAgKTtcbiAgfSxcblxuICBkZWxldGVDb29raWUobmFtZSkge1xuICAgIGRvY3VtZW50LmNvb2tpZSA9IGAke25hbWV9PTsgbWF4LWFnZT0tMTsgcGF0aD0vYDtcbiAgfSxcblxuICByZWRpcmVjdChcbiAgICB0b1VSTCxcbiAgICBmbGFzaCxcbiAgICBuYXZpZ2F0ZSA9ICh1cmwpID0+IHtcbiAgICAgIHdpbmRvdy5sb2NhdGlvbi5ocmVmID0gdXJsO1xuICAgIH0sXG4gICkge1xuICAgIGlmIChmbGFzaCkge1xuICAgICAgdGhpcy5zZXRDb29raWUoXCJfX3Bob2VuaXhfZmxhc2hfX1wiLCBmbGFzaCwgNjApO1xuICAgIH1cbiAgICBuYXZpZ2F0ZSh0b1VSTCk7XG4gIH0sXG5cbiAgbG9jYWxLZXkobmFtZXNwYWNlLCBzdWJrZXkpIHtcbiAgICByZXR1cm4gYCR7bmFtZXNwYWNlfS0ke3N1YmtleX1gO1xuICB9LFxuXG4gIGdldEhhc2hUYXJnZXRFbChtYXliZUhhc2gpIHtcbiAgICBjb25zdCBoYXNoID0gbWF5YmVIYXNoLnRvU3RyaW5nKCkuc3Vic3RyaW5nKDEpO1xuICAgIGlmIChoYXNoID09PSBcIlwiKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIHJldHVybiAoXG4gICAgICBkb2N1bWVudC5nZXRFbGVtZW50QnlJZChoYXNoKSB8fFxuICAgICAgZG9jdW1lbnQucXVlcnlTZWxlY3RvcihgYVtuYW1lPVwiJHtoYXNofVwiXWApXG4gICAgKTtcbiAgfSxcbn07XG5cbmV4cG9ydCBkZWZhdWx0IEJyb3dzZXI7XG4iLCAiaW1wb3J0IHtcbiAgQ0hFQ0tBQkxFX0lOUFVUUyxcbiAgREVCT1VOQ0VfUFJFVl9LRVksXG4gIERFQk9VTkNFX1RSSUdHRVIsXG4gIEZPQ1VTQUJMRV9JTlBVVFMsXG4gIFBIWF9DT01QT05FTlQsXG4gIFBIWF9WSUVXX1JFRixcbiAgUEhYX1RFTEVQT1JURURfUkVGLFxuICBQSFhfSEFTX0ZPQ1VTRUQsXG4gIFBIWF9IQVNfU1VCTUlUVEVELFxuICBQSFhfTUFJTixcbiAgUEhYX1BBUkVOVF9JRCxcbiAgUEhYX1BSSVZBVEUsXG4gIFBIWF9SRUZfU1JDLFxuICBQSFhfUkVGX0xPQ0ssXG4gIFBIWF9QRU5ESU5HX0FUVFJTLFxuICBQSFhfUk9PVF9JRCxcbiAgUEhYX1NFU1NJT04sXG4gIFBIWF9TVEFUSUMsXG4gIFBIWF9VUExPQURfUkVGLFxuICBQSFhfVklFV19TRUxFQ1RPUixcbiAgUEhYX1NUSUNLWSxcbiAgUEhYX0VWRU5UX0NMQVNTRVMsXG4gIFRIUk9UVExFRCxcbiAgUEhYX1BPUlRBTCxcbiAgUEhYX1NUUkVBTSxcbn0gZnJvbSBcIi4vY29uc3RhbnRzXCI7XG5cbmltcG9ydCB7IGxvZ0Vycm9yIH0gZnJvbSBcIi4vdXRpbHNcIjtcblxuY29uc3QgRE9NID0ge1xuICBieUlkKGlkKSB7XG4gICAgcmV0dXJuIGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKGlkKSB8fCBsb2dFcnJvcihgbm8gaWQgZm91bmQgZm9yICR7aWR9YCk7XG4gIH0sXG5cbiAgcmVtb3ZlQ2xhc3MoZWwsIGNsYXNzTmFtZSkge1xuICAgIGVsLmNsYXNzTGlzdC5yZW1vdmUoY2xhc3NOYW1lKTtcbiAgICBpZiAoZWwuY2xhc3NMaXN0Lmxlbmd0aCA9PT0gMCkge1xuICAgICAgZWwucmVtb3ZlQXR0cmlidXRlKFwiY2xhc3NcIik7XG4gICAgfVxuICB9LFxuXG4gIGFsbChub2RlLCBxdWVyeSwgY2FsbGJhY2spIHtcbiAgICBpZiAoIW5vZGUpIHtcbiAgICAgIHJldHVybiBbXTtcbiAgICB9XG4gICAgY29uc3QgYXJyYXkgPSBBcnJheS5mcm9tKG5vZGUucXVlcnlTZWxlY3RvckFsbChxdWVyeSkpO1xuICAgIGlmIChjYWxsYmFjaykge1xuICAgICAgYXJyYXkuZm9yRWFjaChjYWxsYmFjayk7XG4gICAgfVxuICAgIHJldHVybiBhcnJheTtcbiAgfSxcblxuICBjaGlsZE5vZGVMZW5ndGgoaHRtbCkge1xuICAgIGNvbnN0IHRlbXBsYXRlID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudChcInRlbXBsYXRlXCIpO1xuICAgIHRlbXBsYXRlLmlubmVySFRNTCA9IGh0bWw7XG4gICAgcmV0dXJuIHRlbXBsYXRlLmNvbnRlbnQuY2hpbGRFbGVtZW50Q291bnQ7XG4gIH0sXG5cbiAgaXNVcGxvYWRJbnB1dChlbCkge1xuICAgIHJldHVybiBlbC50eXBlID09PSBcImZpbGVcIiAmJiBlbC5nZXRBdHRyaWJ1dGUoUEhYX1VQTE9BRF9SRUYpICE9PSBudWxsO1xuICB9LFxuXG4gIGlzQXV0b1VwbG9hZChpbnB1dEVsKSB7XG4gICAgcmV0dXJuIGlucHV0RWwuaGFzQXR0cmlidXRlKFwiZGF0YS1waHgtYXV0by11cGxvYWRcIik7XG4gIH0sXG5cbiAgZmluZFVwbG9hZElucHV0cyhub2RlKSB7XG4gICAgY29uc3QgZm9ybUlkID0gbm9kZS5pZDtcbiAgICBjb25zdCBpbnB1dHNPdXRzaWRlRm9ybSA9IHRoaXMuYWxsKFxuICAgICAgZG9jdW1lbnQsXG4gICAgICBgaW5wdXRbdHlwZT1cImZpbGVcIl1bJHtQSFhfVVBMT0FEX1JFRn1dW2Zvcm09XCIke2Zvcm1JZH1cIl1gLFxuICAgICk7XG4gICAgcmV0dXJuIHRoaXMuYWxsKG5vZGUsIGBpbnB1dFt0eXBlPVwiZmlsZVwiXVske1BIWF9VUExPQURfUkVGfV1gKS5jb25jYXQoXG4gICAgICBpbnB1dHNPdXRzaWRlRm9ybSxcbiAgICApO1xuICB9LFxuXG4gIGZpbmRDb21wb25lbnROb2RlTGlzdCh2aWV3SWQsIGNpZCwgZG9jID0gZG9jdW1lbnQpIHtcbiAgICByZXR1cm4gdGhpcy5hbGwoXG4gICAgICBkb2MsXG4gICAgICBgWyR7UEhYX1ZJRVdfUkVGfT1cIiR7dmlld0lkfVwiXVske1BIWF9DT01QT05FTlR9PVwiJHtjaWR9XCJdYCxcbiAgICApO1xuICB9LFxuXG4gIGlzUGh4RGVzdHJveWVkKG5vZGUpIHtcbiAgICByZXR1cm4gbm9kZS5pZCAmJiBET00ucHJpdmF0ZShub2RlLCBcImRlc3Ryb3llZFwiKSA/IHRydWUgOiBmYWxzZTtcbiAgfSxcblxuICB3YW50c05ld1RhYihlKSB7XG4gICAgY29uc3Qgd2FudHNOZXdUYWIgPVxuICAgICAgZS5jdHJsS2V5IHx8IGUuc2hpZnRLZXkgfHwgZS5tZXRhS2V5IHx8IChlLmJ1dHRvbiAmJiBlLmJ1dHRvbiA9PT0gMSk7XG4gICAgY29uc3QgaXNEb3dubG9hZCA9XG4gICAgICBlLnRhcmdldCBpbnN0YW5jZW9mIEhUTUxBbmNob3JFbGVtZW50ICYmXG4gICAgICBlLnRhcmdldC5oYXNBdHRyaWJ1dGUoXCJkb3dubG9hZFwiKTtcbiAgICBjb25zdCBpc1RhcmdldEJsYW5rID1cbiAgICAgIGUudGFyZ2V0Lmhhc0F0dHJpYnV0ZShcInRhcmdldFwiKSAmJlxuICAgICAgZS50YXJnZXQuZ2V0QXR0cmlidXRlKFwidGFyZ2V0XCIpLnRvTG93ZXJDYXNlKCkgPT09IFwiX2JsYW5rXCI7XG4gICAgY29uc3QgaXNUYXJnZXROYW1lZFRhYiA9XG4gICAgICBlLnRhcmdldC5oYXNBdHRyaWJ1dGUoXCJ0YXJnZXRcIikgJiZcbiAgICAgICFlLnRhcmdldC5nZXRBdHRyaWJ1dGUoXCJ0YXJnZXRcIikuc3RhcnRzV2l0aChcIl9cIik7XG4gICAgcmV0dXJuIHdhbnRzTmV3VGFiIHx8IGlzVGFyZ2V0QmxhbmsgfHwgaXNEb3dubG9hZCB8fCBpc1RhcmdldE5hbWVkVGFiO1xuICB9LFxuXG4gIGlzVW5sb2FkYWJsZUZvcm1TdWJtaXQoZSkge1xuICAgIC8vIElnbm9yZSBmb3JtIHN1Ym1pc3Npb25zIGludGVuZGVkIHRvIGNsb3NlIGEgbmF0aXZlIDxkaWFsb2c+IGVsZW1lbnRcbiAgICAvLyBodHRwczovL2RldmVsb3Blci5tb3ppbGxhLm9yZy9lbi1VUy9kb2NzL1dlYi9IVE1ML0VsZW1lbnQvZGlhbG9nI3VzYWdlX25vdGVzXG4gICAgY29uc3QgaXNEaWFsb2dTdWJtaXQgPVxuICAgICAgKGUudGFyZ2V0ICYmIGUudGFyZ2V0LmdldEF0dHJpYnV0ZShcIm1ldGhvZFwiKSA9PT0gXCJkaWFsb2dcIikgfHxcbiAgICAgIChlLnN1Ym1pdHRlciAmJiBlLnN1Ym1pdHRlci5nZXRBdHRyaWJ1dGUoXCJmb3JtbWV0aG9kXCIpID09PSBcImRpYWxvZ1wiKTtcblxuICAgIGlmIChpc0RpYWxvZ1N1Ym1pdCkge1xuICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH0gZWxzZSB7XG4gICAgICByZXR1cm4gIWUuZGVmYXVsdFByZXZlbnRlZCAmJiAhdGhpcy53YW50c05ld1RhYihlKTtcbiAgICB9XG4gIH0sXG5cbiAgaXNOZXdQYWdlQ2xpY2soZSwgY3VycmVudExvY2F0aW9uKSB7XG4gICAgY29uc3QgaHJlZiA9XG4gICAgICBlLnRhcmdldCBpbnN0YW5jZW9mIEhUTUxBbmNob3JFbGVtZW50XG4gICAgICAgID8gZS50YXJnZXQuZ2V0QXR0cmlidXRlKFwiaHJlZlwiKVxuICAgICAgICA6IG51bGw7XG4gICAgbGV0IHVybDtcblxuICAgIGlmIChlLmRlZmF1bHRQcmV2ZW50ZWQgfHwgaHJlZiA9PT0gbnVsbCB8fCB0aGlzLndhbnRzTmV3VGFiKGUpKSB7XG4gICAgICByZXR1cm4gZmFsc2U7XG4gICAgfVxuICAgIGlmIChocmVmLnN0YXJ0c1dpdGgoXCJtYWlsdG86XCIpIHx8IGhyZWYuc3RhcnRzV2l0aChcInRlbDpcIikpIHtcbiAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9XG4gICAgaWYgKGUudGFyZ2V0LmlzQ29udGVudEVkaXRhYmxlKSB7XG4gICAgICByZXR1cm4gZmFsc2U7XG4gICAgfVxuXG4gICAgdHJ5IHtcbiAgICAgIHVybCA9IG5ldyBVUkwoaHJlZik7XG4gICAgfSBjYXRjaCB7XG4gICAgICB0cnkge1xuICAgICAgICB1cmwgPSBuZXcgVVJMKGhyZWYsIGN1cnJlbnRMb2NhdGlvbik7XG4gICAgICB9IGNhdGNoIHtcbiAgICAgICAgLy8gYmFkIFVSTCwgZmFsbGJhY2sgdG8gbGV0IGJyb3dzZXIgdHJ5IGl0IGFzIGV4dGVybmFsXG4gICAgICAgIHJldHVybiB0cnVlO1xuICAgICAgfVxuICAgIH1cblxuICAgIGlmIChcbiAgICAgIHVybC5ob3N0ID09PSBjdXJyZW50TG9jYXRpb24uaG9zdCAmJlxuICAgICAgdXJsLnByb3RvY29sID09PSBjdXJyZW50TG9jYXRpb24ucHJvdG9jb2xcbiAgICApIHtcbiAgICAgIGlmIChcbiAgICAgICAgdXJsLnBhdGhuYW1lID09PSBjdXJyZW50TG9jYXRpb24ucGF0aG5hbWUgJiZcbiAgICAgICAgdXJsLnNlYXJjaCA9PT0gY3VycmVudExvY2F0aW9uLnNlYXJjaFxuICAgICAgKSB7XG4gICAgICAgIHJldHVybiB1cmwuaGFzaCA9PT0gXCJcIiAmJiAhdXJsLmhyZWYuZW5kc1dpdGgoXCIjXCIpO1xuICAgICAgfVxuICAgIH1cbiAgICByZXR1cm4gdXJsLnByb3RvY29sLnN0YXJ0c1dpdGgoXCJodHRwXCIpO1xuICB9LFxuXG4gIG1hcmtQaHhDaGlsZERlc3Ryb3llZChlbCkge1xuICAgIGlmICh0aGlzLmlzUGh4Q2hpbGQoZWwpKSB7XG4gICAgICBlbC5zZXRBdHRyaWJ1dGUoUEhYX1NFU1NJT04sIFwiXCIpO1xuICAgIH1cbiAgICB0aGlzLnB1dFByaXZhdGUoZWwsIFwiZGVzdHJveWVkXCIsIHRydWUpO1xuICB9LFxuXG4gIGZpbmRQaHhDaGlsZHJlbkluRnJhZ21lbnQoaHRtbCwgcGFyZW50SWQpIHtcbiAgICBjb25zdCB0ZW1wbGF0ZSA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoXCJ0ZW1wbGF0ZVwiKTtcbiAgICB0ZW1wbGF0ZS5pbm5lckhUTUwgPSBodG1sO1xuICAgIHJldHVybiB0aGlzLmZpbmRQaHhDaGlsZHJlbih0ZW1wbGF0ZS5jb250ZW50LCBwYXJlbnRJZCk7XG4gIH0sXG5cbiAgaXNJZ25vcmVkKGVsLCBwaHhVcGRhdGUpIHtcbiAgICByZXR1cm4gKFxuICAgICAgKGVsLmdldEF0dHJpYnV0ZShwaHhVcGRhdGUpIHx8IGVsLmdldEF0dHJpYnV0ZShcImRhdGEtcGh4LXVwZGF0ZVwiKSkgPT09XG4gICAgICBcImlnbm9yZVwiXG4gICAgKTtcbiAgfSxcblxuICBpc1BoeFVwZGF0ZShlbCwgcGh4VXBkYXRlLCB1cGRhdGVUeXBlcykge1xuICAgIHJldHVybiAoXG4gICAgICBlbC5nZXRBdHRyaWJ1dGUgJiYgdXBkYXRlVHlwZXMuaW5kZXhPZihlbC5nZXRBdHRyaWJ1dGUocGh4VXBkYXRlKSkgPj0gMFxuICAgICk7XG4gIH0sXG5cbiAgZmluZFBoeFN0aWNreShlbCkge1xuICAgIHJldHVybiB0aGlzLmFsbChlbCwgYFske1BIWF9TVElDS1l9XWApO1xuICB9LFxuXG4gIGZpbmRQaHhDaGlsZHJlbihlbCwgcGFyZW50SWQpIHtcbiAgICByZXR1cm4gdGhpcy5hbGwoZWwsIGAke1BIWF9WSUVXX1NFTEVDVE9SfVske1BIWF9QQVJFTlRfSUR9PVwiJHtwYXJlbnRJZH1cIl1gKTtcbiAgfSxcblxuICBmaW5kRXhpc3RpbmdQYXJlbnRDSURzKHZpZXdJZCwgY2lkcykge1xuICAgIC8vIHdlIG9ubHkgd2FudCB0byBmaW5kIHBhcmVudHMgdGhhdCBleGlzdCBvbiB0aGUgcGFnZVxuICAgIC8vIGlmIGEgY2lkIGlzIG5vdCBvbiB0aGUgcGFnZSwgdGhlIG9ubHkgd2F5IGl0IGNhbiBiZSBhZGRlZCBiYWNrIHRvIHRoZSBwYWdlXG4gICAgLy8gaXMgaWYgYSBwYXJlbnQgYWRkcyBpdCBiYWNrLCB0aGVyZWZvcmUgaWYgYSBjaWQgZG9lcyBub3QgZXhpc3Qgb24gdGhlIHBhZ2UsXG4gICAgLy8gd2Ugc2hvdWxkIG5vdCB0cnkgdG8gcmVuZGVyIGl0IGJ5IGl0c2VsZiAoYmVjYXVzZSBpdCB3b3VsZCBiZSByZW5kZXJlZCB0d2ljZSxcbiAgICAvLyBvbmUgYnkgdGhlIHBhcmVudCwgYW5kIGEgc2Vjb25kIHRpbWUgYnkgaXRzZWxmKVxuICAgIGNvbnN0IHBhcmVudENpZHMgPSBuZXcgU2V0KCk7XG4gICAgY29uc3QgY2hpbGRyZW5DaWRzID0gbmV3IFNldCgpO1xuXG4gICAgY2lkcy5mb3JFYWNoKChjaWQpID0+IHtcbiAgICAgIHRoaXMuYWxsKFxuICAgICAgICBkb2N1bWVudCxcbiAgICAgICAgYFske1BIWF9WSUVXX1JFRn09XCIke3ZpZXdJZH1cIl1bJHtQSFhfQ09NUE9ORU5UfT1cIiR7Y2lkfVwiXWAsXG4gICAgICApLmZvckVhY2goKHBhcmVudCkgPT4ge1xuICAgICAgICBwYXJlbnRDaWRzLmFkZChjaWQpO1xuICAgICAgICB0aGlzLmFsbChwYXJlbnQsIGBbJHtQSFhfVklFV19SRUZ9PVwiJHt2aWV3SWR9XCJdWyR7UEhYX0NPTVBPTkVOVH1dYClcbiAgICAgICAgICAubWFwKChlbCkgPT4gcGFyc2VJbnQoZWwuZ2V0QXR0cmlidXRlKFBIWF9DT01QT05FTlQpKSlcbiAgICAgICAgICAuZm9yRWFjaCgoY2hpbGRDSUQpID0+IGNoaWxkcmVuQ2lkcy5hZGQoY2hpbGRDSUQpKTtcbiAgICAgIH0pO1xuICAgIH0pO1xuXG4gICAgY2hpbGRyZW5DaWRzLmZvckVhY2goKGNoaWxkQ2lkKSA9PiBwYXJlbnRDaWRzLmRlbGV0ZShjaGlsZENpZCkpO1xuXG4gICAgcmV0dXJuIHBhcmVudENpZHM7XG4gIH0sXG5cbiAgcHJpdmF0ZShlbCwga2V5KSB7XG4gICAgcmV0dXJuIGVsW1BIWF9QUklWQVRFXSAmJiBlbFtQSFhfUFJJVkFURV1ba2V5XTtcbiAgfSxcblxuICBkZWxldGVQcml2YXRlKGVsLCBrZXkpIHtcbiAgICBlbFtQSFhfUFJJVkFURV0gJiYgZGVsZXRlIGVsW1BIWF9QUklWQVRFXVtrZXldO1xuICB9LFxuXG4gIHB1dFByaXZhdGUoZWwsIGtleSwgdmFsdWUpIHtcbiAgICBpZiAoIWVsW1BIWF9QUklWQVRFXSkge1xuICAgICAgZWxbUEhYX1BSSVZBVEVdID0ge307XG4gICAgfVxuICAgIGVsW1BIWF9QUklWQVRFXVtrZXldID0gdmFsdWU7XG4gIH0sXG5cbiAgdXBkYXRlUHJpdmF0ZShlbCwga2V5LCBkZWZhdWx0VmFsLCB1cGRhdGVGdW5jKSB7XG4gICAgY29uc3QgZXhpc3RpbmcgPSB0aGlzLnByaXZhdGUoZWwsIGtleSk7XG4gICAgaWYgKGV4aXN0aW5nID09PSB1bmRlZmluZWQpIHtcbiAgICAgIHRoaXMucHV0UHJpdmF0ZShlbCwga2V5LCB1cGRhdGVGdW5jKGRlZmF1bHRWYWwpKTtcbiAgICB9IGVsc2Uge1xuICAgICAgdGhpcy5wdXRQcml2YXRlKGVsLCBrZXksIHVwZGF0ZUZ1bmMoZXhpc3RpbmcpKTtcbiAgICB9XG4gIH0sXG5cbiAgc3luY1BlbmRpbmdBdHRycyhmcm9tRWwsIHRvRWwpIHtcbiAgICBpZiAoIWZyb21FbC5oYXNBdHRyaWJ1dGUoUEhYX1JFRl9TUkMpKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIFBIWF9FVkVOVF9DTEFTU0VTLmZvckVhY2goKGNsYXNzTmFtZSkgPT4ge1xuICAgICAgZnJvbUVsLmNsYXNzTGlzdC5jb250YWlucyhjbGFzc05hbWUpICYmIHRvRWwuY2xhc3NMaXN0LmFkZChjbGFzc05hbWUpO1xuICAgIH0pO1xuICAgIFBIWF9QRU5ESU5HX0FUVFJTLmZpbHRlcigoYXR0cikgPT4gZnJvbUVsLmhhc0F0dHJpYnV0ZShhdHRyKSkuZm9yRWFjaChcbiAgICAgIChhdHRyKSA9PiB7XG4gICAgICAgIHRvRWwuc2V0QXR0cmlidXRlKGF0dHIsIGZyb21FbC5nZXRBdHRyaWJ1dGUoYXR0cikpO1xuICAgICAgfSxcbiAgICApO1xuICB9LFxuXG4gIGNvcHlQcml2YXRlcyh0YXJnZXQsIHNvdXJjZSkge1xuICAgIGlmIChzb3VyY2VbUEhYX1BSSVZBVEVdKSB7XG4gICAgICB0YXJnZXRbUEhYX1BSSVZBVEVdID0gc291cmNlW1BIWF9QUklWQVRFXTtcbiAgICB9XG4gIH0sXG5cbiAgcHV0VGl0bGUoc3RyKSB7XG4gICAgY29uc3QgdGl0bGVFbCA9IGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3IoXCJ0aXRsZVwiKTtcbiAgICBpZiAodGl0bGVFbCkge1xuICAgICAgY29uc3QgeyBwcmVmaXgsIHN1ZmZpeCwgZGVmYXVsdDogZGVmYXVsdFRpdGxlIH0gPSB0aXRsZUVsLmRhdGFzZXQ7XG4gICAgICBjb25zdCBpc0VtcHR5ID0gdHlwZW9mIHN0ciAhPT0gXCJzdHJpbmdcIiB8fCBzdHIudHJpbSgpID09PSBcIlwiO1xuICAgICAgaWYgKGlzRW1wdHkgJiYgdHlwZW9mIGRlZmF1bHRUaXRsZSAhPT0gXCJzdHJpbmdcIikge1xuICAgICAgICByZXR1cm47XG4gICAgICB9XG5cbiAgICAgIGNvbnN0IGlubmVyID0gaXNFbXB0eSA/IGRlZmF1bHRUaXRsZSA6IHN0cjtcbiAgICAgIGRvY3VtZW50LnRpdGxlID0gYCR7cHJlZml4IHx8IFwiXCJ9JHtpbm5lciB8fCBcIlwifSR7c3VmZml4IHx8IFwiXCJ9YDtcbiAgICB9IGVsc2Uge1xuICAgICAgZG9jdW1lbnQudGl0bGUgPSBzdHI7XG4gICAgfVxuICB9LFxuXG4gIGRlYm91bmNlKFxuICAgIGVsLFxuICAgIGV2ZW50LFxuICAgIHBoeERlYm91bmNlLFxuICAgIGRlZmF1bHREZWJvdW5jZSxcbiAgICBwaHhUaHJvdHRsZSxcbiAgICBkZWZhdWx0VGhyb3R0bGUsXG4gICAgYXN5bmNGaWx0ZXIsXG4gICAgY2FsbGJhY2ssXG4gICkge1xuICAgIGxldCBkZWJvdW5jZSA9IGVsLmdldEF0dHJpYnV0ZShwaHhEZWJvdW5jZSk7XG4gICAgbGV0IHRocm90dGxlID0gZWwuZ2V0QXR0cmlidXRlKHBoeFRocm90dGxlKTtcblxuICAgIGlmIChkZWJvdW5jZSA9PT0gXCJcIikge1xuICAgICAgZGVib3VuY2UgPSBkZWZhdWx0RGVib3VuY2U7XG4gICAgfVxuICAgIGlmICh0aHJvdHRsZSA9PT0gXCJcIikge1xuICAgICAgdGhyb3R0bGUgPSBkZWZhdWx0VGhyb3R0bGU7XG4gICAgfVxuICAgIGNvbnN0IHZhbHVlID0gZGVib3VuY2UgfHwgdGhyb3R0bGU7XG4gICAgc3dpdGNoICh2YWx1ZSkge1xuICAgICAgY2FzZSBudWxsOlxuICAgICAgICByZXR1cm4gY2FsbGJhY2soKTtcblxuICAgICAgY2FzZSBcImJsdXJcIjpcbiAgICAgICAgdGhpcy5pbmNDeWNsZShlbCwgXCJkZWJvdW5jZS1ibHVyLWN5Y2xlXCIsICgpID0+IHtcbiAgICAgICAgICBpZiAoYXN5bmNGaWx0ZXIoKSkge1xuICAgICAgICAgICAgY2FsbGJhY2soKTtcbiAgICAgICAgICB9XG4gICAgICAgIH0pO1xuICAgICAgICBpZiAodGhpcy5vbmNlKGVsLCBcImRlYm91bmNlLWJsdXJcIikpIHtcbiAgICAgICAgICBlbC5hZGRFdmVudExpc3RlbmVyKFwiYmx1clwiLCAoKSA9PlxuICAgICAgICAgICAgdGhpcy50cmlnZ2VyQ3ljbGUoZWwsIFwiZGVib3VuY2UtYmx1ci1jeWNsZVwiKSxcbiAgICAgICAgICApO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybjtcblxuICAgICAgZGVmYXVsdDpcbiAgICAgICAgY29uc3QgdGltZW91dCA9IHBhcnNlSW50KHZhbHVlKTtcbiAgICAgICAgY29uc3QgdHJpZ2dlciA9ICgpID0+XG4gICAgICAgICAgdGhyb3R0bGUgPyB0aGlzLmRlbGV0ZVByaXZhdGUoZWwsIFRIUk9UVExFRCkgOiBjYWxsYmFjaygpO1xuICAgICAgICBjb25zdCBjdXJyZW50Q3ljbGUgPSB0aGlzLmluY0N5Y2xlKGVsLCBERUJPVU5DRV9UUklHR0VSLCB0cmlnZ2VyKTtcbiAgICAgICAgaWYgKGlzTmFOKHRpbWVvdXQpKSB7XG4gICAgICAgICAgcmV0dXJuIGxvZ0Vycm9yKGBpbnZhbGlkIHRocm90dGxlL2RlYm91bmNlIHZhbHVlOiAke3ZhbHVlfWApO1xuICAgICAgICB9XG4gICAgICAgIGlmICh0aHJvdHRsZSkge1xuICAgICAgICAgIGxldCBuZXdLZXlEb3duID0gZmFsc2U7XG4gICAgICAgICAgaWYgKGV2ZW50LnR5cGUgPT09IFwia2V5ZG93blwiKSB7XG4gICAgICAgICAgICBjb25zdCBwcmV2S2V5ID0gdGhpcy5wcml2YXRlKGVsLCBERUJPVU5DRV9QUkVWX0tFWSk7XG4gICAgICAgICAgICB0aGlzLnB1dFByaXZhdGUoZWwsIERFQk9VTkNFX1BSRVZfS0VZLCBldmVudC5rZXkpO1xuICAgICAgICAgICAgbmV3S2V5RG93biA9IHByZXZLZXkgIT09IGV2ZW50LmtleTtcbiAgICAgICAgICB9XG5cbiAgICAgICAgICBpZiAoIW5ld0tleURvd24gJiYgdGhpcy5wcml2YXRlKGVsLCBUSFJPVFRMRUQpKSB7XG4gICAgICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIGNhbGxiYWNrKCk7XG4gICAgICAgICAgICBjb25zdCB0ID0gc2V0VGltZW91dCgoKSA9PiB7XG4gICAgICAgICAgICAgIGlmIChhc3luY0ZpbHRlcigpKSB7XG4gICAgICAgICAgICAgICAgdGhpcy50cmlnZ2VyQ3ljbGUoZWwsIERFQk9VTkNFX1RSSUdHRVIpO1xuICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9LCB0aW1lb3V0KTtcbiAgICAgICAgICAgIHRoaXMucHV0UHJpdmF0ZShlbCwgVEhST1RUTEVELCB0KTtcbiAgICAgICAgICB9XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgc2V0VGltZW91dCgoKSA9PiB7XG4gICAgICAgICAgICBpZiAoYXN5bmNGaWx0ZXIoKSkge1xuICAgICAgICAgICAgICB0aGlzLnRyaWdnZXJDeWNsZShlbCwgREVCT1VOQ0VfVFJJR0dFUiwgY3VycmVudEN5Y2xlKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9LCB0aW1lb3V0KTtcbiAgICAgICAgfVxuXG4gICAgICAgIGNvbnN0IGZvcm0gPSBlbC5mb3JtO1xuICAgICAgICBpZiAoZm9ybSAmJiB0aGlzLm9uY2UoZm9ybSwgXCJiaW5kLWRlYm91bmNlXCIpKSB7XG4gICAgICAgICAgZm9ybS5hZGRFdmVudExpc3RlbmVyKFwic3VibWl0XCIsICgpID0+IHtcbiAgICAgICAgICAgIEFycmF5LmZyb20obmV3IEZvcm1EYXRhKGZvcm0pLmVudHJpZXMoKSwgKFtuYW1lXSkgPT4ge1xuICAgICAgICAgICAgICBjb25zdCBpbnB1dCA9IGZvcm0ucXVlcnlTZWxlY3RvcihgW25hbWU9XCIke25hbWV9XCJdYCk7XG4gICAgICAgICAgICAgIHRoaXMuaW5jQ3ljbGUoaW5wdXQsIERFQk9VTkNFX1RSSUdHRVIpO1xuICAgICAgICAgICAgICB0aGlzLmRlbGV0ZVByaXZhdGUoaW5wdXQsIFRIUk9UVExFRCk7XG4gICAgICAgICAgICB9KTtcbiAgICAgICAgICB9KTtcbiAgICAgICAgfVxuICAgICAgICBpZiAodGhpcy5vbmNlKGVsLCBcImJpbmQtZGVib3VuY2VcIikpIHtcbiAgICAgICAgICBlbC5hZGRFdmVudExpc3RlbmVyKFwiYmx1clwiLCAoKSA9PiB7XG4gICAgICAgICAgICAvLyBiZWNhdXNlIHdlIHRyaWdnZXIgdGhlIGNhbGxiYWNrIGhlcmUsXG4gICAgICAgICAgICAvLyB3ZSBhbHNvIGNsZWFyIHRoZSB0aHJvdHRsZSB0aW1lb3V0IHRvIHByZXZlbnQgdGhlIGNhbGxiYWNrXG4gICAgICAgICAgICAvLyBmcm9tIGJlaW5nIGNhbGxlZCBhZ2FpbiBhZnRlciB0aGUgdGltZW91dCBmaXJlc1xuICAgICAgICAgICAgY2xlYXJUaW1lb3V0KHRoaXMucHJpdmF0ZShlbCwgVEhST1RUTEVEKSk7XG4gICAgICAgICAgICB0aGlzLnRyaWdnZXJDeWNsZShlbCwgREVCT1VOQ0VfVFJJR0dFUik7XG4gICAgICAgICAgfSk7XG4gICAgICAgIH1cbiAgICB9XG4gIH0sXG5cbiAgdHJpZ2dlckN5Y2xlKGVsLCBrZXksIGN1cnJlbnRDeWNsZSkge1xuICAgIGNvbnN0IFtjeWNsZSwgdHJpZ2dlcl0gPSB0aGlzLnByaXZhdGUoZWwsIGtleSk7XG4gICAgaWYgKCFjdXJyZW50Q3ljbGUpIHtcbiAgICAgIGN1cnJlbnRDeWNsZSA9IGN5Y2xlO1xuICAgIH1cbiAgICBpZiAoY3VycmVudEN5Y2xlID09PSBjeWNsZSkge1xuICAgICAgdGhpcy5pbmNDeWNsZShlbCwga2V5KTtcbiAgICAgIHRyaWdnZXIoKTtcbiAgICB9XG4gIH0sXG5cbiAgb25jZShlbCwga2V5KSB7XG4gICAgaWYgKHRoaXMucHJpdmF0ZShlbCwga2V5KSA9PT0gdHJ1ZSkge1xuICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH1cbiAgICB0aGlzLnB1dFByaXZhdGUoZWwsIGtleSwgdHJ1ZSk7XG4gICAgcmV0dXJuIHRydWU7XG4gIH0sXG5cbiAgaW5jQ3ljbGUoZWwsIGtleSwgdHJpZ2dlciA9IGZ1bmN0aW9uICgpIHt9KSB7XG4gICAgbGV0IFtjdXJyZW50Q3ljbGVdID0gdGhpcy5wcml2YXRlKGVsLCBrZXkpIHx8IFswLCB0cmlnZ2VyXTtcbiAgICBjdXJyZW50Q3ljbGUrKztcbiAgICB0aGlzLnB1dFByaXZhdGUoZWwsIGtleSwgW2N1cnJlbnRDeWNsZSwgdHJpZ2dlcl0pO1xuICAgIHJldHVybiBjdXJyZW50Q3ljbGU7XG4gIH0sXG5cbiAgLy8gbWFpbnRhaW5zIG9yIGFkZHMgcHJpdmF0ZWx5IHVzZWQgaG9vayBpbmZvcm1hdGlvblxuICAvLyBmcm9tRWwgYW5kIHRvRWwgY2FuIGJlIHRoZSBzYW1lIGVsZW1lbnQgaW4gdGhlIGNhc2Ugb2YgYSBuZXdseSBhZGRlZCBub2RlXG4gIC8vIGZyb21FbCBhbmQgdG9FbCBjYW4gYmUgYW55IEhUTUwgbm9kZSB0eXBlLCBzbyB3ZSBuZWVkIHRvIGNoZWNrIGlmIGl0J3MgYW4gZWxlbWVudCBub2RlXG4gIG1haW50YWluUHJpdmF0ZUhvb2tzKGZyb21FbCwgdG9FbCwgcGh4Vmlld3BvcnRUb3AsIHBoeFZpZXdwb3J0Qm90dG9tKSB7XG4gICAgLy8gbWFpbnRhaW4gdGhlIGhvb2tzIGNyZWF0ZWQgd2l0aCBjcmVhdGVIb29rXG4gICAgaWYgKFxuICAgICAgZnJvbUVsLmhhc0F0dHJpYnV0ZSAmJlxuICAgICAgZnJvbUVsLmhhc0F0dHJpYnV0ZShcImRhdGEtcGh4LWhvb2tcIikgJiZcbiAgICAgICF0b0VsLmhhc0F0dHJpYnV0ZShcImRhdGEtcGh4LWhvb2tcIilcbiAgICApIHtcbiAgICAgIHRvRWwuc2V0QXR0cmlidXRlKFwiZGF0YS1waHgtaG9va1wiLCBmcm9tRWwuZ2V0QXR0cmlidXRlKFwiZGF0YS1waHgtaG9va1wiKSk7XG4gICAgfVxuICAgIC8vIGFkZCBob29rcyB0byBlbGVtZW50cyB3aXRoIHZpZXdwb3J0IGF0dHJpYnV0ZXNcbiAgICBpZiAoXG4gICAgICB0b0VsLmhhc0F0dHJpYnV0ZSAmJlxuICAgICAgKHRvRWwuaGFzQXR0cmlidXRlKHBoeFZpZXdwb3J0VG9wKSB8fFxuICAgICAgICB0b0VsLmhhc0F0dHJpYnV0ZShwaHhWaWV3cG9ydEJvdHRvbSkpXG4gICAgKSB7XG4gICAgICB0b0VsLnNldEF0dHJpYnV0ZShcImRhdGEtcGh4LWhvb2tcIiwgXCJQaG9lbml4LkluZmluaXRlU2Nyb2xsXCIpO1xuICAgIH1cbiAgfSxcblxuICBwdXRDdXN0b21FbEhvb2soZWwsIGhvb2spIHtcbiAgICBpZiAoZWwuaXNDb25uZWN0ZWQpIHtcbiAgICAgIGVsLnNldEF0dHJpYnV0ZShcImRhdGEtcGh4LWhvb2tcIiwgXCJcIik7XG4gICAgfSBlbHNlIHtcbiAgICAgIGNvbnNvbGUuZXJyb3IoYFxuICAgICAgICBob29rIGF0dGFjaGVkIHRvIG5vbi1jb25uZWN0ZWQgRE9NIGVsZW1lbnRcbiAgICAgICAgZW5zdXJlIHlvdSBhcmUgY2FsbGluZyBjcmVhdGVIb29rIHdpdGhpbiB5b3VyIGNvbm5lY3RlZENhbGxiYWNrLiAke2VsLm91dGVySFRNTH1cbiAgICAgIGApO1xuICAgIH1cbiAgICB0aGlzLnB1dFByaXZhdGUoZWwsIFwiY3VzdG9tLWVsLWhvb2tcIiwgaG9vayk7XG4gIH0sXG5cbiAgZ2V0Q3VzdG9tRWxIb29rKGVsKSB7XG4gICAgcmV0dXJuIHRoaXMucHJpdmF0ZShlbCwgXCJjdXN0b20tZWwtaG9va1wiKTtcbiAgfSxcblxuICBpc1VzZWRJbnB1dChlbCkge1xuICAgIHJldHVybiAoXG4gICAgICBlbC5ub2RlVHlwZSA9PT0gTm9kZS5FTEVNRU5UX05PREUgJiZcbiAgICAgICh0aGlzLnByaXZhdGUoZWwsIFBIWF9IQVNfRk9DVVNFRCkgfHwgdGhpcy5wcml2YXRlKGVsLCBQSFhfSEFTX1NVQk1JVFRFRCkpXG4gICAgKTtcbiAgfSxcblxuICByZXNldEZvcm0oZm9ybSkge1xuICAgIEFycmF5LmZyb20oZm9ybS5lbGVtZW50cykuZm9yRWFjaCgoaW5wdXQpID0+IHtcbiAgICAgIHRoaXMuZGVsZXRlUHJpdmF0ZShpbnB1dCwgUEhYX0hBU19GT0NVU0VEKTtcbiAgICAgIHRoaXMuZGVsZXRlUHJpdmF0ZShpbnB1dCwgUEhYX0hBU19TVUJNSVRURUQpO1xuICAgIH0pO1xuICB9LFxuXG4gIGlzUGh4Q2hpbGQobm9kZSkge1xuICAgIHJldHVybiBub2RlLmdldEF0dHJpYnV0ZSAmJiBub2RlLmdldEF0dHJpYnV0ZShQSFhfUEFSRU5UX0lEKTtcbiAgfSxcblxuICBpc1BoeFN0aWNreShub2RlKSB7XG4gICAgcmV0dXJuIG5vZGUuZ2V0QXR0cmlidXRlICYmIG5vZGUuZ2V0QXR0cmlidXRlKFBIWF9TVElDS1kpICE9PSBudWxsO1xuICB9LFxuXG4gIGlzQ2hpbGRPZkFueShlbCwgcGFyZW50cykge1xuICAgIHJldHVybiAhIXBhcmVudHMuZmluZCgocGFyZW50KSA9PiBwYXJlbnQuY29udGFpbnMoZWwpKTtcbiAgfSxcblxuICBmaXJzdFBoeENoaWxkKGVsKSB7XG4gICAgcmV0dXJuIHRoaXMuaXNQaHhDaGlsZChlbCkgPyBlbCA6IHRoaXMuYWxsKGVsLCBgWyR7UEhYX1BBUkVOVF9JRH1dYClbMF07XG4gIH0sXG5cbiAgaXNQb3J0YWxUZW1wbGF0ZShlbCkge1xuICAgIHJldHVybiBlbC50YWdOYW1lID09PSBcIlRFTVBMQVRFXCIgJiYgZWwuaGFzQXR0cmlidXRlKFBIWF9QT1JUQUwpO1xuICB9LFxuXG4gIGNsb3Nlc3RWaWV3RWwoZWwpIHtcbiAgICAvLyBmaW5kIHRoZSBjbG9zZXN0IHBvcnRhbCBvciB2aWV3IGVsZW1lbnQsIHdoaWNoZXZlciBjb21lcyBmaXJzdFxuICAgIGNvbnN0IHBvcnRhbE9yVmlld0VsID0gZWwuY2xvc2VzdChcbiAgICAgIGBbJHtQSFhfVEVMRVBPUlRFRF9SRUZ9XSwke1BIWF9WSUVXX1NFTEVDVE9SfWAsXG4gICAgKTtcbiAgICBpZiAoIXBvcnRhbE9yVmlld0VsKSB7XG4gICAgICByZXR1cm4gbnVsbDtcbiAgICB9XG4gICAgaWYgKHBvcnRhbE9yVmlld0VsLmhhc0F0dHJpYnV0ZShQSFhfVEVMRVBPUlRFRF9SRUYpKSB7XG4gICAgICAvLyBQSFhfVEVMRVBPUlRFRF9SRUYgaXMgc2V0IHRvIHRoZSBpZCBvZiB0aGUgdmlldyB0aGF0IG93bnMgdGhlIHBvcnRhbCBlbGVtZW50XG4gICAgICByZXR1cm4gdGhpcy5ieUlkKHBvcnRhbE9yVmlld0VsLmdldEF0dHJpYnV0ZShQSFhfVEVMRVBPUlRFRF9SRUYpKTtcbiAgICB9IGVsc2UgaWYgKHBvcnRhbE9yVmlld0VsLmhhc0F0dHJpYnV0ZShQSFhfU0VTU0lPTikpIHtcbiAgICAgIHJldHVybiBwb3J0YWxPclZpZXdFbDtcbiAgICB9XG4gICAgcmV0dXJuIG51bGw7XG4gIH0sXG5cbiAgZGlzcGF0Y2hFdmVudCh0YXJnZXQsIG5hbWUsIG9wdHMgPSB7fSkge1xuICAgIGxldCBkZWZhdWx0QnViYmxlID0gdHJ1ZTtcbiAgICBjb25zdCBpc1VwbG9hZFRhcmdldCA9XG4gICAgICB0YXJnZXQubm9kZU5hbWUgPT09IFwiSU5QVVRcIiAmJiB0YXJnZXQudHlwZSA9PT0gXCJmaWxlXCI7XG4gICAgaWYgKGlzVXBsb2FkVGFyZ2V0ICYmIG5hbWUgPT09IFwiY2xpY2tcIikge1xuICAgICAgZGVmYXVsdEJ1YmJsZSA9IGZhbHNlO1xuICAgIH1cbiAgICBjb25zdCBidWJibGVzID0gb3B0cy5idWJibGVzID09PSB1bmRlZmluZWQgPyBkZWZhdWx0QnViYmxlIDogISFvcHRzLmJ1YmJsZXM7XG4gICAgY29uc3QgZXZlbnRPcHRzID0ge1xuICAgICAgYnViYmxlczogYnViYmxlcyxcbiAgICAgIGNhbmNlbGFibGU6IHRydWUsXG4gICAgICBkZXRhaWw6IG9wdHMuZGV0YWlsIHx8IHt9LFxuICAgIH07XG4gICAgY29uc3QgZXZlbnQgPVxuICAgICAgbmFtZSA9PT0gXCJjbGlja1wiXG4gICAgICAgID8gbmV3IE1vdXNlRXZlbnQoXCJjbGlja1wiLCBldmVudE9wdHMpXG4gICAgICAgIDogbmV3IEN1c3RvbUV2ZW50KG5hbWUsIGV2ZW50T3B0cyk7XG4gICAgdGFyZ2V0LmRpc3BhdGNoRXZlbnQoZXZlbnQpO1xuICB9LFxuXG4gIGNsb25lTm9kZShub2RlLCBodG1sKSB7XG4gICAgaWYgKHR5cGVvZiBodG1sID09PSBcInVuZGVmaW5lZFwiKSB7XG4gICAgICByZXR1cm4gbm9kZS5jbG9uZU5vZGUodHJ1ZSk7XG4gICAgfSBlbHNlIHtcbiAgICAgIGNvbnN0IGNsb25lZCA9IG5vZGUuY2xvbmVOb2RlKGZhbHNlKTtcbiAgICAgIGNsb25lZC5pbm5lckhUTUwgPSBodG1sO1xuICAgICAgcmV0dXJuIGNsb25lZDtcbiAgICB9XG4gIH0sXG5cbiAgLy8gbWVyZ2UgYXR0cmlidXRlcyBmcm9tIHNvdXJjZSB0byB0YXJnZXRcbiAgLy8gaWYgYW4gZWxlbWVudCBpcyBpZ25vcmVkLCB3ZSBvbmx5IG1lcmdlIGRhdGEgYXR0cmlidXRlc1xuICAvLyBpbmNsdWRpbmcgcmVtb3ZpbmcgZGF0YSBhdHRyaWJ1dGVzIHRoYXQgYXJlIG5vIGxvbmdlciBpbiB0aGUgc291cmNlXG4gIG1lcmdlQXR0cnModGFyZ2V0LCBzb3VyY2UsIG9wdHMgPSB7fSkge1xuICAgIGNvbnN0IGV4Y2x1ZGUgPSBuZXcgU2V0KG9wdHMuZXhjbHVkZSB8fCBbXSk7XG4gICAgY29uc3QgaXNJZ25vcmVkID0gb3B0cy5pc0lnbm9yZWQ7XG4gICAgY29uc3Qgc291cmNlQXR0cnMgPSBzb3VyY2UuYXR0cmlidXRlcztcbiAgICBmb3IgKGxldCBpID0gc291cmNlQXR0cnMubGVuZ3RoIC0gMTsgaSA+PSAwOyBpLS0pIHtcbiAgICAgIGNvbnN0IG5hbWUgPSBzb3VyY2VBdHRyc1tpXS5uYW1lO1xuICAgICAgaWYgKCFleGNsdWRlLmhhcyhuYW1lKSkge1xuICAgICAgICBjb25zdCBzb3VyY2VWYWx1ZSA9IHNvdXJjZS5nZXRBdHRyaWJ1dGUobmFtZSk7XG4gICAgICAgIGlmIChcbiAgICAgICAgICB0YXJnZXQuZ2V0QXR0cmlidXRlKG5hbWUpICE9PSBzb3VyY2VWYWx1ZSAmJlxuICAgICAgICAgICghaXNJZ25vcmVkIHx8IChpc0lnbm9yZWQgJiYgbmFtZS5zdGFydHNXaXRoKFwiZGF0YS1cIikpKVxuICAgICAgICApIHtcbiAgICAgICAgICB0YXJnZXQuc2V0QXR0cmlidXRlKG5hbWUsIHNvdXJjZVZhbHVlKTtcbiAgICAgICAgfVxuICAgICAgfSBlbHNlIHtcbiAgICAgICAgLy8gV2UgZXhjbHVkZSB0aGUgdmFsdWUgZnJvbSBiZWluZyBtZXJnZWQgb24gZm9jdXNlZCBpbnB1dHMsIGJlY2F1c2UgdGhlXG4gICAgICAgIC8vIHVzZXIncyBpbnB1dCBzaG91bGQgYWx3YXlzIHdpbi5cbiAgICAgICAgLy8gV2UgY2FuIHN0aWxsIGFzc2lnbiBpdCBhcyBsb25nIGFzIHRoZSB2YWx1ZSBwcm9wZXJ0eSBpcyB0aGUgc2FtZSwgdGhvdWdoLlxuICAgICAgICAvLyBUaGlzIHByZXZlbnRzIGEgc2l0dWF0aW9uIHdoZXJlIHRoZSB1cGRhdGVkIGhvb2sgaXMgbm90IGJlaW5nIHRyaWdnZXJlZFxuICAgICAgICAvLyB3aGVuIGFuIGlucHV0IGlzIGJhY2sgaW4gaXRzIFwib3JpZ2luYWwgc3RhdGVcIiwgYmVjYXVzZSB0aGUgYXR0cmlidXRlXG4gICAgICAgIC8vIHdhcyBuZXZlciBjaGFuZ2VkLCBzZWU6XG4gICAgICAgIC8vIGh0dHBzOi8vZ2l0aHViLmNvbS9waG9lbml4ZnJhbWV3b3JrL3Bob2VuaXhfbGl2ZV92aWV3L2lzc3Vlcy8yMTYzXG4gICAgICAgIGlmIChuYW1lID09PSBcInZhbHVlXCIpIHtcbiAgICAgICAgICBjb25zdCBzb3VyY2VWYWx1ZSA9IHNvdXJjZS52YWx1ZSA/PyBzb3VyY2UuZ2V0QXR0cmlidXRlKG5hbWUpO1xuICAgICAgICAgIGlmICh0YXJnZXQudmFsdWUgPT09IHNvdXJjZVZhbHVlKSB7XG4gICAgICAgICAgICAvLyBhY3R1YWxseSBzZXQgdGhlIHZhbHVlIGF0dHJpYnV0ZSB0byBzeW5jIGl0IHdpdGggdGhlIHZhbHVlIHByb3BlcnR5XG4gICAgICAgICAgICB0YXJnZXQuc2V0QXR0cmlidXRlKFwidmFsdWVcIiwgc291cmNlLmdldEF0dHJpYnV0ZShuYW1lKSk7XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICB9XG4gICAgfVxuXG4gICAgY29uc3QgdGFyZ2V0QXR0cnMgPSB0YXJnZXQuYXR0cmlidXRlcztcbiAgICBmb3IgKGxldCBpID0gdGFyZ2V0QXR0cnMubGVuZ3RoIC0gMTsgaSA+PSAwOyBpLS0pIHtcbiAgICAgIGNvbnN0IG5hbWUgPSB0YXJnZXRBdHRyc1tpXS5uYW1lO1xuICAgICAgaWYgKGlzSWdub3JlZCkge1xuICAgICAgICBpZiAoXG4gICAgICAgICAgbmFtZS5zdGFydHNXaXRoKFwiZGF0YS1cIikgJiZcbiAgICAgICAgICAhc291cmNlLmhhc0F0dHJpYnV0ZShuYW1lKSAmJlxuICAgICAgICAgICFQSFhfUEVORElOR19BVFRSUy5pbmNsdWRlcyhuYW1lKVxuICAgICAgICApIHtcbiAgICAgICAgICB0YXJnZXQucmVtb3ZlQXR0cmlidXRlKG5hbWUpO1xuICAgICAgICB9XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBpZiAoIXNvdXJjZS5oYXNBdHRyaWJ1dGUobmFtZSkpIHtcbiAgICAgICAgICB0YXJnZXQucmVtb3ZlQXR0cmlidXRlKG5hbWUpO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfVxuICB9LFxuXG4gIG1lcmdlRm9jdXNlZElucHV0KHRhcmdldCwgc291cmNlKSB7XG4gICAgLy8gc2tpcCBzZWxlY3RzIGJlY2F1c2UgRkYgd2lsbCByZXNldCBoaWdobGlnaHRlZCBpbmRleCBmb3IgYW55IHNldEF0dHJpYnV0ZVxuICAgIGlmICghKHRhcmdldCBpbnN0YW5jZW9mIEhUTUxTZWxlY3RFbGVtZW50KSkge1xuICAgICAgRE9NLm1lcmdlQXR0cnModGFyZ2V0LCBzb3VyY2UsIHsgZXhjbHVkZTogW1widmFsdWVcIl0gfSk7XG4gICAgfVxuXG4gICAgaWYgKHNvdXJjZS5yZWFkT25seSkge1xuICAgICAgdGFyZ2V0LnNldEF0dHJpYnV0ZShcInJlYWRvbmx5XCIsIHRydWUpO1xuICAgIH0gZWxzZSB7XG4gICAgICB0YXJnZXQucmVtb3ZlQXR0cmlidXRlKFwicmVhZG9ubHlcIik7XG4gICAgfVxuICB9LFxuXG4gIGhhc1NlbGVjdGlvblJhbmdlKGVsKSB7XG4gICAgcmV0dXJuIChcbiAgICAgIGVsLnNldFNlbGVjdGlvblJhbmdlICYmIChlbC50eXBlID09PSBcInRleHRcIiB8fCBlbC50eXBlID09PSBcInRleHRhcmVhXCIpXG4gICAgKTtcbiAgfSxcblxuICByZXN0b3JlRm9jdXMoZm9jdXNlZCwgc2VsZWN0aW9uU3RhcnQsIHNlbGVjdGlvbkVuZCkge1xuICAgIGlmIChmb2N1c2VkIGluc3RhbmNlb2YgSFRNTFNlbGVjdEVsZW1lbnQpIHtcbiAgICAgIGZvY3VzZWQuZm9jdXMoKTtcbiAgICB9XG4gICAgaWYgKCFET00uaXNUZXh0dWFsSW5wdXQoZm9jdXNlZCkpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICBjb25zdCB3YXNGb2N1c2VkID0gZm9jdXNlZC5tYXRjaGVzKFwiOmZvY3VzXCIpO1xuICAgIGlmICghd2FzRm9jdXNlZCkge1xuICAgICAgZm9jdXNlZC5mb2N1cygpO1xuICAgIH1cbiAgICBpZiAodGhpcy5oYXNTZWxlY3Rpb25SYW5nZShmb2N1c2VkKSkge1xuICAgICAgZm9jdXNlZC5zZXRTZWxlY3Rpb25SYW5nZShzZWxlY3Rpb25TdGFydCwgc2VsZWN0aW9uRW5kKTtcbiAgICB9XG4gIH0sXG5cbiAgaXNGb3JtSW5wdXQoZWwpIHtcbiAgICBpZiAoZWwubG9jYWxOYW1lICYmIGN1c3RvbUVsZW1lbnRzLmdldChlbC5sb2NhbE5hbWUpKSB7XG4gICAgICAvLyBDdXN0b20gRWxlbWVudHMgbWF5IGJlIGZvcm0gYXNzb2NpYXRlZC4gVGhpcyBhbGxvd3MgdGhlbVxuICAgICAgLy8gdG8gcGFydGljaXBhdGUgd2l0aGluIGEgZm9ybSdzIGxpZmVjeWNsZSwgaW5jbHVkaW5nIGZvcm1cbiAgICAgIC8vIHZhbGlkaXR5IGFuZCBmb3JtIHN1Ym1pc3Npb25zLlxuICAgICAgLy8gVGhlIHNwZWMgZm9yIEZvcm0gQXNzb2NpYXRlZCBjdXN0b20gZWxlbWVudHMgcmVxdWlyZXMgdGhlXG4gICAgICAvLyBjdXN0b20gZWxlbWVudCdzIGNsYXNzIHRvIGNvbnRhaW4gYSBzdGF0aWMgYm9vbGVhbiB2YWx1ZSBvZiBgZm9ybUFzc29jaWF0ZWRgXG4gICAgICAvLyB3aGljaCBpZGVudGlmaWVzIHRoaXMgY2xhc3MgYXMgYWxsb3dlZCB0byBhc3NvY2lhdGUgdG8gYSBmb3JtLlxuICAgICAgLy8gU2VlIGh0dHBzOi8vaHRtbC5zcGVjLndoYXR3Zy5vcmcvZGV2L2N1c3RvbS1lbGVtZW50cy5odG1sI2N1c3RvbS1lbGVtZW50cy1mYWNlLWV4YW1wbGVcbiAgICAgIC8vIGZvciBkZXRhaWxzLlxuICAgICAgcmV0dXJuIGN1c3RvbUVsZW1lbnRzLmdldChlbC5sb2NhbE5hbWUpW2Bmb3JtQXNzb2NpYXRlZGBdO1xuICAgIH1cblxuICAgIHJldHVybiAoXG4gICAgICAvXig/OmlucHV0fHNlbGVjdHx0ZXh0YXJlYSkkL2kudGVzdChlbC50YWdOYW1lKSAmJiBlbC50eXBlICE9PSBcImJ1dHRvblwiXG4gICAgKTtcbiAgfSxcblxuICBzeW5jQXR0cnNUb1Byb3BzKGVsKSB7XG4gICAgaWYgKFxuICAgICAgZWwgaW5zdGFuY2VvZiBIVE1MSW5wdXRFbGVtZW50ICYmXG4gICAgICBDSEVDS0FCTEVfSU5QVVRTLmluZGV4T2YoZWwudHlwZS50b0xvY2FsZUxvd2VyQ2FzZSgpKSA+PSAwXG4gICAgKSB7XG4gICAgICBlbC5jaGVja2VkID0gZWwuZ2V0QXR0cmlidXRlKFwiY2hlY2tlZFwiKSAhPT0gbnVsbDtcbiAgICB9XG4gIH0sXG5cbiAgaXNUZXh0dWFsSW5wdXQoZWwpIHtcbiAgICByZXR1cm4gRk9DVVNBQkxFX0lOUFVUUy5pbmRleE9mKGVsLnR5cGUpID49IDA7XG4gIH0sXG5cbiAgaXNOb3dUcmlnZ2VyRm9ybUV4dGVybmFsKGVsLCBwaHhUcmlnZ2VyRXh0ZXJuYWwpIHtcbiAgICByZXR1cm4gKFxuICAgICAgZWwuZ2V0QXR0cmlidXRlICYmXG4gICAgICBlbC5nZXRBdHRyaWJ1dGUocGh4VHJpZ2dlckV4dGVybmFsKSAhPT0gbnVsbCAmJlxuICAgICAgZG9jdW1lbnQuYm9keS5jb250YWlucyhlbClcbiAgICApO1xuICB9LFxuXG4gIGNsZWFuQ2hpbGROb2Rlcyhjb250YWluZXIsIHBoeFVwZGF0ZSkge1xuICAgIGlmIChcbiAgICAgIERPTS5pc1BoeFVwZGF0ZShjb250YWluZXIsIHBoeFVwZGF0ZSwgW1wiYXBwZW5kXCIsIFwicHJlcGVuZFwiLCBQSFhfU1RSRUFNXSlcbiAgICApIHtcbiAgICAgIGNvbnN0IHRvUmVtb3ZlID0gW107XG4gICAgICBjb250YWluZXIuY2hpbGROb2Rlcy5mb3JFYWNoKChjaGlsZE5vZGUpID0+IHtcbiAgICAgICAgaWYgKCFjaGlsZE5vZGUuaWQpIHtcbiAgICAgICAgICAvLyBTa2lwIHdhcm5pbmcgaWYgaXQncyBhbiBlbXB0eSB0ZXh0IG5vZGUgKGUuZy4gYSBuZXctbGluZSlcbiAgICAgICAgICBjb25zdCBpc0VtcHR5VGV4dE5vZGUgPVxuICAgICAgICAgICAgY2hpbGROb2RlLm5vZGVUeXBlID09PSBOb2RlLlRFWFRfTk9ERSAmJlxuICAgICAgICAgICAgY2hpbGROb2RlLm5vZGVWYWx1ZS50cmltKCkgPT09IFwiXCI7XG4gICAgICAgICAgaWYgKCFpc0VtcHR5VGV4dE5vZGUgJiYgY2hpbGROb2RlLm5vZGVUeXBlICE9PSBOb2RlLkNPTU1FTlRfTk9ERSkge1xuICAgICAgICAgICAgbG9nRXJyb3IoXG4gICAgICAgICAgICAgIFwib25seSBIVE1MIGVsZW1lbnQgdGFncyB3aXRoIGFuIGlkIGFyZSBhbGxvd2VkIGluc2lkZSBjb250YWluZXJzIHdpdGggcGh4LXVwZGF0ZS5cXG5cXG5cIiArXG4gICAgICAgICAgICAgICAgYHJlbW92aW5nIGlsbGVnYWwgbm9kZTogXCIkeyhjaGlsZE5vZGUub3V0ZXJIVE1MIHx8IGNoaWxkTm9kZS5ub2RlVmFsdWUpLnRyaW0oKX1cIlxcblxcbmAsXG4gICAgICAgICAgICApO1xuICAgICAgICAgIH1cbiAgICAgICAgICB0b1JlbW92ZS5wdXNoKGNoaWxkTm9kZSk7XG4gICAgICAgIH1cbiAgICAgIH0pO1xuICAgICAgdG9SZW1vdmUuZm9yRWFjaCgoY2hpbGROb2RlKSA9PiBjaGlsZE5vZGUucmVtb3ZlKCkpO1xuICAgIH1cbiAgfSxcblxuICByZXBsYWNlUm9vdENvbnRhaW5lcihjb250YWluZXIsIHRhZ05hbWUsIGF0dHJzKSB7XG4gICAgY29uc3QgcmV0YWluZWRBdHRycyA9IG5ldyBTZXQoW1xuICAgICAgXCJpZFwiLFxuICAgICAgUEhYX1NFU1NJT04sXG4gICAgICBQSFhfU1RBVElDLFxuICAgICAgUEhYX01BSU4sXG4gICAgICBQSFhfUk9PVF9JRCxcbiAgICBdKTtcbiAgICBpZiAoY29udGFpbmVyLnRhZ05hbWUudG9Mb3dlckNhc2UoKSA9PT0gdGFnTmFtZS50b0xvd2VyQ2FzZSgpKSB7XG4gICAgICBBcnJheS5mcm9tKGNvbnRhaW5lci5hdHRyaWJ1dGVzKVxuICAgICAgICAuZmlsdGVyKChhdHRyKSA9PiAhcmV0YWluZWRBdHRycy5oYXMoYXR0ci5uYW1lLnRvTG93ZXJDYXNlKCkpKVxuICAgICAgICAuZm9yRWFjaCgoYXR0cikgPT4gY29udGFpbmVyLnJlbW92ZUF0dHJpYnV0ZShhdHRyLm5hbWUpKTtcblxuICAgICAgT2JqZWN0LmtleXMoYXR0cnMpXG4gICAgICAgIC5maWx0ZXIoKG5hbWUpID0+ICFyZXRhaW5lZEF0dHJzLmhhcyhuYW1lLnRvTG93ZXJDYXNlKCkpKVxuICAgICAgICAuZm9yRWFjaCgoYXR0cikgPT4gY29udGFpbmVyLnNldEF0dHJpYnV0ZShhdHRyLCBhdHRyc1thdHRyXSkpO1xuXG4gICAgICByZXR1cm4gY29udGFpbmVyO1xuICAgIH0gZWxzZSB7XG4gICAgICBjb25zdCBuZXdDb250YWluZXIgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KHRhZ05hbWUpO1xuICAgICAgT2JqZWN0LmtleXMoYXR0cnMpLmZvckVhY2goKGF0dHIpID0+XG4gICAgICAgIG5ld0NvbnRhaW5lci5zZXRBdHRyaWJ1dGUoYXR0ciwgYXR0cnNbYXR0cl0pLFxuICAgICAgKTtcbiAgICAgIHJldGFpbmVkQXR0cnMuZm9yRWFjaCgoYXR0cikgPT5cbiAgICAgICAgbmV3Q29udGFpbmVyLnNldEF0dHJpYnV0ZShhdHRyLCBjb250YWluZXIuZ2V0QXR0cmlidXRlKGF0dHIpKSxcbiAgICAgICk7XG4gICAgICBuZXdDb250YWluZXIuaW5uZXJIVE1MID0gY29udGFpbmVyLmlubmVySFRNTDtcbiAgICAgIGNvbnRhaW5lci5yZXBsYWNlV2l0aChuZXdDb250YWluZXIpO1xuICAgICAgcmV0dXJuIG5ld0NvbnRhaW5lcjtcbiAgICB9XG4gIH0sXG5cbiAgZ2V0U3RpY2t5KGVsLCBuYW1lLCBkZWZhdWx0VmFsKSB7XG4gICAgY29uc3Qgb3AgPSAoRE9NLnByaXZhdGUoZWwsIFwic3RpY2t5XCIpIHx8IFtdKS5maW5kKFxuICAgICAgKFtleGlzdGluZ05hbWVdKSA9PiBuYW1lID09PSBleGlzdGluZ05hbWUsXG4gICAgKTtcbiAgICBpZiAob3ApIHtcbiAgICAgIGNvbnN0IFtfbmFtZSwgX29wLCBzdGFzaGVkUmVzdWx0XSA9IG9wO1xuICAgICAgcmV0dXJuIHN0YXNoZWRSZXN1bHQ7XG4gICAgfSBlbHNlIHtcbiAgICAgIHJldHVybiB0eXBlb2YgZGVmYXVsdFZhbCA9PT0gXCJmdW5jdGlvblwiID8gZGVmYXVsdFZhbCgpIDogZGVmYXVsdFZhbDtcbiAgICB9XG4gIH0sXG5cbiAgZGVsZXRlU3RpY2t5KGVsLCBuYW1lKSB7XG4gICAgdGhpcy51cGRhdGVQcml2YXRlKGVsLCBcInN0aWNreVwiLCBbXSwgKG9wcykgPT4ge1xuICAgICAgcmV0dXJuIG9wcy5maWx0ZXIoKFtleGlzdGluZ05hbWUsIF9dKSA9PiBleGlzdGluZ05hbWUgIT09IG5hbWUpO1xuICAgIH0pO1xuICB9LFxuXG4gIHB1dFN0aWNreShlbCwgbmFtZSwgb3ApIHtcbiAgICBjb25zdCBzdGFzaGVkUmVzdWx0ID0gb3AoZWwpO1xuICAgIHRoaXMudXBkYXRlUHJpdmF0ZShlbCwgXCJzdGlja3lcIiwgW10sIChvcHMpID0+IHtcbiAgICAgIGNvbnN0IGV4aXN0aW5nSW5kZXggPSBvcHMuZmluZEluZGV4KFxuICAgICAgICAoW2V4aXN0aW5nTmFtZV0pID0+IG5hbWUgPT09IGV4aXN0aW5nTmFtZSxcbiAgICAgICk7XG4gICAgICBpZiAoZXhpc3RpbmdJbmRleCA+PSAwKSB7XG4gICAgICAgIG9wc1tleGlzdGluZ0luZGV4XSA9IFtuYW1lLCBvcCwgc3Rhc2hlZFJlc3VsdF07XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBvcHMucHVzaChbbmFtZSwgb3AsIHN0YXNoZWRSZXN1bHRdKTtcbiAgICAgIH1cbiAgICAgIHJldHVybiBvcHM7XG4gICAgfSk7XG4gIH0sXG5cbiAgYXBwbHlTdGlja3lPcGVyYXRpb25zKGVsKSB7XG4gICAgY29uc3Qgb3BzID0gRE9NLnByaXZhdGUoZWwsIFwic3RpY2t5XCIpO1xuICAgIGlmICghb3BzKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgb3BzLmZvckVhY2goKFtuYW1lLCBvcCwgX3N0YXNoZWRdKSA9PiB0aGlzLnB1dFN0aWNreShlbCwgbmFtZSwgb3ApKTtcbiAgfSxcblxuICBpc0xvY2tlZChlbCkge1xuICAgIHJldHVybiBlbC5oYXNBdHRyaWJ1dGUgJiYgZWwuaGFzQXR0cmlidXRlKFBIWF9SRUZfTE9DSyk7XG4gIH0sXG59O1xuXG5leHBvcnQgZGVmYXVsdCBET007XG4iLCAiaW1wb3J0IHtcbiAgUEhYX0FDVElWRV9FTlRSWV9SRUZTLFxuICBQSFhfTElWRV9GSUxFX1VQREFURUQsXG4gIFBIWF9QUkVGTElHSFRFRF9SRUZTLFxufSBmcm9tIFwiLi9jb25zdGFudHNcIjtcblxuaW1wb3J0IHsgY2hhbm5lbFVwbG9hZGVyLCBsb2dFcnJvciB9IGZyb20gXCIuL3V0aWxzXCI7XG5cbmltcG9ydCBMaXZlVXBsb2FkZXIgZnJvbSBcIi4vbGl2ZV91cGxvYWRlclwiO1xuXG5leHBvcnQgZGVmYXVsdCBjbGFzcyBVcGxvYWRFbnRyeSB7XG4gIHN0YXRpYyBpc0FjdGl2ZShmaWxlRWwsIGZpbGUpIHtcbiAgICBjb25zdCBpc05ldyA9IGZpbGUuX3BoeFJlZiA9PT0gdW5kZWZpbmVkO1xuICAgIGNvbnN0IGFjdGl2ZVJlZnMgPSBmaWxlRWwuZ2V0QXR0cmlidXRlKFBIWF9BQ1RJVkVfRU5UUllfUkVGUykuc3BsaXQoXCIsXCIpO1xuICAgIGNvbnN0IGlzQWN0aXZlID0gYWN0aXZlUmVmcy5pbmRleE9mKExpdmVVcGxvYWRlci5nZW5GaWxlUmVmKGZpbGUpKSA+PSAwO1xuICAgIHJldHVybiBmaWxlLnNpemUgPiAwICYmIChpc05ldyB8fCBpc0FjdGl2ZSk7XG4gIH1cblxuICBzdGF0aWMgaXNQcmVmbGlnaHRlZChmaWxlRWwsIGZpbGUpIHtcbiAgICBjb25zdCBwcmVmbGlnaHRlZFJlZnMgPSBmaWxlRWxcbiAgICAgIC5nZXRBdHRyaWJ1dGUoUEhYX1BSRUZMSUdIVEVEX1JFRlMpXG4gICAgICAuc3BsaXQoXCIsXCIpO1xuICAgIGNvbnN0IGlzUHJlZmxpZ2h0ZWQgPVxuICAgICAgcHJlZmxpZ2h0ZWRSZWZzLmluZGV4T2YoTGl2ZVVwbG9hZGVyLmdlbkZpbGVSZWYoZmlsZSkpID49IDA7XG4gICAgcmV0dXJuIGlzUHJlZmxpZ2h0ZWQgJiYgdGhpcy5pc0FjdGl2ZShmaWxlRWwsIGZpbGUpO1xuICB9XG5cbiAgc3RhdGljIGlzUHJlZmxpZ2h0SW5Qcm9ncmVzcyhmaWxlKSB7XG4gICAgcmV0dXJuIGZpbGUuX3ByZWZsaWdodEluUHJvZ3Jlc3MgPT09IHRydWU7XG4gIH1cblxuICBzdGF0aWMgbWFya1ByZWZsaWdodEluUHJvZ3Jlc3MoZmlsZSkge1xuICAgIGZpbGUuX3ByZWZsaWdodEluUHJvZ3Jlc3MgPSB0cnVlO1xuICB9XG5cbiAgY29uc3RydWN0b3IoZmlsZUVsLCBmaWxlLCB2aWV3LCBhdXRvVXBsb2FkKSB7XG4gICAgdGhpcy5yZWYgPSBMaXZlVXBsb2FkZXIuZ2VuRmlsZVJlZihmaWxlKTtcbiAgICB0aGlzLmZpbGVFbCA9IGZpbGVFbDtcbiAgICB0aGlzLmZpbGUgPSBmaWxlO1xuICAgIHRoaXMudmlldyA9IHZpZXc7XG4gICAgdGhpcy5tZXRhID0gbnVsbDtcbiAgICB0aGlzLl9pc0NhbmNlbGxlZCA9IGZhbHNlO1xuICAgIHRoaXMuX2lzRG9uZSA9IGZhbHNlO1xuICAgIHRoaXMuX3Byb2dyZXNzID0gMDtcbiAgICB0aGlzLl9sYXN0UHJvZ3Jlc3NTZW50ID0gLTE7XG4gICAgdGhpcy5fb25Eb25lID0gZnVuY3Rpb24gKCkge307XG4gICAgdGhpcy5fb25FbFVwZGF0ZWQgPSB0aGlzLm9uRWxVcGRhdGVkLmJpbmQodGhpcyk7XG4gICAgdGhpcy5maWxlRWwuYWRkRXZlbnRMaXN0ZW5lcihQSFhfTElWRV9GSUxFX1VQREFURUQsIHRoaXMuX29uRWxVcGRhdGVkKTtcbiAgICB0aGlzLmF1dG9VcGxvYWQgPSBhdXRvVXBsb2FkO1xuICB9XG5cbiAgbWV0YWRhdGEoKSB7XG4gICAgcmV0dXJuIHRoaXMubWV0YTtcbiAgfVxuXG4gIHByb2dyZXNzKHByb2dyZXNzKSB7XG4gICAgdGhpcy5fcHJvZ3Jlc3MgPSBNYXRoLmZsb29yKHByb2dyZXNzKTtcbiAgICBpZiAodGhpcy5fcHJvZ3Jlc3MgPiB0aGlzLl9sYXN0UHJvZ3Jlc3NTZW50KSB7XG4gICAgICBpZiAodGhpcy5fcHJvZ3Jlc3MgPj0gMTAwKSB7XG4gICAgICAgIHRoaXMuX3Byb2dyZXNzID0gMTAwO1xuICAgICAgICB0aGlzLl9sYXN0UHJvZ3Jlc3NTZW50ID0gMTAwO1xuICAgICAgICB0aGlzLl9pc0RvbmUgPSB0cnVlO1xuICAgICAgICB0aGlzLnZpZXcucHVzaEZpbGVQcm9ncmVzcyh0aGlzLmZpbGVFbCwgdGhpcy5yZWYsIDEwMCwgKCkgPT4ge1xuICAgICAgICAgIExpdmVVcGxvYWRlci51bnRyYWNrRmlsZSh0aGlzLmZpbGVFbCwgdGhpcy5maWxlKTtcbiAgICAgICAgICB0aGlzLl9vbkRvbmUoKTtcbiAgICAgICAgfSk7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICB0aGlzLl9sYXN0UHJvZ3Jlc3NTZW50ID0gdGhpcy5fcHJvZ3Jlc3M7XG4gICAgICAgIHRoaXMudmlldy5wdXNoRmlsZVByb2dyZXNzKHRoaXMuZmlsZUVsLCB0aGlzLnJlZiwgdGhpcy5fcHJvZ3Jlc3MpO1xuICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIGlzQ2FuY2VsbGVkKCkge1xuICAgIHJldHVybiB0aGlzLl9pc0NhbmNlbGxlZDtcbiAgfVxuXG4gIGNhbmNlbCgpIHtcbiAgICB0aGlzLmZpbGUuX3ByZWZsaWdodEluUHJvZ3Jlc3MgPSBmYWxzZTtcbiAgICB0aGlzLl9pc0NhbmNlbGxlZCA9IHRydWU7XG4gICAgdGhpcy5faXNEb25lID0gdHJ1ZTtcbiAgICB0aGlzLl9vbkRvbmUoKTtcbiAgfVxuXG4gIGlzRG9uZSgpIHtcbiAgICByZXR1cm4gdGhpcy5faXNEb25lO1xuICB9XG5cbiAgZXJyb3IocmVhc29uID0gXCJmYWlsZWRcIikge1xuICAgIHRoaXMuZmlsZUVsLnJlbW92ZUV2ZW50TGlzdGVuZXIoUEhYX0xJVkVfRklMRV9VUERBVEVELCB0aGlzLl9vbkVsVXBkYXRlZCk7XG4gICAgdGhpcy52aWV3LnB1c2hGaWxlUHJvZ3Jlc3ModGhpcy5maWxlRWwsIHRoaXMucmVmLCB7IGVycm9yOiByZWFzb24gfSk7XG4gICAgaWYgKCF0aGlzLmlzQXV0b1VwbG9hZCgpKSB7XG4gICAgICBMaXZlVXBsb2FkZXIuY2xlYXJGaWxlcyh0aGlzLmZpbGVFbCk7XG4gICAgfVxuICB9XG5cbiAgaXNBdXRvVXBsb2FkKCkge1xuICAgIHJldHVybiB0aGlzLmF1dG9VcGxvYWQ7XG4gIH1cblxuICAvL3ByaXZhdGVcblxuICBvbkRvbmUoY2FsbGJhY2spIHtcbiAgICB0aGlzLl9vbkRvbmUgPSAoKSA9PiB7XG4gICAgICB0aGlzLmZpbGVFbC5yZW1vdmVFdmVudExpc3RlbmVyKFBIWF9MSVZFX0ZJTEVfVVBEQVRFRCwgdGhpcy5fb25FbFVwZGF0ZWQpO1xuICAgICAgY2FsbGJhY2soKTtcbiAgICB9O1xuICB9XG5cbiAgb25FbFVwZGF0ZWQoKSB7XG4gICAgY29uc3QgYWN0aXZlUmVmcyA9IHRoaXMuZmlsZUVsXG4gICAgICAuZ2V0QXR0cmlidXRlKFBIWF9BQ1RJVkVfRU5UUllfUkVGUylcbiAgICAgIC5zcGxpdChcIixcIik7XG4gICAgaWYgKGFjdGl2ZVJlZnMuaW5kZXhPZih0aGlzLnJlZikgPT09IC0xKSB7XG4gICAgICBMaXZlVXBsb2FkZXIudW50cmFja0ZpbGUodGhpcy5maWxlRWwsIHRoaXMuZmlsZSk7XG4gICAgICB0aGlzLmNhbmNlbCgpO1xuICAgIH1cbiAgfVxuXG4gIHRvUHJlZmxpZ2h0UGF5bG9hZCgpIHtcbiAgICByZXR1cm4ge1xuICAgICAgbGFzdF9tb2RpZmllZDogdGhpcy5maWxlLmxhc3RNb2RpZmllZCxcbiAgICAgIG5hbWU6IHRoaXMuZmlsZS5uYW1lLFxuICAgICAgcmVsYXRpdmVfcGF0aDogdGhpcy5maWxlLndlYmtpdFJlbGF0aXZlUGF0aCxcbiAgICAgIHNpemU6IHRoaXMuZmlsZS5zaXplLFxuICAgICAgdHlwZTogdGhpcy5maWxlLnR5cGUsXG4gICAgICByZWY6IHRoaXMucmVmLFxuICAgICAgbWV0YTogdHlwZW9mIHRoaXMuZmlsZS5tZXRhID09PSBcImZ1bmN0aW9uXCIgPyB0aGlzLmZpbGUubWV0YSgpIDogdW5kZWZpbmVkLFxuICAgIH07XG4gIH1cblxuICB1cGxvYWRlcih1cGxvYWRlcnMpIHtcbiAgICBpZiAodGhpcy5tZXRhLnVwbG9hZGVyKSB7XG4gICAgICBjb25zdCBjYWxsYmFjayA9XG4gICAgICAgIHVwbG9hZGVyc1t0aGlzLm1ldGEudXBsb2FkZXJdIHx8XG4gICAgICAgIGxvZ0Vycm9yKGBubyB1cGxvYWRlciBjb25maWd1cmVkIGZvciAke3RoaXMubWV0YS51cGxvYWRlcn1gKTtcbiAgICAgIHJldHVybiB7IG5hbWU6IHRoaXMubWV0YS51cGxvYWRlciwgY2FsbGJhY2s6IGNhbGxiYWNrIH07XG4gICAgfSBlbHNlIHtcbiAgICAgIHJldHVybiB7IG5hbWU6IFwiY2hhbm5lbFwiLCBjYWxsYmFjazogY2hhbm5lbFVwbG9hZGVyIH07XG4gICAgfVxuICB9XG5cbiAgemlwUG9zdEZsaWdodChyZXNwKSB7XG4gICAgdGhpcy5tZXRhID0gcmVzcC5lbnRyaWVzW3RoaXMucmVmXTtcbiAgICBpZiAoIXRoaXMubWV0YSkge1xuICAgICAgbG9nRXJyb3IoYG5vIHByZWZsaWdodCB1cGxvYWQgcmVzcG9uc2UgcmV0dXJuZWQgd2l0aCByZWYgJHt0aGlzLnJlZn1gLCB7XG4gICAgICAgIGlucHV0OiB0aGlzLmZpbGVFbCxcbiAgICAgICAgcmVzcG9uc2U6IHJlc3AsXG4gICAgICB9KTtcbiAgICB9XG4gIH1cbn1cbiIsICJpbXBvcnQge1xuICBQSFhfRE9ORV9SRUZTLFxuICBQSFhfUFJFRkxJR0hURURfUkVGUyxcbiAgUEhYX1VQTE9BRF9SRUYsXG59IGZyb20gXCIuL2NvbnN0YW50c1wiO1xuXG5pbXBvcnQge30gZnJvbSBcIi4vdXRpbHNcIjtcblxuaW1wb3J0IERPTSBmcm9tIFwiLi9kb21cIjtcbmltcG9ydCBVcGxvYWRFbnRyeSBmcm9tIFwiLi91cGxvYWRfZW50cnlcIjtcblxubGV0IGxpdmVVcGxvYWRlckZpbGVSZWYgPSAwO1xuXG5leHBvcnQgZGVmYXVsdCBjbGFzcyBMaXZlVXBsb2FkZXIge1xuICBzdGF0aWMgZ2VuRmlsZVJlZihmaWxlKSB7XG4gICAgY29uc3QgcmVmID0gZmlsZS5fcGh4UmVmO1xuICAgIGlmIChyZWYgIT09IHVuZGVmaW5lZCkge1xuICAgICAgcmV0dXJuIHJlZjtcbiAgICB9IGVsc2Uge1xuICAgICAgZmlsZS5fcGh4UmVmID0gKGxpdmVVcGxvYWRlckZpbGVSZWYrKykudG9TdHJpbmcoKTtcbiAgICAgIHJldHVybiBmaWxlLl9waHhSZWY7XG4gICAgfVxuICB9XG5cbiAgc3RhdGljIGdldEVudHJ5RGF0YVVSTChpbnB1dEVsLCByZWYsIGNhbGxiYWNrKSB7XG4gICAgY29uc3QgZmlsZSA9IHRoaXMuYWN0aXZlRmlsZXMoaW5wdXRFbCkuZmluZChcbiAgICAgIChmaWxlKSA9PiB0aGlzLmdlbkZpbGVSZWYoZmlsZSkgPT09IHJlZixcbiAgICApO1xuICAgIGNhbGxiYWNrKFVSTC5jcmVhdGVPYmplY3RVUkwoZmlsZSkpO1xuICB9XG5cbiAgc3RhdGljIGhhc1VwbG9hZHNJblByb2dyZXNzKGZvcm1FbCkge1xuICAgIGxldCBhY3RpdmUgPSAwO1xuICAgIERPTS5maW5kVXBsb2FkSW5wdXRzKGZvcm1FbCkuZm9yRWFjaCgoaW5wdXQpID0+IHtcbiAgICAgIGlmIChcbiAgICAgICAgaW5wdXQuZ2V0QXR0cmlidXRlKFBIWF9QUkVGTElHSFRFRF9SRUZTKSAhPT1cbiAgICAgICAgaW5wdXQuZ2V0QXR0cmlidXRlKFBIWF9ET05FX1JFRlMpXG4gICAgICApIHtcbiAgICAgICAgYWN0aXZlKys7XG4gICAgICB9XG4gICAgfSk7XG4gICAgcmV0dXJuIGFjdGl2ZSA+IDA7XG4gIH1cblxuICBzdGF0aWMgc2VyaWFsaXplVXBsb2FkcyhpbnB1dEVsKSB7XG4gICAgY29uc3QgZmlsZXMgPSB0aGlzLmFjdGl2ZUZpbGVzKGlucHV0RWwpO1xuICAgIGNvbnN0IGZpbGVEYXRhID0ge307XG4gICAgZmlsZXMuZm9yRWFjaCgoZmlsZSkgPT4ge1xuICAgICAgY29uc3QgZW50cnkgPSB7IHBhdGg6IGlucHV0RWwubmFtZSB9O1xuICAgICAgY29uc3QgdXBsb2FkUmVmID0gaW5wdXRFbC5nZXRBdHRyaWJ1dGUoUEhYX1VQTE9BRF9SRUYpO1xuICAgICAgZmlsZURhdGFbdXBsb2FkUmVmXSA9IGZpbGVEYXRhW3VwbG9hZFJlZl0gfHwgW107XG4gICAgICBlbnRyeS5yZWYgPSB0aGlzLmdlbkZpbGVSZWYoZmlsZSk7XG4gICAgICBlbnRyeS5sYXN0X21vZGlmaWVkID0gZmlsZS5sYXN0TW9kaWZpZWQ7XG4gICAgICBlbnRyeS5uYW1lID0gZmlsZS5uYW1lIHx8IGVudHJ5LnJlZjtcbiAgICAgIGVudHJ5LnJlbGF0aXZlX3BhdGggPSBmaWxlLndlYmtpdFJlbGF0aXZlUGF0aDtcbiAgICAgIGVudHJ5LnR5cGUgPSBmaWxlLnR5cGU7XG4gICAgICBlbnRyeS5zaXplID0gZmlsZS5zaXplO1xuICAgICAgaWYgKHR5cGVvZiBmaWxlLm1ldGEgPT09IFwiZnVuY3Rpb25cIikge1xuICAgICAgICBlbnRyeS5tZXRhID0gZmlsZS5tZXRhKCk7XG4gICAgICB9XG4gICAgICBmaWxlRGF0YVt1cGxvYWRSZWZdLnB1c2goZW50cnkpO1xuICAgIH0pO1xuICAgIHJldHVybiBmaWxlRGF0YTtcbiAgfVxuXG4gIHN0YXRpYyBjbGVhckZpbGVzKGlucHV0RWwpIHtcbiAgICBpbnB1dEVsLnZhbHVlID0gbnVsbDtcbiAgICBpbnB1dEVsLnJlbW92ZUF0dHJpYnV0ZShQSFhfVVBMT0FEX1JFRik7XG4gICAgRE9NLnB1dFByaXZhdGUoaW5wdXRFbCwgXCJmaWxlc1wiLCBbXSk7XG4gIH1cblxuICBzdGF0aWMgdW50cmFja0ZpbGUoaW5wdXRFbCwgZmlsZSkge1xuICAgIERPTS5wdXRQcml2YXRlKFxuICAgICAgaW5wdXRFbCxcbiAgICAgIFwiZmlsZXNcIixcbiAgICAgIERPTS5wcml2YXRlKGlucHV0RWwsIFwiZmlsZXNcIikuZmlsdGVyKChmKSA9PiAhT2JqZWN0LmlzKGYsIGZpbGUpKSxcbiAgICApO1xuICB9XG5cbiAgLyoqXG4gICAqIEBwYXJhbSB7SFRNTElucHV0RWxlbWVudH0gaW5wdXRFbFxuICAgKiBAcGFyYW0ge0FycmF5PEZpbGV8QmxvYj59IGZpbGVzXG4gICAqIEBwYXJhbSB7RGF0YVRyYW5zZmVyfSBbZGF0YVRyYW5zZmVyXVxuICAgKi9cbiAgc3RhdGljIHRyYWNrRmlsZXMoaW5wdXRFbCwgZmlsZXMsIGRhdGFUcmFuc2Zlcikge1xuICAgIGlmIChpbnB1dEVsLmdldEF0dHJpYnV0ZShcIm11bHRpcGxlXCIpICE9PSBudWxsKSB7XG4gICAgICBjb25zdCBuZXdGaWxlcyA9IGZpbGVzLmZpbHRlcihcbiAgICAgICAgKGZpbGUpID0+ICF0aGlzLmFjdGl2ZUZpbGVzKGlucHV0RWwpLmZpbmQoKGYpID0+IE9iamVjdC5pcyhmLCBmaWxlKSksXG4gICAgICApO1xuICAgICAgRE9NLnVwZGF0ZVByaXZhdGUoaW5wdXRFbCwgXCJmaWxlc1wiLCBbXSwgKGV4aXN0aW5nKSA9PlxuICAgICAgICBleGlzdGluZy5jb25jYXQobmV3RmlsZXMpLFxuICAgICAgKTtcbiAgICAgIGlucHV0RWwudmFsdWUgPSBudWxsO1xuICAgIH0gZWxzZSB7XG4gICAgICAvLyBSZXNldCBpbnB1dEVsIGZpbGVzIHRvIGFsaWduIG91dHB1dCB3aXRoIHByb2dyYW1tYXRpYyBjaGFuZ2VzIChpLmUuIGRyYWcgYW5kIGRyb3ApXG4gICAgICBpZiAoZGF0YVRyYW5zZmVyICYmIGRhdGFUcmFuc2Zlci5maWxlcy5sZW5ndGggPiAwKSB7XG4gICAgICAgIGlucHV0RWwuZmlsZXMgPSBkYXRhVHJhbnNmZXIuZmlsZXM7XG4gICAgICB9XG4gICAgICBET00ucHV0UHJpdmF0ZShpbnB1dEVsLCBcImZpbGVzXCIsIGZpbGVzKTtcbiAgICB9XG4gIH1cblxuICBzdGF0aWMgYWN0aXZlRmlsZUlucHV0cyhmb3JtRWwpIHtcbiAgICBjb25zdCBmaWxlSW5wdXRzID0gRE9NLmZpbmRVcGxvYWRJbnB1dHMoZm9ybUVsKTtcbiAgICByZXR1cm4gQXJyYXkuZnJvbShmaWxlSW5wdXRzKS5maWx0ZXIoXG4gICAgICAoZWwpID0+IGVsLmZpbGVzICYmIHRoaXMuYWN0aXZlRmlsZXMoZWwpLmxlbmd0aCA+IDAsXG4gICAgKTtcbiAgfVxuXG4gIHN0YXRpYyBhY3RpdmVGaWxlcyhpbnB1dCkge1xuICAgIHJldHVybiAoRE9NLnByaXZhdGUoaW5wdXQsIFwiZmlsZXNcIikgfHwgW10pLmZpbHRlcigoZikgPT5cbiAgICAgIFVwbG9hZEVudHJ5LmlzQWN0aXZlKGlucHV0LCBmKSxcbiAgICApO1xuICB9XG5cbiAgc3RhdGljIGlucHV0c0F3YWl0aW5nUHJlZmxpZ2h0KGZvcm1FbCkge1xuICAgIGNvbnN0IGZpbGVJbnB1dHMgPSBET00uZmluZFVwbG9hZElucHV0cyhmb3JtRWwpO1xuICAgIHJldHVybiBBcnJheS5mcm9tKGZpbGVJbnB1dHMpLmZpbHRlcihcbiAgICAgIChpbnB1dCkgPT4gdGhpcy5maWxlc0F3YWl0aW5nUHJlZmxpZ2h0KGlucHV0KS5sZW5ndGggPiAwLFxuICAgICk7XG4gIH1cblxuICBzdGF0aWMgZmlsZXNBd2FpdGluZ1ByZWZsaWdodChpbnB1dCkge1xuICAgIHJldHVybiB0aGlzLmFjdGl2ZUZpbGVzKGlucHV0KS5maWx0ZXIoXG4gICAgICAoZikgPT5cbiAgICAgICAgIVVwbG9hZEVudHJ5LmlzUHJlZmxpZ2h0ZWQoaW5wdXQsIGYpICYmXG4gICAgICAgICFVcGxvYWRFbnRyeS5pc1ByZWZsaWdodEluUHJvZ3Jlc3MoZiksXG4gICAgKTtcbiAgfVxuXG4gIHN0YXRpYyBtYXJrUHJlZmxpZ2h0SW5Qcm9ncmVzcyhlbnRyaWVzKSB7XG4gICAgZW50cmllcy5mb3JFYWNoKChlbnRyeSkgPT4gVXBsb2FkRW50cnkubWFya1ByZWZsaWdodEluUHJvZ3Jlc3MoZW50cnkuZmlsZSkpO1xuICB9XG5cbiAgY29uc3RydWN0b3IoaW5wdXRFbCwgdmlldywgb25Db21wbGV0ZSkge1xuICAgIHRoaXMuYXV0b1VwbG9hZCA9IERPTS5pc0F1dG9VcGxvYWQoaW5wdXRFbCk7XG4gICAgdGhpcy52aWV3ID0gdmlldztcbiAgICB0aGlzLm9uQ29tcGxldGUgPSBvbkNvbXBsZXRlO1xuICAgIHRoaXMuX2VudHJpZXMgPSBBcnJheS5mcm9tKFxuICAgICAgTGl2ZVVwbG9hZGVyLmZpbGVzQXdhaXRpbmdQcmVmbGlnaHQoaW5wdXRFbCkgfHwgW10sXG4gICAgKS5tYXAoKGZpbGUpID0+IG5ldyBVcGxvYWRFbnRyeShpbnB1dEVsLCBmaWxlLCB2aWV3LCB0aGlzLmF1dG9VcGxvYWQpKTtcblxuICAgIC8vIHByZXZlbnQgc2VuZGluZyBkdXBsaWNhdGUgcHJlZmxpZ2h0IHJlcXVlc3RzXG4gICAgTGl2ZVVwbG9hZGVyLm1hcmtQcmVmbGlnaHRJblByb2dyZXNzKHRoaXMuX2VudHJpZXMpO1xuXG4gICAgdGhpcy5udW1FbnRyaWVzSW5Qcm9ncmVzcyA9IHRoaXMuX2VudHJpZXMubGVuZ3RoO1xuICB9XG5cbiAgaXNBdXRvVXBsb2FkKCkge1xuICAgIHJldHVybiB0aGlzLmF1dG9VcGxvYWQ7XG4gIH1cblxuICBlbnRyaWVzKCkge1xuICAgIHJldHVybiB0aGlzLl9lbnRyaWVzO1xuICB9XG5cbiAgaW5pdEFkYXB0ZXJVcGxvYWQocmVzcCwgb25FcnJvciwgbGl2ZVNvY2tldCkge1xuICAgIHRoaXMuX2VudHJpZXMgPSB0aGlzLl9lbnRyaWVzLm1hcCgoZW50cnkpID0+IHtcbiAgICAgIGlmIChlbnRyeS5pc0NhbmNlbGxlZCgpKSB7XG4gICAgICAgIHRoaXMubnVtRW50cmllc0luUHJvZ3Jlc3MtLTtcbiAgICAgICAgaWYgKHRoaXMubnVtRW50cmllc0luUHJvZ3Jlc3MgPT09IDApIHtcbiAgICAgICAgICB0aGlzLm9uQ29tcGxldGUoKTtcbiAgICAgICAgfVxuICAgICAgfSBlbHNlIHtcbiAgICAgICAgZW50cnkuemlwUG9zdEZsaWdodChyZXNwKTtcbiAgICAgICAgZW50cnkub25Eb25lKCgpID0+IHtcbiAgICAgICAgICB0aGlzLm51bUVudHJpZXNJblByb2dyZXNzLS07XG4gICAgICAgICAgaWYgKHRoaXMubnVtRW50cmllc0luUHJvZ3Jlc3MgPT09IDApIHtcbiAgICAgICAgICAgIHRoaXMub25Db21wbGV0ZSgpO1xuICAgICAgICAgIH1cbiAgICAgICAgfSk7XG4gICAgICB9XG4gICAgICByZXR1cm4gZW50cnk7XG4gICAgfSk7XG5cbiAgICBjb25zdCBncm91cGVkRW50cmllcyA9IHRoaXMuX2VudHJpZXMucmVkdWNlKChhY2MsIGVudHJ5KSA9PiB7XG4gICAgICBpZiAoIWVudHJ5Lm1ldGEpIHtcbiAgICAgICAgcmV0dXJuIGFjYztcbiAgICAgIH1cbiAgICAgIGNvbnN0IHsgbmFtZSwgY2FsbGJhY2sgfSA9IGVudHJ5LnVwbG9hZGVyKGxpdmVTb2NrZXQudXBsb2FkZXJzKTtcbiAgICAgIGFjY1tuYW1lXSA9IGFjY1tuYW1lXSB8fCB7IGNhbGxiYWNrOiBjYWxsYmFjaywgZW50cmllczogW10gfTtcbiAgICAgIGFjY1tuYW1lXS5lbnRyaWVzLnB1c2goZW50cnkpO1xuICAgICAgcmV0dXJuIGFjYztcbiAgICB9LCB7fSk7XG5cbiAgICBmb3IgKGNvbnN0IG5hbWUgaW4gZ3JvdXBlZEVudHJpZXMpIHtcbiAgICAgIGNvbnN0IHsgY2FsbGJhY2ssIGVudHJpZXMgfSA9IGdyb3VwZWRFbnRyaWVzW25hbWVdO1xuICAgICAgY2FsbGJhY2soZW50cmllcywgb25FcnJvciwgcmVzcCwgbGl2ZVNvY2tldCk7XG4gICAgfVxuICB9XG59XG4iLCAiY29uc3QgQVJJQSA9IHtcbiAgYW55T2YoaW5zdGFuY2UsIGNsYXNzZXMpIHtcbiAgICByZXR1cm4gY2xhc3Nlcy5maW5kKChuYW1lKSA9PiBpbnN0YW5jZSBpbnN0YW5jZW9mIG5hbWUpO1xuICB9LFxuXG4gIGlzRm9jdXNhYmxlKGVsLCBpbnRlcmFjdGl2ZU9ubHkpIHtcbiAgICByZXR1cm4gKFxuICAgICAgKGVsIGluc3RhbmNlb2YgSFRNTEFuY2hvckVsZW1lbnQgJiYgZWwucmVsICE9PSBcImlnbm9yZVwiKSB8fFxuICAgICAgKGVsIGluc3RhbmNlb2YgSFRNTEFyZWFFbGVtZW50ICYmIGVsLmhyZWYgIT09IHVuZGVmaW5lZCkgfHxcbiAgICAgICghZWwuZGlzYWJsZWQgJiZcbiAgICAgICAgdGhpcy5hbnlPZihlbCwgW1xuICAgICAgICAgIEhUTUxJbnB1dEVsZW1lbnQsXG4gICAgICAgICAgSFRNTFNlbGVjdEVsZW1lbnQsXG4gICAgICAgICAgSFRNTFRleHRBcmVhRWxlbWVudCxcbiAgICAgICAgICBIVE1MQnV0dG9uRWxlbWVudCxcbiAgICAgICAgXSkpIHx8XG4gICAgICBlbCBpbnN0YW5jZW9mIEhUTUxJRnJhbWVFbGVtZW50IHx8XG4gICAgICAoZWwudGFiSW5kZXggPj0gMCAmJiBlbC5nZXRBdHRyaWJ1dGUoXCJhcmlhLWhpZGRlblwiKSAhPT0gXCJ0cnVlXCIpIHx8XG4gICAgICAoIWludGVyYWN0aXZlT25seSAmJlxuICAgICAgICBlbC5nZXRBdHRyaWJ1dGUoXCJ0YWJpbmRleFwiKSAhPT0gbnVsbCAmJlxuICAgICAgICBlbC5nZXRBdHRyaWJ1dGUoXCJhcmlhLWhpZGRlblwiKSAhPT0gXCJ0cnVlXCIpXG4gICAgKTtcbiAgfSxcblxuICBhdHRlbXB0Rm9jdXMoZWwsIGludGVyYWN0aXZlT25seSkge1xuICAgIGlmICh0aGlzLmlzRm9jdXNhYmxlKGVsLCBpbnRlcmFjdGl2ZU9ubHkpKSB7XG4gICAgICB0cnkge1xuICAgICAgICBlbC5mb2N1cygpO1xuICAgICAgfSBjYXRjaCB7XG4gICAgICAgIC8vIHRoYXQncyBmaW5lXG4gICAgICB9XG4gICAgfVxuICAgIHJldHVybiAhIWRvY3VtZW50LmFjdGl2ZUVsZW1lbnQgJiYgZG9jdW1lbnQuYWN0aXZlRWxlbWVudC5pc1NhbWVOb2RlKGVsKTtcbiAgfSxcblxuICBmb2N1c0ZpcnN0SW50ZXJhY3RpdmUoZWwpIHtcbiAgICBsZXQgY2hpbGQgPSBlbC5maXJzdEVsZW1lbnRDaGlsZDtcbiAgICB3aGlsZSAoY2hpbGQpIHtcbiAgICAgIGlmICh0aGlzLmF0dGVtcHRGb2N1cyhjaGlsZCwgdHJ1ZSkgfHwgdGhpcy5mb2N1c0ZpcnN0SW50ZXJhY3RpdmUoY2hpbGQpKSB7XG4gICAgICAgIHJldHVybiB0cnVlO1xuICAgICAgfVxuICAgICAgY2hpbGQgPSBjaGlsZC5uZXh0RWxlbWVudFNpYmxpbmc7XG4gICAgfVxuICB9LFxuXG4gIGZvY3VzRmlyc3QoZWwpIHtcbiAgICBsZXQgY2hpbGQgPSBlbC5maXJzdEVsZW1lbnRDaGlsZDtcbiAgICB3aGlsZSAoY2hpbGQpIHtcbiAgICAgIGlmICh0aGlzLmF0dGVtcHRGb2N1cyhjaGlsZCkgfHwgdGhpcy5mb2N1c0ZpcnN0KGNoaWxkKSkge1xuICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICAgIH1cbiAgICAgIGNoaWxkID0gY2hpbGQubmV4dEVsZW1lbnRTaWJsaW5nO1xuICAgIH1cbiAgfSxcblxuICBmb2N1c0xhc3QoZWwpIHtcbiAgICBsZXQgY2hpbGQgPSBlbC5sYXN0RWxlbWVudENoaWxkO1xuICAgIHdoaWxlIChjaGlsZCkge1xuICAgICAgaWYgKHRoaXMuYXR0ZW1wdEZvY3VzKGNoaWxkKSB8fCB0aGlzLmZvY3VzTGFzdChjaGlsZCkpIHtcbiAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgICB9XG4gICAgICBjaGlsZCA9IGNoaWxkLnByZXZpb3VzRWxlbWVudFNpYmxpbmc7XG4gICAgfVxuICB9LFxufTtcbmV4cG9ydCBkZWZhdWx0IEFSSUE7XG4iLCAiaW1wb3J0IHtcbiAgUEhYX0FDVElWRV9FTlRSWV9SRUZTLFxuICBQSFhfTElWRV9GSUxFX1VQREFURUQsXG4gIFBIWF9QUkVGTElHSFRFRF9SRUZTLFxuICBQSFhfVVBMT0FEX1JFRixcbn0gZnJvbSBcIi4vY29uc3RhbnRzXCI7XG5cbmltcG9ydCBMaXZlVXBsb2FkZXIgZnJvbSBcIi4vbGl2ZV91cGxvYWRlclwiO1xuaW1wb3J0IEFSSUEgZnJvbSBcIi4vYXJpYVwiO1xuXG5jb25zdCBIb29rcyA9IHtcbiAgTGl2ZUZpbGVVcGxvYWQ6IHtcbiAgICBhY3RpdmVSZWZzKCkge1xuICAgICAgcmV0dXJuIHRoaXMuZWwuZ2V0QXR0cmlidXRlKFBIWF9BQ1RJVkVfRU5UUllfUkVGUyk7XG4gICAgfSxcblxuICAgIHByZWZsaWdodGVkUmVmcygpIHtcbiAgICAgIHJldHVybiB0aGlzLmVsLmdldEF0dHJpYnV0ZShQSFhfUFJFRkxJR0hURURfUkVGUyk7XG4gICAgfSxcblxuICAgIG1vdW50ZWQoKSB7XG4gICAgICB0aGlzLnByZWZsaWdodGVkV2FzID0gdGhpcy5wcmVmbGlnaHRlZFJlZnMoKTtcbiAgICB9LFxuXG4gICAgdXBkYXRlZCgpIHtcbiAgICAgIGNvbnN0IG5ld1ByZWZsaWdodHMgPSB0aGlzLnByZWZsaWdodGVkUmVmcygpO1xuICAgICAgaWYgKHRoaXMucHJlZmxpZ2h0ZWRXYXMgIT09IG5ld1ByZWZsaWdodHMpIHtcbiAgICAgICAgdGhpcy5wcmVmbGlnaHRlZFdhcyA9IG5ld1ByZWZsaWdodHM7XG4gICAgICAgIGlmIChuZXdQcmVmbGlnaHRzID09PSBcIlwiKSB7XG4gICAgICAgICAgdGhpcy5fX3ZpZXcoKS5jYW5jZWxTdWJtaXQodGhpcy5lbC5mb3JtKTtcbiAgICAgICAgfVxuICAgICAgfVxuXG4gICAgICBpZiAodGhpcy5hY3RpdmVSZWZzKCkgPT09IFwiXCIpIHtcbiAgICAgICAgdGhpcy5lbC52YWx1ZSA9IG51bGw7XG4gICAgICB9XG4gICAgICB0aGlzLmVsLmRpc3BhdGNoRXZlbnQobmV3IEN1c3RvbUV2ZW50KFBIWF9MSVZFX0ZJTEVfVVBEQVRFRCkpO1xuICAgIH0sXG4gIH0sXG5cbiAgTGl2ZUltZ1ByZXZpZXc6IHtcbiAgICBtb3VudGVkKCkge1xuICAgICAgdGhpcy5yZWYgPSB0aGlzLmVsLmdldEF0dHJpYnV0ZShcImRhdGEtcGh4LWVudHJ5LXJlZlwiKTtcbiAgICAgIHRoaXMuaW5wdXRFbCA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKFxuICAgICAgICB0aGlzLmVsLmdldEF0dHJpYnV0ZShQSFhfVVBMT0FEX1JFRiksXG4gICAgICApO1xuICAgICAgTGl2ZVVwbG9hZGVyLmdldEVudHJ5RGF0YVVSTCh0aGlzLmlucHV0RWwsIHRoaXMucmVmLCAodXJsKSA9PiB7XG4gICAgICAgIHRoaXMudXJsID0gdXJsO1xuICAgICAgICB0aGlzLmVsLnNyYyA9IHVybDtcbiAgICAgIH0pO1xuICAgIH0sXG4gICAgZGVzdHJveWVkKCkge1xuICAgICAgVVJMLnJldm9rZU9iamVjdFVSTCh0aGlzLnVybCk7XG4gICAgfSxcbiAgfSxcbiAgRm9jdXNXcmFwOiB7XG4gICAgbW91bnRlZCgpIHtcbiAgICAgIHRoaXMuZm9jdXNTdGFydCA9IHRoaXMuZWwuZmlyc3RFbGVtZW50Q2hpbGQ7XG4gICAgICB0aGlzLmZvY3VzRW5kID0gdGhpcy5lbC5sYXN0RWxlbWVudENoaWxkO1xuICAgICAgdGhpcy5mb2N1c1N0YXJ0LmFkZEV2ZW50TGlzdGVuZXIoXCJmb2N1c1wiLCAoZSkgPT4ge1xuICAgICAgICBpZiAoIWUucmVsYXRlZFRhcmdldCB8fCAhdGhpcy5lbC5jb250YWlucyhlLnJlbGF0ZWRUYXJnZXQpKSB7XG4gICAgICAgICAgLy8gSGFuZGxlIGZvY3VzIGVudGVyaW5nIGZyb20gb3V0c2lkZSAoZS5nLiBUYWIgd2hlbiBib2R5IGlzIGZvY3VzZWQpXG4gICAgICAgICAgLy8gaHR0cHM6Ly9naXRodWIuY29tL3Bob2VuaXhmcmFtZXdvcmsvcGhvZW5peF9saXZlX3ZpZXcvaXNzdWVzLzM2MzZcbiAgICAgICAgICBjb25zdCBuZXh0Rm9jdXMgPSBlLnRhcmdldC5uZXh0RWxlbWVudFNpYmxpbmc7XG4gICAgICAgICAgQVJJQS5hdHRlbXB0Rm9jdXMobmV4dEZvY3VzKSB8fCBBUklBLmZvY3VzRmlyc3QobmV4dEZvY3VzKTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICBBUklBLmZvY3VzTGFzdCh0aGlzLmVsKTtcbiAgICAgICAgfVxuICAgICAgfSk7XG4gICAgICB0aGlzLmZvY3VzRW5kLmFkZEV2ZW50TGlzdGVuZXIoXCJmb2N1c1wiLCAoZSkgPT4ge1xuICAgICAgICBpZiAoIWUucmVsYXRlZFRhcmdldCB8fCAhdGhpcy5lbC5jb250YWlucyhlLnJlbGF0ZWRUYXJnZXQpKSB7XG4gICAgICAgICAgLy8gSGFuZGxlIGZvY3VzIGVudGVyaW5nIGZyb20gb3V0c2lkZSAoZS5nLiBTaGlmdCtUYWIgd2hlbiBib2R5IGlzIGZvY3VzZWQpXG4gICAgICAgICAgLy8gaHR0cHM6Ly9naXRodWIuY29tL3Bob2VuaXhmcmFtZXdvcmsvcGhvZW5peF9saXZlX3ZpZXcvaXNzdWVzLzM2MzZcbiAgICAgICAgICBjb25zdCBuZXh0Rm9jdXMgPSBlLnRhcmdldC5wcmV2aW91c0VsZW1lbnRTaWJsaW5nO1xuICAgICAgICAgIEFSSUEuYXR0ZW1wdEZvY3VzKG5leHRGb2N1cykgfHwgQVJJQS5mb2N1c0xhc3QobmV4dEZvY3VzKTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICBBUklBLmZvY3VzRmlyc3QodGhpcy5lbCk7XG4gICAgICAgIH1cbiAgICAgIH0pO1xuICAgICAgLy8gb25seSB0cnkgdG8gY2hhbmdlIHRoZSBmb2N1cyBpZiBpdCBpcyBub3QgYWxyZWFkeSBpbnNpZGVcbiAgICAgIGlmICghdGhpcy5lbC5jb250YWlucyhkb2N1bWVudC5hY3RpdmVFbGVtZW50KSkge1xuICAgICAgICB0aGlzLmVsLmFkZEV2ZW50TGlzdGVuZXIoXCJwaHg6c2hvdy1lbmRcIiwgKCkgPT4gdGhpcy5lbC5mb2N1cygpKTtcbiAgICAgICAgaWYgKHdpbmRvdy5nZXRDb21wdXRlZFN0eWxlKHRoaXMuZWwpLmRpc3BsYXkgIT09IFwibm9uZVwiKSB7XG4gICAgICAgICAgQVJJQS5mb2N1c0ZpcnN0KHRoaXMuZWwpO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfSxcbiAgfSxcbn07XG5cbmNvbnN0IGZpbmRTY3JvbGxDb250YWluZXIgPSAoZWwpID0+IHtcbiAgLy8gdGhlIHNjcm9sbCBldmVudCB3b24ndCBiZSBmaXJlZCBvbiB0aGUgaHRtbC9ib2R5IGVsZW1lbnQgZXZlbiBpZiBvdmVyZmxvdyBpcyBzZXRcbiAgLy8gdGhlcmVmb3JlIHdlIHJldHVybiBudWxsIHRvIGluc3RlYWQgbGlzdGVuIGZvciBzY3JvbGwgZXZlbnRzIG9uIGRvY3VtZW50XG4gIGlmIChbXCJIVE1MXCIsIFwiQk9EWVwiXS5pbmRleE9mKGVsLm5vZGVOYW1lLnRvVXBwZXJDYXNlKCkpID49IDApIHJldHVybiBudWxsO1xuICBpZiAoW1wic2Nyb2xsXCIsIFwiYXV0b1wiXS5pbmRleE9mKGdldENvbXB1dGVkU3R5bGUoZWwpLm92ZXJmbG93WSkgPj0gMClcbiAgICByZXR1cm4gZWw7XG4gIHJldHVybiBmaW5kU2Nyb2xsQ29udGFpbmVyKGVsLnBhcmVudEVsZW1lbnQpO1xufTtcblxuY29uc3Qgc2Nyb2xsVG9wID0gKHNjcm9sbENvbnRhaW5lcikgPT4ge1xuICBpZiAoc2Nyb2xsQ29udGFpbmVyKSB7XG4gICAgcmV0dXJuIHNjcm9sbENvbnRhaW5lci5zY3JvbGxUb3A7XG4gIH0gZWxzZSB7XG4gICAgcmV0dXJuIGRvY3VtZW50LmRvY3VtZW50RWxlbWVudC5zY3JvbGxUb3AgfHwgZG9jdW1lbnQuYm9keS5zY3JvbGxUb3A7XG4gIH1cbn07XG5cbmNvbnN0IGJvdHRvbSA9IChzY3JvbGxDb250YWluZXIpID0+IHtcbiAgaWYgKHNjcm9sbENvbnRhaW5lcikge1xuICAgIHJldHVybiBzY3JvbGxDb250YWluZXIuZ2V0Qm91bmRpbmdDbGllbnRSZWN0KCkuYm90dG9tO1xuICB9IGVsc2Uge1xuICAgIC8vIHdoZW4gd2UgaGF2ZSBubyBjb250YWluZXIsIHRoZSB3aG9sZSBwYWdlIHNjcm9sbHMsXG4gICAgLy8gdGhlcmVmb3JlIHRoZSBib3R0b20gY29vcmRpbmF0ZSBpcyB0aGUgdmlld3BvcnQgaGVpZ2h0XG4gICAgcmV0dXJuIHdpbmRvdy5pbm5lckhlaWdodCB8fCBkb2N1bWVudC5kb2N1bWVudEVsZW1lbnQuY2xpZW50SGVpZ2h0O1xuICB9XG59O1xuXG5jb25zdCB0b3AgPSAoc2Nyb2xsQ29udGFpbmVyKSA9PiB7XG4gIGlmIChzY3JvbGxDb250YWluZXIpIHtcbiAgICByZXR1cm4gc2Nyb2xsQ29udGFpbmVyLmdldEJvdW5kaW5nQ2xpZW50UmVjdCgpLnRvcDtcbiAgfSBlbHNlIHtcbiAgICAvLyB3aGVuIHdlIGhhdmUgbm8gY29udGFpbmVyIHRoZSB3aG9sZSBwYWdlIHNjcm9sbHMsXG4gICAgLy8gdGhlcmVmb3JlIHRoZSB0b3AgY29vcmRpbmF0ZSBpcyAwXG4gICAgcmV0dXJuIDA7XG4gIH1cbn07XG5cbmNvbnN0IGlzQXRWaWV3cG9ydFRvcCA9IChlbCwgc2Nyb2xsQ29udGFpbmVyKSA9PiB7XG4gIGNvbnN0IHJlY3QgPSBlbC5nZXRCb3VuZGluZ0NsaWVudFJlY3QoKTtcbiAgcmV0dXJuIChcbiAgICBNYXRoLmNlaWwocmVjdC50b3ApID49IHRvcChzY3JvbGxDb250YWluZXIpICYmXG4gICAgTWF0aC5jZWlsKHJlY3QubGVmdCkgPj0gMCAmJlxuICAgIE1hdGguZmxvb3IocmVjdC50b3ApIDw9IGJvdHRvbShzY3JvbGxDb250YWluZXIpXG4gICk7XG59O1xuXG5jb25zdCBpc0F0Vmlld3BvcnRCb3R0b20gPSAoZWwsIHNjcm9sbENvbnRhaW5lcikgPT4ge1xuICBjb25zdCByZWN0ID0gZWwuZ2V0Qm91bmRpbmdDbGllbnRSZWN0KCk7XG4gIHJldHVybiAoXG4gICAgTWF0aC5jZWlsKHJlY3QuYm90dG9tKSA+PSB0b3Aoc2Nyb2xsQ29udGFpbmVyKSAmJlxuICAgIE1hdGguY2VpbChyZWN0LmxlZnQpID49IDAgJiZcbiAgICBNYXRoLmZsb29yKHJlY3QuYm90dG9tKSA8PSBib3R0b20oc2Nyb2xsQ29udGFpbmVyKVxuICApO1xufTtcblxuY29uc3QgaXNXaXRoaW5WaWV3cG9ydCA9IChlbCwgc2Nyb2xsQ29udGFpbmVyKSA9PiB7XG4gIGNvbnN0IHJlY3QgPSBlbC5nZXRCb3VuZGluZ0NsaWVudFJlY3QoKTtcbiAgcmV0dXJuIChcbiAgICBNYXRoLmNlaWwocmVjdC50b3ApID49IHRvcChzY3JvbGxDb250YWluZXIpICYmXG4gICAgTWF0aC5jZWlsKHJlY3QubGVmdCkgPj0gMCAmJlxuICAgIE1hdGguZmxvb3IocmVjdC50b3ApIDw9IGJvdHRvbShzY3JvbGxDb250YWluZXIpXG4gICk7XG59O1xuXG5Ib29rcy5JbmZpbml0ZVNjcm9sbCA9IHtcbiAgbW91bnRlZCgpIHtcbiAgICB0aGlzLnNjcm9sbENvbnRhaW5lciA9IGZpbmRTY3JvbGxDb250YWluZXIodGhpcy5lbCk7XG4gICAgbGV0IHNjcm9sbEJlZm9yZSA9IHNjcm9sbFRvcCh0aGlzLnNjcm9sbENvbnRhaW5lcik7XG4gICAgbGV0IHRvcE92ZXJyYW4gPSBmYWxzZTtcbiAgICBjb25zdCB0aHJvdHRsZUludGVydmFsID0gNTAwO1xuICAgIGxldCBwZW5kaW5nT3AgPSBudWxsO1xuXG4gICAgY29uc3Qgb25Ub3BPdmVycnVuID0gdGhpcy50aHJvdHRsZShcbiAgICAgIHRocm90dGxlSW50ZXJ2YWwsXG4gICAgICAodG9wRXZlbnQsIGZpcnN0Q2hpbGQpID0+IHtcbiAgICAgICAgcGVuZGluZ09wID0gKCkgPT4gdHJ1ZTtcbiAgICAgICAgdGhpcy5saXZlU29ja2V0LmpzKCkucHVzaCh0aGlzLmVsLCB0b3BFdmVudCwge1xuICAgICAgICAgIHZhbHVlOiB7IGlkOiBmaXJzdENoaWxkLmlkLCBfb3ZlcnJhbjogdHJ1ZSB9LFxuICAgICAgICAgIGNhbGxiYWNrOiAoKSA9PiB7XG4gICAgICAgICAgICBwZW5kaW5nT3AgPSBudWxsO1xuICAgICAgICAgIH0sXG4gICAgICAgIH0pO1xuICAgICAgfSxcbiAgICApO1xuXG4gICAgY29uc3Qgb25GaXJzdENoaWxkQXRUb3AgPSB0aGlzLnRocm90dGxlKFxuICAgICAgdGhyb3R0bGVJbnRlcnZhbCxcbiAgICAgICh0b3BFdmVudCwgZmlyc3RDaGlsZCkgPT4ge1xuICAgICAgICBwZW5kaW5nT3AgPSAoKSA9PiBmaXJzdENoaWxkLnNjcm9sbEludG9WaWV3KHsgYmxvY2s6IFwic3RhcnRcIiB9KTtcbiAgICAgICAgdGhpcy5saXZlU29ja2V0LmpzKCkucHVzaCh0aGlzLmVsLCB0b3BFdmVudCwge1xuICAgICAgICAgIHZhbHVlOiB7IGlkOiBmaXJzdENoaWxkLmlkIH0sXG4gICAgICAgICAgY2FsbGJhY2s6ICgpID0+IHtcbiAgICAgICAgICAgIHBlbmRpbmdPcCA9IG51bGw7XG4gICAgICAgICAgICAvLyBtYWtlIHN1cmUgdGhhdCB0aGUgRE9NIGlzIHBhdGNoZWQgYnkgd2FpdGluZyBmb3IgdGhlIG5leHQgdGlja1xuICAgICAgICAgICAgd2luZG93LnJlcXVlc3RBbmltYXRpb25GcmFtZSgoKSA9PiB7XG4gICAgICAgICAgICAgIGlmICghaXNXaXRoaW5WaWV3cG9ydChmaXJzdENoaWxkLCB0aGlzLnNjcm9sbENvbnRhaW5lcikpIHtcbiAgICAgICAgICAgICAgICBmaXJzdENoaWxkLnNjcm9sbEludG9WaWV3KHsgYmxvY2s6IFwic3RhcnRcIiB9KTtcbiAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfSk7XG4gICAgICAgICAgfSxcbiAgICAgICAgfSk7XG4gICAgICB9LFxuICAgICk7XG5cbiAgICBjb25zdCBvbkxhc3RDaGlsZEF0Qm90dG9tID0gdGhpcy50aHJvdHRsZShcbiAgICAgIHRocm90dGxlSW50ZXJ2YWwsXG4gICAgICAoYm90dG9tRXZlbnQsIGxhc3RDaGlsZCkgPT4ge1xuICAgICAgICBwZW5kaW5nT3AgPSAoKSA9PiBsYXN0Q2hpbGQuc2Nyb2xsSW50b1ZpZXcoeyBibG9jazogXCJlbmRcIiB9KTtcbiAgICAgICAgdGhpcy5saXZlU29ja2V0LmpzKCkucHVzaCh0aGlzLmVsLCBib3R0b21FdmVudCwge1xuICAgICAgICAgIHZhbHVlOiB7IGlkOiBsYXN0Q2hpbGQuaWQgfSxcbiAgICAgICAgICBjYWxsYmFjazogKCkgPT4ge1xuICAgICAgICAgICAgcGVuZGluZ09wID0gbnVsbDtcbiAgICAgICAgICAgIC8vIG1ha2Ugc3VyZSB0aGF0IHRoZSBET00gaXMgcGF0Y2hlZCBieSB3YWl0aW5nIGZvciB0aGUgbmV4dCB0aWNrXG4gICAgICAgICAgICB3aW5kb3cucmVxdWVzdEFuaW1hdGlvbkZyYW1lKCgpID0+IHtcbiAgICAgICAgICAgICAgaWYgKCFpc1dpdGhpblZpZXdwb3J0KGxhc3RDaGlsZCwgdGhpcy5zY3JvbGxDb250YWluZXIpKSB7XG4gICAgICAgICAgICAgICAgbGFzdENoaWxkLnNjcm9sbEludG9WaWV3KHsgYmxvY2s6IFwiZW5kXCIgfSk7XG4gICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH0pO1xuICAgICAgICAgIH0sXG4gICAgICAgIH0pO1xuICAgICAgfSxcbiAgICApO1xuXG4gICAgdGhpcy5vblNjcm9sbCA9IChfZSkgPT4ge1xuICAgICAgY29uc3Qgc2Nyb2xsTm93ID0gc2Nyb2xsVG9wKHRoaXMuc2Nyb2xsQ29udGFpbmVyKTtcblxuICAgICAgaWYgKHBlbmRpbmdPcCkge1xuICAgICAgICBzY3JvbGxCZWZvcmUgPSBzY3JvbGxOb3c7XG4gICAgICAgIHJldHVybiBwZW5kaW5nT3AoKTtcbiAgICAgIH1cbiAgICAgIGNvbnN0IHJlY3QgPSB0aGlzLmVsLmdldEJvdW5kaW5nQ2xpZW50UmVjdCgpO1xuICAgICAgY29uc3QgdG9wRXZlbnQgPSB0aGlzLmVsLmdldEF0dHJpYnV0ZShcbiAgICAgICAgdGhpcy5saXZlU29ja2V0LmJpbmRpbmcoXCJ2aWV3cG9ydC10b3BcIiksXG4gICAgICApO1xuICAgICAgY29uc3QgYm90dG9tRXZlbnQgPSB0aGlzLmVsLmdldEF0dHJpYnV0ZShcbiAgICAgICAgdGhpcy5saXZlU29ja2V0LmJpbmRpbmcoXCJ2aWV3cG9ydC1ib3R0b21cIiksXG4gICAgICApO1xuICAgICAgY29uc3QgbGFzdENoaWxkID0gdGhpcy5lbC5sYXN0RWxlbWVudENoaWxkO1xuICAgICAgY29uc3QgZmlyc3RDaGlsZCA9IHRoaXMuZWwuZmlyc3RFbGVtZW50Q2hpbGQ7XG4gICAgICBjb25zdCBpc1Njcm9sbGluZ1VwID0gc2Nyb2xsTm93IDwgc2Nyb2xsQmVmb3JlO1xuICAgICAgY29uc3QgaXNTY3JvbGxpbmdEb3duID0gc2Nyb2xsTm93ID4gc2Nyb2xsQmVmb3JlO1xuXG4gICAgICAvLyBlbCBvdmVycmFuIHdoaWxlIHNjcm9sbGluZyB1cFxuICAgICAgaWYgKGlzU2Nyb2xsaW5nVXAgJiYgdG9wRXZlbnQgJiYgIXRvcE92ZXJyYW4gJiYgcmVjdC50b3AgPj0gMCkge1xuICAgICAgICB0b3BPdmVycmFuID0gdHJ1ZTtcbiAgICAgICAgb25Ub3BPdmVycnVuKHRvcEV2ZW50LCBmaXJzdENoaWxkKTtcbiAgICAgIH0gZWxzZSBpZiAoaXNTY3JvbGxpbmdEb3duICYmIHRvcE92ZXJyYW4gJiYgcmVjdC50b3AgPD0gMCkge1xuICAgICAgICB0b3BPdmVycmFuID0gZmFsc2U7XG4gICAgICB9XG5cbiAgICAgIGlmIChcbiAgICAgICAgdG9wRXZlbnQgJiZcbiAgICAgICAgaXNTY3JvbGxpbmdVcCAmJlxuICAgICAgICBpc0F0Vmlld3BvcnRUb3AoZmlyc3RDaGlsZCwgdGhpcy5zY3JvbGxDb250YWluZXIpXG4gICAgICApIHtcbiAgICAgICAgb25GaXJzdENoaWxkQXRUb3AodG9wRXZlbnQsIGZpcnN0Q2hpbGQpO1xuICAgICAgfSBlbHNlIGlmIChcbiAgICAgICAgYm90dG9tRXZlbnQgJiZcbiAgICAgICAgaXNTY3JvbGxpbmdEb3duICYmXG4gICAgICAgIGlzQXRWaWV3cG9ydEJvdHRvbShsYXN0Q2hpbGQsIHRoaXMuc2Nyb2xsQ29udGFpbmVyKVxuICAgICAgKSB7XG4gICAgICAgIG9uTGFzdENoaWxkQXRCb3R0b20oYm90dG9tRXZlbnQsIGxhc3RDaGlsZCk7XG4gICAgICB9XG4gICAgICBzY3JvbGxCZWZvcmUgPSBzY3JvbGxOb3c7XG4gICAgfTtcblxuICAgIGlmICh0aGlzLnNjcm9sbENvbnRhaW5lcikge1xuICAgICAgdGhpcy5zY3JvbGxDb250YWluZXIuYWRkRXZlbnRMaXN0ZW5lcihcInNjcm9sbFwiLCB0aGlzLm9uU2Nyb2xsKTtcbiAgICB9IGVsc2Uge1xuICAgICAgd2luZG93LmFkZEV2ZW50TGlzdGVuZXIoXCJzY3JvbGxcIiwgdGhpcy5vblNjcm9sbCk7XG4gICAgfVxuICB9LFxuXG4gIGRlc3Ryb3llZCgpIHtcbiAgICBpZiAodGhpcy5zY3JvbGxDb250YWluZXIpIHtcbiAgICAgIHRoaXMuc2Nyb2xsQ29udGFpbmVyLnJlbW92ZUV2ZW50TGlzdGVuZXIoXCJzY3JvbGxcIiwgdGhpcy5vblNjcm9sbCk7XG4gICAgfSBlbHNlIHtcbiAgICAgIHdpbmRvdy5yZW1vdmVFdmVudExpc3RlbmVyKFwic2Nyb2xsXCIsIHRoaXMub25TY3JvbGwpO1xuICAgIH1cbiAgfSxcblxuICB0aHJvdHRsZShpbnRlcnZhbCwgY2FsbGJhY2spIHtcbiAgICBsZXQgbGFzdENhbGxBdCA9IDA7XG4gICAgbGV0IHRpbWVyO1xuXG4gICAgcmV0dXJuICguLi5hcmdzKSA9PiB7XG4gICAgICBjb25zdCBub3cgPSBEYXRlLm5vdygpO1xuICAgICAgY29uc3QgcmVtYWluaW5nVGltZSA9IGludGVydmFsIC0gKG5vdyAtIGxhc3RDYWxsQXQpO1xuXG4gICAgICBpZiAocmVtYWluaW5nVGltZSA8PSAwIHx8IHJlbWFpbmluZ1RpbWUgPiBpbnRlcnZhbCkge1xuICAgICAgICBpZiAodGltZXIpIHtcbiAgICAgICAgICBjbGVhclRpbWVvdXQodGltZXIpO1xuICAgICAgICAgIHRpbWVyID0gbnVsbDtcbiAgICAgICAgfVxuICAgICAgICBsYXN0Q2FsbEF0ID0gbm93O1xuICAgICAgICBjYWxsYmFjayguLi5hcmdzKTtcbiAgICAgIH0gZWxzZSBpZiAoIXRpbWVyKSB7XG4gICAgICAgIHRpbWVyID0gc2V0VGltZW91dCgoKSA9PiB7XG4gICAgICAgICAgbGFzdENhbGxBdCA9IERhdGUubm93KCk7XG4gICAgICAgICAgdGltZXIgPSBudWxsO1xuICAgICAgICAgIGNhbGxiYWNrKC4uLmFyZ3MpO1xuICAgICAgICB9LCByZW1haW5pbmdUaW1lKTtcbiAgICAgIH1cbiAgICB9O1xuICB9LFxufTtcbmV4cG9ydCBkZWZhdWx0IEhvb2tzO1xuIiwgImltcG9ydCB7XG4gIFBIWF9SRUZfTE9BRElORyxcbiAgUEhYX1JFRl9MT0NLLFxuICBQSFhfUkVGX1NSQyxcbiAgUEhYX1BFTkRJTkdfUkVGUyxcbiAgUEhYX0VWRU5UX0NMQVNTRVMsXG4gIFBIWF9ESVNBQkxFRCxcbiAgUEhYX1JFQURPTkxZLFxuICBQSFhfRElTQUJMRV9XSVRIX1JFU1RPUkUsXG59IGZyb20gXCIuL2NvbnN0YW50c1wiO1xuXG5pbXBvcnQgRE9NIGZyb20gXCIuL2RvbVwiO1xuXG5leHBvcnQgZGVmYXVsdCBjbGFzcyBFbGVtZW50UmVmIHtcbiAgc3RhdGljIG9uVW5sb2NrKGVsLCBjYWxsYmFjaykge1xuICAgIGlmICghRE9NLmlzTG9ja2VkKGVsKSAmJiAhZWwuY2xvc2VzdChgWyR7UEhYX1JFRl9MT0NLfV1gKSkge1xuICAgICAgcmV0dXJuIGNhbGxiYWNrKCk7XG4gICAgfVxuICAgIGNvbnN0IGNsb3Nlc3RMb2NrID0gZWwuY2xvc2VzdChgWyR7UEhYX1JFRl9MT0NLfV1gKTtcbiAgICBjb25zdCByZWYgPSBjbG9zZXN0TG9ja1xuICAgICAgLmNsb3Nlc3QoYFske1BIWF9SRUZfTE9DS31dYClcbiAgICAgIC5nZXRBdHRyaWJ1dGUoUEhYX1JFRl9MT0NLKTtcbiAgICBjbG9zZXN0TG9jay5hZGRFdmVudExpc3RlbmVyKFxuICAgICAgYHBoeDp1bmRvLWxvY2s6JHtyZWZ9YCxcbiAgICAgICgpID0+IHtcbiAgICAgICAgY2FsbGJhY2soKTtcbiAgICAgIH0sXG4gICAgICB7IG9uY2U6IHRydWUgfSxcbiAgICApO1xuICB9XG5cbiAgY29uc3RydWN0b3IoZWwpIHtcbiAgICB0aGlzLmVsID0gZWw7XG4gICAgdGhpcy5sb2FkaW5nUmVmID0gZWwuaGFzQXR0cmlidXRlKFBIWF9SRUZfTE9BRElORylcbiAgICAgID8gcGFyc2VJbnQoZWwuZ2V0QXR0cmlidXRlKFBIWF9SRUZfTE9BRElORyksIDEwKVxuICAgICAgOiBudWxsO1xuICAgIHRoaXMubG9ja1JlZiA9IGVsLmhhc0F0dHJpYnV0ZShQSFhfUkVGX0xPQ0spXG4gICAgICA/IHBhcnNlSW50KGVsLmdldEF0dHJpYnV0ZShQSFhfUkVGX0xPQ0spLCAxMClcbiAgICAgIDogbnVsbDtcbiAgfVxuXG4gIC8vIHB1YmxpY1xuXG4gIG1heWJlVW5kbyhyZWYsIHBoeEV2ZW50LCBlYWNoQ2xvbmVDYWxsYmFjaykge1xuICAgIGlmICghdGhpcy5pc1dpdGhpbihyZWYpKSB7XG4gICAgICAvLyB3ZSBjYW5ub3QgdW5kbyB0aGUgbG9jayAvIGxvYWRpbmcgbm93LCBhcyB0aGVyZSBpcyBhIG5ld2VyIG9uZSBhbHJlYWR5IHNldDtcbiAgICAgIC8vIHdlIG5lZWQgdG8gc3RvcmUgdGhlIG9yaWdpbmFsIHJlZiB3ZSB0cmllZCB0byBzZW5kIHRoZSB1bmRvIGV2ZW50IGxhdGVyXG4gICAgICBET00udXBkYXRlUHJpdmF0ZSh0aGlzLmVsLCBQSFhfUEVORElOR19SRUZTLCBbXSwgKHBlbmRpbmdSZWZzKSA9PiB7XG4gICAgICAgIHBlbmRpbmdSZWZzLnB1c2gocmVmKTtcbiAgICAgICAgcmV0dXJuIHBlbmRpbmdSZWZzO1xuICAgICAgfSk7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgLy8gdW5kbyBsb2NrcyBhbmQgYXBwbHkgY2xvbmVzXG4gICAgdGhpcy51bmRvTG9ja3MocmVmLCBwaHhFdmVudCwgZWFjaENsb25lQ2FsbGJhY2spO1xuXG4gICAgLy8gdW5kbyBsb2FkaW5nIHN0YXRlc1xuICAgIHRoaXMudW5kb0xvYWRpbmcocmVmLCBwaHhFdmVudCk7XG5cbiAgICAvLyBlbnN1cmUgdW5kbyBldmVudHMgYXJlIGZpcmVkIGZvciBwZW5kaW5nIHJlZnMgdGhhdFxuICAgIC8vIGFyZSByZXNvbHZlZCBieSB0aGUgY3VycmVudCByZWYsIG90aGVyd2lzZSB3ZSdkIGxlYWsgZXZlbnQgbGlzdGVuZXJzXG4gICAgRE9NLnVwZGF0ZVByaXZhdGUodGhpcy5lbCwgUEhYX1BFTkRJTkdfUkVGUywgW10sIChwZW5kaW5nUmVmcykgPT4ge1xuICAgICAgcmV0dXJuIHBlbmRpbmdSZWZzLmZpbHRlcigocGVuZGluZ1JlZikgPT4ge1xuICAgICAgICBsZXQgb3B0cyA9IHtcbiAgICAgICAgICBkZXRhaWw6IHsgcmVmOiBwZW5kaW5nUmVmLCBldmVudDogcGh4RXZlbnQgfSxcbiAgICAgICAgICBidWJibGVzOiB0cnVlLFxuICAgICAgICAgIGNhbmNlbGFibGU6IGZhbHNlLFxuICAgICAgICB9O1xuICAgICAgICBpZiAodGhpcy5sb2FkaW5nUmVmICYmIHRoaXMubG9hZGluZ1JlZiA+IHBlbmRpbmdSZWYpIHtcbiAgICAgICAgICB0aGlzLmVsLmRpc3BhdGNoRXZlbnQoXG4gICAgICAgICAgICBuZXcgQ3VzdG9tRXZlbnQoYHBoeDp1bmRvLWxvYWRpbmc6JHtwZW5kaW5nUmVmfWAsIG9wdHMpLFxuICAgICAgICAgICk7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKHRoaXMubG9ja1JlZiAmJiB0aGlzLmxvY2tSZWYgPiBwZW5kaW5nUmVmKSB7XG4gICAgICAgICAgdGhpcy5lbC5kaXNwYXRjaEV2ZW50KFxuICAgICAgICAgICAgbmV3IEN1c3RvbUV2ZW50KGBwaHg6dW5kby1sb2NrOiR7cGVuZGluZ1JlZn1gLCBvcHRzKSxcbiAgICAgICAgICApO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBwZW5kaW5nUmVmID4gcmVmO1xuICAgICAgfSk7XG4gICAgfSk7XG5cbiAgICAvLyBjbGVhbiB1cCBpZiBmdWxseSByZXNvbHZlZFxuICAgIGlmICh0aGlzLmlzRnVsbHlSZXNvbHZlZEJ5KHJlZikpIHtcbiAgICAgIHRoaXMuZWwucmVtb3ZlQXR0cmlidXRlKFBIWF9SRUZfU1JDKTtcbiAgICB9XG4gIH1cblxuICAvLyBwcml2YXRlXG5cbiAgaXNXaXRoaW4ocmVmKSB7XG4gICAgcmV0dXJuICEoXG4gICAgICB0aGlzLmxvYWRpbmdSZWYgIT09IG51bGwgJiZcbiAgICAgIHRoaXMubG9hZGluZ1JlZiA+IHJlZiAmJlxuICAgICAgdGhpcy5sb2NrUmVmICE9PSBudWxsICYmXG4gICAgICB0aGlzLmxvY2tSZWYgPiByZWZcbiAgICApO1xuICB9XG5cbiAgLy8gQ2hlY2sgZm9yIGNsb25lZCBQSFhfUkVGX0xPQ0sgZWxlbWVudCB0aGF0IGhhcyBiZWVuIG1vcnBoZWQgYmVoaW5kXG4gIC8vIHRoZSBzY2VuZXMgd2hpbGUgdGhpcyBlbGVtZW50IHdhcyBsb2NrZWQgaW4gdGhlIERPTS5cbiAgLy8gV2hlbiB3ZSBhcHBseSB0aGUgY2xvbmVkIHRyZWUgdG8gdGhlIGFjdGl2ZSBET00gZWxlbWVudCwgd2UgbXVzdFxuICAvL1xuICAvLyAgIDEuIGV4ZWN1dGUgcGVuZGluZyBtb3VudGVkIGhvb2tzIGZvciBub2RlcyBub3cgaW4gdGhlIERPTVxuICAvLyAgIDIuIHVuZG8gYW55IHJlZiBpbnNpZGUgdGhlIGNsb25lZCB0cmVlIHRoYXQgaGFzIHNpbmNlIGJlZW4gYWNrJ2RcbiAgdW5kb0xvY2tzKHJlZiwgcGh4RXZlbnQsIGVhY2hDbG9uZUNhbGxiYWNrKSB7XG4gICAgaWYgKCF0aGlzLmlzTG9ja1VuZG9uZUJ5KHJlZikpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICBjb25zdCBjbG9uZWRUcmVlID0gRE9NLnByaXZhdGUodGhpcy5lbCwgUEhYX1JFRl9MT0NLKTtcbiAgICBpZiAoY2xvbmVkVHJlZSkge1xuICAgICAgZWFjaENsb25lQ2FsbGJhY2soY2xvbmVkVHJlZSk7XG4gICAgICBET00uZGVsZXRlUHJpdmF0ZSh0aGlzLmVsLCBQSFhfUkVGX0xPQ0spO1xuICAgIH1cbiAgICB0aGlzLmVsLnJlbW92ZUF0dHJpYnV0ZShQSFhfUkVGX0xPQ0spO1xuXG4gICAgY29uc3Qgb3B0cyA9IHtcbiAgICAgIGRldGFpbDogeyByZWY6IHJlZiwgZXZlbnQ6IHBoeEV2ZW50IH0sXG4gICAgICBidWJibGVzOiB0cnVlLFxuICAgICAgY2FuY2VsYWJsZTogZmFsc2UsXG4gICAgfTtcbiAgICB0aGlzLmVsLmRpc3BhdGNoRXZlbnQoXG4gICAgICBuZXcgQ3VzdG9tRXZlbnQoYHBoeDp1bmRvLWxvY2s6JHt0aGlzLmxvY2tSZWZ9YCwgb3B0cyksXG4gICAgKTtcbiAgfVxuXG4gIHVuZG9Mb2FkaW5nKHJlZiwgcGh4RXZlbnQpIHtcbiAgICBpZiAoIXRoaXMuaXNMb2FkaW5nVW5kb25lQnkocmVmKSkge1xuICAgICAgaWYgKFxuICAgICAgICB0aGlzLmNhblVuZG9Mb2FkaW5nKHJlZikgJiZcbiAgICAgICAgdGhpcy5lbC5jbGFzc0xpc3QuY29udGFpbnMoXCJwaHgtc3VibWl0LWxvYWRpbmdcIilcbiAgICAgICkge1xuICAgICAgICB0aGlzLmVsLmNsYXNzTGlzdC5yZW1vdmUoXCJwaHgtY2hhbmdlLWxvYWRpbmdcIik7XG4gICAgICB9XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgaWYgKHRoaXMuY2FuVW5kb0xvYWRpbmcocmVmKSkge1xuICAgICAgdGhpcy5lbC5yZW1vdmVBdHRyaWJ1dGUoUEhYX1JFRl9MT0FESU5HKTtcbiAgICAgIGNvbnN0IGRpc2FibGVkVmFsID0gdGhpcy5lbC5nZXRBdHRyaWJ1dGUoUEhYX0RJU0FCTEVEKTtcbiAgICAgIGNvbnN0IHJlYWRPbmx5VmFsID0gdGhpcy5lbC5nZXRBdHRyaWJ1dGUoUEhYX1JFQURPTkxZKTtcbiAgICAgIC8vIHJlc3RvcmUgaW5wdXRzXG4gICAgICBpZiAocmVhZE9ubHlWYWwgIT09IG51bGwpIHtcbiAgICAgICAgdGhpcy5lbC5yZWFkT25seSA9IHJlYWRPbmx5VmFsID09PSBcInRydWVcIiA/IHRydWUgOiBmYWxzZTtcbiAgICAgICAgdGhpcy5lbC5yZW1vdmVBdHRyaWJ1dGUoUEhYX1JFQURPTkxZKTtcbiAgICAgIH1cbiAgICAgIGlmIChkaXNhYmxlZFZhbCAhPT0gbnVsbCkge1xuICAgICAgICB0aGlzLmVsLmRpc2FibGVkID0gZGlzYWJsZWRWYWwgPT09IFwidHJ1ZVwiID8gdHJ1ZSA6IGZhbHNlO1xuICAgICAgICB0aGlzLmVsLnJlbW92ZUF0dHJpYnV0ZShQSFhfRElTQUJMRUQpO1xuICAgICAgfVxuICAgICAgLy8gcmVzdG9yZSBkaXNhYmxlc1xuICAgICAgY29uc3QgZGlzYWJsZVJlc3RvcmUgPSB0aGlzLmVsLmdldEF0dHJpYnV0ZShQSFhfRElTQUJMRV9XSVRIX1JFU1RPUkUpO1xuICAgICAgaWYgKGRpc2FibGVSZXN0b3JlICE9PSBudWxsKSB7XG4gICAgICAgIHRoaXMuZWwuaW5uZXJUZXh0ID0gZGlzYWJsZVJlc3RvcmU7XG4gICAgICAgIHRoaXMuZWwucmVtb3ZlQXR0cmlidXRlKFBIWF9ESVNBQkxFX1dJVEhfUkVTVE9SRSk7XG4gICAgICB9XG5cbiAgICAgIGNvbnN0IG9wdHMgPSB7XG4gICAgICAgIGRldGFpbDogeyByZWY6IHJlZiwgZXZlbnQ6IHBoeEV2ZW50IH0sXG4gICAgICAgIGJ1YmJsZXM6IHRydWUsXG4gICAgICAgIGNhbmNlbGFibGU6IGZhbHNlLFxuICAgICAgfTtcbiAgICAgIHRoaXMuZWwuZGlzcGF0Y2hFdmVudChcbiAgICAgICAgbmV3IEN1c3RvbUV2ZW50KGBwaHg6dW5kby1sb2FkaW5nOiR7dGhpcy5sb2FkaW5nUmVmfWAsIG9wdHMpLFxuICAgICAgKTtcbiAgICB9XG5cbiAgICAvLyByZW1vdmUgY2xhc3Nlc1xuICAgIFBIWF9FVkVOVF9DTEFTU0VTLmZvckVhY2goKG5hbWUpID0+IHtcbiAgICAgIGlmIChuYW1lICE9PSBcInBoeC1zdWJtaXQtbG9hZGluZ1wiIHx8IHRoaXMuY2FuVW5kb0xvYWRpbmcocmVmKSkge1xuICAgICAgICBET00ucmVtb3ZlQ2xhc3ModGhpcy5lbCwgbmFtZSk7XG4gICAgICB9XG4gICAgfSk7XG4gIH1cblxuICBpc0xvYWRpbmdVbmRvbmVCeShyZWYpIHtcbiAgICByZXR1cm4gdGhpcy5sb2FkaW5nUmVmID09PSBudWxsID8gZmFsc2UgOiB0aGlzLmxvYWRpbmdSZWYgPD0gcmVmO1xuICB9XG4gIGlzTG9ja1VuZG9uZUJ5KHJlZikge1xuICAgIHJldHVybiB0aGlzLmxvY2tSZWYgPT09IG51bGwgPyBmYWxzZSA6IHRoaXMubG9ja1JlZiA8PSByZWY7XG4gIH1cblxuICBpc0Z1bGx5UmVzb2x2ZWRCeShyZWYpIHtcbiAgICByZXR1cm4gKFxuICAgICAgKHRoaXMubG9hZGluZ1JlZiA9PT0gbnVsbCB8fCB0aGlzLmxvYWRpbmdSZWYgPD0gcmVmKSAmJlxuICAgICAgKHRoaXMubG9ja1JlZiA9PT0gbnVsbCB8fCB0aGlzLmxvY2tSZWYgPD0gcmVmKVxuICAgICk7XG4gIH1cblxuICAvLyBvbmx5IHJlbW92ZSB0aGUgcGh4LXN1Ym1pdC1sb2FkaW5nIGNsYXNzIGlmIHdlIGFyZSBub3QgbG9ja2VkXG4gIGNhblVuZG9Mb2FkaW5nKHJlZikge1xuICAgIHJldHVybiB0aGlzLmxvY2tSZWYgPT09IG51bGwgfHwgdGhpcy5sb2NrUmVmIDw9IHJlZjtcbiAgfVxufVxuIiwgImltcG9ydCB7IG1heWJlIH0gZnJvbSBcIi4vdXRpbHNcIjtcblxuaW1wb3J0IERPTSBmcm9tIFwiLi9kb21cIjtcblxuZXhwb3J0IGRlZmF1bHQgY2xhc3MgRE9NUG9zdE1vcnBoUmVzdG9yZXIge1xuICBjb25zdHJ1Y3Rvcihjb250YWluZXJCZWZvcmUsIGNvbnRhaW5lckFmdGVyLCB1cGRhdGVUeXBlKSB7XG4gICAgY29uc3QgaWRzQmVmb3JlID0gbmV3IFNldCgpO1xuICAgIGNvbnN0IGlkc0FmdGVyID0gbmV3IFNldChcbiAgICAgIFsuLi5jb250YWluZXJBZnRlci5jaGlsZHJlbl0ubWFwKChjaGlsZCkgPT4gY2hpbGQuaWQpLFxuICAgICk7XG5cbiAgICBjb25zdCBlbGVtZW50c1RvTW9kaWZ5ID0gW107XG5cbiAgICBBcnJheS5mcm9tKGNvbnRhaW5lckJlZm9yZS5jaGlsZHJlbikuZm9yRWFjaCgoY2hpbGQpID0+IHtcbiAgICAgIGlmIChjaGlsZC5pZCkge1xuICAgICAgICAvLyBhbGwgb2Ygb3VyIGNoaWxkcmVuIHNob3VsZCBiZSBlbGVtZW50cyB3aXRoIGlkc1xuICAgICAgICBpZHNCZWZvcmUuYWRkKGNoaWxkLmlkKTtcbiAgICAgICAgaWYgKGlkc0FmdGVyLmhhcyhjaGlsZC5pZCkpIHtcbiAgICAgICAgICBjb25zdCBwcmV2aW91c0VsZW1lbnRJZCA9XG4gICAgICAgICAgICBjaGlsZC5wcmV2aW91c0VsZW1lbnRTaWJsaW5nICYmIGNoaWxkLnByZXZpb3VzRWxlbWVudFNpYmxpbmcuaWQ7XG4gICAgICAgICAgZWxlbWVudHNUb01vZGlmeS5wdXNoKHtcbiAgICAgICAgICAgIGVsZW1lbnRJZDogY2hpbGQuaWQsXG4gICAgICAgICAgICBwcmV2aW91c0VsZW1lbnRJZDogcHJldmlvdXNFbGVtZW50SWQsXG4gICAgICAgICAgfSk7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9KTtcblxuICAgIHRoaXMuY29udGFpbmVySWQgPSBjb250YWluZXJBZnRlci5pZDtcbiAgICB0aGlzLnVwZGF0ZVR5cGUgPSB1cGRhdGVUeXBlO1xuICAgIHRoaXMuZWxlbWVudHNUb01vZGlmeSA9IGVsZW1lbnRzVG9Nb2RpZnk7XG4gICAgdGhpcy5lbGVtZW50SWRzVG9BZGQgPSBbLi4uaWRzQWZ0ZXJdLmZpbHRlcigoaWQpID0+ICFpZHNCZWZvcmUuaGFzKGlkKSk7XG4gIH1cblxuICAvLyBXZSBkbyB0aGUgZm9sbG93aW5nIHRvIG9wdGltaXplIGFwcGVuZC9wcmVwZW5kIG9wZXJhdGlvbnM6XG4gIC8vICAgMSkgVHJhY2sgaWRzIG9mIG1vZGlmaWVkIGVsZW1lbnRzICYgb2YgbmV3IGVsZW1lbnRzXG4gIC8vICAgMikgQWxsIHRoZSBtb2RpZmllZCBlbGVtZW50cyBhcmUgcHV0IGJhY2sgaW4gdGhlIGNvcnJlY3QgcG9zaXRpb24gaW4gdGhlIERPTSB0cmVlXG4gIC8vICAgICAgYnkgc3RvcmluZyB0aGUgaWQgb2YgdGhlaXIgcHJldmlvdXMgc2libGluZ1xuICAvLyAgIDMpIE5ldyBlbGVtZW50cyBhcmUgZ29pbmcgdG8gYmUgcHV0IGluIHRoZSByaWdodCBwbGFjZSBieSBtb3JwaGRvbSBkdXJpbmcgYXBwZW5kLlxuICAvLyAgICAgIEZvciBwcmVwZW5kLCB3ZSBtb3ZlIHRoZW0gdG8gdGhlIGZpcnN0IHBvc2l0aW9uIGluIHRoZSBjb250YWluZXJcbiAgcGVyZm9ybSgpIHtcbiAgICBjb25zdCBjb250YWluZXIgPSBET00uYnlJZCh0aGlzLmNvbnRhaW5lcklkKTtcbiAgICBpZiAoIWNvbnRhaW5lcikge1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICB0aGlzLmVsZW1lbnRzVG9Nb2RpZnkuZm9yRWFjaCgoZWxlbWVudFRvTW9kaWZ5KSA9PiB7XG4gICAgICBpZiAoZWxlbWVudFRvTW9kaWZ5LnByZXZpb3VzRWxlbWVudElkKSB7XG4gICAgICAgIG1heWJlKFxuICAgICAgICAgIGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKGVsZW1lbnRUb01vZGlmeS5wcmV2aW91c0VsZW1lbnRJZCksXG4gICAgICAgICAgKHByZXZpb3VzRWxlbSkgPT4ge1xuICAgICAgICAgICAgbWF5YmUoXG4gICAgICAgICAgICAgIGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKGVsZW1lbnRUb01vZGlmeS5lbGVtZW50SWQpLFxuICAgICAgICAgICAgICAoZWxlbSkgPT4ge1xuICAgICAgICAgICAgICAgIGNvbnN0IGlzSW5SaWdodFBsYWNlID1cbiAgICAgICAgICAgICAgICAgIGVsZW0ucHJldmlvdXNFbGVtZW50U2libGluZyAmJlxuICAgICAgICAgICAgICAgICAgZWxlbS5wcmV2aW91c0VsZW1lbnRTaWJsaW5nLmlkID09IHByZXZpb3VzRWxlbS5pZDtcbiAgICAgICAgICAgICAgICBpZiAoIWlzSW5SaWdodFBsYWNlKSB7XG4gICAgICAgICAgICAgICAgICBwcmV2aW91c0VsZW0uaW5zZXJ0QWRqYWNlbnRFbGVtZW50KFwiYWZ0ZXJlbmRcIiwgZWxlbSk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgKTtcbiAgICAgICAgICB9LFxuICAgICAgICApO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgLy8gVGhpcyBpcyB0aGUgZmlyc3QgZWxlbWVudCBpbiB0aGUgY29udGFpbmVyXG4gICAgICAgIG1heWJlKGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKGVsZW1lbnRUb01vZGlmeS5lbGVtZW50SWQpLCAoZWxlbSkgPT4ge1xuICAgICAgICAgIGNvbnN0IGlzSW5SaWdodFBsYWNlID0gZWxlbS5wcmV2aW91c0VsZW1lbnRTaWJsaW5nID09IG51bGw7XG4gICAgICAgICAgaWYgKCFpc0luUmlnaHRQbGFjZSkge1xuICAgICAgICAgICAgY29udGFpbmVyLmluc2VydEFkamFjZW50RWxlbWVudChcImFmdGVyYmVnaW5cIiwgZWxlbSk7XG4gICAgICAgICAgfVxuICAgICAgICB9KTtcbiAgICAgIH1cbiAgICB9KTtcblxuICAgIGlmICh0aGlzLnVwZGF0ZVR5cGUgPT0gXCJwcmVwZW5kXCIpIHtcbiAgICAgIHRoaXMuZWxlbWVudElkc1RvQWRkLnJldmVyc2UoKS5mb3JFYWNoKChlbGVtSWQpID0+IHtcbiAgICAgICAgbWF5YmUoZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoZWxlbUlkKSwgKGVsZW0pID0+XG4gICAgICAgICAgY29udGFpbmVyLmluc2VydEFkamFjZW50RWxlbWVudChcImFmdGVyYmVnaW5cIiwgZWxlbSksXG4gICAgICAgICk7XG4gICAgICB9KTtcbiAgICB9XG4gIH1cbn1cbiIsICJ2YXIgRE9DVU1FTlRfRlJBR01FTlRfTk9ERSA9IDExO1xuXG5mdW5jdGlvbiBtb3JwaEF0dHJzKGZyb21Ob2RlLCB0b05vZGUpIHtcbiAgICB2YXIgdG9Ob2RlQXR0cnMgPSB0b05vZGUuYXR0cmlidXRlcztcbiAgICB2YXIgYXR0cjtcbiAgICB2YXIgYXR0ck5hbWU7XG4gICAgdmFyIGF0dHJOYW1lc3BhY2VVUkk7XG4gICAgdmFyIGF0dHJWYWx1ZTtcbiAgICB2YXIgZnJvbVZhbHVlO1xuXG4gICAgLy8gZG9jdW1lbnQtZnJhZ21lbnRzIGRvbnQgaGF2ZSBhdHRyaWJ1dGVzIHNvIGxldHMgbm90IGRvIGFueXRoaW5nXG4gICAgaWYgKHRvTm9kZS5ub2RlVHlwZSA9PT0gRE9DVU1FTlRfRlJBR01FTlRfTk9ERSB8fCBmcm9tTm9kZS5ub2RlVHlwZSA9PT0gRE9DVU1FTlRfRlJBR01FTlRfTk9ERSkge1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIC8vIHVwZGF0ZSBhdHRyaWJ1dGVzIG9uIG9yaWdpbmFsIERPTSBlbGVtZW50XG4gICAgZm9yICh2YXIgaSA9IHRvTm9kZUF0dHJzLmxlbmd0aCAtIDE7IGkgPj0gMDsgaS0tKSB7XG4gICAgICAgIGF0dHIgPSB0b05vZGVBdHRyc1tpXTtcbiAgICAgICAgYXR0ck5hbWUgPSBhdHRyLm5hbWU7XG4gICAgICAgIGF0dHJOYW1lc3BhY2VVUkkgPSBhdHRyLm5hbWVzcGFjZVVSSTtcbiAgICAgICAgYXR0clZhbHVlID0gYXR0ci52YWx1ZTtcblxuICAgICAgICBpZiAoYXR0ck5hbWVzcGFjZVVSSSkge1xuICAgICAgICAgICAgYXR0ck5hbWUgPSBhdHRyLmxvY2FsTmFtZSB8fCBhdHRyTmFtZTtcbiAgICAgICAgICAgIGZyb21WYWx1ZSA9IGZyb21Ob2RlLmdldEF0dHJpYnV0ZU5TKGF0dHJOYW1lc3BhY2VVUkksIGF0dHJOYW1lKTtcblxuICAgICAgICAgICAgaWYgKGZyb21WYWx1ZSAhPT0gYXR0clZhbHVlKSB7XG4gICAgICAgICAgICAgICAgaWYgKGF0dHIucHJlZml4ID09PSAneG1sbnMnKXtcbiAgICAgICAgICAgICAgICAgICAgYXR0ck5hbWUgPSBhdHRyLm5hbWU7IC8vIEl0J3Mgbm90IGFsbG93ZWQgdG8gc2V0IGFuIGF0dHJpYnV0ZSB3aXRoIHRoZSBYTUxOUyBuYW1lc3BhY2Ugd2l0aG91dCBzcGVjaWZ5aW5nIHRoZSBgeG1sbnNgIHByZWZpeFxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBmcm9tTm9kZS5zZXRBdHRyaWJ1dGVOUyhhdHRyTmFtZXNwYWNlVVJJLCBhdHRyTmFtZSwgYXR0clZhbHVlKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIGZyb21WYWx1ZSA9IGZyb21Ob2RlLmdldEF0dHJpYnV0ZShhdHRyTmFtZSk7XG5cbiAgICAgICAgICAgIGlmIChmcm9tVmFsdWUgIT09IGF0dHJWYWx1ZSkge1xuICAgICAgICAgICAgICAgIGZyb21Ob2RlLnNldEF0dHJpYnV0ZShhdHRyTmFtZSwgYXR0clZhbHVlKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgIH1cblxuICAgIC8vIFJlbW92ZSBhbnkgZXh0cmEgYXR0cmlidXRlcyBmb3VuZCBvbiB0aGUgb3JpZ2luYWwgRE9NIGVsZW1lbnQgdGhhdFxuICAgIC8vIHdlcmVuJ3QgZm91bmQgb24gdGhlIHRhcmdldCBlbGVtZW50LlxuICAgIHZhciBmcm9tTm9kZUF0dHJzID0gZnJvbU5vZGUuYXR0cmlidXRlcztcblxuICAgIGZvciAodmFyIGQgPSBmcm9tTm9kZUF0dHJzLmxlbmd0aCAtIDE7IGQgPj0gMDsgZC0tKSB7XG4gICAgICAgIGF0dHIgPSBmcm9tTm9kZUF0dHJzW2RdO1xuICAgICAgICBhdHRyTmFtZSA9IGF0dHIubmFtZTtcbiAgICAgICAgYXR0ck5hbWVzcGFjZVVSSSA9IGF0dHIubmFtZXNwYWNlVVJJO1xuXG4gICAgICAgIGlmIChhdHRyTmFtZXNwYWNlVVJJKSB7XG4gICAgICAgICAgICBhdHRyTmFtZSA9IGF0dHIubG9jYWxOYW1lIHx8IGF0dHJOYW1lO1xuXG4gICAgICAgICAgICBpZiAoIXRvTm9kZS5oYXNBdHRyaWJ1dGVOUyhhdHRyTmFtZXNwYWNlVVJJLCBhdHRyTmFtZSkpIHtcbiAgICAgICAgICAgICAgICBmcm9tTm9kZS5yZW1vdmVBdHRyaWJ1dGVOUyhhdHRyTmFtZXNwYWNlVVJJLCBhdHRyTmFtZSk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICBpZiAoIXRvTm9kZS5oYXNBdHRyaWJ1dGUoYXR0ck5hbWUpKSB7XG4gICAgICAgICAgICAgICAgZnJvbU5vZGUucmVtb3ZlQXR0cmlidXRlKGF0dHJOYW1lKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgIH1cbn1cblxudmFyIHJhbmdlOyAvLyBDcmVhdGUgYSByYW5nZSBvYmplY3QgZm9yIGVmZmljZW50bHkgcmVuZGVyaW5nIHN0cmluZ3MgdG8gZWxlbWVudHMuXG52YXIgTlNfWEhUTUwgPSAnaHR0cDovL3d3dy53My5vcmcvMTk5OS94aHRtbCc7XG5cbnZhciBkb2MgPSB0eXBlb2YgZG9jdW1lbnQgPT09ICd1bmRlZmluZWQnID8gdW5kZWZpbmVkIDogZG9jdW1lbnQ7XG52YXIgSEFTX1RFTVBMQVRFX1NVUFBPUlQgPSAhIWRvYyAmJiAnY29udGVudCcgaW4gZG9jLmNyZWF0ZUVsZW1lbnQoJ3RlbXBsYXRlJyk7XG52YXIgSEFTX1JBTkdFX1NVUFBPUlQgPSAhIWRvYyAmJiBkb2MuY3JlYXRlUmFuZ2UgJiYgJ2NyZWF0ZUNvbnRleHR1YWxGcmFnbWVudCcgaW4gZG9jLmNyZWF0ZVJhbmdlKCk7XG5cbmZ1bmN0aW9uIGNyZWF0ZUZyYWdtZW50RnJvbVRlbXBsYXRlKHN0cikge1xuICAgIHZhciB0ZW1wbGF0ZSA9IGRvYy5jcmVhdGVFbGVtZW50KCd0ZW1wbGF0ZScpO1xuICAgIHRlbXBsYXRlLmlubmVySFRNTCA9IHN0cjtcbiAgICByZXR1cm4gdGVtcGxhdGUuY29udGVudC5jaGlsZE5vZGVzWzBdO1xufVxuXG5mdW5jdGlvbiBjcmVhdGVGcmFnbWVudEZyb21SYW5nZShzdHIpIHtcbiAgICBpZiAoIXJhbmdlKSB7XG4gICAgICAgIHJhbmdlID0gZG9jLmNyZWF0ZVJhbmdlKCk7XG4gICAgICAgIHJhbmdlLnNlbGVjdE5vZGUoZG9jLmJvZHkpO1xuICAgIH1cblxuICAgIHZhciBmcmFnbWVudCA9IHJhbmdlLmNyZWF0ZUNvbnRleHR1YWxGcmFnbWVudChzdHIpO1xuICAgIHJldHVybiBmcmFnbWVudC5jaGlsZE5vZGVzWzBdO1xufVxuXG5mdW5jdGlvbiBjcmVhdGVGcmFnbWVudEZyb21XcmFwKHN0cikge1xuICAgIHZhciBmcmFnbWVudCA9IGRvYy5jcmVhdGVFbGVtZW50KCdib2R5Jyk7XG4gICAgZnJhZ21lbnQuaW5uZXJIVE1MID0gc3RyO1xuICAgIHJldHVybiBmcmFnbWVudC5jaGlsZE5vZGVzWzBdO1xufVxuXG4vKipcbiAqIFRoaXMgaXMgYWJvdXQgdGhlIHNhbWVcbiAqIHZhciBodG1sID0gbmV3IERPTVBhcnNlcigpLnBhcnNlRnJvbVN0cmluZyhzdHIsICd0ZXh0L2h0bWwnKTtcbiAqIHJldHVybiBodG1sLmJvZHkuZmlyc3RDaGlsZDtcbiAqXG4gKiBAbWV0aG9kIHRvRWxlbWVudFxuICogQHBhcmFtIHtTdHJpbmd9IHN0clxuICovXG5mdW5jdGlvbiB0b0VsZW1lbnQoc3RyKSB7XG4gICAgc3RyID0gc3RyLnRyaW0oKTtcbiAgICBpZiAoSEFTX1RFTVBMQVRFX1NVUFBPUlQpIHtcbiAgICAgIC8vIGF2b2lkIHJlc3RyaWN0aW9ucyBvbiBjb250ZW50IGZvciB0aGluZ3MgbGlrZSBgPHRyPjx0aD5IaTwvdGg+PC90cj5gIHdoaWNoXG4gICAgICAvLyBjcmVhdGVDb250ZXh0dWFsRnJhZ21lbnQgZG9lc24ndCBzdXBwb3J0XG4gICAgICAvLyA8dGVtcGxhdGU+IHN1cHBvcnQgbm90IGF2YWlsYWJsZSBpbiBJRVxuICAgICAgcmV0dXJuIGNyZWF0ZUZyYWdtZW50RnJvbVRlbXBsYXRlKHN0cik7XG4gICAgfSBlbHNlIGlmIChIQVNfUkFOR0VfU1VQUE9SVCkge1xuICAgICAgcmV0dXJuIGNyZWF0ZUZyYWdtZW50RnJvbVJhbmdlKHN0cik7XG4gICAgfVxuXG4gICAgcmV0dXJuIGNyZWF0ZUZyYWdtZW50RnJvbVdyYXAoc3RyKTtcbn1cblxuLyoqXG4gKiBSZXR1cm5zIHRydWUgaWYgdHdvIG5vZGUncyBuYW1lcyBhcmUgdGhlIHNhbWUuXG4gKlxuICogTk9URTogV2UgZG9uJ3QgYm90aGVyIGNoZWNraW5nIGBuYW1lc3BhY2VVUklgIGJlY2F1c2UgeW91IHdpbGwgbmV2ZXIgZmluZCB0d28gSFRNTCBlbGVtZW50cyB3aXRoIHRoZSBzYW1lXG4gKiAgICAgICBub2RlTmFtZSBhbmQgZGlmZmVyZW50IG5hbWVzcGFjZSBVUklzLlxuICpcbiAqIEBwYXJhbSB7RWxlbWVudH0gYVxuICogQHBhcmFtIHtFbGVtZW50fSBiIFRoZSB0YXJnZXQgZWxlbWVudFxuICogQHJldHVybiB7Ym9vbGVhbn1cbiAqL1xuZnVuY3Rpb24gY29tcGFyZU5vZGVOYW1lcyhmcm9tRWwsIHRvRWwpIHtcbiAgICB2YXIgZnJvbU5vZGVOYW1lID0gZnJvbUVsLm5vZGVOYW1lO1xuICAgIHZhciB0b05vZGVOYW1lID0gdG9FbC5ub2RlTmFtZTtcbiAgICB2YXIgZnJvbUNvZGVTdGFydCwgdG9Db2RlU3RhcnQ7XG5cbiAgICBpZiAoZnJvbU5vZGVOYW1lID09PSB0b05vZGVOYW1lKSB7XG4gICAgICAgIHJldHVybiB0cnVlO1xuICAgIH1cblxuICAgIGZyb21Db2RlU3RhcnQgPSBmcm9tTm9kZU5hbWUuY2hhckNvZGVBdCgwKTtcbiAgICB0b0NvZGVTdGFydCA9IHRvTm9kZU5hbWUuY2hhckNvZGVBdCgwKTtcblxuICAgIC8vIElmIHRoZSB0YXJnZXQgZWxlbWVudCBpcyBhIHZpcnR1YWwgRE9NIG5vZGUgb3IgU1ZHIG5vZGUgdGhlbiB3ZSBtYXlcbiAgICAvLyBuZWVkIHRvIG5vcm1hbGl6ZSB0aGUgdGFnIG5hbWUgYmVmb3JlIGNvbXBhcmluZy4gTm9ybWFsIEhUTUwgZWxlbWVudHMgdGhhdCBhcmVcbiAgICAvLyBpbiB0aGUgXCJodHRwOi8vd3d3LnczLm9yZy8xOTk5L3hodG1sXCJcbiAgICAvLyBhcmUgY29udmVydGVkIHRvIHVwcGVyIGNhc2VcbiAgICBpZiAoZnJvbUNvZGVTdGFydCA8PSA5MCAmJiB0b0NvZGVTdGFydCA+PSA5NykgeyAvLyBmcm9tIGlzIHVwcGVyIGFuZCB0byBpcyBsb3dlclxuICAgICAgICByZXR1cm4gZnJvbU5vZGVOYW1lID09PSB0b05vZGVOYW1lLnRvVXBwZXJDYXNlKCk7XG4gICAgfSBlbHNlIGlmICh0b0NvZGVTdGFydCA8PSA5MCAmJiBmcm9tQ29kZVN0YXJ0ID49IDk3KSB7IC8vIHRvIGlzIHVwcGVyIGFuZCBmcm9tIGlzIGxvd2VyXG4gICAgICAgIHJldHVybiB0b05vZGVOYW1lID09PSBmcm9tTm9kZU5hbWUudG9VcHBlckNhc2UoKTtcbiAgICB9IGVsc2Uge1xuICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgfVxufVxuXG4vKipcbiAqIENyZWF0ZSBhbiBlbGVtZW50LCBvcHRpb25hbGx5IHdpdGggYSBrbm93biBuYW1lc3BhY2UgVVJJLlxuICpcbiAqIEBwYXJhbSB7c3RyaW5nfSBuYW1lIHRoZSBlbGVtZW50IG5hbWUsIGUuZy4gJ2Rpdicgb3IgJ3N2ZydcbiAqIEBwYXJhbSB7c3RyaW5nfSBbbmFtZXNwYWNlVVJJXSB0aGUgZWxlbWVudCdzIG5hbWVzcGFjZSBVUkksIGkuZS4gdGhlIHZhbHVlIG9mXG4gKiBpdHMgYHhtbG5zYCBhdHRyaWJ1dGUgb3IgaXRzIGluZmVycmVkIG5hbWVzcGFjZS5cbiAqXG4gKiBAcmV0dXJuIHtFbGVtZW50fVxuICovXG5mdW5jdGlvbiBjcmVhdGVFbGVtZW50TlMobmFtZSwgbmFtZXNwYWNlVVJJKSB7XG4gICAgcmV0dXJuICFuYW1lc3BhY2VVUkkgfHwgbmFtZXNwYWNlVVJJID09PSBOU19YSFRNTCA/XG4gICAgICAgIGRvYy5jcmVhdGVFbGVtZW50KG5hbWUpIDpcbiAgICAgICAgZG9jLmNyZWF0ZUVsZW1lbnROUyhuYW1lc3BhY2VVUkksIG5hbWUpO1xufVxuXG4vKipcbiAqIENvcGllcyB0aGUgY2hpbGRyZW4gb2Ygb25lIERPTSBlbGVtZW50IHRvIGFub3RoZXIgRE9NIGVsZW1lbnRcbiAqL1xuZnVuY3Rpb24gbW92ZUNoaWxkcmVuKGZyb21FbCwgdG9FbCkge1xuICAgIHZhciBjdXJDaGlsZCA9IGZyb21FbC5maXJzdENoaWxkO1xuICAgIHdoaWxlIChjdXJDaGlsZCkge1xuICAgICAgICB2YXIgbmV4dENoaWxkID0gY3VyQ2hpbGQubmV4dFNpYmxpbmc7XG4gICAgICAgIHRvRWwuYXBwZW5kQ2hpbGQoY3VyQ2hpbGQpO1xuICAgICAgICBjdXJDaGlsZCA9IG5leHRDaGlsZDtcbiAgICB9XG4gICAgcmV0dXJuIHRvRWw7XG59XG5cbmZ1bmN0aW9uIHN5bmNCb29sZWFuQXR0clByb3AoZnJvbUVsLCB0b0VsLCBuYW1lKSB7XG4gICAgaWYgKGZyb21FbFtuYW1lXSAhPT0gdG9FbFtuYW1lXSkge1xuICAgICAgICBmcm9tRWxbbmFtZV0gPSB0b0VsW25hbWVdO1xuICAgICAgICBpZiAoZnJvbUVsW25hbWVdKSB7XG4gICAgICAgICAgICBmcm9tRWwuc2V0QXR0cmlidXRlKG5hbWUsICcnKTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIGZyb21FbC5yZW1vdmVBdHRyaWJ1dGUobmFtZSk7XG4gICAgICAgIH1cbiAgICB9XG59XG5cbnZhciBzcGVjaWFsRWxIYW5kbGVycyA9IHtcbiAgICBPUFRJT046IGZ1bmN0aW9uKGZyb21FbCwgdG9FbCkge1xuICAgICAgICB2YXIgcGFyZW50Tm9kZSA9IGZyb21FbC5wYXJlbnROb2RlO1xuICAgICAgICBpZiAocGFyZW50Tm9kZSkge1xuICAgICAgICAgICAgdmFyIHBhcmVudE5hbWUgPSBwYXJlbnROb2RlLm5vZGVOYW1lLnRvVXBwZXJDYXNlKCk7XG4gICAgICAgICAgICBpZiAocGFyZW50TmFtZSA9PT0gJ09QVEdST1VQJykge1xuICAgICAgICAgICAgICAgIHBhcmVudE5vZGUgPSBwYXJlbnROb2RlLnBhcmVudE5vZGU7XG4gICAgICAgICAgICAgICAgcGFyZW50TmFtZSA9IHBhcmVudE5vZGUgJiYgcGFyZW50Tm9kZS5ub2RlTmFtZS50b1VwcGVyQ2FzZSgpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgaWYgKHBhcmVudE5hbWUgPT09ICdTRUxFQ1QnICYmICFwYXJlbnROb2RlLmhhc0F0dHJpYnV0ZSgnbXVsdGlwbGUnKSkge1xuICAgICAgICAgICAgICAgIGlmIChmcm9tRWwuaGFzQXR0cmlidXRlKCdzZWxlY3RlZCcpICYmICF0b0VsLnNlbGVjdGVkKSB7XG4gICAgICAgICAgICAgICAgICAgIC8vIFdvcmthcm91bmQgZm9yIE1TIEVkZ2UgYnVnIHdoZXJlIHRoZSAnc2VsZWN0ZWQnIGF0dHJpYnV0ZSBjYW4gb25seSBiZVxuICAgICAgICAgICAgICAgICAgICAvLyByZW1vdmVkIGlmIHNldCB0byBhIG5vbi1lbXB0eSB2YWx1ZTpcbiAgICAgICAgICAgICAgICAgICAgLy8gaHR0cHM6Ly9kZXZlbG9wZXIubWljcm9zb2Z0LmNvbS9lbi11cy9taWNyb3NvZnQtZWRnZS9wbGF0Zm9ybS9pc3N1ZXMvMTIwODc2NzkvXG4gICAgICAgICAgICAgICAgICAgIGZyb21FbC5zZXRBdHRyaWJ1dGUoJ3NlbGVjdGVkJywgJ3NlbGVjdGVkJyk7XG4gICAgICAgICAgICAgICAgICAgIGZyb21FbC5yZW1vdmVBdHRyaWJ1dGUoJ3NlbGVjdGVkJyk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIC8vIFdlIGhhdmUgdG8gcmVzZXQgc2VsZWN0IGVsZW1lbnQncyBzZWxlY3RlZEluZGV4IHRvIC0xLCBvdGhlcndpc2Ugc2V0dGluZ1xuICAgICAgICAgICAgICAgIC8vIGZyb21FbC5zZWxlY3RlZCB1c2luZyB0aGUgc3luY0Jvb2xlYW5BdHRyUHJvcCBiZWxvdyBoYXMgbm8gZWZmZWN0LlxuICAgICAgICAgICAgICAgIC8vIFRoZSBjb3JyZWN0IHNlbGVjdGVkSW5kZXggd2lsbCBiZSBzZXQgaW4gdGhlIFNFTEVDVCBzcGVjaWFsIGhhbmRsZXIgYmVsb3cuXG4gICAgICAgICAgICAgICAgcGFyZW50Tm9kZS5zZWxlY3RlZEluZGV4ID0gLTE7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgc3luY0Jvb2xlYW5BdHRyUHJvcChmcm9tRWwsIHRvRWwsICdzZWxlY3RlZCcpO1xuICAgIH0sXG4gICAgLyoqXG4gICAgICogVGhlIFwidmFsdWVcIiBhdHRyaWJ1dGUgaXMgc3BlY2lhbCBmb3IgdGhlIDxpbnB1dD4gZWxlbWVudCBzaW5jZSBpdCBzZXRzXG4gICAgICogdGhlIGluaXRpYWwgdmFsdWUuIENoYW5naW5nIHRoZSBcInZhbHVlXCIgYXR0cmlidXRlIHdpdGhvdXQgY2hhbmdpbmcgdGhlXG4gICAgICogXCJ2YWx1ZVwiIHByb3BlcnR5IHdpbGwgaGF2ZSBubyBlZmZlY3Qgc2luY2UgaXQgaXMgb25seSB1c2VkIHRvIHRoZSBzZXQgdGhlXG4gICAgICogaW5pdGlhbCB2YWx1ZS4gIFNpbWlsYXIgZm9yIHRoZSBcImNoZWNrZWRcIiBhdHRyaWJ1dGUsIGFuZCBcImRpc2FibGVkXCIuXG4gICAgICovXG4gICAgSU5QVVQ6IGZ1bmN0aW9uKGZyb21FbCwgdG9FbCkge1xuICAgICAgICBzeW5jQm9vbGVhbkF0dHJQcm9wKGZyb21FbCwgdG9FbCwgJ2NoZWNrZWQnKTtcbiAgICAgICAgc3luY0Jvb2xlYW5BdHRyUHJvcChmcm9tRWwsIHRvRWwsICdkaXNhYmxlZCcpO1xuXG4gICAgICAgIGlmIChmcm9tRWwudmFsdWUgIT09IHRvRWwudmFsdWUpIHtcbiAgICAgICAgICAgIGZyb21FbC52YWx1ZSA9IHRvRWwudmFsdWU7XG4gICAgICAgIH1cblxuICAgICAgICBpZiAoIXRvRWwuaGFzQXR0cmlidXRlKCd2YWx1ZScpKSB7XG4gICAgICAgICAgICBmcm9tRWwucmVtb3ZlQXR0cmlidXRlKCd2YWx1ZScpO1xuICAgICAgICB9XG4gICAgfSxcblxuICAgIFRFWFRBUkVBOiBmdW5jdGlvbihmcm9tRWwsIHRvRWwpIHtcbiAgICAgICAgdmFyIG5ld1ZhbHVlID0gdG9FbC52YWx1ZTtcbiAgICAgICAgaWYgKGZyb21FbC52YWx1ZSAhPT0gbmV3VmFsdWUpIHtcbiAgICAgICAgICAgIGZyb21FbC52YWx1ZSA9IG5ld1ZhbHVlO1xuICAgICAgICB9XG5cbiAgICAgICAgdmFyIGZpcnN0Q2hpbGQgPSBmcm9tRWwuZmlyc3RDaGlsZDtcbiAgICAgICAgaWYgKGZpcnN0Q2hpbGQpIHtcbiAgICAgICAgICAgIC8vIE5lZWRlZCBmb3IgSUUuIEFwcGFyZW50bHkgSUUgc2V0cyB0aGUgcGxhY2Vob2xkZXIgYXMgdGhlXG4gICAgICAgICAgICAvLyBub2RlIHZhbHVlIGFuZCB2aXNlIHZlcnNhLiBUaGlzIGlnbm9yZXMgYW4gZW1wdHkgdXBkYXRlLlxuICAgICAgICAgICAgdmFyIG9sZFZhbHVlID0gZmlyc3RDaGlsZC5ub2RlVmFsdWU7XG5cbiAgICAgICAgICAgIGlmIChvbGRWYWx1ZSA9PSBuZXdWYWx1ZSB8fCAoIW5ld1ZhbHVlICYmIG9sZFZhbHVlID09IGZyb21FbC5wbGFjZWhvbGRlcikpIHtcbiAgICAgICAgICAgICAgICByZXR1cm47XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIGZpcnN0Q2hpbGQubm9kZVZhbHVlID0gbmV3VmFsdWU7XG4gICAgICAgIH1cbiAgICB9LFxuICAgIFNFTEVDVDogZnVuY3Rpb24oZnJvbUVsLCB0b0VsKSB7XG4gICAgICAgIGlmICghdG9FbC5oYXNBdHRyaWJ1dGUoJ211bHRpcGxlJykpIHtcbiAgICAgICAgICAgIHZhciBzZWxlY3RlZEluZGV4ID0gLTE7XG4gICAgICAgICAgICB2YXIgaSA9IDA7XG4gICAgICAgICAgICAvLyBXZSBoYXZlIHRvIGxvb3AgdGhyb3VnaCBjaGlsZHJlbiBvZiBmcm9tRWwsIG5vdCB0b0VsIHNpbmNlIG5vZGVzIGNhbiBiZSBtb3ZlZFxuICAgICAgICAgICAgLy8gZnJvbSB0b0VsIHRvIGZyb21FbCBkaXJlY3RseSB3aGVuIG1vcnBoaW5nLlxuICAgICAgICAgICAgLy8gQXQgdGhlIHRpbWUgdGhpcyBzcGVjaWFsIGhhbmRsZXIgaXMgaW52b2tlZCwgYWxsIGNoaWxkcmVuIGhhdmUgYWxyZWFkeSBiZWVuIG1vcnBoZWRcbiAgICAgICAgICAgIC8vIGFuZCBhcHBlbmRlZCB0byAvIHJlbW92ZWQgZnJvbSBmcm9tRWwsIHNvIHVzaW5nIGZyb21FbCBoZXJlIGlzIHNhZmUgYW5kIGNvcnJlY3QuXG4gICAgICAgICAgICB2YXIgY3VyQ2hpbGQgPSBmcm9tRWwuZmlyc3RDaGlsZDtcbiAgICAgICAgICAgIHZhciBvcHRncm91cDtcbiAgICAgICAgICAgIHZhciBub2RlTmFtZTtcbiAgICAgICAgICAgIHdoaWxlKGN1ckNoaWxkKSB7XG4gICAgICAgICAgICAgICAgbm9kZU5hbWUgPSBjdXJDaGlsZC5ub2RlTmFtZSAmJiBjdXJDaGlsZC5ub2RlTmFtZS50b1VwcGVyQ2FzZSgpO1xuICAgICAgICAgICAgICAgIGlmIChub2RlTmFtZSA9PT0gJ09QVEdST1VQJykge1xuICAgICAgICAgICAgICAgICAgICBvcHRncm91cCA9IGN1ckNoaWxkO1xuICAgICAgICAgICAgICAgICAgICBjdXJDaGlsZCA9IG9wdGdyb3VwLmZpcnN0Q2hpbGQ7XG4gICAgICAgICAgICAgICAgICAgIC8vIGhhbmRsZSBlbXB0eSBvcHRncm91cHNcbiAgICAgICAgICAgICAgICAgICAgaWYgKCFjdXJDaGlsZCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgY3VyQ2hpbGQgPSBvcHRncm91cC5uZXh0U2libGluZztcbiAgICAgICAgICAgICAgICAgICAgICAgIG9wdGdyb3VwID0gbnVsbDtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgIGlmIChub2RlTmFtZSA9PT0gJ09QVElPTicpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGlmIChjdXJDaGlsZC5oYXNBdHRyaWJ1dGUoJ3NlbGVjdGVkJykpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZWxlY3RlZEluZGV4ID0gaTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgIGkrKztcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICBjdXJDaGlsZCA9IGN1ckNoaWxkLm5leHRTaWJsaW5nO1xuICAgICAgICAgICAgICAgICAgICBpZiAoIWN1ckNoaWxkICYmIG9wdGdyb3VwKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBjdXJDaGlsZCA9IG9wdGdyb3VwLm5leHRTaWJsaW5nO1xuICAgICAgICAgICAgICAgICAgICAgICAgb3B0Z3JvdXAgPSBudWxsO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBmcm9tRWwuc2VsZWN0ZWRJbmRleCA9IHNlbGVjdGVkSW5kZXg7XG4gICAgICAgIH1cbiAgICB9XG59O1xuXG52YXIgRUxFTUVOVF9OT0RFID0gMTtcbnZhciBET0NVTUVOVF9GUkFHTUVOVF9OT0RFJDEgPSAxMTtcbnZhciBURVhUX05PREUgPSAzO1xudmFyIENPTU1FTlRfTk9ERSA9IDg7XG5cbmZ1bmN0aW9uIG5vb3AoKSB7fVxuXG5mdW5jdGlvbiBkZWZhdWx0R2V0Tm9kZUtleShub2RlKSB7XG4gIGlmIChub2RlKSB7XG4gICAgcmV0dXJuIChub2RlLmdldEF0dHJpYnV0ZSAmJiBub2RlLmdldEF0dHJpYnV0ZSgnaWQnKSkgfHwgbm9kZS5pZDtcbiAgfVxufVxuXG5mdW5jdGlvbiBtb3JwaGRvbUZhY3RvcnkobW9ycGhBdHRycykge1xuXG4gIHJldHVybiBmdW5jdGlvbiBtb3JwaGRvbShmcm9tTm9kZSwgdG9Ob2RlLCBvcHRpb25zKSB7XG4gICAgaWYgKCFvcHRpb25zKSB7XG4gICAgICBvcHRpb25zID0ge307XG4gICAgfVxuXG4gICAgaWYgKHR5cGVvZiB0b05vZGUgPT09ICdzdHJpbmcnKSB7XG4gICAgICBpZiAoZnJvbU5vZGUubm9kZU5hbWUgPT09ICcjZG9jdW1lbnQnIHx8IGZyb21Ob2RlLm5vZGVOYW1lID09PSAnSFRNTCcgfHwgZnJvbU5vZGUubm9kZU5hbWUgPT09ICdCT0RZJykge1xuICAgICAgICB2YXIgdG9Ob2RlSHRtbCA9IHRvTm9kZTtcbiAgICAgICAgdG9Ob2RlID0gZG9jLmNyZWF0ZUVsZW1lbnQoJ2h0bWwnKTtcbiAgICAgICAgdG9Ob2RlLmlubmVySFRNTCA9IHRvTm9kZUh0bWw7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICB0b05vZGUgPSB0b0VsZW1lbnQodG9Ob2RlKTtcbiAgICAgIH1cbiAgICB9IGVsc2UgaWYgKHRvTm9kZS5ub2RlVHlwZSA9PT0gRE9DVU1FTlRfRlJBR01FTlRfTk9ERSQxKSB7XG4gICAgICB0b05vZGUgPSB0b05vZGUuZmlyc3RFbGVtZW50Q2hpbGQ7XG4gICAgfVxuXG4gICAgdmFyIGdldE5vZGVLZXkgPSBvcHRpb25zLmdldE5vZGVLZXkgfHwgZGVmYXVsdEdldE5vZGVLZXk7XG4gICAgdmFyIG9uQmVmb3JlTm9kZUFkZGVkID0gb3B0aW9ucy5vbkJlZm9yZU5vZGVBZGRlZCB8fCBub29wO1xuICAgIHZhciBvbk5vZGVBZGRlZCA9IG9wdGlvbnMub25Ob2RlQWRkZWQgfHwgbm9vcDtcbiAgICB2YXIgb25CZWZvcmVFbFVwZGF0ZWQgPSBvcHRpb25zLm9uQmVmb3JlRWxVcGRhdGVkIHx8IG5vb3A7XG4gICAgdmFyIG9uRWxVcGRhdGVkID0gb3B0aW9ucy5vbkVsVXBkYXRlZCB8fCBub29wO1xuICAgIHZhciBvbkJlZm9yZU5vZGVEaXNjYXJkZWQgPSBvcHRpb25zLm9uQmVmb3JlTm9kZURpc2NhcmRlZCB8fCBub29wO1xuICAgIHZhciBvbk5vZGVEaXNjYXJkZWQgPSBvcHRpb25zLm9uTm9kZURpc2NhcmRlZCB8fCBub29wO1xuICAgIHZhciBvbkJlZm9yZUVsQ2hpbGRyZW5VcGRhdGVkID0gb3B0aW9ucy5vbkJlZm9yZUVsQ2hpbGRyZW5VcGRhdGVkIHx8IG5vb3A7XG4gICAgdmFyIHNraXBGcm9tQ2hpbGRyZW4gPSBvcHRpb25zLnNraXBGcm9tQ2hpbGRyZW4gfHwgbm9vcDtcbiAgICB2YXIgYWRkQ2hpbGQgPSBvcHRpb25zLmFkZENoaWxkIHx8IGZ1bmN0aW9uKHBhcmVudCwgY2hpbGQpeyByZXR1cm4gcGFyZW50LmFwcGVuZENoaWxkKGNoaWxkKTsgfTtcbiAgICB2YXIgY2hpbGRyZW5Pbmx5ID0gb3B0aW9ucy5jaGlsZHJlbk9ubHkgPT09IHRydWU7XG5cbiAgICAvLyBUaGlzIG9iamVjdCBpcyB1c2VkIGFzIGEgbG9va3VwIHRvIHF1aWNrbHkgZmluZCBhbGwga2V5ZWQgZWxlbWVudHMgaW4gdGhlIG9yaWdpbmFsIERPTSB0cmVlLlxuICAgIHZhciBmcm9tTm9kZXNMb29rdXAgPSBPYmplY3QuY3JlYXRlKG51bGwpO1xuICAgIHZhciBrZXllZFJlbW92YWxMaXN0ID0gW107XG5cbiAgICBmdW5jdGlvbiBhZGRLZXllZFJlbW92YWwoa2V5KSB7XG4gICAgICBrZXllZFJlbW92YWxMaXN0LnB1c2goa2V5KTtcbiAgICB9XG5cbiAgICBmdW5jdGlvbiB3YWxrRGlzY2FyZGVkQ2hpbGROb2Rlcyhub2RlLCBza2lwS2V5ZWROb2Rlcykge1xuICAgICAgaWYgKG5vZGUubm9kZVR5cGUgPT09IEVMRU1FTlRfTk9ERSkge1xuICAgICAgICB2YXIgY3VyQ2hpbGQgPSBub2RlLmZpcnN0Q2hpbGQ7XG4gICAgICAgIHdoaWxlIChjdXJDaGlsZCkge1xuXG4gICAgICAgICAgdmFyIGtleSA9IHVuZGVmaW5lZDtcblxuICAgICAgICAgIGlmIChza2lwS2V5ZWROb2RlcyAmJiAoa2V5ID0gZ2V0Tm9kZUtleShjdXJDaGlsZCkpKSB7XG4gICAgICAgICAgICAvLyBJZiB3ZSBhcmUgc2tpcHBpbmcga2V5ZWQgbm9kZXMgdGhlbiB3ZSBhZGQgdGhlIGtleVxuICAgICAgICAgICAgLy8gdG8gYSBsaXN0IHNvIHRoYXQgaXQgY2FuIGJlIGhhbmRsZWQgYXQgdGhlIHZlcnkgZW5kLlxuICAgICAgICAgICAgYWRkS2V5ZWRSZW1vdmFsKGtleSk7XG4gICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIC8vIE9ubHkgcmVwb3J0IHRoZSBub2RlIGFzIGRpc2NhcmRlZCBpZiBpdCBpcyBub3Qga2V5ZWQuIFdlIGRvIHRoaXMgYmVjYXVzZVxuICAgICAgICAgICAgLy8gYXQgdGhlIGVuZCB3ZSBsb29wIHRocm91Z2ggYWxsIGtleWVkIGVsZW1lbnRzIHRoYXQgd2VyZSB1bm1hdGNoZWRcbiAgICAgICAgICAgIC8vIGFuZCB0aGVuIGRpc2NhcmQgdGhlbSBpbiBvbmUgZmluYWwgcGFzcy5cbiAgICAgICAgICAgIG9uTm9kZURpc2NhcmRlZChjdXJDaGlsZCk7XG4gICAgICAgICAgICBpZiAoY3VyQ2hpbGQuZmlyc3RDaGlsZCkge1xuICAgICAgICAgICAgICB3YWxrRGlzY2FyZGVkQ2hpbGROb2RlcyhjdXJDaGlsZCwgc2tpcEtleWVkTm9kZXMpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgIH1cblxuICAgICAgICAgIGN1ckNoaWxkID0gY3VyQ2hpbGQubmV4dFNpYmxpbmc7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9XG5cbiAgICAvKipcbiAgICAqIFJlbW92ZXMgYSBET00gbm9kZSBvdXQgb2YgdGhlIG9yaWdpbmFsIERPTVxuICAgICpcbiAgICAqIEBwYXJhbSAge05vZGV9IG5vZGUgVGhlIG5vZGUgdG8gcmVtb3ZlXG4gICAgKiBAcGFyYW0gIHtOb2RlfSBwYXJlbnROb2RlIFRoZSBub2RlcyBwYXJlbnRcbiAgICAqIEBwYXJhbSAge0Jvb2xlYW59IHNraXBLZXllZE5vZGVzIElmIHRydWUgdGhlbiBlbGVtZW50cyB3aXRoIGtleXMgd2lsbCBiZSBza2lwcGVkIGFuZCBub3QgZGlzY2FyZGVkLlxuICAgICogQHJldHVybiB7dW5kZWZpbmVkfVxuICAgICovXG4gICAgZnVuY3Rpb24gcmVtb3ZlTm9kZShub2RlLCBwYXJlbnROb2RlLCBza2lwS2V5ZWROb2Rlcykge1xuICAgICAgaWYgKG9uQmVmb3JlTm9kZURpc2NhcmRlZChub2RlKSA9PT0gZmFsc2UpIHtcbiAgICAgICAgcmV0dXJuO1xuICAgICAgfVxuXG4gICAgICBpZiAocGFyZW50Tm9kZSkge1xuICAgICAgICBwYXJlbnROb2RlLnJlbW92ZUNoaWxkKG5vZGUpO1xuICAgICAgfVxuXG4gICAgICBvbk5vZGVEaXNjYXJkZWQobm9kZSk7XG4gICAgICB3YWxrRGlzY2FyZGVkQ2hpbGROb2Rlcyhub2RlLCBza2lwS2V5ZWROb2Rlcyk7XG4gICAgfVxuXG4gICAgLy8gLy8gVHJlZVdhbGtlciBpbXBsZW1lbnRhdGlvbiBpcyBubyBmYXN0ZXIsIGJ1dCBrZWVwaW5nIHRoaXMgYXJvdW5kIGluIGNhc2UgdGhpcyBjaGFuZ2VzIGluIHRoZSBmdXR1cmVcbiAgICAvLyBmdW5jdGlvbiBpbmRleFRyZWUocm9vdCkge1xuICAgIC8vICAgICB2YXIgdHJlZVdhbGtlciA9IGRvY3VtZW50LmNyZWF0ZVRyZWVXYWxrZXIoXG4gICAgLy8gICAgICAgICByb290LFxuICAgIC8vICAgICAgICAgTm9kZUZpbHRlci5TSE9XX0VMRU1FTlQpO1xuICAgIC8vXG4gICAgLy8gICAgIHZhciBlbDtcbiAgICAvLyAgICAgd2hpbGUoKGVsID0gdHJlZVdhbGtlci5uZXh0Tm9kZSgpKSkge1xuICAgIC8vICAgICAgICAgdmFyIGtleSA9IGdldE5vZGVLZXkoZWwpO1xuICAgIC8vICAgICAgICAgaWYgKGtleSkge1xuICAgIC8vICAgICAgICAgICAgIGZyb21Ob2Rlc0xvb2t1cFtrZXldID0gZWw7XG4gICAgLy8gICAgICAgICB9XG4gICAgLy8gICAgIH1cbiAgICAvLyB9XG5cbiAgICAvLyAvLyBOb2RlSXRlcmF0b3IgaW1wbGVtZW50YXRpb24gaXMgbm8gZmFzdGVyLCBidXQga2VlcGluZyB0aGlzIGFyb3VuZCBpbiBjYXNlIHRoaXMgY2hhbmdlcyBpbiB0aGUgZnV0dXJlXG4gICAgLy9cbiAgICAvLyBmdW5jdGlvbiBpbmRleFRyZWUobm9kZSkge1xuICAgIC8vICAgICB2YXIgbm9kZUl0ZXJhdG9yID0gZG9jdW1lbnQuY3JlYXRlTm9kZUl0ZXJhdG9yKG5vZGUsIE5vZGVGaWx0ZXIuU0hPV19FTEVNRU5UKTtcbiAgICAvLyAgICAgdmFyIGVsO1xuICAgIC8vICAgICB3aGlsZSgoZWwgPSBub2RlSXRlcmF0b3IubmV4dE5vZGUoKSkpIHtcbiAgICAvLyAgICAgICAgIHZhciBrZXkgPSBnZXROb2RlS2V5KGVsKTtcbiAgICAvLyAgICAgICAgIGlmIChrZXkpIHtcbiAgICAvLyAgICAgICAgICAgICBmcm9tTm9kZXNMb29rdXBba2V5XSA9IGVsO1xuICAgIC8vICAgICAgICAgfVxuICAgIC8vICAgICB9XG4gICAgLy8gfVxuXG4gICAgZnVuY3Rpb24gaW5kZXhUcmVlKG5vZGUpIHtcbiAgICAgIGlmIChub2RlLm5vZGVUeXBlID09PSBFTEVNRU5UX05PREUgfHwgbm9kZS5ub2RlVHlwZSA9PT0gRE9DVU1FTlRfRlJBR01FTlRfTk9ERSQxKSB7XG4gICAgICAgIHZhciBjdXJDaGlsZCA9IG5vZGUuZmlyc3RDaGlsZDtcbiAgICAgICAgd2hpbGUgKGN1ckNoaWxkKSB7XG4gICAgICAgICAgdmFyIGtleSA9IGdldE5vZGVLZXkoY3VyQ2hpbGQpO1xuICAgICAgICAgIGlmIChrZXkpIHtcbiAgICAgICAgICAgIGZyb21Ob2Rlc0xvb2t1cFtrZXldID0gY3VyQ2hpbGQ7XG4gICAgICAgICAgfVxuXG4gICAgICAgICAgLy8gV2FsayByZWN1cnNpdmVseVxuICAgICAgICAgIGluZGV4VHJlZShjdXJDaGlsZCk7XG5cbiAgICAgICAgICBjdXJDaGlsZCA9IGN1ckNoaWxkLm5leHRTaWJsaW5nO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfVxuXG4gICAgaW5kZXhUcmVlKGZyb21Ob2RlKTtcblxuICAgIGZ1bmN0aW9uIGhhbmRsZU5vZGVBZGRlZChlbCkge1xuICAgICAgb25Ob2RlQWRkZWQoZWwpO1xuXG4gICAgICB2YXIgY3VyQ2hpbGQgPSBlbC5maXJzdENoaWxkO1xuICAgICAgd2hpbGUgKGN1ckNoaWxkKSB7XG4gICAgICAgIHZhciBuZXh0U2libGluZyA9IGN1ckNoaWxkLm5leHRTaWJsaW5nO1xuXG4gICAgICAgIHZhciBrZXkgPSBnZXROb2RlS2V5KGN1ckNoaWxkKTtcbiAgICAgICAgaWYgKGtleSkge1xuICAgICAgICAgIHZhciB1bm1hdGNoZWRGcm9tRWwgPSBmcm9tTm9kZXNMb29rdXBba2V5XTtcbiAgICAgICAgICAvLyBpZiB3ZSBmaW5kIGEgZHVwbGljYXRlICNpZCBub2RlIGluIGNhY2hlLCByZXBsYWNlIGBlbGAgd2l0aCBjYWNoZSB2YWx1ZVxuICAgICAgICAgIC8vIGFuZCBtb3JwaCBpdCB0byB0aGUgY2hpbGQgbm9kZS5cbiAgICAgICAgICBpZiAodW5tYXRjaGVkRnJvbUVsICYmIGNvbXBhcmVOb2RlTmFtZXMoY3VyQ2hpbGQsIHVubWF0Y2hlZEZyb21FbCkpIHtcbiAgICAgICAgICAgIGN1ckNoaWxkLnBhcmVudE5vZGUucmVwbGFjZUNoaWxkKHVubWF0Y2hlZEZyb21FbCwgY3VyQ2hpbGQpO1xuICAgICAgICAgICAgbW9ycGhFbCh1bm1hdGNoZWRGcm9tRWwsIGN1ckNoaWxkKTtcbiAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgaGFuZGxlTm9kZUFkZGVkKGN1ckNoaWxkKTtcbiAgICAgICAgICB9XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgLy8gcmVjdXJzaXZlbHkgY2FsbCBmb3IgY3VyQ2hpbGQgYW5kIGl0J3MgY2hpbGRyZW4gdG8gc2VlIGlmIHdlIGZpbmQgc29tZXRoaW5nIGluXG4gICAgICAgICAgLy8gZnJvbU5vZGVzTG9va3VwXG4gICAgICAgICAgaGFuZGxlTm9kZUFkZGVkKGN1ckNoaWxkKTtcbiAgICAgICAgfVxuXG4gICAgICAgIGN1ckNoaWxkID0gbmV4dFNpYmxpbmc7XG4gICAgICB9XG4gICAgfVxuXG4gICAgZnVuY3Rpb24gY2xlYW51cEZyb21FbChmcm9tRWwsIGN1ckZyb21Ob2RlQ2hpbGQsIGN1ckZyb21Ob2RlS2V5KSB7XG4gICAgICAvLyBXZSBoYXZlIHByb2Nlc3NlZCBhbGwgb2YgdGhlIFwidG8gbm9kZXNcIi4gSWYgY3VyRnJvbU5vZGVDaGlsZCBpc1xuICAgICAgLy8gbm9uLW51bGwgdGhlbiB3ZSBzdGlsbCBoYXZlIHNvbWUgZnJvbSBub2RlcyBsZWZ0IG92ZXIgdGhhdCBuZWVkXG4gICAgICAvLyB0byBiZSByZW1vdmVkXG4gICAgICB3aGlsZSAoY3VyRnJvbU5vZGVDaGlsZCkge1xuICAgICAgICB2YXIgZnJvbU5leHRTaWJsaW5nID0gY3VyRnJvbU5vZGVDaGlsZC5uZXh0U2libGluZztcbiAgICAgICAgaWYgKChjdXJGcm9tTm9kZUtleSA9IGdldE5vZGVLZXkoY3VyRnJvbU5vZGVDaGlsZCkpKSB7XG4gICAgICAgICAgLy8gU2luY2UgdGhlIG5vZGUgaXMga2V5ZWQgaXQgbWlnaHQgYmUgbWF0Y2hlZCB1cCBsYXRlciBzbyB3ZSBkZWZlclxuICAgICAgICAgIC8vIHRoZSBhY3R1YWwgcmVtb3ZhbCB0byBsYXRlclxuICAgICAgICAgIGFkZEtleWVkUmVtb3ZhbChjdXJGcm9tTm9kZUtleSk7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgLy8gTk9URTogd2Ugc2tpcCBuZXN0ZWQga2V5ZWQgbm9kZXMgZnJvbSBiZWluZyByZW1vdmVkIHNpbmNlIHRoZXJlIGlzXG4gICAgICAgICAgLy8gICAgICAgc3RpbGwgYSBjaGFuY2UgdGhleSB3aWxsIGJlIG1hdGNoZWQgdXAgbGF0ZXJcbiAgICAgICAgICByZW1vdmVOb2RlKGN1ckZyb21Ob2RlQ2hpbGQsIGZyb21FbCwgdHJ1ZSAvKiBza2lwIGtleWVkIG5vZGVzICovKTtcbiAgICAgICAgfVxuICAgICAgICBjdXJGcm9tTm9kZUNoaWxkID0gZnJvbU5leHRTaWJsaW5nO1xuICAgICAgfVxuICAgIH1cblxuICAgIGZ1bmN0aW9uIG1vcnBoRWwoZnJvbUVsLCB0b0VsLCBjaGlsZHJlbk9ubHkpIHtcbiAgICAgIHZhciB0b0VsS2V5ID0gZ2V0Tm9kZUtleSh0b0VsKTtcblxuICAgICAgaWYgKHRvRWxLZXkpIHtcbiAgICAgICAgLy8gSWYgYW4gZWxlbWVudCB3aXRoIGFuIElEIGlzIGJlaW5nIG1vcnBoZWQgdGhlbiBpdCB3aWxsIGJlIGluIHRoZSBmaW5hbFxuICAgICAgICAvLyBET00gc28gY2xlYXIgaXQgb3V0IG9mIHRoZSBzYXZlZCBlbGVtZW50cyBjb2xsZWN0aW9uXG4gICAgICAgIGRlbGV0ZSBmcm9tTm9kZXNMb29rdXBbdG9FbEtleV07XG4gICAgICB9XG5cbiAgICAgIGlmICghY2hpbGRyZW5Pbmx5KSB7XG4gICAgICAgIC8vIG9wdGlvbmFsXG4gICAgICAgIHZhciBiZWZvcmVVcGRhdGVSZXN1bHQgPSBvbkJlZm9yZUVsVXBkYXRlZChmcm9tRWwsIHRvRWwpO1xuICAgICAgICBpZiAoYmVmb3JlVXBkYXRlUmVzdWx0ID09PSBmYWxzZSkge1xuICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfSBlbHNlIGlmIChiZWZvcmVVcGRhdGVSZXN1bHQgaW5zdGFuY2VvZiBIVE1MRWxlbWVudCkge1xuICAgICAgICAgIGZyb21FbCA9IGJlZm9yZVVwZGF0ZVJlc3VsdDtcbiAgICAgICAgICAvLyByZWluZGV4IHRoZSBuZXcgZnJvbUVsIGluIGNhc2UgaXQncyBub3QgaW4gdGhlIHNhbWVcbiAgICAgICAgICAvLyB0cmVlIGFzIHRoZSBvcmlnaW5hbCBmcm9tRWxcbiAgICAgICAgICAvLyAoUGhvZW5peCBMaXZlVmlldyBzb21ldGltZXMgcmV0dXJucyBhIGNsb25lZCB0cmVlLFxuICAgICAgICAgIC8vICBidXQga2V5ZWQgbG9va3VwcyB3b3VsZCBzdGlsbCBwb2ludCB0byB0aGUgb3JpZ2luYWwgdHJlZSlcbiAgICAgICAgICBpbmRleFRyZWUoZnJvbUVsKTtcbiAgICAgICAgfVxuXG4gICAgICAgIC8vIHVwZGF0ZSBhdHRyaWJ1dGVzIG9uIG9yaWdpbmFsIERPTSBlbGVtZW50IGZpcnN0XG4gICAgICAgIG1vcnBoQXR0cnMoZnJvbUVsLCB0b0VsKTtcbiAgICAgICAgLy8gb3B0aW9uYWxcbiAgICAgICAgb25FbFVwZGF0ZWQoZnJvbUVsKTtcblxuICAgICAgICBpZiAob25CZWZvcmVFbENoaWxkcmVuVXBkYXRlZChmcm9tRWwsIHRvRWwpID09PSBmYWxzZSkge1xuICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuICAgICAgfVxuXG4gICAgICBpZiAoZnJvbUVsLm5vZGVOYW1lICE9PSAnVEVYVEFSRUEnKSB7XG4gICAgICAgIG1vcnBoQ2hpbGRyZW4oZnJvbUVsLCB0b0VsKTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHNwZWNpYWxFbEhhbmRsZXJzLlRFWFRBUkVBKGZyb21FbCwgdG9FbCk7XG4gICAgICB9XG4gICAgfVxuXG4gICAgZnVuY3Rpb24gbW9ycGhDaGlsZHJlbihmcm9tRWwsIHRvRWwpIHtcbiAgICAgIHZhciBza2lwRnJvbSA9IHNraXBGcm9tQ2hpbGRyZW4oZnJvbUVsLCB0b0VsKTtcbiAgICAgIHZhciBjdXJUb05vZGVDaGlsZCA9IHRvRWwuZmlyc3RDaGlsZDtcbiAgICAgIHZhciBjdXJGcm9tTm9kZUNoaWxkID0gZnJvbUVsLmZpcnN0Q2hpbGQ7XG4gICAgICB2YXIgY3VyVG9Ob2RlS2V5O1xuICAgICAgdmFyIGN1ckZyb21Ob2RlS2V5O1xuXG4gICAgICB2YXIgZnJvbU5leHRTaWJsaW5nO1xuICAgICAgdmFyIHRvTmV4dFNpYmxpbmc7XG4gICAgICB2YXIgbWF0Y2hpbmdGcm9tRWw7XG5cbiAgICAgIC8vIHdhbGsgdGhlIGNoaWxkcmVuXG4gICAgICBvdXRlcjogd2hpbGUgKGN1clRvTm9kZUNoaWxkKSB7XG4gICAgICAgIHRvTmV4dFNpYmxpbmcgPSBjdXJUb05vZGVDaGlsZC5uZXh0U2libGluZztcbiAgICAgICAgY3VyVG9Ob2RlS2V5ID0gZ2V0Tm9kZUtleShjdXJUb05vZGVDaGlsZCk7XG5cbiAgICAgICAgLy8gd2FsayB0aGUgZnJvbU5vZGUgY2hpbGRyZW4gYWxsIHRoZSB3YXkgdGhyb3VnaFxuICAgICAgICB3aGlsZSAoIXNraXBGcm9tICYmIGN1ckZyb21Ob2RlQ2hpbGQpIHtcbiAgICAgICAgICBmcm9tTmV4dFNpYmxpbmcgPSBjdXJGcm9tTm9kZUNoaWxkLm5leHRTaWJsaW5nO1xuXG4gICAgICAgICAgaWYgKGN1clRvTm9kZUNoaWxkLmlzU2FtZU5vZGUgJiYgY3VyVG9Ob2RlQ2hpbGQuaXNTYW1lTm9kZShjdXJGcm9tTm9kZUNoaWxkKSkge1xuICAgICAgICAgICAgY3VyVG9Ob2RlQ2hpbGQgPSB0b05leHRTaWJsaW5nO1xuICAgICAgICAgICAgY3VyRnJvbU5vZGVDaGlsZCA9IGZyb21OZXh0U2libGluZztcbiAgICAgICAgICAgIGNvbnRpbnVlIG91dGVyO1xuICAgICAgICAgIH1cblxuICAgICAgICAgIGN1ckZyb21Ob2RlS2V5ID0gZ2V0Tm9kZUtleShjdXJGcm9tTm9kZUNoaWxkKTtcblxuICAgICAgICAgIHZhciBjdXJGcm9tTm9kZVR5cGUgPSBjdXJGcm9tTm9kZUNoaWxkLm5vZGVUeXBlO1xuXG4gICAgICAgICAgLy8gdGhpcyBtZWFucyBpZiB0aGUgY3VyRnJvbU5vZGVDaGlsZCBkb2VzbnQgaGF2ZSBhIG1hdGNoIHdpdGggdGhlIGN1clRvTm9kZUNoaWxkXG4gICAgICAgICAgdmFyIGlzQ29tcGF0aWJsZSA9IHVuZGVmaW5lZDtcblxuICAgICAgICAgIGlmIChjdXJGcm9tTm9kZVR5cGUgPT09IGN1clRvTm9kZUNoaWxkLm5vZGVUeXBlKSB7XG4gICAgICAgICAgICBpZiAoY3VyRnJvbU5vZGVUeXBlID09PSBFTEVNRU5UX05PREUpIHtcbiAgICAgICAgICAgICAgLy8gQm90aCBub2RlcyBiZWluZyBjb21wYXJlZCBhcmUgRWxlbWVudCBub2Rlc1xuXG4gICAgICAgICAgICAgIGlmIChjdXJUb05vZGVLZXkpIHtcbiAgICAgICAgICAgICAgICAvLyBUaGUgdGFyZ2V0IG5vZGUgaGFzIGEga2V5IHNvIHdlIHdhbnQgdG8gbWF0Y2ggaXQgdXAgd2l0aCB0aGUgY29ycmVjdCBlbGVtZW50XG4gICAgICAgICAgICAgICAgLy8gaW4gdGhlIG9yaWdpbmFsIERPTSB0cmVlXG4gICAgICAgICAgICAgICAgaWYgKGN1clRvTm9kZUtleSAhPT0gY3VyRnJvbU5vZGVLZXkpIHtcbiAgICAgICAgICAgICAgICAgIC8vIFRoZSBjdXJyZW50IGVsZW1lbnQgaW4gdGhlIG9yaWdpbmFsIERPTSB0cmVlIGRvZXMgbm90IGhhdmUgYSBtYXRjaGluZyBrZXkgc29cbiAgICAgICAgICAgICAgICAgIC8vIGxldCdzIGNoZWNrIG91ciBsb29rdXAgdG8gc2VlIGlmIHRoZXJlIGlzIGEgbWF0Y2hpbmcgZWxlbWVudCBpbiB0aGUgb3JpZ2luYWxcbiAgICAgICAgICAgICAgICAgIC8vIERPTSB0cmVlXG4gICAgICAgICAgICAgICAgICBpZiAoKG1hdGNoaW5nRnJvbUVsID0gZnJvbU5vZGVzTG9va3VwW2N1clRvTm9kZUtleV0pKSB7XG4gICAgICAgICAgICAgICAgICAgIGlmIChmcm9tTmV4dFNpYmxpbmcgPT09IG1hdGNoaW5nRnJvbUVsKSB7XG4gICAgICAgICAgICAgICAgICAgICAgLy8gU3BlY2lhbCBjYXNlIGZvciBzaW5nbGUgZWxlbWVudCByZW1vdmFscy4gVG8gYXZvaWQgcmVtb3ZpbmcgdGhlIG9yaWdpbmFsXG4gICAgICAgICAgICAgICAgICAgICAgLy8gRE9NIG5vZGUgb3V0IG9mIHRoZSB0cmVlIChzaW5jZSB0aGF0IGNhbiBicmVhayBDU1MgdHJhbnNpdGlvbnMsIGV0Yy4pLFxuICAgICAgICAgICAgICAgICAgICAgIC8vIHdlIHdpbGwgaW5zdGVhZCBkaXNjYXJkIHRoZSBjdXJyZW50IG5vZGUgYW5kIHdhaXQgdW50aWwgdGhlIG5leHRcbiAgICAgICAgICAgICAgICAgICAgICAvLyBpdGVyYXRpb24gdG8gcHJvcGVybHkgbWF0Y2ggdXAgdGhlIGtleWVkIHRhcmdldCBlbGVtZW50IHdpdGggaXRzIG1hdGNoaW5nXG4gICAgICAgICAgICAgICAgICAgICAgLy8gZWxlbWVudCBpbiB0aGUgb3JpZ2luYWwgdHJlZVxuICAgICAgICAgICAgICAgICAgICAgIGlzQ29tcGF0aWJsZSA9IGZhbHNlO1xuICAgICAgICAgICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICAgIC8vIFdlIGZvdW5kIGEgbWF0Y2hpbmcga2V5ZWQgZWxlbWVudCBzb21ld2hlcmUgaW4gdGhlIG9yaWdpbmFsIERPTSB0cmVlLlxuICAgICAgICAgICAgICAgICAgICAgIC8vIExldCdzIG1vdmUgdGhlIG9yaWdpbmFsIERPTSBub2RlIGludG8gdGhlIGN1cnJlbnQgcG9zaXRpb24gYW5kIG1vcnBoXG4gICAgICAgICAgICAgICAgICAgICAgLy8gaXQuXG5cbiAgICAgICAgICAgICAgICAgICAgICAvLyBOT1RFOiBXZSB1c2UgaW5zZXJ0QmVmb3JlIGluc3RlYWQgb2YgcmVwbGFjZUNoaWxkIGJlY2F1c2Ugd2Ugd2FudCB0byBnbyB0aHJvdWdoXG4gICAgICAgICAgICAgICAgICAgICAgLy8gdGhlIGByZW1vdmVOb2RlKClgIGZ1bmN0aW9uIGZvciB0aGUgbm9kZSB0aGF0IGlzIGJlaW5nIGRpc2NhcmRlZCBzbyB0aGF0XG4gICAgICAgICAgICAgICAgICAgICAgLy8gYWxsIGxpZmVjeWNsZSBob29rcyBhcmUgY29ycmVjdGx5IGludm9rZWRcbiAgICAgICAgICAgICAgICAgICAgICBmcm9tRWwuaW5zZXJ0QmVmb3JlKG1hdGNoaW5nRnJvbUVsLCBjdXJGcm9tTm9kZUNoaWxkKTtcblxuICAgICAgICAgICAgICAgICAgICAgIC8vIGZyb21OZXh0U2libGluZyA9IGN1ckZyb21Ob2RlQ2hpbGQubmV4dFNpYmxpbmc7XG5cbiAgICAgICAgICAgICAgICAgICAgICBpZiAoY3VyRnJvbU5vZGVLZXkpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIC8vIFNpbmNlIHRoZSBub2RlIGlzIGtleWVkIGl0IG1pZ2h0IGJlIG1hdGNoZWQgdXAgbGF0ZXIgc28gd2UgZGVmZXJcbiAgICAgICAgICAgICAgICAgICAgICAgIC8vIHRoZSBhY3R1YWwgcmVtb3ZhbCB0byBsYXRlclxuICAgICAgICAgICAgICAgICAgICAgICAgYWRkS2V5ZWRSZW1vdmFsKGN1ckZyb21Ob2RlS2V5KTtcbiAgICAgICAgICAgICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICAgICAgLy8gTk9URTogd2Ugc2tpcCBuZXN0ZWQga2V5ZWQgbm9kZXMgZnJvbSBiZWluZyByZW1vdmVkIHNpbmNlIHRoZXJlIGlzXG4gICAgICAgICAgICAgICAgICAgICAgICAvLyAgICAgICBzdGlsbCBhIGNoYW5jZSB0aGV5IHdpbGwgYmUgbWF0Y2hlZCB1cCBsYXRlclxuICAgICAgICAgICAgICAgICAgICAgICAgcmVtb3ZlTm9kZShjdXJGcm9tTm9kZUNoaWxkLCBmcm9tRWwsIHRydWUgLyogc2tpcCBrZXllZCBub2RlcyAqLyk7XG4gICAgICAgICAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgICAgICAgICAgY3VyRnJvbU5vZGVDaGlsZCA9IG1hdGNoaW5nRnJvbUVsO1xuICAgICAgICAgICAgICAgICAgICAgIGN1ckZyb21Ob2RlS2V5ID0gZ2V0Tm9kZUtleShjdXJGcm9tTm9kZUNoaWxkKTtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgLy8gVGhlIG5vZGVzIGFyZSBub3QgY29tcGF0aWJsZSBzaW5jZSB0aGUgXCJ0b1wiIG5vZGUgaGFzIGEga2V5IGFuZCB0aGVyZVxuICAgICAgICAgICAgICAgICAgICAvLyBpcyBubyBtYXRjaGluZyBrZXllZCBub2RlIGluIHRoZSBzb3VyY2UgdHJlZVxuICAgICAgICAgICAgICAgICAgICBpc0NvbXBhdGlibGUgPSBmYWxzZTtcbiAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgIH0gZWxzZSBpZiAoY3VyRnJvbU5vZGVLZXkpIHtcbiAgICAgICAgICAgICAgICAvLyBUaGUgb3JpZ2luYWwgaGFzIGEga2V5XG4gICAgICAgICAgICAgICAgaXNDb21wYXRpYmxlID0gZmFsc2U7XG4gICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICBpc0NvbXBhdGlibGUgPSBpc0NvbXBhdGlibGUgIT09IGZhbHNlICYmIGNvbXBhcmVOb2RlTmFtZXMoY3VyRnJvbU5vZGVDaGlsZCwgY3VyVG9Ob2RlQ2hpbGQpO1xuICAgICAgICAgICAgICBpZiAoaXNDb21wYXRpYmxlKSB7XG4gICAgICAgICAgICAgICAgLy8gV2UgZm91bmQgY29tcGF0aWJsZSBET00gZWxlbWVudHMgc28gdHJhbnNmb3JtXG4gICAgICAgICAgICAgICAgLy8gdGhlIGN1cnJlbnQgXCJmcm9tXCIgbm9kZSB0byBtYXRjaCB0aGUgY3VycmVudFxuICAgICAgICAgICAgICAgIC8vIHRhcmdldCBET00gbm9kZS5cbiAgICAgICAgICAgICAgICAvLyBNT1JQSFxuICAgICAgICAgICAgICAgIG1vcnBoRWwoY3VyRnJvbU5vZGVDaGlsZCwgY3VyVG9Ob2RlQ2hpbGQpO1xuICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIH0gZWxzZSBpZiAoY3VyRnJvbU5vZGVUeXBlID09PSBURVhUX05PREUgfHwgY3VyRnJvbU5vZGVUeXBlID09IENPTU1FTlRfTk9ERSkge1xuICAgICAgICAgICAgICAvLyBCb3RoIG5vZGVzIGJlaW5nIGNvbXBhcmVkIGFyZSBUZXh0IG9yIENvbW1lbnQgbm9kZXNcbiAgICAgICAgICAgICAgaXNDb21wYXRpYmxlID0gdHJ1ZTtcbiAgICAgICAgICAgICAgLy8gU2ltcGx5IHVwZGF0ZSBub2RlVmFsdWUgb24gdGhlIG9yaWdpbmFsIG5vZGUgdG9cbiAgICAgICAgICAgICAgLy8gY2hhbmdlIHRoZSB0ZXh0IHZhbHVlXG4gICAgICAgICAgICAgIGlmIChjdXJGcm9tTm9kZUNoaWxkLm5vZGVWYWx1ZSAhPT0gY3VyVG9Ob2RlQ2hpbGQubm9kZVZhbHVlKSB7XG4gICAgICAgICAgICAgICAgY3VyRnJvbU5vZGVDaGlsZC5ub2RlVmFsdWUgPSBjdXJUb05vZGVDaGlsZC5ub2RlVmFsdWU7XG4gICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgfVxuICAgICAgICAgIH1cblxuICAgICAgICAgIGlmIChpc0NvbXBhdGlibGUpIHtcbiAgICAgICAgICAgIC8vIEFkdmFuY2UgYm90aCB0aGUgXCJ0b1wiIGNoaWxkIGFuZCB0aGUgXCJmcm9tXCIgY2hpbGQgc2luY2Ugd2UgZm91bmQgYSBtYXRjaFxuICAgICAgICAgICAgLy8gTm90aGluZyBlbHNlIHRvIGRvIGFzIHdlIGFscmVhZHkgcmVjdXJzaXZlbHkgY2FsbGVkIG1vcnBoQ2hpbGRyZW4gYWJvdmVcbiAgICAgICAgICAgIGN1clRvTm9kZUNoaWxkID0gdG9OZXh0U2libGluZztcbiAgICAgICAgICAgIGN1ckZyb21Ob2RlQ2hpbGQgPSBmcm9tTmV4dFNpYmxpbmc7XG4gICAgICAgICAgICBjb250aW51ZSBvdXRlcjtcbiAgICAgICAgICB9XG5cbiAgICAgICAgICAvLyBObyBjb21wYXRpYmxlIG1hdGNoIHNvIHJlbW92ZSB0aGUgb2xkIG5vZGUgZnJvbSB0aGUgRE9NIGFuZCBjb250aW51ZSB0cnlpbmcgdG8gZmluZCBhXG4gICAgICAgICAgLy8gbWF0Y2ggaW4gdGhlIG9yaWdpbmFsIERPTS4gSG93ZXZlciwgd2Ugb25seSBkbyB0aGlzIGlmIHRoZSBmcm9tIG5vZGUgaXMgbm90IGtleWVkXG4gICAgICAgICAgLy8gc2luY2UgaXQgaXMgcG9zc2libGUgdGhhdCBhIGtleWVkIG5vZGUgbWlnaHQgbWF0Y2ggdXAgd2l0aCBhIG5vZGUgc29tZXdoZXJlIGVsc2UgaW4gdGhlXG4gICAgICAgICAgLy8gdGFyZ2V0IHRyZWUgYW5kIHdlIGRvbid0IHdhbnQgdG8gZGlzY2FyZCBpdCBqdXN0IHlldCBzaW5jZSBpdCBzdGlsbCBtaWdodCBmaW5kIGFcbiAgICAgICAgICAvLyBob21lIGluIHRoZSBmaW5hbCBET00gdHJlZS4gQWZ0ZXIgZXZlcnl0aGluZyBpcyBkb25lIHdlIHdpbGwgcmVtb3ZlIGFueSBrZXllZCBub2Rlc1xuICAgICAgICAgIC8vIHRoYXQgZGlkbid0IGZpbmQgYSBob21lXG4gICAgICAgICAgaWYgKGN1ckZyb21Ob2RlS2V5KSB7XG4gICAgICAgICAgICAvLyBTaW5jZSB0aGUgbm9kZSBpcyBrZXllZCBpdCBtaWdodCBiZSBtYXRjaGVkIHVwIGxhdGVyIHNvIHdlIGRlZmVyXG4gICAgICAgICAgICAvLyB0aGUgYWN0dWFsIHJlbW92YWwgdG8gbGF0ZXJcbiAgICAgICAgICAgIGFkZEtleWVkUmVtb3ZhbChjdXJGcm9tTm9kZUtleSk7XG4gICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIC8vIE5PVEU6IHdlIHNraXAgbmVzdGVkIGtleWVkIG5vZGVzIGZyb20gYmVpbmcgcmVtb3ZlZCBzaW5jZSB0aGVyZSBpc1xuICAgICAgICAgICAgLy8gICAgICAgc3RpbGwgYSBjaGFuY2UgdGhleSB3aWxsIGJlIG1hdGNoZWQgdXAgbGF0ZXJcbiAgICAgICAgICAgIHJlbW92ZU5vZGUoY3VyRnJvbU5vZGVDaGlsZCwgZnJvbUVsLCB0cnVlIC8qIHNraXAga2V5ZWQgbm9kZXMgKi8pO1xuICAgICAgICAgIH1cblxuICAgICAgICAgIGN1ckZyb21Ob2RlQ2hpbGQgPSBmcm9tTmV4dFNpYmxpbmc7XG4gICAgICAgIH0gLy8gRU5EOiB3aGlsZShjdXJGcm9tTm9kZUNoaWxkKSB7fVxuXG4gICAgICAgIC8vIElmIHdlIGdvdCB0aGlzIGZhciB0aGVuIHdlIGRpZCBub3QgZmluZCBhIGNhbmRpZGF0ZSBtYXRjaCBmb3JcbiAgICAgICAgLy8gb3VyIFwidG8gbm9kZVwiIGFuZCB3ZSBleGhhdXN0ZWQgYWxsIG9mIHRoZSBjaGlsZHJlbiBcImZyb21cIlxuICAgICAgICAvLyBub2Rlcy4gVGhlcmVmb3JlLCB3ZSB3aWxsIGp1c3QgYXBwZW5kIHRoZSBjdXJyZW50IFwidG9cIiBub2RlXG4gICAgICAgIC8vIHRvIHRoZSBlbmRcbiAgICAgICAgaWYgKGN1clRvTm9kZUtleSAmJiAobWF0Y2hpbmdGcm9tRWwgPSBmcm9tTm9kZXNMb29rdXBbY3VyVG9Ob2RlS2V5XSkgJiYgY29tcGFyZU5vZGVOYW1lcyhtYXRjaGluZ0Zyb21FbCwgY3VyVG9Ob2RlQ2hpbGQpKSB7XG4gICAgICAgICAgLy8gTU9SUEhcbiAgICAgICAgICBpZighc2tpcEZyb20peyBhZGRDaGlsZChmcm9tRWwsIG1hdGNoaW5nRnJvbUVsKTsgfVxuICAgICAgICAgIG1vcnBoRWwobWF0Y2hpbmdGcm9tRWwsIGN1clRvTm9kZUNoaWxkKTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICB2YXIgb25CZWZvcmVOb2RlQWRkZWRSZXN1bHQgPSBvbkJlZm9yZU5vZGVBZGRlZChjdXJUb05vZGVDaGlsZCk7XG4gICAgICAgICAgaWYgKG9uQmVmb3JlTm9kZUFkZGVkUmVzdWx0ICE9PSBmYWxzZSkge1xuICAgICAgICAgICAgaWYgKG9uQmVmb3JlTm9kZUFkZGVkUmVzdWx0KSB7XG4gICAgICAgICAgICAgIGN1clRvTm9kZUNoaWxkID0gb25CZWZvcmVOb2RlQWRkZWRSZXN1bHQ7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIGlmIChjdXJUb05vZGVDaGlsZC5hY3R1YWxpemUpIHtcbiAgICAgICAgICAgICAgY3VyVG9Ob2RlQ2hpbGQgPSBjdXJUb05vZGVDaGlsZC5hY3R1YWxpemUoZnJvbUVsLm93bmVyRG9jdW1lbnQgfHwgZG9jKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGFkZENoaWxkKGZyb21FbCwgY3VyVG9Ob2RlQ2hpbGQpO1xuICAgICAgICAgICAgaGFuZGxlTm9kZUFkZGVkKGN1clRvTm9kZUNoaWxkKTtcbiAgICAgICAgICB9XG4gICAgICAgIH1cblxuICAgICAgICBjdXJUb05vZGVDaGlsZCA9IHRvTmV4dFNpYmxpbmc7XG4gICAgICAgIGN1ckZyb21Ob2RlQ2hpbGQgPSBmcm9tTmV4dFNpYmxpbmc7XG4gICAgICB9XG5cbiAgICAgIGNsZWFudXBGcm9tRWwoZnJvbUVsLCBjdXJGcm9tTm9kZUNoaWxkLCBjdXJGcm9tTm9kZUtleSk7XG5cbiAgICAgIHZhciBzcGVjaWFsRWxIYW5kbGVyID0gc3BlY2lhbEVsSGFuZGxlcnNbZnJvbUVsLm5vZGVOYW1lXTtcbiAgICAgIGlmIChzcGVjaWFsRWxIYW5kbGVyKSB7XG4gICAgICAgIHNwZWNpYWxFbEhhbmRsZXIoZnJvbUVsLCB0b0VsKTtcbiAgICAgIH1cbiAgICB9IC8vIEVORDogbW9ycGhDaGlsZHJlbiguLi4pXG5cbiAgICB2YXIgbW9ycGhlZE5vZGUgPSBmcm9tTm9kZTtcbiAgICB2YXIgbW9ycGhlZE5vZGVUeXBlID0gbW9ycGhlZE5vZGUubm9kZVR5cGU7XG4gICAgdmFyIHRvTm9kZVR5cGUgPSB0b05vZGUubm9kZVR5cGU7XG5cbiAgICBpZiAoIWNoaWxkcmVuT25seSkge1xuICAgICAgLy8gSGFuZGxlIHRoZSBjYXNlIHdoZXJlIHdlIGFyZSBnaXZlbiB0d28gRE9NIG5vZGVzIHRoYXQgYXJlIG5vdFxuICAgICAgLy8gY29tcGF0aWJsZSAoZS5nLiA8ZGl2PiAtLT4gPHNwYW4+IG9yIDxkaXY+IC0tPiBURVhUKVxuICAgICAgaWYgKG1vcnBoZWROb2RlVHlwZSA9PT0gRUxFTUVOVF9OT0RFKSB7XG4gICAgICAgIGlmICh0b05vZGVUeXBlID09PSBFTEVNRU5UX05PREUpIHtcbiAgICAgICAgICBpZiAoIWNvbXBhcmVOb2RlTmFtZXMoZnJvbU5vZGUsIHRvTm9kZSkpIHtcbiAgICAgICAgICAgIG9uTm9kZURpc2NhcmRlZChmcm9tTm9kZSk7XG4gICAgICAgICAgICBtb3JwaGVkTm9kZSA9IG1vdmVDaGlsZHJlbihmcm9tTm9kZSwgY3JlYXRlRWxlbWVudE5TKHRvTm9kZS5ub2RlTmFtZSwgdG9Ob2RlLm5hbWVzcGFjZVVSSSkpO1xuICAgICAgICAgIH1cbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAvLyBHb2luZyBmcm9tIGFuIGVsZW1lbnQgbm9kZSB0byBhIHRleHQgbm9kZVxuICAgICAgICAgIG1vcnBoZWROb2RlID0gdG9Ob2RlO1xuICAgICAgICB9XG4gICAgICB9IGVsc2UgaWYgKG1vcnBoZWROb2RlVHlwZSA9PT0gVEVYVF9OT0RFIHx8IG1vcnBoZWROb2RlVHlwZSA9PT0gQ09NTUVOVF9OT0RFKSB7IC8vIFRleHQgb3IgY29tbWVudCBub2RlXG4gICAgICAgIGlmICh0b05vZGVUeXBlID09PSBtb3JwaGVkTm9kZVR5cGUpIHtcbiAgICAgICAgICBpZiAobW9ycGhlZE5vZGUubm9kZVZhbHVlICE9PSB0b05vZGUubm9kZVZhbHVlKSB7XG4gICAgICAgICAgICBtb3JwaGVkTm9kZS5ub2RlVmFsdWUgPSB0b05vZGUubm9kZVZhbHVlO1xuICAgICAgICAgIH1cblxuICAgICAgICAgIHJldHVybiBtb3JwaGVkTm9kZTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAvLyBUZXh0IG5vZGUgdG8gc29tZXRoaW5nIGVsc2VcbiAgICAgICAgICBtb3JwaGVkTm9kZSA9IHRvTm9kZTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH1cblxuICAgIGlmIChtb3JwaGVkTm9kZSA9PT0gdG9Ob2RlKSB7XG4gICAgICAvLyBUaGUgXCJ0byBub2RlXCIgd2FzIG5vdCBjb21wYXRpYmxlIHdpdGggdGhlIFwiZnJvbSBub2RlXCIgc28gd2UgaGFkIHRvXG4gICAgICAvLyB0b3NzIG91dCB0aGUgXCJmcm9tIG5vZGVcIiBhbmQgdXNlIHRoZSBcInRvIG5vZGVcIlxuICAgICAgb25Ob2RlRGlzY2FyZGVkKGZyb21Ob2RlKTtcbiAgICB9IGVsc2Uge1xuICAgICAgaWYgKHRvTm9kZS5pc1NhbWVOb2RlICYmIHRvTm9kZS5pc1NhbWVOb2RlKG1vcnBoZWROb2RlKSkge1xuICAgICAgICByZXR1cm47XG4gICAgICB9XG5cbiAgICAgIG1vcnBoRWwobW9ycGhlZE5vZGUsIHRvTm9kZSwgY2hpbGRyZW5Pbmx5KTtcblxuICAgICAgLy8gV2Ugbm93IG5lZWQgdG8gbG9vcCBvdmVyIGFueSBrZXllZCBub2RlcyB0aGF0IG1pZ2h0IG5lZWQgdG8gYmVcbiAgICAgIC8vIHJlbW92ZWQuIFdlIG9ubHkgZG8gdGhlIHJlbW92YWwgaWYgd2Uga25vdyB0aGF0IHRoZSBrZXllZCBub2RlXG4gICAgICAvLyBuZXZlciBmb3VuZCBhIG1hdGNoLiBXaGVuIGEga2V5ZWQgbm9kZSBpcyBtYXRjaGVkIHVwIHdlIHJlbW92ZVxuICAgICAgLy8gaXQgb3V0IG9mIGZyb21Ob2Rlc0xvb2t1cCBhbmQgd2UgdXNlIGZyb21Ob2Rlc0xvb2t1cCB0byBkZXRlcm1pbmVcbiAgICAgIC8vIGlmIGEga2V5ZWQgbm9kZSBoYXMgYmVlbiBtYXRjaGVkIHVwIG9yIG5vdFxuICAgICAgaWYgKGtleWVkUmVtb3ZhbExpc3QpIHtcbiAgICAgICAgZm9yICh2YXIgaT0wLCBsZW49a2V5ZWRSZW1vdmFsTGlzdC5sZW5ndGg7IGk8bGVuOyBpKyspIHtcbiAgICAgICAgICB2YXIgZWxUb1JlbW92ZSA9IGZyb21Ob2Rlc0xvb2t1cFtrZXllZFJlbW92YWxMaXN0W2ldXTtcbiAgICAgICAgICBpZiAoZWxUb1JlbW92ZSkge1xuICAgICAgICAgICAgcmVtb3ZlTm9kZShlbFRvUmVtb3ZlLCBlbFRvUmVtb3ZlLnBhcmVudE5vZGUsIGZhbHNlKTtcbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9XG5cbiAgICBpZiAoIWNoaWxkcmVuT25seSAmJiBtb3JwaGVkTm9kZSAhPT0gZnJvbU5vZGUgJiYgZnJvbU5vZGUucGFyZW50Tm9kZSkge1xuICAgICAgaWYgKG1vcnBoZWROb2RlLmFjdHVhbGl6ZSkge1xuICAgICAgICBtb3JwaGVkTm9kZSA9IG1vcnBoZWROb2RlLmFjdHVhbGl6ZShmcm9tTm9kZS5vd25lckRvY3VtZW50IHx8IGRvYyk7XG4gICAgICB9XG4gICAgICAvLyBJZiB3ZSBoYWQgdG8gc3dhcCBvdXQgdGhlIGZyb20gbm9kZSB3aXRoIGEgbmV3IG5vZGUgYmVjYXVzZSB0aGUgb2xkXG4gICAgICAvLyBub2RlIHdhcyBub3QgY29tcGF0aWJsZSB3aXRoIHRoZSB0YXJnZXQgbm9kZSB0aGVuIHdlIG5lZWQgdG9cbiAgICAgIC8vIHJlcGxhY2UgdGhlIG9sZCBET00gbm9kZSBpbiB0aGUgb3JpZ2luYWwgRE9NIHRyZWUuIFRoaXMgaXMgb25seVxuICAgICAgLy8gcG9zc2libGUgaWYgdGhlIG9yaWdpbmFsIERPTSBub2RlIHdhcyBwYXJ0IG9mIGEgRE9NIHRyZWUgd2hpY2hcbiAgICAgIC8vIHdlIGtub3cgaXMgdGhlIGNhc2UgaWYgaXQgaGFzIGEgcGFyZW50IG5vZGUuXG4gICAgICBmcm9tTm9kZS5wYXJlbnROb2RlLnJlcGxhY2VDaGlsZChtb3JwaGVkTm9kZSwgZnJvbU5vZGUpO1xuICAgIH1cblxuICAgIHJldHVybiBtb3JwaGVkTm9kZTtcbiAgfTtcbn1cblxudmFyIG1vcnBoZG9tID0gbW9ycGhkb21GYWN0b3J5KG1vcnBoQXR0cnMpO1xuXG5leHBvcnQgZGVmYXVsdCBtb3JwaGRvbTtcbiIsICJpbXBvcnQge1xuICBQSFhfQ09NUE9ORU5ULFxuICBQSFhfUFJVTkUsXG4gIFBIWF9ST09UX0lELFxuICBQSFhfU0VTU0lPTixcbiAgUEhYX1NLSVAsXG4gIFBIWF9NQUdJQ19JRCxcbiAgUEhYX1NUQVRJQyxcbiAgUEhYX1RSSUdHRVJfQUNUSU9OLFxuICBQSFhfVVBEQVRFLFxuICBQSFhfUkVGX1NSQyxcbiAgUEhYX1JFRl9MT0NLLFxuICBQSFhfU1RSRUFNLFxuICBQSFhfU1RSRUFNX1JFRixcbiAgUEhYX1ZJRVdQT1JUX1RPUCxcbiAgUEhYX1ZJRVdQT1JUX0JPVFRPTSxcbiAgUEhYX1BPUlRBTCxcbiAgUEhYX1RFTEVQT1JURURfUkVGLFxuICBQSFhfVEVMRVBPUlRFRF9TUkMsXG4gIFBIWF9SVU5USU1FX0hPT0ssXG59IGZyb20gXCIuL2NvbnN0YW50c1wiO1xuXG5pbXBvcnQgeyBkZXRlY3REdXBsaWNhdGVJZHMsIGRldGVjdEludmFsaWRTdHJlYW1JbnNlcnRzLCBpc0NpZCB9IGZyb20gXCIuL3V0aWxzXCI7XG5pbXBvcnQgRWxlbWVudFJlZiBmcm9tIFwiLi9lbGVtZW50X3JlZlwiO1xuaW1wb3J0IERPTSBmcm9tIFwiLi9kb21cIjtcbmltcG9ydCBET01Qb3N0TW9ycGhSZXN0b3JlciBmcm9tIFwiLi9kb21fcG9zdF9tb3JwaF9yZXN0b3JlclwiO1xuaW1wb3J0IG1vcnBoZG9tIGZyb20gXCJtb3JwaGRvbVwiO1xuXG5leHBvcnQgZGVmYXVsdCBjbGFzcyBET01QYXRjaCB7XG4gIGNvbnN0cnVjdG9yKHZpZXcsIGNvbnRhaW5lciwgaWQsIGh0bWwsIHN0cmVhbXMsIHRhcmdldENJRCwgb3B0cyA9IHt9KSB7XG4gICAgdGhpcy52aWV3ID0gdmlldztcbiAgICB0aGlzLmxpdmVTb2NrZXQgPSB2aWV3LmxpdmVTb2NrZXQ7XG4gICAgdGhpcy5jb250YWluZXIgPSBjb250YWluZXI7XG4gICAgdGhpcy5pZCA9IGlkO1xuICAgIHRoaXMucm9vdElEID0gdmlldy5yb290LmlkO1xuICAgIHRoaXMuaHRtbCA9IGh0bWw7XG4gICAgdGhpcy5zdHJlYW1zID0gc3RyZWFtcztcbiAgICB0aGlzLnN0cmVhbUluc2VydHMgPSB7fTtcbiAgICB0aGlzLnN0cmVhbUNvbXBvbmVudFJlc3RvcmUgPSB7fTtcbiAgICB0aGlzLnRhcmdldENJRCA9IHRhcmdldENJRDtcbiAgICB0aGlzLmNpZFBhdGNoID0gaXNDaWQodGhpcy50YXJnZXRDSUQpO1xuICAgIHRoaXMucGVuZGluZ1JlbW92ZXMgPSBbXTtcbiAgICB0aGlzLnBoeFJlbW92ZSA9IHRoaXMubGl2ZVNvY2tldC5iaW5kaW5nKFwicmVtb3ZlXCIpO1xuICAgIHRoaXMudGFyZ2V0Q29udGFpbmVyID0gdGhpcy5pc0NJRFBhdGNoKClcbiAgICAgID8gdGhpcy50YXJnZXRDSURDb250YWluZXIoaHRtbClcbiAgICAgIDogY29udGFpbmVyO1xuICAgIHRoaXMuY2FsbGJhY2tzID0ge1xuICAgICAgYmVmb3JlYWRkZWQ6IFtdLFxuICAgICAgYmVmb3JldXBkYXRlZDogW10sXG4gICAgICBiZWZvcmVwaHhDaGlsZEFkZGVkOiBbXSxcbiAgICAgIGFmdGVyYWRkZWQ6IFtdLFxuICAgICAgYWZ0ZXJ1cGRhdGVkOiBbXSxcbiAgICAgIGFmdGVyZGlzY2FyZGVkOiBbXSxcbiAgICAgIGFmdGVycGh4Q2hpbGRBZGRlZDogW10sXG4gICAgICBhZnRlcnRyYW5zaXRpb25zRGlzY2FyZGVkOiBbXSxcbiAgICB9O1xuICAgIHRoaXMud2l0aENoaWxkcmVuID0gb3B0cy53aXRoQ2hpbGRyZW4gfHwgb3B0cy51bmRvUmVmIHx8IGZhbHNlO1xuICAgIHRoaXMudW5kb1JlZiA9IG9wdHMudW5kb1JlZjtcbiAgfVxuXG4gIGJlZm9yZShraW5kLCBjYWxsYmFjaykge1xuICAgIHRoaXMuY2FsbGJhY2tzW2BiZWZvcmUke2tpbmR9YF0ucHVzaChjYWxsYmFjayk7XG4gIH1cbiAgYWZ0ZXIoa2luZCwgY2FsbGJhY2spIHtcbiAgICB0aGlzLmNhbGxiYWNrc1tgYWZ0ZXIke2tpbmR9YF0ucHVzaChjYWxsYmFjayk7XG4gIH1cblxuICB0cmFja0JlZm9yZShraW5kLCAuLi5hcmdzKSB7XG4gICAgdGhpcy5jYWxsYmFja3NbYGJlZm9yZSR7a2luZH1gXS5mb3JFYWNoKChjYWxsYmFjaykgPT4gY2FsbGJhY2soLi4uYXJncykpO1xuICB9XG5cbiAgdHJhY2tBZnRlcihraW5kLCAuLi5hcmdzKSB7XG4gICAgdGhpcy5jYWxsYmFja3NbYGFmdGVyJHtraW5kfWBdLmZvckVhY2goKGNhbGxiYWNrKSA9PiBjYWxsYmFjayguLi5hcmdzKSk7XG4gIH1cblxuICBtYXJrUHJ1bmFibGVDb250ZW50Rm9yUmVtb3ZhbCgpIHtcbiAgICBjb25zdCBwaHhVcGRhdGUgPSB0aGlzLmxpdmVTb2NrZXQuYmluZGluZyhQSFhfVVBEQVRFKTtcbiAgICBET00uYWxsKFxuICAgICAgdGhpcy5jb250YWluZXIsXG4gICAgICBgWyR7cGh4VXBkYXRlfT1hcHBlbmRdID4gKiwgWyR7cGh4VXBkYXRlfT1wcmVwZW5kXSA+ICpgLFxuICAgICAgKGVsKSA9PiB7XG4gICAgICAgIGVsLnNldEF0dHJpYnV0ZShQSFhfUFJVTkUsIFwiXCIpO1xuICAgICAgfSxcbiAgICApO1xuICB9XG5cbiAgcGVyZm9ybShpc0pvaW5QYXRjaCkge1xuICAgIGNvbnN0IHsgdmlldywgbGl2ZVNvY2tldCwgaHRtbCwgY29udGFpbmVyIH0gPSB0aGlzO1xuICAgIGxldCB0YXJnZXRDb250YWluZXIgPSB0aGlzLnRhcmdldENvbnRhaW5lcjtcblxuICAgIGlmICh0aGlzLmlzQ0lEUGF0Y2goKSAmJiAhdGhpcy50YXJnZXRDb250YWluZXIpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICBpZiAodGhpcy5pc0NJRFBhdGNoKCkpIHtcbiAgICAgIC8vIGh0dHBzOi8vZ2l0aHViLmNvbS9waG9lbml4ZnJhbWV3b3JrL3Bob2VuaXhfbGl2ZV92aWV3L3B1bGwvMzk0MlxuICAgICAgLy8gd2UgbmVlZCB0byBlbnN1cmUgdGhhdCBubyBwYXJlbnQgaXMgbG9ja2VkXG4gICAgICBjb25zdCBjbG9zZXN0TG9jayA9IHRhcmdldENvbnRhaW5lci5jbG9zZXN0KGBbJHtQSFhfUkVGX0xPQ0t9XWApO1xuICAgICAgaWYgKGNsb3Nlc3RMb2NrKSB7XG4gICAgICAgIGNvbnN0IGNsb25lZFRyZWUgPSBET00ucHJpdmF0ZShjbG9zZXN0TG9jaywgUEhYX1JFRl9MT0NLKTtcbiAgICAgICAgaWYgKGNsb25lZFRyZWUpIHtcbiAgICAgICAgICAvLyBpZiBhIHBhcmVudCBpcyBsb2NrZWQgd2l0aCBhIGNsb25lZCB0cmVlLCB3ZSBuZWVkIHRvIHBhdGNoIHRoZSBjbG9uZWQgdHJlZSBpbnN0ZWFkXG4gICAgICAgICAgdGFyZ2V0Q29udGFpbmVyID0gY2xvbmVkVHJlZS5xdWVyeVNlbGVjdG9yKFxuICAgICAgICAgICAgYFtkYXRhLXBoeC1jb21wb25lbnQ9XCIke3RoaXMudGFyZ2V0Q0lEfVwiXWAsXG4gICAgICAgICAgKTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH1cblxuICAgIGNvbnN0IGZvY3VzZWQgPSBsaXZlU29ja2V0LmdldEFjdGl2ZUVsZW1lbnQoKTtcbiAgICBjb25zdCB7IHNlbGVjdGlvblN0YXJ0LCBzZWxlY3Rpb25FbmQgfSA9XG4gICAgICBmb2N1c2VkICYmIERPTS5oYXNTZWxlY3Rpb25SYW5nZShmb2N1c2VkKSA/IGZvY3VzZWQgOiB7fTtcbiAgICBjb25zdCBwaHhVcGRhdGUgPSBsaXZlU29ja2V0LmJpbmRpbmcoUEhYX1VQREFURSk7XG4gICAgY29uc3QgcGh4Vmlld3BvcnRUb3AgPSBsaXZlU29ja2V0LmJpbmRpbmcoUEhYX1ZJRVdQT1JUX1RPUCk7XG4gICAgY29uc3QgcGh4Vmlld3BvcnRCb3R0b20gPSBsaXZlU29ja2V0LmJpbmRpbmcoUEhYX1ZJRVdQT1JUX0JPVFRPTSk7XG4gICAgY29uc3QgcGh4VHJpZ2dlckV4dGVybmFsID0gbGl2ZVNvY2tldC5iaW5kaW5nKFBIWF9UUklHR0VSX0FDVElPTik7XG4gICAgY29uc3QgYWRkZWQgPSBbXTtcbiAgICBjb25zdCB1cGRhdGVzID0gW107XG4gICAgY29uc3QgYXBwZW5kUHJlcGVuZFVwZGF0ZXMgPSBbXTtcblxuICAgIC8vIGFzIHRoZSBwb3J0YWwgdGFyZ2V0IGl0c2VsZiBjb3VsZCBiZSBhdCB0aGUgZW5kIG9mIHRoZSBET00sXG4gICAgLy8gaXQgbWF5IG5vdCBiZSBwcmVzZW50IHdoaWxlIG1vcnBoaW5nIHByZXZpb3VzIHBhcnRzO1xuICAgIC8vIHRoZXJlZm9yZSB3ZSBhcHBseSBhbGwgdGVsZXBvcnRzIGFmdGVyIHRoZSBtb3JwaGluZyBpcyBkb25lK1xuICAgIGNvbnN0IHBvcnRhbENhbGxiYWNrcyA9IFtdO1xuXG4gICAgbGV0IGV4dGVybmFsRm9ybVRyaWdnZXJlZCA9IG51bGw7XG5cbiAgICBjb25zdCBtb3JwaCA9IChcbiAgICAgIHRhcmdldENvbnRhaW5lcixcbiAgICAgIHNvdXJjZSxcbiAgICAgIHdpdGhDaGlsZHJlbiA9IHRoaXMud2l0aENoaWxkcmVuLFxuICAgICkgPT4ge1xuICAgICAgY29uc3QgbW9ycGhDYWxsYmFja3MgPSB7XG4gICAgICAgIC8vIG5vcm1hbGx5LCB3ZSBhcmUgcnVubmluZyB3aXRoIGNoaWxkcmVuT25seSwgYXMgdGhlIHBhdGNoIEhUTUwgZm9yIGEgTFZcbiAgICAgICAgLy8gZG9lcyBub3QgaW5jbHVkZSB0aGUgTFYgYXR0cnMgKGRhdGEtcGh4LXNlc3Npb24sIGV0Yy4pXG4gICAgICAgIC8vIHdoZW4gd2UgYXJlIHBhdGNoaW5nIGEgbGl2ZSBjb21wb25lbnQsIHdlIGRvIHdhbnQgdG8gcGF0Y2ggdGhlIHJvb3QgZWxlbWVudCBhcyB3ZWxsO1xuICAgICAgICAvLyBhbm90aGVyIGNhc2UgaXMgdGhlIHJlY3Vyc2l2ZSBwYXRjaCBvZiBhIHN0cmVhbSBpdGVtIHRoYXQgd2FzIGtlcHQgb24gcmVzZXQgKC0+IG9uQmVmb3JlTm9kZUFkZGVkKVxuICAgICAgICBjaGlsZHJlbk9ubHk6XG4gICAgICAgICAgdGFyZ2V0Q29udGFpbmVyLmdldEF0dHJpYnV0ZShQSFhfQ09NUE9ORU5UKSA9PT0gbnVsbCAmJiAhd2l0aENoaWxkcmVuLFxuICAgICAgICBnZXROb2RlS2V5OiAobm9kZSkgPT4ge1xuICAgICAgICAgIGlmIChET00uaXNQaHhEZXN0cm95ZWQobm9kZSkpIHtcbiAgICAgICAgICAgIHJldHVybiBudWxsO1xuICAgICAgICAgIH1cbiAgICAgICAgICAvLyBJZiB3ZSBoYXZlIGEgam9pbiBwYXRjaCwgdGhlbiBieSBkZWZpbml0aW9uIHRoZXJlIHdhcyBubyBQSFhfTUFHSUNfSUQuXG4gICAgICAgICAgLy8gVGhpcyBpcyBpbXBvcnRhbnQgdG8gcmVkdWNlIHRoZSBhbW91bnQgb2YgZWxlbWVudHMgbW9ycGhkb20gZGlzY2FyZHMuXG4gICAgICAgICAgaWYgKGlzSm9pblBhdGNoKSB7XG4gICAgICAgICAgICByZXR1cm4gbm9kZS5pZDtcbiAgICAgICAgICB9XG4gICAgICAgICAgcmV0dXJuIChcbiAgICAgICAgICAgIG5vZGUuaWQgfHwgKG5vZGUuZ2V0QXR0cmlidXRlICYmIG5vZGUuZ2V0QXR0cmlidXRlKFBIWF9NQUdJQ19JRCkpXG4gICAgICAgICAgKTtcbiAgICAgICAgfSxcbiAgICAgICAgLy8gc2tpcCBpbmRleGluZyBmcm9tIGNoaWxkcmVuIHdoZW4gY29udGFpbmVyIGlzIHN0cmVhbVxuICAgICAgICBza2lwRnJvbUNoaWxkcmVuOiAoZnJvbSkgPT4ge1xuICAgICAgICAgIHJldHVybiBmcm9tLmdldEF0dHJpYnV0ZShwaHhVcGRhdGUpID09PSBQSFhfU1RSRUFNO1xuICAgICAgICB9LFxuICAgICAgICAvLyB0ZWxsIG1vcnBoZG9tIGhvdyB0byBhZGQgYSBjaGlsZFxuICAgICAgICBhZGRDaGlsZDogKHBhcmVudCwgY2hpbGQpID0+IHtcbiAgICAgICAgICBjb25zdCB7IHJlZiwgc3RyZWFtQXQgfSA9IHRoaXMuZ2V0U3RyZWFtSW5zZXJ0KGNoaWxkKTtcbiAgICAgICAgICBpZiAocmVmID09PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICAgIHJldHVybiBwYXJlbnQuYXBwZW5kQ2hpbGQoY2hpbGQpO1xuICAgICAgICAgIH1cblxuICAgICAgICAgIHRoaXMuc2V0U3RyZWFtUmVmKGNoaWxkLCByZWYpO1xuXG4gICAgICAgICAgLy8gc3RyZWFtaW5nXG4gICAgICAgICAgaWYgKHN0cmVhbUF0ID09PSAwKSB7XG4gICAgICAgICAgICBwYXJlbnQuaW5zZXJ0QWRqYWNlbnRFbGVtZW50KFwiYWZ0ZXJiZWdpblwiLCBjaGlsZCk7XG4gICAgICAgICAgfSBlbHNlIGlmIChzdHJlYW1BdCA9PT0gLTEpIHtcbiAgICAgICAgICAgIGNvbnN0IGxhc3RDaGlsZCA9IHBhcmVudC5sYXN0RWxlbWVudENoaWxkO1xuICAgICAgICAgICAgaWYgKGxhc3RDaGlsZCAmJiAhbGFzdENoaWxkLmhhc0F0dHJpYnV0ZShQSFhfU1RSRUFNX1JFRikpIHtcbiAgICAgICAgICAgICAgY29uc3Qgbm9uU3RyZWFtQ2hpbGQgPSBBcnJheS5mcm9tKHBhcmVudC5jaGlsZHJlbikuZmluZChcbiAgICAgICAgICAgICAgICAoYykgPT4gIWMuaGFzQXR0cmlidXRlKFBIWF9TVFJFQU1fUkVGKSxcbiAgICAgICAgICAgICAgKTtcbiAgICAgICAgICAgICAgcGFyZW50Lmluc2VydEJlZm9yZShjaGlsZCwgbm9uU3RyZWFtQ2hpbGQpO1xuICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgcGFyZW50LmFwcGVuZENoaWxkKGNoaWxkKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9IGVsc2UgaWYgKHN0cmVhbUF0ID4gMCkge1xuICAgICAgICAgICAgY29uc3Qgc2libGluZyA9IEFycmF5LmZyb20ocGFyZW50LmNoaWxkcmVuKVtzdHJlYW1BdF07XG4gICAgICAgICAgICBwYXJlbnQuaW5zZXJ0QmVmb3JlKGNoaWxkLCBzaWJsaW5nKTtcbiAgICAgICAgICB9XG4gICAgICAgIH0sXG4gICAgICAgIG9uQmVmb3JlTm9kZUFkZGVkOiAoZWwpID0+IHtcbiAgICAgICAgICAvLyBkb24ndCBhZGQgdXBkYXRlX29ubHkgbm9kZXMgaWYgdGhleSBkaWQgbm90IGFscmVhZHkgZXhpc3RcbiAgICAgICAgICBpZiAoXG4gICAgICAgICAgICB0aGlzLmdldFN0cmVhbUluc2VydChlbCk/LnVwZGF0ZU9ubHkgJiZcbiAgICAgICAgICAgICF0aGlzLnN0cmVhbUNvbXBvbmVudFJlc3RvcmVbZWwuaWRdXG4gICAgICAgICAgKSB7XG4gICAgICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICAgICAgfVxuXG4gICAgICAgICAgRE9NLm1haW50YWluUHJpdmF0ZUhvb2tzKGVsLCBlbCwgcGh4Vmlld3BvcnRUb3AsIHBoeFZpZXdwb3J0Qm90dG9tKTtcbiAgICAgICAgICB0aGlzLnRyYWNrQmVmb3JlKFwiYWRkZWRcIiwgZWwpO1xuXG4gICAgICAgICAgbGV0IG1vcnBoZWRFbCA9IGVsO1xuICAgICAgICAgIC8vIHRoaXMgaXMgYSBzdHJlYW0gaXRlbSB0aGF0IHdhcyBrZXB0IG9uIHJlc2V0LCByZWN1cnNpdmVseSBtb3JwaCBpdFxuICAgICAgICAgIGlmICh0aGlzLnN0cmVhbUNvbXBvbmVudFJlc3RvcmVbZWwuaWRdKSB7XG4gICAgICAgICAgICBtb3JwaGVkRWwgPSB0aGlzLnN0cmVhbUNvbXBvbmVudFJlc3RvcmVbZWwuaWRdO1xuICAgICAgICAgICAgZGVsZXRlIHRoaXMuc3RyZWFtQ29tcG9uZW50UmVzdG9yZVtlbC5pZF07XG4gICAgICAgICAgICBtb3JwaChtb3JwaGVkRWwsIGVsLCB0cnVlKTtcbiAgICAgICAgICB9XG5cbiAgICAgICAgICByZXR1cm4gbW9ycGhlZEVsO1xuICAgICAgICB9LFxuICAgICAgICBvbk5vZGVBZGRlZDogKGVsKSA9PiB7XG4gICAgICAgICAgaWYgKGVsLmdldEF0dHJpYnV0ZSkge1xuICAgICAgICAgICAgdGhpcy5tYXliZVJlT3JkZXJTdHJlYW0oZWwsIHRydWUpO1xuICAgICAgICAgIH1cbiAgICAgICAgICAvLyBwaHgtcG9ydGFsIGhhbmRsaW5nXG4gICAgICAgICAgaWYgKERPTS5pc1BvcnRhbFRlbXBsYXRlKGVsKSkge1xuICAgICAgICAgICAgcG9ydGFsQ2FsbGJhY2tzLnB1c2goKCkgPT4gdGhpcy50ZWxlcG9ydChlbCwgbW9ycGgpKTtcbiAgICAgICAgICB9XG5cbiAgICAgICAgICAvLyBoYWNrIHRvIGZpeCBTYWZhcmkgaGFuZGxpbmcgb2YgaW1nIHNyY3NldCBhbmQgdmlkZW8gdGFnc1xuICAgICAgICAgIGlmIChlbCBpbnN0YW5jZW9mIEhUTUxJbWFnZUVsZW1lbnQgJiYgZWwuc3Jjc2V0KSB7XG4gICAgICAgICAgICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgbm8tc2VsZi1hc3NpZ25cbiAgICAgICAgICAgIGVsLnNyY3NldCA9IGVsLnNyY3NldDtcbiAgICAgICAgICB9IGVsc2UgaWYgKGVsIGluc3RhbmNlb2YgSFRNTFZpZGVvRWxlbWVudCAmJiBlbC5hdXRvcGxheSkge1xuICAgICAgICAgICAgZWwucGxheSgpO1xuICAgICAgICAgIH1cbiAgICAgICAgICBpZiAoRE9NLmlzTm93VHJpZ2dlckZvcm1FeHRlcm5hbChlbCwgcGh4VHJpZ2dlckV4dGVybmFsKSkge1xuICAgICAgICAgICAgZXh0ZXJuYWxGb3JtVHJpZ2dlcmVkID0gZWw7XG4gICAgICAgICAgfVxuXG4gICAgICAgICAgLy8gbmVzdGVkIHZpZXcgaGFuZGxpbmdcbiAgICAgICAgICBpZiAoXG4gICAgICAgICAgICAoRE9NLmlzUGh4Q2hpbGQoZWwpICYmIHZpZXcub3duc0VsZW1lbnQoZWwpKSB8fFxuICAgICAgICAgICAgKERPTS5pc1BoeFN0aWNreShlbCkgJiYgdmlldy5vd25zRWxlbWVudChlbC5wYXJlbnROb2RlKSlcbiAgICAgICAgICApIHtcbiAgICAgICAgICAgIHRoaXMudHJhY2tBZnRlcihcInBoeENoaWxkQWRkZWRcIiwgZWwpO1xuICAgICAgICAgIH1cblxuICAgICAgICAgIC8vIGRhdGEtcGh4LXJ1bnRpbWUtaG9va1xuICAgICAgICAgIGlmIChlbC5ub2RlTmFtZSA9PT0gXCJTQ1JJUFRcIiAmJiBlbC5oYXNBdHRyaWJ1dGUoUEhYX1JVTlRJTUVfSE9PSykpIHtcbiAgICAgICAgICAgIHRoaXMuaGFuZGxlUnVudGltZUhvb2soZWwsIHNvdXJjZSk7XG4gICAgICAgICAgfVxuXG4gICAgICAgICAgYWRkZWQucHVzaChlbCk7XG4gICAgICAgIH0sXG4gICAgICAgIG9uTm9kZURpc2NhcmRlZDogKGVsKSA9PiB0aGlzLm9uTm9kZURpc2NhcmRlZChlbCksXG4gICAgICAgIG9uQmVmb3JlTm9kZURpc2NhcmRlZDogKGVsKSA9PiB7XG4gICAgICAgICAgaWYgKGVsLmdldEF0dHJpYnV0ZSAmJiBlbC5nZXRBdHRyaWJ1dGUoUEhYX1BSVU5FKSAhPT0gbnVsbCkge1xuICAgICAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgICAgICAgfVxuICAgICAgICAgIGlmIChcbiAgICAgICAgICAgIGVsLnBhcmVudEVsZW1lbnQgIT09IG51bGwgJiZcbiAgICAgICAgICAgIGVsLmlkICYmXG4gICAgICAgICAgICBET00uaXNQaHhVcGRhdGUoZWwucGFyZW50RWxlbWVudCwgcGh4VXBkYXRlLCBbXG4gICAgICAgICAgICAgIFBIWF9TVFJFQU0sXG4gICAgICAgICAgICAgIFwiYXBwZW5kXCIsXG4gICAgICAgICAgICAgIFwicHJlcGVuZFwiLFxuICAgICAgICAgICAgXSlcbiAgICAgICAgICApIHtcbiAgICAgICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgICAgICB9XG4gICAgICAgICAgLy8gZG9uJ3QgcmVtb3ZlIHRlbGVwb3J0ZWQgZWxlbWVudHNcbiAgICAgICAgICBpZiAoZWwuZ2V0QXR0cmlidXRlICYmIGVsLmdldEF0dHJpYnV0ZShQSFhfVEVMRVBPUlRFRF9SRUYpKSB7XG4gICAgICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICAgICAgfVxuICAgICAgICAgIGlmICh0aGlzLm1heWJlUGVuZGluZ1JlbW92ZShlbCkpIHtcbiAgICAgICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgICAgICB9XG4gICAgICAgICAgaWYgKHRoaXMuc2tpcENJRFNpYmxpbmcoZWwpKSB7XG4gICAgICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICAgICAgfVxuXG4gICAgICAgICAgaWYgKERPTS5pc1BvcnRhbFRlbXBsYXRlKGVsKSkge1xuICAgICAgICAgICAgLy8gaWYgdGhlIHBvcnRhbCB0ZW1wbGF0ZSBpdHNlbGYgaXMgcmVtb3ZlZCwgcmVtb3ZlIHRoZSB0ZWxlcG9ydGVkIGVsZW1lbnQgYXMgd2VsbDtcbiAgICAgICAgICAgIC8vIHdlIGFsc28gcGVyZm9ybSBhIGNoZWNrIGFmdGVyIG1vcnBoZG9tIGlzIGZpbmlzaGVkIHRvIGNhdGNoIHBhcmVudCByZW1vdmFsc1xuICAgICAgICAgICAgY29uc3QgdGVsZXBvcnRlZEVsID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoXG4gICAgICAgICAgICAgIGVsLmNvbnRlbnQuZmlyc3RFbGVtZW50Q2hpbGQuaWQsXG4gICAgICAgICAgICApO1xuICAgICAgICAgICAgaWYgKHRlbGVwb3J0ZWRFbCkge1xuICAgICAgICAgICAgICB0ZWxlcG9ydGVkRWwucmVtb3ZlKCk7XG4gICAgICAgICAgICAgIG1vcnBoQ2FsbGJhY2tzLm9uTm9kZURpc2NhcmRlZCh0ZWxlcG9ydGVkRWwpO1xuICAgICAgICAgICAgICB0aGlzLnZpZXcuZHJvcFBvcnRhbEVsZW1lbnRJZCh0ZWxlcG9ydGVkRWwuaWQpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgIH1cblxuICAgICAgICAgIHJldHVybiB0cnVlO1xuICAgICAgICB9LFxuICAgICAgICBvbkVsVXBkYXRlZDogKGVsKSA9PiB7XG4gICAgICAgICAgaWYgKERPTS5pc05vd1RyaWdnZXJGb3JtRXh0ZXJuYWwoZWwsIHBoeFRyaWdnZXJFeHRlcm5hbCkpIHtcbiAgICAgICAgICAgIGV4dGVybmFsRm9ybVRyaWdnZXJlZCA9IGVsO1xuICAgICAgICAgIH1cbiAgICAgICAgICB1cGRhdGVzLnB1c2goZWwpO1xuICAgICAgICAgIHRoaXMubWF5YmVSZU9yZGVyU3RyZWFtKGVsLCBmYWxzZSk7XG4gICAgICAgIH0sXG4gICAgICAgIG9uQmVmb3JlRWxVcGRhdGVkOiAoZnJvbUVsLCB0b0VsKSA9PiB7XG4gICAgICAgICAgLy8gaWYgd2UgYXJlIHBhdGNoaW5nIHRoZSByb290IHRhcmdldCBjb250YWluZXIgYW5kIHRoZSBpZCBoYXMgY2hhbmdlZCwgdHJlYXQgaXQgYXMgYSBuZXcgbm9kZVxuICAgICAgICAgIC8vIGJ5IHJlcGxhY2luZyB0aGUgZnJvbUVsIHdpdGggdGhlIHRvRWwsIHdoaWNoIGVuc3VyZXMgaG9va3MgYXJlIHRvcm4gZG93biBhbmQgcmUtY3JlYXRlZFxuICAgICAgICAgIGlmIChcbiAgICAgICAgICAgIGZyb21FbC5pZCAmJlxuICAgICAgICAgICAgZnJvbUVsLmlzU2FtZU5vZGUodGFyZ2V0Q29udGFpbmVyKSAmJlxuICAgICAgICAgICAgZnJvbUVsLmlkICE9PSB0b0VsLmlkXG4gICAgICAgICAgKSB7XG4gICAgICAgICAgICBtb3JwaENhbGxiYWNrcy5vbk5vZGVEaXNjYXJkZWQoZnJvbUVsKTtcbiAgICAgICAgICAgIGZyb21FbC5yZXBsYWNlV2l0aCh0b0VsKTtcbiAgICAgICAgICAgIHJldHVybiBtb3JwaENhbGxiYWNrcy5vbk5vZGVBZGRlZCh0b0VsKTtcbiAgICAgICAgICB9XG4gICAgICAgICAgRE9NLnN5bmNQZW5kaW5nQXR0cnMoZnJvbUVsLCB0b0VsKTtcbiAgICAgICAgICBET00ubWFpbnRhaW5Qcml2YXRlSG9va3MoXG4gICAgICAgICAgICBmcm9tRWwsXG4gICAgICAgICAgICB0b0VsLFxuICAgICAgICAgICAgcGh4Vmlld3BvcnRUb3AsXG4gICAgICAgICAgICBwaHhWaWV3cG9ydEJvdHRvbSxcbiAgICAgICAgICApO1xuICAgICAgICAgIERPTS5jbGVhbkNoaWxkTm9kZXModG9FbCwgcGh4VXBkYXRlKTtcbiAgICAgICAgICBpZiAodGhpcy5za2lwQ0lEU2libGluZyh0b0VsKSkge1xuICAgICAgICAgICAgLy8gaWYgdGhpcyBpcyBhIGxpdmUgY29tcG9uZW50IHVzZWQgaW4gYSBzdHJlYW0sIHdlIG1heSBuZWVkIHRvIHJlb3JkZXIgaXRcbiAgICAgICAgICAgIHRoaXMubWF5YmVSZU9yZGVyU3RyZWFtKGZyb21FbCk7XG4gICAgICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICAgICAgfVxuICAgICAgICAgIGlmIChET00uaXNQaHhTdGlja3koZnJvbUVsKSkge1xuICAgICAgICAgICAgW1BIWF9TRVNTSU9OLCBQSFhfU1RBVElDLCBQSFhfUk9PVF9JRF1cbiAgICAgICAgICAgICAgLm1hcCgoYXR0cikgPT4gW1xuICAgICAgICAgICAgICAgIGF0dHIsXG4gICAgICAgICAgICAgICAgZnJvbUVsLmdldEF0dHJpYnV0ZShhdHRyKSxcbiAgICAgICAgICAgICAgICB0b0VsLmdldEF0dHJpYnV0ZShhdHRyKSxcbiAgICAgICAgICAgICAgXSlcbiAgICAgICAgICAgICAgLmZvckVhY2goKFthdHRyLCBmcm9tVmFsLCB0b1ZhbF0pID0+IHtcbiAgICAgICAgICAgICAgICBpZiAodG9WYWwgJiYgZnJvbVZhbCAhPT0gdG9WYWwpIHtcbiAgICAgICAgICAgICAgICAgIGZyb21FbC5zZXRBdHRyaWJ1dGUoYXR0ciwgdG9WYWwpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgfSk7XG5cbiAgICAgICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgICAgICB9XG4gICAgICAgICAgaWYgKFxuICAgICAgICAgICAgRE9NLmlzSWdub3JlZChmcm9tRWwsIHBoeFVwZGF0ZSkgfHxcbiAgICAgICAgICAgIChmcm9tRWwuZm9ybSAmJiBmcm9tRWwuZm9ybS5pc1NhbWVOb2RlKGV4dGVybmFsRm9ybVRyaWdnZXJlZCkpXG4gICAgICAgICAgKSB7XG4gICAgICAgICAgICB0aGlzLnRyYWNrQmVmb3JlKFwidXBkYXRlZFwiLCBmcm9tRWwsIHRvRWwpO1xuICAgICAgICAgICAgRE9NLm1lcmdlQXR0cnMoZnJvbUVsLCB0b0VsLCB7XG4gICAgICAgICAgICAgIGlzSWdub3JlZDogRE9NLmlzSWdub3JlZChmcm9tRWwsIHBoeFVwZGF0ZSksXG4gICAgICAgICAgICB9KTtcbiAgICAgICAgICAgIHVwZGF0ZXMucHVzaChmcm9tRWwpO1xuICAgICAgICAgICAgRE9NLmFwcGx5U3RpY2t5T3BlcmF0aW9ucyhmcm9tRWwpO1xuICAgICAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgICAgIH1cbiAgICAgICAgICBpZiAoXG4gICAgICAgICAgICBmcm9tRWwudHlwZSA9PT0gXCJudW1iZXJcIiAmJlxuICAgICAgICAgICAgZnJvbUVsLnZhbGlkaXR5ICYmXG4gICAgICAgICAgICBmcm9tRWwudmFsaWRpdHkuYmFkSW5wdXRcbiAgICAgICAgICApIHtcbiAgICAgICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgICAgICB9XG4gICAgICAgICAgLy8gSWYgdGhlIGVsZW1lbnQgaGFzIFBIWF9SRUZfU1JDLCBpdCBpcyBsb2FkaW5nIG9yIGxvY2tlZCBhbmQgYXdhaXRpbmcgYW4gYWNrLlxuICAgICAgICAgIC8vIElmIGl0J3MgbG9ja2VkLCB3ZSBjbG9uZSB0aGUgZnJvbUVsIHRyZWUgYW5kIGluc3RydWN0IG1vcnBoZG9tIHRvIHVzZVxuICAgICAgICAgIC8vIHRoZSBjbG9uZWQgdHJlZSBhcyB0aGUgc291cmNlIG9mIHRoZSBtb3JwaCBmb3IgdGhpcyBicmFuY2ggZnJvbSBoZXJlIG9uIG91dC5cbiAgICAgICAgICAvLyBXZSBrZWVwIGEgcmVmZXJlbmNlIHRvIHRoZSBjbG9uZWQgdHJlZSBpbiB0aGUgZWxlbWVudCdzIHByaXZhdGUgZGF0YSwgYW5kXG4gICAgICAgICAgLy8gb24gYWNrICh2aWV3LnVuZG9SZWZzKSwgd2UgbW9ycGggdGhlIGNsb25lZCB0cmVlIHdpdGggdGhlIHRydWUgZnJvbUVsIGluIHRoZSBET00gdG9cbiAgICAgICAgICAvLyBhcHBseSBhbnkgY2hhbmdlcyB0aGF0IGhhcHBlbmVkIHdoaWxlIHRoZSBlbGVtZW50IHdhcyBsb2NrZWQuXG4gICAgICAgICAgY29uc3QgaXNGb2N1c2VkRm9ybUVsID1cbiAgICAgICAgICAgIGZvY3VzZWQgJiYgZnJvbUVsLmlzU2FtZU5vZGUoZm9jdXNlZCkgJiYgRE9NLmlzRm9ybUlucHV0KGZyb21FbCk7XG4gICAgICAgICAgY29uc3QgZm9jdXNlZFNlbGVjdENoYW5nZWQgPVxuICAgICAgICAgICAgaXNGb2N1c2VkRm9ybUVsICYmIHRoaXMuaXNDaGFuZ2VkU2VsZWN0KGZyb21FbCwgdG9FbCk7XG4gICAgICAgICAgaWYgKGZyb21FbC5oYXNBdHRyaWJ1dGUoUEhYX1JFRl9TUkMpKSB7XG4gICAgICAgICAgICBjb25zdCByZWYgPSBuZXcgRWxlbWVudFJlZihmcm9tRWwpO1xuICAgICAgICAgICAgLy8gb25seSBwZXJmb3JtIHRoZSBjbG9uZSBzdGVwIGlmIHRoaXMgaXMgbm90IGEgcGF0Y2ggdGhhdCB1bmxvY2tzXG4gICAgICAgICAgICBpZiAoXG4gICAgICAgICAgICAgIHJlZi5sb2NrUmVmICYmXG4gICAgICAgICAgICAgICghdGhpcy51bmRvUmVmIHx8ICFyZWYuaXNMb2NrVW5kb25lQnkodGhpcy51bmRvUmVmKSlcbiAgICAgICAgICAgICkge1xuICAgICAgICAgICAgICBpZiAoRE9NLmlzVXBsb2FkSW5wdXQoZnJvbUVsKSkge1xuICAgICAgICAgICAgICAgIERPTS5tZXJnZUF0dHJzKGZyb21FbCwgdG9FbCwgeyBpc0lnbm9yZWQ6IHRydWUgfSk7XG4gICAgICAgICAgICAgICAgdGhpcy50cmFja0JlZm9yZShcInVwZGF0ZWRcIiwgZnJvbUVsLCB0b0VsKTtcbiAgICAgICAgICAgICAgICB1cGRhdGVzLnB1c2goZnJvbUVsKTtcbiAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICBET00uYXBwbHlTdGlja3lPcGVyYXRpb25zKGZyb21FbCk7XG4gICAgICAgICAgICAgIGNvbnN0IGlzTG9ja2VkID0gZnJvbUVsLmhhc0F0dHJpYnV0ZShQSFhfUkVGX0xPQ0spO1xuICAgICAgICAgICAgICBjb25zdCBjbG9uZSA9IGlzTG9ja2VkXG4gICAgICAgICAgICAgICAgPyBET00ucHJpdmF0ZShmcm9tRWwsIFBIWF9SRUZfTE9DSykgfHwgZnJvbUVsLmNsb25lTm9kZSh0cnVlKVxuICAgICAgICAgICAgICAgIDogbnVsbDtcbiAgICAgICAgICAgICAgaWYgKGNsb25lKSB7XG4gICAgICAgICAgICAgICAgRE9NLnB1dFByaXZhdGUoZnJvbUVsLCBQSFhfUkVGX0xPQ0ssIGNsb25lKTtcbiAgICAgICAgICAgICAgICBpZiAoIWlzRm9jdXNlZEZvcm1FbCkge1xuICAgICAgICAgICAgICAgICAgZnJvbUVsID0gY2xvbmU7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgICAgfVxuXG4gICAgICAgICAgLy8gbmVzdGVkIHZpZXcgaGFuZGxpbmdcbiAgICAgICAgICBpZiAoRE9NLmlzUGh4Q2hpbGQodG9FbCkpIHtcbiAgICAgICAgICAgIGNvbnN0IHByZXZTZXNzaW9uID0gZnJvbUVsLmdldEF0dHJpYnV0ZShQSFhfU0VTU0lPTik7XG4gICAgICAgICAgICBET00ubWVyZ2VBdHRycyhmcm9tRWwsIHRvRWwsIHsgZXhjbHVkZTogW1BIWF9TVEFUSUNdIH0pO1xuICAgICAgICAgICAgaWYgKHByZXZTZXNzaW9uICE9PSBcIlwiKSB7XG4gICAgICAgICAgICAgIGZyb21FbC5zZXRBdHRyaWJ1dGUoUEhYX1NFU1NJT04sIHByZXZTZXNzaW9uKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGZyb21FbC5zZXRBdHRyaWJ1dGUoUEhYX1JPT1RfSUQsIHRoaXMucm9vdElEKTtcbiAgICAgICAgICAgIERPTS5hcHBseVN0aWNreU9wZXJhdGlvbnMoZnJvbUVsKTtcbiAgICAgICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgICAgICB9XG5cbiAgICAgICAgICAvLyBpZiB3ZSBhcmUgdW5kb2luZyBhIGxvY2ssIGNvcHkgcG90ZW50aWFsbHkgbmVzdGVkIGNsb25lcyBvdmVyXG4gICAgICAgICAgaWYgKHRoaXMudW5kb1JlZiAmJiBET00ucHJpdmF0ZSh0b0VsLCBQSFhfUkVGX0xPQ0spKSB7XG4gICAgICAgICAgICBET00ucHV0UHJpdmF0ZShcbiAgICAgICAgICAgICAgZnJvbUVsLFxuICAgICAgICAgICAgICBQSFhfUkVGX0xPQ0ssXG4gICAgICAgICAgICAgIERPTS5wcml2YXRlKHRvRWwsIFBIWF9SRUZfTE9DSyksXG4gICAgICAgICAgICApO1xuICAgICAgICAgIH1cbiAgICAgICAgICAvLyBub3cgY29weSByZWd1bGFyIERPTS5wcml2YXRlIGRhdGFcbiAgICAgICAgICBET00uY29weVByaXZhdGVzKHRvRWwsIGZyb21FbCk7XG5cbiAgICAgICAgICAvLyBwaHgtcG9ydGFsIGhhbmRsaW5nXG4gICAgICAgICAgaWYgKERPTS5pc1BvcnRhbFRlbXBsYXRlKHRvRWwpKSB7XG4gICAgICAgICAgICBwb3J0YWxDYWxsYmFja3MucHVzaCgoKSA9PiB0aGlzLnRlbGVwb3J0KHRvRWwsIG1vcnBoKSk7XG4gICAgICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICAgICAgfVxuXG4gICAgICAgICAgLy8gc2tpcCBwYXRjaGluZyBmb2N1c2VkIGlucHV0cyB1bmxlc3MgZm9jdXMgaXMgYSBzZWxlY3QgdGhhdCBoYXMgY2hhbmdlZCBvcHRpb25zXG4gICAgICAgICAgaWYgKFxuICAgICAgICAgICAgaXNGb2N1c2VkRm9ybUVsICYmXG4gICAgICAgICAgICBmcm9tRWwudHlwZSAhPT0gXCJoaWRkZW5cIiAmJlxuICAgICAgICAgICAgIWZvY3VzZWRTZWxlY3RDaGFuZ2VkXG4gICAgICAgICAgKSB7XG4gICAgICAgICAgICB0aGlzLnRyYWNrQmVmb3JlKFwidXBkYXRlZFwiLCBmcm9tRWwsIHRvRWwpO1xuICAgICAgICAgICAgRE9NLm1lcmdlRm9jdXNlZElucHV0KGZyb21FbCwgdG9FbCk7XG4gICAgICAgICAgICBET00uc3luY0F0dHJzVG9Qcm9wcyhmcm9tRWwpO1xuICAgICAgICAgICAgdXBkYXRlcy5wdXNoKGZyb21FbCk7XG4gICAgICAgICAgICBET00uYXBwbHlTdGlja3lPcGVyYXRpb25zKGZyb21FbCk7XG4gICAgICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIC8vIGJsdXIgZm9jdXNlZCBzZWxlY3QgaWYgaXQgY2hhbmdlZCBzbyBuYXRpdmUgVUkgaXMgdXBkYXRlZCAoaWUgc2FmYXJpIHdvbid0IHVwZGF0ZSB2aXNpYmxlIG9wdGlvbnMpXG4gICAgICAgICAgICBpZiAoZm9jdXNlZFNlbGVjdENoYW5nZWQpIHtcbiAgICAgICAgICAgICAgZnJvbUVsLmJsdXIoKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGlmIChET00uaXNQaHhVcGRhdGUodG9FbCwgcGh4VXBkYXRlLCBbXCJhcHBlbmRcIiwgXCJwcmVwZW5kXCJdKSkge1xuICAgICAgICAgICAgICBhcHBlbmRQcmVwZW5kVXBkYXRlcy5wdXNoKFxuICAgICAgICAgICAgICAgIG5ldyBET01Qb3N0TW9ycGhSZXN0b3JlcihcbiAgICAgICAgICAgICAgICAgIGZyb21FbCxcbiAgICAgICAgICAgICAgICAgIHRvRWwsXG4gICAgICAgICAgICAgICAgICB0b0VsLmdldEF0dHJpYnV0ZShwaHhVcGRhdGUpLFxuICAgICAgICAgICAgICAgICksXG4gICAgICAgICAgICAgICk7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIERPTS5zeW5jQXR0cnNUb1Byb3BzKHRvRWwpO1xuICAgICAgICAgICAgRE9NLmFwcGx5U3RpY2t5T3BlcmF0aW9ucyh0b0VsKTtcbiAgICAgICAgICAgIHRoaXMudHJhY2tCZWZvcmUoXCJ1cGRhdGVkXCIsIGZyb21FbCwgdG9FbCk7XG4gICAgICAgICAgICByZXR1cm4gZnJvbUVsO1xuICAgICAgICAgIH1cbiAgICAgICAgfSxcbiAgICAgIH07XG5cbiAgICAgIG1vcnBoZG9tKHRhcmdldENvbnRhaW5lciwgc291cmNlLCBtb3JwaENhbGxiYWNrcyk7XG4gICAgfTtcblxuICAgIHRoaXMudHJhY2tCZWZvcmUoXCJhZGRlZFwiLCBjb250YWluZXIpO1xuICAgIHRoaXMudHJhY2tCZWZvcmUoXCJ1cGRhdGVkXCIsIGNvbnRhaW5lciwgY29udGFpbmVyKTtcblxuICAgIGxpdmVTb2NrZXQudGltZShcIm1vcnBoZG9tXCIsICgpID0+IHtcbiAgICAgIHRoaXMuc3RyZWFtcy5mb3JFYWNoKChbcmVmLCBpbnNlcnRzLCBkZWxldGVJZHMsIHJlc2V0XSkgPT4ge1xuICAgICAgICBpbnNlcnRzLmZvckVhY2goKFtrZXksIHN0cmVhbUF0LCBsaW1pdCwgdXBkYXRlT25seV0pID0+IHtcbiAgICAgICAgICB0aGlzLnN0cmVhbUluc2VydHNba2V5XSA9IHsgcmVmLCBzdHJlYW1BdCwgbGltaXQsIHJlc2V0LCB1cGRhdGVPbmx5IH07XG4gICAgICAgIH0pO1xuICAgICAgICBpZiAocmVzZXQgIT09IHVuZGVmaW5lZCkge1xuICAgICAgICAgIERPTS5hbGwoY29udGFpbmVyLCBgWyR7UEhYX1NUUkVBTV9SRUZ9PVwiJHtyZWZ9XCJdYCwgKGNoaWxkKSA9PiB7XG4gICAgICAgICAgICB0aGlzLnJlbW92ZVN0cmVhbUNoaWxkRWxlbWVudChjaGlsZCk7XG4gICAgICAgICAgfSk7XG4gICAgICAgIH1cbiAgICAgICAgZGVsZXRlSWRzLmZvckVhY2goKGlkKSA9PiB7XG4gICAgICAgICAgY29uc3QgY2hpbGQgPSBjb250YWluZXIucXVlcnlTZWxlY3RvcihgW2lkPVwiJHtpZH1cIl1gKTtcbiAgICAgICAgICBpZiAoY2hpbGQpIHtcbiAgICAgICAgICAgIHRoaXMucmVtb3ZlU3RyZWFtQ2hpbGRFbGVtZW50KGNoaWxkKTtcbiAgICAgICAgICB9XG4gICAgICAgIH0pO1xuICAgICAgfSk7XG5cbiAgICAgIC8vIGNsZWFyIHN0cmVhbSBpdGVtcyBmcm9tIHRoZSBkZWFkIHJlbmRlciBpZiB0aGV5IGFyZSBub3QgaW5zZXJ0ZWQgYWdhaW5cbiAgICAgIGlmIChpc0pvaW5QYXRjaCkge1xuICAgICAgICBET00uYWxsKHRoaXMuY29udGFpbmVyLCBgWyR7cGh4VXBkYXRlfT0ke1BIWF9TVFJFQU19XWApXG4gICAgICAgICAgLy8gaXQgaXMgaW1wb3J0YW50IHRvIGZpbHRlciB0aGUgZWxlbWVudCBiZWZvcmUgcmVtb3ZpbmcgdGhlbSwgYXNcbiAgICAgICAgICAvLyBpdCBtYXkgaGFwcGVuIHRoYXQgc3RyZWFtcyBhcmUgbmVzdGVkIGFuZCB0aGUgb3duZXIgY2hlY2sgZmFpbHMgaWZcbiAgICAgICAgICAvLyBhIHBhcmVudCBpcyByZW1vdmVkIGJlZm9yZSBhIGNoaWxkXG4gICAgICAgICAgLmZpbHRlcigoZWwpID0+IHRoaXMudmlldy5vd25zRWxlbWVudChlbCkpXG4gICAgICAgICAgLmZvckVhY2goKGVsKSA9PiB7XG4gICAgICAgICAgICBBcnJheS5mcm9tKGVsLmNoaWxkcmVuKS5mb3JFYWNoKChjaGlsZCkgPT4ge1xuICAgICAgICAgICAgICAvLyB3ZSBhbHJlYWR5IHBlcmZvcm1lZCB0aGUgb3duZXIgY2hlY2ssIGVhY2ggY2hpbGQgaXMgZ3VhcmFudGVlZCB0byBiZSBvd25lZFxuICAgICAgICAgICAgICAvLyBieSB0aGUgdmlldy4gVG8gcHJldmVudCB0aGUgbmVzdGVkIG93bmVyIGNoZWNrIGZyb20gZmFpbGluZyBpbiBjYXNlIG9mIG5lc3RlZFxuICAgICAgICAgICAgICAvLyBzdHJlYW1zIHdoZXJlIHRoZSBwYXJlbnQgaXMgcmVtb3ZlZCBiZWZvcmUgdGhlIGNoaWxkLCB3ZSBmb3JjZSB0aGUgcmVtb3ZhbFxuICAgICAgICAgICAgICB0aGlzLnJlbW92ZVN0cmVhbUNoaWxkRWxlbWVudChjaGlsZCwgdHJ1ZSk7XG4gICAgICAgICAgICB9KTtcbiAgICAgICAgICB9KTtcbiAgICAgIH1cblxuICAgICAgbW9ycGgodGFyZ2V0Q29udGFpbmVyLCBodG1sKTtcbiAgICAgIC8vIG5vcm1hbCBwYXRjaCBjb21wbGV0ZSwgdGVsZXBvcnQgZWxlbWVudHMgbm93XG4gICAgICBwb3J0YWxDYWxsYmFja3MuZm9yRWFjaCgoY2FsbGJhY2spID0+IGNhbGxiYWNrKCkpO1xuICAgICAgLy8gY2hlY2sgZm9yIGFueSB0ZWxlcG9ydGVkIGVsZW1lbnRzIHRoYXQgYXJlIG5vdCBpbiB0aGUgdmlldyBhbnkgbW9yZVxuICAgICAgLy8gYW5kIHJlbW92ZSB0aGVtXG4gICAgICB0aGlzLnZpZXcucG9ydGFsRWxlbWVudElkcy5mb3JFYWNoKChpZCkgPT4ge1xuICAgICAgICBjb25zdCBlbCA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKGlkKTtcbiAgICAgICAgaWYgKGVsKSB7XG4gICAgICAgICAgY29uc3Qgc291cmNlID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoXG4gICAgICAgICAgICBlbC5nZXRBdHRyaWJ1dGUoUEhYX1RFTEVQT1JURURfU1JDKSxcbiAgICAgICAgICApO1xuICAgICAgICAgIGlmICghc291cmNlKSB7XG4gICAgICAgICAgICBlbC5yZW1vdmUoKTtcbiAgICAgICAgICAgIHRoaXMub25Ob2RlRGlzY2FyZGVkKGVsKTtcbiAgICAgICAgICAgIHRoaXMudmlldy5kcm9wUG9ydGFsRWxlbWVudElkKGlkKTtcbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgIH0pO1xuICAgIH0pO1xuXG4gICAgaWYgKGxpdmVTb2NrZXQuaXNEZWJ1Z0VuYWJsZWQoKSkge1xuICAgICAgZGV0ZWN0RHVwbGljYXRlSWRzKCk7XG4gICAgICBkZXRlY3RJbnZhbGlkU3RyZWFtSW5zZXJ0cyh0aGlzLnN0cmVhbUluc2VydHMpO1xuICAgICAgLy8gd2FybiBpZiB0aGVyZSBhcmUgYW55IGlucHV0cyBuYW1lZCBcImlkXCJcbiAgICAgIEFycmF5LmZyb20oZG9jdW1lbnQucXVlcnlTZWxlY3RvckFsbChcImlucHV0W25hbWU9aWRdXCIpKS5mb3JFYWNoKFxuICAgICAgICAobm9kZSkgPT4ge1xuICAgICAgICAgIGlmIChub2RlIGluc3RhbmNlb2YgSFRNTElucHV0RWxlbWVudCAmJiBub2RlLmZvcm0pIHtcbiAgICAgICAgICAgIGNvbnNvbGUuZXJyb3IoXG4gICAgICAgICAgICAgICdEZXRlY3RlZCBhbiBpbnB1dCB3aXRoIG5hbWU9XCJpZFwiIGluc2lkZSBhIGZvcm0hIFRoaXMgd2lsbCBjYXVzZSBwcm9ibGVtcyB3aGVuIHBhdGNoaW5nIHRoZSBET00uXFxuJyxcbiAgICAgICAgICAgICAgbm9kZSxcbiAgICAgICAgICAgICk7XG4gICAgICAgICAgfVxuICAgICAgICB9LFxuICAgICAgKTtcbiAgICB9XG5cbiAgICBpZiAoYXBwZW5kUHJlcGVuZFVwZGF0ZXMubGVuZ3RoID4gMCkge1xuICAgICAgbGl2ZVNvY2tldC50aW1lKFwicG9zdC1tb3JwaCBhcHBlbmQvcHJlcGVuZCByZXN0b3JhdGlvblwiLCAoKSA9PiB7XG4gICAgICAgIGFwcGVuZFByZXBlbmRVcGRhdGVzLmZvckVhY2goKHVwZGF0ZSkgPT4gdXBkYXRlLnBlcmZvcm0oKSk7XG4gICAgICB9KTtcbiAgICB9XG5cbiAgICBsaXZlU29ja2V0LnNpbGVuY2VFdmVudHMoKCkgPT5cbiAgICAgIERPTS5yZXN0b3JlRm9jdXMoZm9jdXNlZCwgc2VsZWN0aW9uU3RhcnQsIHNlbGVjdGlvbkVuZCksXG4gICAgKTtcbiAgICBET00uZGlzcGF0Y2hFdmVudChkb2N1bWVudCwgXCJwaHg6dXBkYXRlXCIpO1xuICAgIGFkZGVkLmZvckVhY2goKGVsKSA9PiB0aGlzLnRyYWNrQWZ0ZXIoXCJhZGRlZFwiLCBlbCkpO1xuICAgIHVwZGF0ZXMuZm9yRWFjaCgoZWwpID0+IHRoaXMudHJhY2tBZnRlcihcInVwZGF0ZWRcIiwgZWwpKTtcblxuICAgIHRoaXMudHJhbnNpdGlvblBlbmRpbmdSZW1vdmVzKCk7XG5cbiAgICBpZiAoZXh0ZXJuYWxGb3JtVHJpZ2dlcmVkKSB7XG4gICAgICBsaXZlU29ja2V0LnVubG9hZCgpO1xuICAgICAgLy8gY2hlY2sgZm9yIHN1Ym1pdHRlciBhbmQgaW5qZWN0IGl0IGFzIGhpZGRlbiBpbnB1dCBmb3IgZXh0ZXJuYWwgc3VibWl0O1xuICAgICAgLy8gSW4gdGhlb3J5LCBpdCBjb3VsZCBoYXBwZW4gdGhhdCB0aGUgc3RvcmVkIHN1Ym1pdHRlciBpcyBvdXRkYXRlZCBhbmQgZG9lc24ndFxuICAgICAgLy8gZXhpc3QgaW4gdGhlIERPTSBhbnkgbW9yZSwgYnV0IHRoaXMgaXMgdW5saWtlbHksIHNvIHdlIGp1c3QgYWNjZXB0IGl0IGZvciBub3cuXG4gICAgICBjb25zdCBzdWJtaXR0ZXIgPSBET00ucHJpdmF0ZShleHRlcm5hbEZvcm1UcmlnZ2VyZWQsIFwic3VibWl0dGVyXCIpO1xuICAgICAgaWYgKHN1Ym1pdHRlciAmJiBzdWJtaXR0ZXIubmFtZSAmJiB0YXJnZXRDb250YWluZXIuY29udGFpbnMoc3VibWl0dGVyKSkge1xuICAgICAgICBjb25zdCBpbnB1dCA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoXCJpbnB1dFwiKTtcbiAgICAgICAgaW5wdXQudHlwZSA9IFwiaGlkZGVuXCI7XG4gICAgICAgIGNvbnN0IGZvcm1JZCA9IHN1Ym1pdHRlci5nZXRBdHRyaWJ1dGUoXCJmb3JtXCIpO1xuICAgICAgICBpZiAoZm9ybUlkKSB7XG4gICAgICAgICAgaW5wdXQuc2V0QXR0cmlidXRlKFwiZm9ybVwiLCBmb3JtSWQpO1xuICAgICAgICB9XG4gICAgICAgIGlucHV0Lm5hbWUgPSBzdWJtaXR0ZXIubmFtZTtcbiAgICAgICAgaW5wdXQudmFsdWUgPSBzdWJtaXR0ZXIudmFsdWU7XG4gICAgICAgIHN1Ym1pdHRlci5wYXJlbnRFbGVtZW50Lmluc2VydEJlZm9yZShpbnB1dCwgc3VibWl0dGVyKTtcbiAgICAgIH1cbiAgICAgIC8vIHVzZSBwcm90b3R5cGUncyBzdWJtaXQgaW4gY2FzZSB0aGVyZSdzIGEgZm9ybSBjb250cm9sIHdpdGggbmFtZSBvciBpZCBvZiBcInN1Ym1pdFwiXG4gICAgICAvLyBodHRwczovL2RldmVsb3Blci5tb3ppbGxhLm9yZy9lbi1VUy9kb2NzL1dlYi9BUEkvSFRNTEZvcm1FbGVtZW50L3N1Ym1pdFxuICAgICAgT2JqZWN0LmdldFByb3RvdHlwZU9mKGV4dGVybmFsRm9ybVRyaWdnZXJlZCkuc3VibWl0LmNhbGwoXG4gICAgICAgIGV4dGVybmFsRm9ybVRyaWdnZXJlZCxcbiAgICAgICk7XG4gICAgfVxuICAgIHJldHVybiB0cnVlO1xuICB9XG5cbiAgb25Ob2RlRGlzY2FyZGVkKGVsKSB7XG4gICAgLy8gbmVzdGVkIHZpZXcgaGFuZGxpbmdcbiAgICBpZiAoRE9NLmlzUGh4Q2hpbGQoZWwpIHx8IERPTS5pc1BoeFN0aWNreShlbCkpIHtcbiAgICAgIHRoaXMubGl2ZVNvY2tldC5kZXN0cm95Vmlld0J5RWwoZWwpO1xuICAgIH1cbiAgICB0aGlzLnRyYWNrQWZ0ZXIoXCJkaXNjYXJkZWRcIiwgZWwpO1xuICB9XG5cbiAgbWF5YmVQZW5kaW5nUmVtb3ZlKG5vZGUpIHtcbiAgICBpZiAobm9kZS5nZXRBdHRyaWJ1dGUgJiYgbm9kZS5nZXRBdHRyaWJ1dGUodGhpcy5waHhSZW1vdmUpICE9PSBudWxsKSB7XG4gICAgICB0aGlzLnBlbmRpbmdSZW1vdmVzLnB1c2gobm9kZSk7XG4gICAgICByZXR1cm4gdHJ1ZTtcbiAgICB9IGVsc2Uge1xuICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH1cbiAgfVxuXG4gIHJlbW92ZVN0cmVhbUNoaWxkRWxlbWVudChjaGlsZCwgZm9yY2UgPSBmYWxzZSkge1xuICAgIC8vIG1ha2Ugc3VyZSB0byBvbmx5IHJlbW92ZSBlbGVtZW50cyBvd25lZCBieSB0aGUgY3VycmVudCB2aWV3XG4gICAgLy8gc2VlIGh0dHBzOi8vZ2l0aHViLmNvbS9waG9lbml4ZnJhbWV3b3JrL3Bob2VuaXhfbGl2ZV92aWV3L2lzc3Vlcy8zMDQ3XG4gICAgLy8gYW5kIGh0dHBzOi8vZ2l0aHViLmNvbS9waG9lbml4ZnJhbWV3b3JrL3Bob2VuaXhfbGl2ZV92aWV3L2lzc3Vlcy8zNjgxXG4gICAgaWYgKCFmb3JjZSAmJiAhdGhpcy52aWV3Lm93bnNFbGVtZW50KGNoaWxkKSkge1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIC8vIHdlIG5lZWQgdG8gc3RvcmUgdGhlIG5vZGUgaWYgaXQgaXMgYWN0dWFsbHkgcmUtYWRkZWQgaW4gdGhlIHNhbWUgcGF0Y2hcbiAgICAvLyB3ZSBkbyBOT1Qgd2FudCB0byBleGVjdXRlIHBoeC1yZW1vdmUsIHdlIGRvIE5PVCB3YW50IHRvIGNhbGwgb25Ob2RlRGlzY2FyZGVkXG4gICAgaWYgKHRoaXMuc3RyZWFtSW5zZXJ0c1tjaGlsZC5pZF0pIHtcbiAgICAgIHRoaXMuc3RyZWFtQ29tcG9uZW50UmVzdG9yZVtjaGlsZC5pZF0gPSBjaGlsZDtcbiAgICAgIGNoaWxkLnJlbW92ZSgpO1xuICAgIH0gZWxzZSB7XG4gICAgICAvLyBvbmx5IHJlbW92ZSB0aGUgZWxlbWVudCBub3cgaWYgaXQgaGFzIG5vIHBoeC1yZW1vdmUgYmluZGluZ1xuICAgICAgaWYgKCF0aGlzLm1heWJlUGVuZGluZ1JlbW92ZShjaGlsZCkpIHtcbiAgICAgICAgY2hpbGQucmVtb3ZlKCk7XG4gICAgICAgIHRoaXMub25Ob2RlRGlzY2FyZGVkKGNoaWxkKTtcbiAgICAgIH1cbiAgICB9XG4gIH1cblxuICBnZXRTdHJlYW1JbnNlcnQoZWwpIHtcbiAgICBjb25zdCBpbnNlcnQgPSBlbC5pZCA/IHRoaXMuc3RyZWFtSW5zZXJ0c1tlbC5pZF0gOiB7fTtcbiAgICByZXR1cm4gaW5zZXJ0IHx8IHt9O1xuICB9XG5cbiAgc2V0U3RyZWFtUmVmKGVsLCByZWYpIHtcbiAgICBET00ucHV0U3RpY2t5KGVsLCBQSFhfU1RSRUFNX1JFRiwgKGVsKSA9PlxuICAgICAgZWwuc2V0QXR0cmlidXRlKFBIWF9TVFJFQU1fUkVGLCByZWYpLFxuICAgICk7XG4gIH1cblxuICBtYXliZVJlT3JkZXJTdHJlYW0oZWwsIGlzTmV3KSB7XG4gICAgY29uc3QgeyByZWYsIHN0cmVhbUF0LCByZXNldCB9ID0gdGhpcy5nZXRTdHJlYW1JbnNlcnQoZWwpO1xuICAgIGlmIChzdHJlYW1BdCA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgLy8gd2UgbmVlZCB0byBzZXQgdGhlIFBIWF9TVFJFQU1fUkVGIGhlcmUgYXMgd2VsbCBhcyBhZGRDaGlsZCBpcyBpbnZva2VkIG9ubHkgZm9yIHBhcmVudHNcbiAgICB0aGlzLnNldFN0cmVhbVJlZihlbCwgcmVmKTtcblxuICAgIGlmICghcmVzZXQgJiYgIWlzTmV3KSB7XG4gICAgICAvLyB3ZSBvbmx5IHJlb3JkZXIgaWYgdGhlIGVsZW1lbnQgaXMgbmV3IG9yIGl0J3MgYSBzdHJlYW0gcmVzZXRcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICAvLyBjaGVjayBpZiB0aGUgZWxlbWVudCBoYXMgYSBwYXJlbnQgZWxlbWVudDtcbiAgICAvLyBpdCBkb2Vzbid0IGlmIHdlIGFyZSBjdXJyZW50bHkgcmVjdXJzaXZlbHkgbW9ycGhpbmcgKHJlc3RvcmluZyBhIHNhdmVkIHN0cmVhbSBjaGlsZClcbiAgICAvLyBiZWNhdXNlIHRoZSBlbGVtZW50IGlzIG5vdCB5ZXQgYWRkZWQgdG8gdGhlIHJlYWwgZG9tO1xuICAgIC8vIHJlb3JkZXJpbmcgZG9lcyBub3QgbWFrZSBzZW5zZSBpbiB0aGF0IGNhc2UgYW55d2F5XG4gICAgaWYgKCFlbC5wYXJlbnRFbGVtZW50KSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgaWYgKHN0cmVhbUF0ID09PSAwKSB7XG4gICAgICBlbC5wYXJlbnRFbGVtZW50Lmluc2VydEJlZm9yZShlbCwgZWwucGFyZW50RWxlbWVudC5maXJzdEVsZW1lbnRDaGlsZCk7XG4gICAgfSBlbHNlIGlmIChzdHJlYW1BdCA+IDApIHtcbiAgICAgIGNvbnN0IGNoaWxkcmVuID0gQXJyYXkuZnJvbShlbC5wYXJlbnRFbGVtZW50LmNoaWxkcmVuKTtcbiAgICAgIGNvbnN0IG9sZEluZGV4ID0gY2hpbGRyZW4uaW5kZXhPZihlbCk7XG4gICAgICBpZiAoc3RyZWFtQXQgPj0gY2hpbGRyZW4ubGVuZ3RoIC0gMSkge1xuICAgICAgICBlbC5wYXJlbnRFbGVtZW50LmFwcGVuZENoaWxkKGVsKTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIGNvbnN0IHNpYmxpbmcgPSBjaGlsZHJlbltzdHJlYW1BdF07XG4gICAgICAgIGlmIChvbGRJbmRleCA+IHN0cmVhbUF0KSB7XG4gICAgICAgICAgZWwucGFyZW50RWxlbWVudC5pbnNlcnRCZWZvcmUoZWwsIHNpYmxpbmcpO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIGVsLnBhcmVudEVsZW1lbnQuaW5zZXJ0QmVmb3JlKGVsLCBzaWJsaW5nLm5leHRFbGVtZW50U2libGluZyk7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9XG5cbiAgICB0aGlzLm1heWJlTGltaXRTdHJlYW0oZWwpO1xuICB9XG5cbiAgbWF5YmVMaW1pdFN0cmVhbShlbCkge1xuICAgIGNvbnN0IHsgbGltaXQgfSA9IHRoaXMuZ2V0U3RyZWFtSW5zZXJ0KGVsKTtcbiAgICBjb25zdCBjaGlsZHJlbiA9IGxpbWl0ICE9PSBudWxsICYmIEFycmF5LmZyb20oZWwucGFyZW50RWxlbWVudC5jaGlsZHJlbik7XG4gICAgaWYgKGxpbWl0ICYmIGxpbWl0IDwgMCAmJiBjaGlsZHJlbi5sZW5ndGggPiBsaW1pdCAqIC0xKSB7XG4gICAgICBjaGlsZHJlblxuICAgICAgICAuc2xpY2UoMCwgY2hpbGRyZW4ubGVuZ3RoICsgbGltaXQpXG4gICAgICAgIC5mb3JFYWNoKChjaGlsZCkgPT4gdGhpcy5yZW1vdmVTdHJlYW1DaGlsZEVsZW1lbnQoY2hpbGQpKTtcbiAgICB9IGVsc2UgaWYgKGxpbWl0ICYmIGxpbWl0ID49IDAgJiYgY2hpbGRyZW4ubGVuZ3RoID4gbGltaXQpIHtcbiAgICAgIGNoaWxkcmVuXG4gICAgICAgIC5zbGljZShsaW1pdClcbiAgICAgICAgLmZvckVhY2goKGNoaWxkKSA9PiB0aGlzLnJlbW92ZVN0cmVhbUNoaWxkRWxlbWVudChjaGlsZCkpO1xuICAgIH1cbiAgfVxuXG4gIHRyYW5zaXRpb25QZW5kaW5nUmVtb3ZlcygpIHtcbiAgICBjb25zdCB7IHBlbmRpbmdSZW1vdmVzLCBsaXZlU29ja2V0IH0gPSB0aGlzO1xuICAgIGlmIChwZW5kaW5nUmVtb3Zlcy5sZW5ndGggPiAwKSB7XG4gICAgICBsaXZlU29ja2V0LnRyYW5zaXRpb25SZW1vdmVzKHBlbmRpbmdSZW1vdmVzLCAoKSA9PiB7XG4gICAgICAgIHBlbmRpbmdSZW1vdmVzLmZvckVhY2goKGVsKSA9PiB7XG4gICAgICAgICAgY29uc3QgY2hpbGQgPSBET00uZmlyc3RQaHhDaGlsZChlbCk7XG4gICAgICAgICAgaWYgKGNoaWxkKSB7XG4gICAgICAgICAgICBsaXZlU29ja2V0LmRlc3Ryb3lWaWV3QnlFbChjaGlsZCk7XG4gICAgICAgICAgfVxuICAgICAgICAgIGVsLnJlbW92ZSgpO1xuICAgICAgICB9KTtcbiAgICAgICAgdGhpcy50cmFja0FmdGVyKFwidHJhbnNpdGlvbnNEaXNjYXJkZWRcIiwgcGVuZGluZ1JlbW92ZXMpO1xuICAgICAgfSk7XG4gICAgfVxuICB9XG5cbiAgaXNDaGFuZ2VkU2VsZWN0KGZyb21FbCwgdG9FbCkge1xuICAgIGlmICghKGZyb21FbCBpbnN0YW5jZW9mIEhUTUxTZWxlY3RFbGVtZW50KSB8fCBmcm9tRWwubXVsdGlwbGUpIHtcbiAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9XG4gICAgaWYgKGZyb21FbC5vcHRpb25zLmxlbmd0aCAhPT0gdG9FbC5vcHRpb25zLmxlbmd0aCkge1xuICAgICAgcmV0dXJuIHRydWU7XG4gICAgfVxuXG4gICAgLy8ga2VlcCB0aGUgY3VycmVudCB2YWx1ZVxuICAgIHRvRWwudmFsdWUgPSBmcm9tRWwudmFsdWU7XG5cbiAgICAvLyBpbiBnZW5lcmFsIHdlIGhhdmUgdG8gYmUgdmVyeSBjYXJlZnVsIHdpdGggdXNpbmcgaXNFcXVhbE5vZGUgYXMgaXQgZG9lcyBub3QgYSByZWxpYWJsZVxuICAgIC8vIERPTSB0cmVlIGVxdWFsaXR5IGNoZWNrLCBidXQgZm9yIHNlbGVjdGlvbiBhdHRyaWJ1dGVzIGFuZCBvcHRpb25zIGl0IHdvcmtzIGZpbmVcbiAgICByZXR1cm4gIWZyb21FbC5pc0VxdWFsTm9kZSh0b0VsKTtcbiAgfVxuXG4gIGlzQ0lEUGF0Y2goKSB7XG4gICAgcmV0dXJuIHRoaXMuY2lkUGF0Y2g7XG4gIH1cblxuICBza2lwQ0lEU2libGluZyhlbCkge1xuICAgIHJldHVybiBlbC5ub2RlVHlwZSA9PT0gTm9kZS5FTEVNRU5UX05PREUgJiYgZWwuaGFzQXR0cmlidXRlKFBIWF9TS0lQKTtcbiAgfVxuXG4gIHRhcmdldENJRENvbnRhaW5lcihodG1sKSB7XG4gICAgaWYgKCF0aGlzLmlzQ0lEUGF0Y2goKSkge1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICBjb25zdCBbZmlyc3QsIC4uLnJlc3RdID0gRE9NLmZpbmRDb21wb25lbnROb2RlTGlzdChcbiAgICAgIHRoaXMudmlldy5pZCxcbiAgICAgIHRoaXMudGFyZ2V0Q0lELFxuICAgICk7XG4gICAgaWYgKHJlc3QubGVuZ3RoID09PSAwICYmIERPTS5jaGlsZE5vZGVMZW5ndGgoaHRtbCkgPT09IDEpIHtcbiAgICAgIHJldHVybiBmaXJzdDtcbiAgICB9IGVsc2Uge1xuICAgICAgcmV0dXJuIGZpcnN0ICYmIGZpcnN0LnBhcmVudE5vZGU7XG4gICAgfVxuICB9XG5cbiAgaW5kZXhPZihwYXJlbnQsIGNoaWxkKSB7XG4gICAgcmV0dXJuIEFycmF5LmZyb20ocGFyZW50LmNoaWxkcmVuKS5pbmRleE9mKGNoaWxkKTtcbiAgfVxuXG4gIHRlbGVwb3J0KGVsLCBtb3JwaCkge1xuICAgIGNvbnN0IHRhcmdldFNlbGVjdG9yID0gZWwuZ2V0QXR0cmlidXRlKFBIWF9QT1JUQUwpO1xuICAgIGNvbnN0IHBvcnRhbENvbnRhaW5lciA9IGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3IodGFyZ2V0U2VsZWN0b3IpO1xuICAgIGlmICghcG9ydGFsQ29udGFpbmVyKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoXG4gICAgICAgIFwicG9ydGFsIHRhcmdldCB3aXRoIHNlbGVjdG9yIFwiICsgdGFyZ2V0U2VsZWN0b3IgKyBcIiBub3QgZm91bmRcIixcbiAgICAgICk7XG4gICAgfVxuICAgIC8vIHBoeC1wb3J0YWwgdGVtcGxhdGVzIG11c3QgaGF2ZSBhIHNpbmdsZSByb290IGVsZW1lbnQsIHNvIHdlIGFzc3VtZSB0aGlzIHRvIGJlXG4gICAgLy8gdGhlIGNhc2UgaGVyZVxuICAgIGNvbnN0IHRvVGVsZXBvcnQgPSBlbC5jb250ZW50LmZpcnN0RWxlbWVudENoaWxkO1xuICAgIC8vIHRoZSBQSFhfU0tJUCBvcHRpbWl6YXRpb24gY2FuIGFsc28gYXBwbHkgaW5zaWRlIG9mIHRoZSA8dGVtcGxhdGU+IGVsZW1lbnRzXG4gICAgaWYgKHRoaXMuc2tpcENJRFNpYmxpbmcodG9UZWxlcG9ydCkpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgaWYgKCF0b1RlbGVwb3J0Py5pZCkge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKFxuICAgICAgICBcInBoeC1wb3J0YWwgdGVtcGxhdGUgbXVzdCBoYXZlIGEgc2luZ2xlIHJvb3QgZWxlbWVudCB3aXRoIElEIVwiLFxuICAgICAgKTtcbiAgICB9XG4gICAgY29uc3QgZXhpc3RpbmcgPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCh0b1RlbGVwb3J0LmlkKTtcbiAgICBsZXQgcG9ydGFsVGFyZ2V0O1xuICAgIGlmIChleGlzdGluZykge1xuICAgICAgLy8gY2hlY2sgaWYgdGhlIGVsZW1lbnQgbmVlZHMgdG8gYmUgbW92ZWQgdG8gYW5vdGhlciB0YXJnZXRcbiAgICAgIGlmICghcG9ydGFsQ29udGFpbmVyLmNvbnRhaW5zKGV4aXN0aW5nKSkge1xuICAgICAgICBwb3J0YWxDb250YWluZXIuYXBwZW5kQ2hpbGQoZXhpc3RpbmcpO1xuICAgICAgfVxuICAgICAgLy8gd2UgYWxyZWFkeSB0ZWxlcG9ydGVkIGluIGEgcHJldmlvdXMgcGF0Y2hcbiAgICAgIHBvcnRhbFRhcmdldCA9IGV4aXN0aW5nO1xuICAgIH0gZWxzZSB7XG4gICAgICAvLyBjcmVhdGUgZW1wdHkgdGFyZ2V0IGFuZCBtb3JwaCBpdCByZWN1cnNpdmVseVxuICAgICAgcG9ydGFsVGFyZ2V0ID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCh0b1RlbGVwb3J0LnRhZ05hbWUpO1xuICAgICAgcG9ydGFsQ29udGFpbmVyLmFwcGVuZENoaWxkKHBvcnRhbFRhcmdldCk7XG4gICAgfVxuICAgIC8vIG1hcmsgdGhlIHRhcmdldCBhcyB0ZWxlcG9ydGVkO1xuICAgIC8vIHRvIHByZXZlbnQgdW5uZWNlc3NhcnkgYXR0cmlidXRlIG1vZGlmaWNhdGlvbnMsIHdlIHNldCB0aGUgYXR0cmlidXRlXG4gICAgLy8gb24gdGhlIHNvdXJjZSBhbmQgcmVtb3ZlIGl0IGFmdGVyIG1vcnBoaW5nICh3ZSBjb3VsZCBhbHNvIGp1c3Qga2VlcCBpdClcbiAgICAvLyBvdGhlcndpc2UgbW9ycGhkb20gd291bGQgcmVtb3ZlIGl0LCBhcyB0aGUgcmVmIGlzIG5vdCBwcmVzZW50IGluIHRoZSBzb3VyY2VcbiAgICAvLyBhbmQgd2UnZCBuZWVkIHRvIHNldCBpdCBiYWNrIGFmdGVyIGVhY2ggbW9ycGhcbiAgICB0b1RlbGVwb3J0LnNldEF0dHJpYnV0ZShQSFhfVEVMRVBPUlRFRF9SRUYsIHRoaXMudmlldy5pZCk7XG4gICAgdG9UZWxlcG9ydC5zZXRBdHRyaWJ1dGUoUEhYX1RFTEVQT1JURURfU1JDLCBlbC5pZCk7XG4gICAgbW9ycGgocG9ydGFsVGFyZ2V0LCB0b1RlbGVwb3J0LCB0cnVlKTtcbiAgICB0b1RlbGVwb3J0LnJlbW92ZUF0dHJpYnV0ZShQSFhfVEVMRVBPUlRFRF9SRUYpO1xuICAgIHRvVGVsZXBvcnQucmVtb3ZlQXR0cmlidXRlKFBIWF9URUxFUE9SVEVEX1NSQyk7XG4gICAgLy8gc3RvcmUgYSByZWZlcmVuY2UgdG8gdGhlIHRlbGVwb3J0ZWQgZWxlbWVudCBpbiB0aGUgdmlld1xuICAgIC8vIHRvIGNsZWFudXAgd2hlbiB0aGUgdmlldyBpcyBkZXN0cm95ZWQsIGluIGNhc2UgdGhlIHBvcnRhbCB0YXJnZXRcbiAgICAvLyBpcyBvdXRzaWRlIHRoZSB2aWV3IGl0c2VsZlxuICAgIHRoaXMudmlldy5wdXNoUG9ydGFsRWxlbWVudElkKHRvVGVsZXBvcnQuaWQpO1xuICB9XG5cbiAgaGFuZGxlUnVudGltZUhvb2soZWwsIHNvdXJjZSkge1xuICAgIC8vIHVzdWFsbHksIHNjcmlwdHMgYXJlIG5vdCBleGVjdXRlZCB3aGVuIG1vcnBoZG9tIGFkZHMgdGhlbSB0byB0aGUgRE9NXG4gICAgLy8gd2Ugc3BlY2lhbCBjYXNlIHJ1bnRpbWUgY29sb2NhdGVkIGhvb2tzXG4gICAgY29uc3QgbmFtZSA9IGVsLmdldEF0dHJpYnV0ZShQSFhfUlVOVElNRV9IT09LKTtcbiAgICBsZXQgbm9uY2UgPSBlbC5oYXNBdHRyaWJ1dGUoXCJub25jZVwiKSA/IGVsLmdldEF0dHJpYnV0ZShcIm5vbmNlXCIpIDogbnVsbDtcbiAgICBpZiAoZWwuaGFzQXR0cmlidXRlKFwibm9uY2VcIikpIHtcbiAgICAgIGNvbnN0IHRlbXBsYXRlID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudChcInRlbXBsYXRlXCIpO1xuICAgICAgdGVtcGxhdGUuaW5uZXJIVE1MID0gc291cmNlO1xuICAgICAgbm9uY2UgPSB0ZW1wbGF0ZS5jb250ZW50XG4gICAgICAgIC5xdWVyeVNlbGVjdG9yKGBzY3JpcHRbJHtQSFhfUlVOVElNRV9IT09LfT1cIiR7Q1NTLmVzY2FwZShuYW1lKX1cIl1gKVxuICAgICAgICAuZ2V0QXR0cmlidXRlKFwibm9uY2VcIik7XG4gICAgfVxuICAgIGNvbnN0IHNjcmlwdCA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoXCJzY3JpcHRcIik7XG4gICAgc2NyaXB0LnRleHRDb250ZW50ID0gZWwudGV4dENvbnRlbnQ7XG4gICAgRE9NLm1lcmdlQXR0cnMoc2NyaXB0LCBlbCwgeyBpc0lnbm9yZWQ6IGZhbHNlIH0pO1xuICAgIGlmIChub25jZSkge1xuICAgICAgc2NyaXB0Lm5vbmNlID0gbm9uY2U7XG4gICAgfVxuICAgIGVsLnJlcGxhY2VXaXRoKHNjcmlwdCk7XG4gICAgZWwgPSBzY3JpcHQ7XG4gIH1cbn1cbiIsICJpbXBvcnQge1xuICBDT01QT05FTlRTLFxuICBURU1QTEFURVMsXG4gIEVWRU5UUyxcbiAgUEhYX0NPTVBPTkVOVCxcbiAgUEhYX1ZJRVdfUkVGLFxuICBQSFhfU0tJUCxcbiAgUEhYX01BR0lDX0lELFxuICBSRVBMWSxcbiAgU1RBVElDLFxuICBUSVRMRSxcbiAgU1RSRUFNLFxuICBST09ULFxuICBLRVlFRCxcbiAgS0VZRURfQ09VTlQsXG59IGZyb20gXCIuL2NvbnN0YW50c1wiO1xuXG5pbXBvcnQgeyBpc09iamVjdCwgbG9nRXJyb3IsIGlzQ2lkIH0gZnJvbSBcIi4vdXRpbHNcIjtcblxuY29uc3QgVk9JRF9UQUdTID0gbmV3IFNldChbXG4gIFwiYXJlYVwiLFxuICBcImJhc2VcIixcbiAgXCJiclwiLFxuICBcImNvbFwiLFxuICBcImNvbW1hbmRcIixcbiAgXCJlbWJlZFwiLFxuICBcImhyXCIsXG4gIFwiaW1nXCIsXG4gIFwiaW5wdXRcIixcbiAgXCJrZXlnZW5cIixcbiAgXCJsaW5rXCIsXG4gIFwibWV0YVwiLFxuICBcInBhcmFtXCIsXG4gIFwic291cmNlXCIsXG4gIFwidHJhY2tcIixcbiAgXCJ3YnJcIixcbl0pO1xuY29uc3QgcXVvdGVDaGFycyA9IG5ldyBTZXQoW1wiJ1wiLCAnXCInXSk7XG5cbmV4cG9ydCBjb25zdCBtb2RpZnlSb290ID0gKGh0bWwsIGF0dHJzLCBjbGVhcklubmVySFRNTCkgPT4ge1xuICBsZXQgaSA9IDA7XG4gIGxldCBpbnNpZGVDb21tZW50ID0gZmFsc2U7XG4gIGxldCBiZWZvcmVUYWcsIGFmdGVyVGFnLCB0YWcsIHRhZ05hbWVFbmRzQXQsIGlkLCBuZXdIVE1MO1xuXG4gIGNvbnN0IGxvb2thaGVhZCA9IGh0bWwubWF0Y2goL14oXFxzKig/OjwhLS0uKj8tLT5cXHMqKSopPChbXlxcc1xcLz5dKykvKTtcbiAgaWYgKGxvb2thaGVhZCA9PT0gbnVsbCkge1xuICAgIHRocm93IG5ldyBFcnJvcihgbWFsZm9ybWVkIGh0bWwgJHtodG1sfWApO1xuICB9XG5cbiAgaSA9IGxvb2thaGVhZFswXS5sZW5ndGg7XG4gIGJlZm9yZVRhZyA9IGxvb2thaGVhZFsxXTtcbiAgdGFnID0gbG9va2FoZWFkWzJdO1xuICB0YWdOYW1lRW5kc0F0ID0gaTtcblxuICAvLyBTY2FuIHRoZSBvcGVuaW5nIHRhZyBmb3IgaWQsIGlmIHRoZXJlIGlzIGFueVxuICBmb3IgKGk7IGkgPCBodG1sLmxlbmd0aDsgaSsrKSB7XG4gICAgaWYgKGh0bWwuY2hhckF0KGkpID09PSBcIj5cIikge1xuICAgICAgYnJlYWs7XG4gICAgfVxuICAgIGlmIChodG1sLmNoYXJBdChpKSA9PT0gXCI9XCIpIHtcbiAgICAgIGNvbnN0IGlzSWQgPSBodG1sLnNsaWNlKGkgLSAzLCBpKSA9PT0gXCIgaWRcIjtcbiAgICAgIGkrKztcbiAgICAgIGNvbnN0IGNoYXIgPSBodG1sLmNoYXJBdChpKTtcbiAgICAgIGlmIChxdW90ZUNoYXJzLmhhcyhjaGFyKSkge1xuICAgICAgICBjb25zdCBhdHRyU3RhcnRzQXQgPSBpO1xuICAgICAgICBpKys7XG4gICAgICAgIGZvciAoaTsgaSA8IGh0bWwubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgICBpZiAoaHRtbC5jaGFyQXQoaSkgPT09IGNoYXIpIHtcbiAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICBpZiAoaXNJZCkge1xuICAgICAgICAgIGlkID0gaHRtbC5zbGljZShhdHRyU3RhcnRzQXQgKyAxLCBpKTtcbiAgICAgICAgICBicmVhaztcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIGxldCBjbG9zZUF0ID0gaHRtbC5sZW5ndGggLSAxO1xuICBpbnNpZGVDb21tZW50ID0gZmFsc2U7XG4gIHdoaWxlIChjbG9zZUF0ID49IGJlZm9yZVRhZy5sZW5ndGggKyB0YWcubGVuZ3RoKSB7XG4gICAgY29uc3QgY2hhciA9IGh0bWwuY2hhckF0KGNsb3NlQXQpO1xuICAgIGlmIChpbnNpZGVDb21tZW50KSB7XG4gICAgICBpZiAoY2hhciA9PT0gXCItXCIgJiYgaHRtbC5zbGljZShjbG9zZUF0IC0gMywgY2xvc2VBdCkgPT09IFwiPCEtXCIpIHtcbiAgICAgICAgaW5zaWRlQ29tbWVudCA9IGZhbHNlO1xuICAgICAgICBjbG9zZUF0IC09IDQ7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBjbG9zZUF0IC09IDE7XG4gICAgICB9XG4gICAgfSBlbHNlIGlmIChjaGFyID09PSBcIj5cIiAmJiBodG1sLnNsaWNlKGNsb3NlQXQgLSAyLCBjbG9zZUF0KSA9PT0gXCItLVwiKSB7XG4gICAgICBpbnNpZGVDb21tZW50ID0gdHJ1ZTtcbiAgICAgIGNsb3NlQXQgLT0gMztcbiAgICB9IGVsc2UgaWYgKGNoYXIgPT09IFwiPlwiKSB7XG4gICAgICBicmVhaztcbiAgICB9IGVsc2Uge1xuICAgICAgY2xvc2VBdCAtPSAxO1xuICAgIH1cbiAgfVxuICBhZnRlclRhZyA9IGh0bWwuc2xpY2UoY2xvc2VBdCArIDEsIGh0bWwubGVuZ3RoKTtcblxuICBjb25zdCBhdHRyc1N0ciA9IE9iamVjdC5rZXlzKGF0dHJzKVxuICAgIC5tYXAoKGF0dHIpID0+IChhdHRyc1thdHRyXSA9PT0gdHJ1ZSA/IGF0dHIgOiBgJHthdHRyfT1cIiR7YXR0cnNbYXR0cl19XCJgKSlcbiAgICAuam9pbihcIiBcIik7XG5cbiAgaWYgKGNsZWFySW5uZXJIVE1MKSB7XG4gICAgLy8gS2VlcCB0aGUgaWQgaWYgYW55XG4gICAgY29uc3QgaWRBdHRyU3RyID0gaWQgPyBgIGlkPVwiJHtpZH1cImAgOiBcIlwiO1xuICAgIGlmIChWT0lEX1RBR1MuaGFzKHRhZykpIHtcbiAgICAgIG5ld0hUTUwgPSBgPCR7dGFnfSR7aWRBdHRyU3RyfSR7YXR0cnNTdHIgPT09IFwiXCIgPyBcIlwiIDogXCIgXCJ9JHthdHRyc1N0cn0vPmA7XG4gICAgfSBlbHNlIHtcbiAgICAgIG5ld0hUTUwgPSBgPCR7dGFnfSR7aWRBdHRyU3RyfSR7YXR0cnNTdHIgPT09IFwiXCIgPyBcIlwiIDogXCIgXCJ9JHthdHRyc1N0cn0+PC8ke3RhZ30+YDtcbiAgICB9XG4gIH0gZWxzZSB7XG4gICAgY29uc3QgcmVzdCA9IGh0bWwuc2xpY2UodGFnTmFtZUVuZHNBdCwgY2xvc2VBdCArIDEpO1xuICAgIG5ld0hUTUwgPSBgPCR7dGFnfSR7YXR0cnNTdHIgPT09IFwiXCIgPyBcIlwiIDogXCIgXCJ9JHthdHRyc1N0cn0ke3Jlc3R9YDtcbiAgfVxuXG4gIHJldHVybiBbbmV3SFRNTCwgYmVmb3JlVGFnLCBhZnRlclRhZ107XG59O1xuXG5leHBvcnQgZGVmYXVsdCBjbGFzcyBSZW5kZXJlZCB7XG4gIHN0YXRpYyBleHRyYWN0KGRpZmYpIHtcbiAgICBjb25zdCB7IFtSRVBMWV06IHJlcGx5LCBbRVZFTlRTXTogZXZlbnRzLCBbVElUTEVdOiB0aXRsZSB9ID0gZGlmZjtcbiAgICBkZWxldGUgZGlmZltSRVBMWV07XG4gICAgZGVsZXRlIGRpZmZbRVZFTlRTXTtcbiAgICBkZWxldGUgZGlmZltUSVRMRV07XG4gICAgcmV0dXJuIHsgZGlmZiwgdGl0bGUsIHJlcGx5OiByZXBseSB8fCBudWxsLCBldmVudHM6IGV2ZW50cyB8fCBbXSB9O1xuICB9XG5cbiAgY29uc3RydWN0b3Iodmlld0lkLCByZW5kZXJlZCkge1xuICAgIHRoaXMudmlld0lkID0gdmlld0lkO1xuICAgIHRoaXMucmVuZGVyZWQgPSB7fTtcbiAgICB0aGlzLm1hZ2ljSWQgPSAwO1xuICAgIHRoaXMubWVyZ2VEaWZmKHJlbmRlcmVkKTtcbiAgfVxuXG4gIHBhcmVudFZpZXdJZCgpIHtcbiAgICByZXR1cm4gdGhpcy52aWV3SWQ7XG4gIH1cblxuICB0b1N0cmluZyhvbmx5Q2lkcykge1xuICAgIGNvbnN0IHsgYnVmZmVyOiBzdHIsIHN0cmVhbXM6IHN0cmVhbXMgfSA9IHRoaXMucmVjdXJzaXZlVG9TdHJpbmcoXG4gICAgICB0aGlzLnJlbmRlcmVkLFxuICAgICAgdGhpcy5yZW5kZXJlZFtDT01QT05FTlRTXSxcbiAgICAgIG9ubHlDaWRzLFxuICAgICAgdHJ1ZSxcbiAgICAgIHt9LFxuICAgICk7XG4gICAgcmV0dXJuIHsgYnVmZmVyOiBzdHIsIHN0cmVhbXM6IHN0cmVhbXMgfTtcbiAgfVxuXG4gIHJlY3Vyc2l2ZVRvU3RyaW5nKFxuICAgIHJlbmRlcmVkLFxuICAgIGNvbXBvbmVudHMgPSByZW5kZXJlZFtDT01QT05FTlRTXSxcbiAgICBvbmx5Q2lkcyxcbiAgICBjaGFuZ2VUcmFja2luZyxcbiAgICByb290QXR0cnMsXG4gICkge1xuICAgIG9ubHlDaWRzID0gb25seUNpZHMgPyBuZXcgU2V0KG9ubHlDaWRzKSA6IG51bGw7XG4gICAgY29uc3Qgb3V0cHV0ID0ge1xuICAgICAgYnVmZmVyOiBcIlwiLFxuICAgICAgY29tcG9uZW50czogY29tcG9uZW50cyxcbiAgICAgIG9ubHlDaWRzOiBvbmx5Q2lkcyxcbiAgICAgIHN0cmVhbXM6IG5ldyBTZXQoKSxcbiAgICB9O1xuICAgIHRoaXMudG9PdXRwdXRCdWZmZXIocmVuZGVyZWQsIG51bGwsIG91dHB1dCwgY2hhbmdlVHJhY2tpbmcsIHJvb3RBdHRycyk7XG4gICAgcmV0dXJuIHsgYnVmZmVyOiBvdXRwdXQuYnVmZmVyLCBzdHJlYW1zOiBvdXRwdXQuc3RyZWFtcyB9O1xuICB9XG5cbiAgY29tcG9uZW50Q0lEcyhkaWZmKSB7XG4gICAgcmV0dXJuIE9iamVjdC5rZXlzKGRpZmZbQ09NUE9ORU5UU10gfHwge30pLm1hcCgoaSkgPT4gcGFyc2VJbnQoaSkpO1xuICB9XG5cbiAgaXNDb21wb25lbnRPbmx5RGlmZihkaWZmKSB7XG4gICAgaWYgKCFkaWZmW0NPTVBPTkVOVFNdKSB7XG4gICAgICByZXR1cm4gZmFsc2U7XG4gICAgfVxuICAgIHJldHVybiBPYmplY3Qua2V5cyhkaWZmKS5sZW5ndGggPT09IDE7XG4gIH1cblxuICBnZXRDb21wb25lbnQoZGlmZiwgY2lkKSB7XG4gICAgcmV0dXJuIGRpZmZbQ09NUE9ORU5UU11bY2lkXTtcbiAgfVxuXG4gIHJlc2V0UmVuZGVyKGNpZCkge1xuICAgIC8vIHdlIGFyZSByYWNpbmcgYSBjb21wb25lbnQgZGVzdHJveSwgaXQgY291bGQgbm90IGV4aXN0LCBzb1xuICAgIC8vIG1ha2Ugc3VyZSB0aGF0IHdlIGRvbid0IHRyeSB0byBzZXQgcmVzZXQgb24gdW5kZWZpbmVkXG4gICAgaWYgKHRoaXMucmVuZGVyZWRbQ09NUE9ORU5UU11bY2lkXSkge1xuICAgICAgdGhpcy5yZW5kZXJlZFtDT01QT05FTlRTXVtjaWRdLnJlc2V0ID0gdHJ1ZTtcbiAgICB9XG4gIH1cblxuICBtZXJnZURpZmYoZGlmZikge1xuICAgIGNvbnN0IG5ld2MgPSBkaWZmW0NPTVBPTkVOVFNdO1xuICAgIGNvbnN0IGNhY2hlID0ge307XG4gICAgZGVsZXRlIGRpZmZbQ09NUE9ORU5UU107XG4gICAgdGhpcy5yZW5kZXJlZCA9IHRoaXMubXV0YWJsZU1lcmdlKHRoaXMucmVuZGVyZWQsIGRpZmYpO1xuICAgIHRoaXMucmVuZGVyZWRbQ09NUE9ORU5UU10gPSB0aGlzLnJlbmRlcmVkW0NPTVBPTkVOVFNdIHx8IHt9O1xuXG4gICAgaWYgKG5ld2MpIHtcbiAgICAgIGNvbnN0IG9sZGMgPSB0aGlzLnJlbmRlcmVkW0NPTVBPTkVOVFNdO1xuXG4gICAgICBmb3IgKGNvbnN0IGNpZCBpbiBuZXdjKSB7XG4gICAgICAgIG5ld2NbY2lkXSA9IHRoaXMuY2FjaGVkRmluZENvbXBvbmVudChjaWQsIG5ld2NbY2lkXSwgb2xkYywgbmV3YywgY2FjaGUpO1xuICAgICAgfVxuXG4gICAgICBmb3IgKGNvbnN0IGNpZCBpbiBuZXdjKSB7XG4gICAgICAgIG9sZGNbY2lkXSA9IG5ld2NbY2lkXTtcbiAgICAgIH1cbiAgICAgIGRpZmZbQ09NUE9ORU5UU10gPSBuZXdjO1xuICAgIH1cbiAgfVxuXG4gIGNhY2hlZEZpbmRDb21wb25lbnQoY2lkLCBjZGlmZiwgb2xkYywgbmV3YywgY2FjaGUpIHtcbiAgICBpZiAoY2FjaGVbY2lkXSkge1xuICAgICAgcmV0dXJuIGNhY2hlW2NpZF07XG4gICAgfSBlbHNlIHtcbiAgICAgIGxldCBuZGlmZixcbiAgICAgICAgc3RhdCxcbiAgICAgICAgc2NpZCA9IGNkaWZmW1NUQVRJQ107XG5cbiAgICAgIGlmIChpc0NpZChzY2lkKSkge1xuICAgICAgICBsZXQgdGRpZmY7XG5cbiAgICAgICAgaWYgKHNjaWQgPiAwKSB7XG4gICAgICAgICAgdGRpZmYgPSB0aGlzLmNhY2hlZEZpbmRDb21wb25lbnQoc2NpZCwgbmV3Y1tzY2lkXSwgb2xkYywgbmV3YywgY2FjaGUpO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIHRkaWZmID0gb2xkY1stc2NpZF07XG4gICAgICAgIH1cblxuICAgICAgICBzdGF0ID0gdGRpZmZbU1RBVElDXTtcbiAgICAgICAgbmRpZmYgPSB0aGlzLmNsb25lTWVyZ2UodGRpZmYsIGNkaWZmLCB0cnVlKTtcbiAgICAgICAgbmRpZmZbU1RBVElDXSA9IHN0YXQ7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBuZGlmZiA9XG4gICAgICAgICAgY2RpZmZbU1RBVElDXSAhPT0gdW5kZWZpbmVkIHx8IG9sZGNbY2lkXSA9PT0gdW5kZWZpbmVkXG4gICAgICAgICAgICA/IGNkaWZmXG4gICAgICAgICAgICA6IHRoaXMuY2xvbmVNZXJnZShvbGRjW2NpZF0sIGNkaWZmLCBmYWxzZSk7XG4gICAgICB9XG5cbiAgICAgIGNhY2hlW2NpZF0gPSBuZGlmZjtcbiAgICAgIHJldHVybiBuZGlmZjtcbiAgICB9XG4gIH1cblxuICBtdXRhYmxlTWVyZ2UodGFyZ2V0LCBzb3VyY2UpIHtcbiAgICBpZiAoc291cmNlW1NUQVRJQ10gIT09IHVuZGVmaW5lZCkge1xuICAgICAgcmV0dXJuIHNvdXJjZTtcbiAgICB9IGVsc2Uge1xuICAgICAgdGhpcy5kb011dGFibGVNZXJnZSh0YXJnZXQsIHNvdXJjZSk7XG4gICAgICByZXR1cm4gdGFyZ2V0O1xuICAgIH1cbiAgfVxuXG4gIGRvTXV0YWJsZU1lcmdlKHRhcmdldCwgc291cmNlKSB7XG4gICAgaWYgKHNvdXJjZVtLRVlFRF0pIHtcbiAgICAgIHRoaXMubWVyZ2VLZXllZCh0YXJnZXQsIHNvdXJjZSk7XG4gICAgfSBlbHNlIHtcbiAgICAgIGZvciAoY29uc3Qga2V5IGluIHNvdXJjZSkge1xuICAgICAgICBjb25zdCB2YWwgPSBzb3VyY2Vba2V5XTtcbiAgICAgICAgY29uc3QgdGFyZ2V0VmFsID0gdGFyZ2V0W2tleV07XG4gICAgICAgIGNvbnN0IGlzT2JqVmFsID0gaXNPYmplY3QodmFsKTtcbiAgICAgICAgaWYgKGlzT2JqVmFsICYmIHZhbFtTVEFUSUNdID09PSB1bmRlZmluZWQgJiYgaXNPYmplY3QodGFyZ2V0VmFsKSkge1xuICAgICAgICAgIHRoaXMuZG9NdXRhYmxlTWVyZ2UodGFyZ2V0VmFsLCB2YWwpO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIHRhcmdldFtrZXldID0gdmFsO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfVxuICAgIGlmICh0YXJnZXRbUk9PVF0pIHtcbiAgICAgIHRhcmdldC5uZXdSZW5kZXIgPSB0cnVlO1xuICAgIH1cbiAgfVxuXG4gIGNsb25lKGRpZmYpIHtcbiAgICBpZiAoXCJzdHJ1Y3R1cmVkQ2xvbmVcIiBpbiB3aW5kb3cpIHtcbiAgICAgIHJldHVybiBzdHJ1Y3R1cmVkQ2xvbmUoZGlmZik7XG4gICAgfSBlbHNlIHtcbiAgICAgIC8vIGZhbGxiYWNrIGZvciBqZXN0XG4gICAgICByZXR1cm4gSlNPTi5wYXJzZShKU09OLnN0cmluZ2lmeShkaWZmKSk7XG4gICAgfVxuICB9XG5cbiAgLy8ga2V5ZWQgY29tcHJlaGVuc2lvbnNcbiAgbWVyZ2VLZXllZCh0YXJnZXQsIHNvdXJjZSkge1xuICAgIC8vIHdlIG5lZWQgdG8gY2xvbmUgdGhlIHRhcmdldCBzaW5jZSBlbGVtZW50cyBjYW4gbW92ZSBhbmQgb3RoZXJ3aXNlXG4gICAgLy8gaXQgY291bGQgaGFwcGVuIHRoYXQgd2UgbW9kaWZ5IGFuIGVsZW1lbnQgdGhhdCB3ZSdsbCBuZWVkIHRvIHJlZmVyIHRvXG4gICAgLy8gbGF0ZXJcbiAgICBjb25zdCBjbG9uZWRUYXJnZXQgPSB0aGlzLmNsb25lKHRhcmdldCk7XG4gICAgT2JqZWN0LmVudHJpZXMoc291cmNlW0tFWUVEXSkuZm9yRWFjaCgoW2ksIGVudHJ5XSkgPT4ge1xuICAgICAgaWYgKGkgPT09IEtFWUVEX0NPVU5UKSB7XG4gICAgICAgIHJldHVybjtcbiAgICAgIH1cbiAgICAgIGlmIChBcnJheS5pc0FycmF5KGVudHJ5KSkge1xuICAgICAgICAvLyBbb2xkX2lkeCwgZGlmZl1cbiAgICAgICAgLy8gbW92ZWQgd2l0aCBkaWZmXG4gICAgICAgIGNvbnN0IFtvbGRfaWR4LCBkaWZmXSA9IGVudHJ5O1xuICAgICAgICB0YXJnZXRbS0VZRURdW2ldID0gY2xvbmVkVGFyZ2V0W0tFWUVEXVtvbGRfaWR4XTtcbiAgICAgICAgdGhpcy5kb011dGFibGVNZXJnZSh0YXJnZXRbS0VZRURdW2ldLCBkaWZmKTtcbiAgICAgIH0gZWxzZSBpZiAodHlwZW9mIGVudHJ5ID09PSBcIm51bWJlclwiKSB7XG4gICAgICAgIC8vIG1vdmVkIHdpdGhvdXQgZGlmZlxuICAgICAgICBjb25zdCBvbGRfaWR4ID0gZW50cnk7XG4gICAgICAgIHRhcmdldFtLRVlFRF1baV0gPSBjbG9uZWRUYXJnZXRbS0VZRURdW29sZF9pZHhdO1xuICAgICAgfSBlbHNlIGlmICh0eXBlb2YgZW50cnkgPT09IFwib2JqZWN0XCIpIHtcbiAgICAgICAgLy8gZGlmZiwgc2FtZSBwb3NpdGlvblxuICAgICAgICBpZiAoIXRhcmdldFtLRVlFRF1baV0pIHtcbiAgICAgICAgICB0YXJnZXRbS0VZRURdW2ldID0ge307XG4gICAgICAgIH1cbiAgICAgICAgdGhpcy5kb011dGFibGVNZXJnZSh0YXJnZXRbS0VZRURdW2ldLCBlbnRyeSk7XG4gICAgICB9XG4gICAgfSk7XG4gICAgLy8gZHJvcCBleHRyYSBlbnRyaWVzXG4gICAgaWYgKHNvdXJjZVtLRVlFRF1bS0VZRURfQ09VTlRdIDwgdGFyZ2V0W0tFWUVEXVtLRVlFRF9DT1VOVF0pIHtcbiAgICAgIGZvciAoXG4gICAgICAgIGxldCBpID0gc291cmNlW0tFWUVEXVtLRVlFRF9DT1VOVF07XG4gICAgICAgIGkgPCB0YXJnZXRbS0VZRURdW0tFWUVEX0NPVU5UXTtcbiAgICAgICAgaSsrXG4gICAgICApIHtcbiAgICAgICAgZGVsZXRlIHRhcmdldFtLRVlFRF1baV07XG4gICAgICB9XG4gICAgfVxuICAgIHRhcmdldFtLRVlFRF1bS0VZRURfQ09VTlRdID0gc291cmNlW0tFWUVEXVtLRVlFRF9DT1VOVF07XG4gICAgaWYgKHNvdXJjZVtTVFJFQU1dKSB7XG4gICAgICB0YXJnZXRbU1RSRUFNXSA9IHNvdXJjZVtTVFJFQU1dO1xuICAgIH1cbiAgICBpZiAoc291cmNlW1RFTVBMQVRFU10pIHtcbiAgICAgIHRhcmdldFtURU1QTEFURVNdID0gc291cmNlW1RFTVBMQVRFU107XG4gICAgfVxuICB9XG5cbiAgLy8gTWVyZ2VzIGNpZCB0cmVlcyB0b2dldGhlciwgY29weWluZyBzdGF0aWNzIGZyb20gc291cmNlIHRyZWUuXG4gIC8vXG4gIC8vIFRoZSBgcHJ1bmVNYWdpY0lkYCBpcyBwYXNzZWQgdG8gY29udHJvbCBwcnVuaW5nIHRoZSBtYWdpY0lkIG9mIHRoZVxuICAvLyB0YXJnZXQuIFdlIG11c3QgYWx3YXlzIHBydW5lIHRoZSBtYWdpY0lkIHdoZW4gd2UgYXJlIHNoYXJpbmcgc3RhdGljc1xuICAvLyBmcm9tIGFub3RoZXIgY29tcG9uZW50LiBJZiBub3QgcHJ1bmluZywgd2UgcmVwbGljYXRlIHRoZSBsb2dpYyBmcm9tXG4gIC8vIG11dGFibGVNZXJnZSwgd2hlcmUgd2Ugc2V0IG5ld1JlbmRlciB0byB0cnVlIGlmIHRoZXJlIGlzIGEgcm9vdFxuICAvLyAoZWZmZWN0aXZlbHkgZm9yY2luZyB0aGUgbmV3IHZlcnNpb24gdG8gYmUgcmVuZGVyZWQgaW5zdGVhZCBvZiBza2lwcGVkKVxuICAvL1xuICBjbG9uZU1lcmdlKHRhcmdldCwgc291cmNlLCBwcnVuZU1hZ2ljSWQpIHtcbiAgICBjb25zdCBtZXJnZWQgPSB7IC4uLnRhcmdldCwgLi4uc291cmNlIH07XG4gICAgZm9yIChjb25zdCBrZXkgaW4gbWVyZ2VkKSB7XG4gICAgICBjb25zdCB2YWwgPSBzb3VyY2Vba2V5XTtcbiAgICAgIGNvbnN0IHRhcmdldFZhbCA9IHRhcmdldFtrZXldO1xuICAgICAgaWYgKGlzT2JqZWN0KHZhbCkgJiYgdmFsW1NUQVRJQ10gPT09IHVuZGVmaW5lZCAmJiBpc09iamVjdCh0YXJnZXRWYWwpKSB7XG4gICAgICAgIG1lcmdlZFtrZXldID0gdGhpcy5jbG9uZU1lcmdlKHRhcmdldFZhbCwgdmFsLCBwcnVuZU1hZ2ljSWQpO1xuICAgICAgfSBlbHNlIGlmICh2YWwgPT09IHVuZGVmaW5lZCAmJiBpc09iamVjdCh0YXJnZXRWYWwpKSB7XG4gICAgICAgIG1lcmdlZFtrZXldID0gdGhpcy5jbG9uZU1lcmdlKHRhcmdldFZhbCwge30sIHBydW5lTWFnaWNJZCk7XG4gICAgICB9XG4gICAgfVxuICAgIGlmIChwcnVuZU1hZ2ljSWQpIHtcbiAgICAgIGRlbGV0ZSBtZXJnZWQubWFnaWNJZDtcbiAgICAgIGRlbGV0ZSBtZXJnZWQubmV3UmVuZGVyO1xuICAgIH0gZWxzZSBpZiAodGFyZ2V0W1JPT1RdKSB7XG4gICAgICBtZXJnZWQubmV3UmVuZGVyID0gdHJ1ZTtcbiAgICB9XG4gICAgcmV0dXJuIG1lcmdlZDtcbiAgfVxuXG4gIGNvbXBvbmVudFRvU3RyaW5nKGNpZCkge1xuICAgIGNvbnN0IHsgYnVmZmVyOiBzdHIsIHN0cmVhbXMgfSA9IHRoaXMucmVjdXJzaXZlQ0lEVG9TdHJpbmcoXG4gICAgICB0aGlzLnJlbmRlcmVkW0NPTVBPTkVOVFNdLFxuICAgICAgY2lkLFxuICAgICAgbnVsbCxcbiAgICApO1xuICAgIGNvbnN0IFtzdHJpcHBlZEhUTUwsIF9iZWZvcmUsIF9hZnRlcl0gPSBtb2RpZnlSb290KHN0ciwge30pO1xuICAgIHJldHVybiB7IGJ1ZmZlcjogc3RyaXBwZWRIVE1MLCBzdHJlYW1zOiBzdHJlYW1zIH07XG4gIH1cblxuICBwcnVuZUNJRHMoY2lkcykge1xuICAgIGNpZHMuZm9yRWFjaCgoY2lkKSA9PiBkZWxldGUgdGhpcy5yZW5kZXJlZFtDT01QT05FTlRTXVtjaWRdKTtcbiAgfVxuXG4gIC8vIHByaXZhdGVcblxuICBnZXQoKSB7XG4gICAgcmV0dXJuIHRoaXMucmVuZGVyZWQ7XG4gIH1cblxuICBpc05ld0ZpbmdlcnByaW50KGRpZmYgPSB7fSkge1xuICAgIHJldHVybiAhIWRpZmZbU1RBVElDXTtcbiAgfVxuXG4gIHRlbXBsYXRlU3RhdGljKHBhcnQsIHRlbXBsYXRlcykge1xuICAgIGlmICh0eXBlb2YgcGFydCA9PT0gXCJudW1iZXJcIikge1xuICAgICAgcmV0dXJuIHRlbXBsYXRlc1twYXJ0XTtcbiAgICB9IGVsc2Uge1xuICAgICAgcmV0dXJuIHBhcnQ7XG4gICAgfVxuICB9XG5cbiAgbmV4dE1hZ2ljSUQoKSB7XG4gICAgdGhpcy5tYWdpY0lkKys7XG4gICAgcmV0dXJuIGBtJHt0aGlzLm1hZ2ljSWR9LSR7dGhpcy5wYXJlbnRWaWV3SWQoKX1gO1xuICB9XG5cbiAgLy8gQ29udmVydHMgcmVuZGVyZWQgdHJlZSB0byBvdXRwdXQgYnVmZmVyLlxuICAvL1xuICAvLyBjaGFuZ2VUcmFja2luZyBjb250cm9scyBpZiB3ZSBjYW4gYXBwbHkgdGhlIFBIWF9TS0lQIG9wdGltaXphdGlvbi5cbiAgdG9PdXRwdXRCdWZmZXIocmVuZGVyZWQsIHRlbXBsYXRlcywgb3V0cHV0LCBjaGFuZ2VUcmFja2luZywgcm9vdEF0dHJzID0ge30pIHtcbiAgICBpZiAocmVuZGVyZWRbS0VZRURdKSB7XG4gICAgICByZXR1cm4gdGhpcy5jb21wcmVoZW5zaW9uVG9CdWZmZXIoXG4gICAgICAgIHJlbmRlcmVkLFxuICAgICAgICB0ZW1wbGF0ZXMsXG4gICAgICAgIG91dHB1dCxcbiAgICAgICAgY2hhbmdlVHJhY2tpbmcsXG4gICAgICApO1xuICAgIH1cblxuICAgIC8vIFRlbXBsYXRlcyBhcmUgYSB3YXkgb2Ygc2hhcmluZyBzdGF0aWNzIGJldHdlZW4gbXVsdGlwbGUgcmVuZGVyZWQgc3RydWN0cy5cbiAgICAvLyBTaW5jZSBMaXZlVmlldyAxLjEsIHRob3NlIGNhbiBhbHNvIGFwcGVhciBhdCB0aGUgcm9vdCAtIGZvciBleGFtcGxlIGlmIG9uZSByZW5kZXJzXG4gICAgLy8gdHdvIGNvbXByZWhlbnNpb25zIHRoYXQgY2FuIHNoYXJlIHN0YXRpY3MuXG4gICAgLy8gV2hlbmV2ZXIgd2UgZmluZCB0ZW1wbGF0ZXMsIHdlIG5lZWQgdG8gdXNlIHRoZW0gcmVjdXJzaXZlbHkuIEFsc28sIHRlbXBsYXRlcyBjYW5cbiAgICAvLyBiZSBzZW50IGZvciBlYWNoIGRpZmYsIG5vdCBvbmx5IGZvciB0aGUgaW5pdGlhbCBvbmUuIFdlIGRvbid0IHdhbnQgdG8gbWVyZ2UgdGhlbVxuICAgIC8vIHRob3VnaCwgc28gd2UgYWx3YXlzIHJlc29sdmUgdGhlbSBhbmQgcmVtb3ZlIHRoZW0gZnJvbSB0aGUgcmVuZGVyZWQgb2JqZWN0LlxuICAgIGlmIChyZW5kZXJlZFtURU1QTEFURVNdKSB7XG4gICAgICB0ZW1wbGF0ZXMgPSByZW5kZXJlZFtURU1QTEFURVNdO1xuICAgICAgZGVsZXRlIHJlbmRlcmVkW1RFTVBMQVRFU107XG4gICAgfVxuXG4gICAgbGV0IHsgW1NUQVRJQ106IHN0YXRpY3MgfSA9IHJlbmRlcmVkO1xuICAgIHN0YXRpY3MgPSB0aGlzLnRlbXBsYXRlU3RhdGljKHN0YXRpY3MsIHRlbXBsYXRlcyk7XG4gICAgcmVuZGVyZWRbU1RBVElDXSA9IHN0YXRpY3M7XG4gICAgY29uc3QgaXNSb290ID0gcmVuZGVyZWRbUk9PVF07XG4gICAgY29uc3QgcHJldkJ1ZmZlciA9IG91dHB1dC5idWZmZXI7XG4gICAgaWYgKGlzUm9vdCkge1xuICAgICAgb3V0cHV0LmJ1ZmZlciA9IFwiXCI7XG4gICAgfVxuXG4gICAgLy8gdGhpcyBjb25kaXRpb24gaXMgY2FsbGVkIHdoZW4gZmlyc3QgcmVuZGVyaW5nIGFuIG9wdGltaXphYmxlIGZ1bmN0aW9uIGNvbXBvbmVudC5cbiAgICAvLyBMQyBoYXZlIHRoZWlyIG1hZ2ljSWQgcHJldmlvdXNseSBzZXRcbiAgICBpZiAoY2hhbmdlVHJhY2tpbmcgJiYgaXNSb290ICYmICFyZW5kZXJlZC5tYWdpY0lkKSB7XG4gICAgICByZW5kZXJlZC5uZXdSZW5kZXIgPSB0cnVlO1xuICAgICAgcmVuZGVyZWQubWFnaWNJZCA9IHRoaXMubmV4dE1hZ2ljSUQoKTtcbiAgICB9XG5cbiAgICBvdXRwdXQuYnVmZmVyICs9IHN0YXRpY3NbMF07XG4gICAgZm9yIChsZXQgaSA9IDE7IGkgPCBzdGF0aWNzLmxlbmd0aDsgaSsrKSB7XG4gICAgICB0aGlzLmR5bmFtaWNUb0J1ZmZlcihyZW5kZXJlZFtpIC0gMV0sIHRlbXBsYXRlcywgb3V0cHV0LCBjaGFuZ2VUcmFja2luZyk7XG4gICAgICBvdXRwdXQuYnVmZmVyICs9IHN0YXRpY3NbaV07XG4gICAgfVxuXG4gICAgLy8gQXBwbGllcyB0aGUgcm9vdCB0YWcgXCJza2lwXCIgb3B0aW1pemF0aW9uIGlmIHN1cHBvcnRlZCwgd2hpY2ggY2xlYXJzXG4gICAgLy8gdGhlIHJvb3QgdGFnIGF0dHJpYnV0ZXMgYW5kIGlubmVySFRNTCwgYW5kIG9ubHkgbWFpbnRhaW5zIHRoZSBtYWdpY0lkLlxuICAgIC8vIFdlIGNhbiBvbmx5IHNraXAgd2hlbiBjaGFuZ2VUcmFja2luZyBpcyBzdXBwb3J0ZWQsXG4gICAgLy8gYW5kIHdoZW4gdGhlIHJvb3QgZWxlbWVudCBoYXNuJ3QgZXhwZXJpZW5jZWQgYW4gdW5yZW5kZXJlZCBtZXJnZSAobmV3UmVuZGVyIHRydWUpLlxuICAgIGlmIChpc1Jvb3QpIHtcbiAgICAgIGxldCBza2lwID0gZmFsc2U7XG4gICAgICBsZXQgYXR0cnM7XG4gICAgICAvLyBXaGVuIGEgTEMgaXMgcmUtYWRkZWQgdG8gdGhlIHBhZ2UsIHdlIG5lZWQgdG8gcmUtcmVuZGVyIHRoZSBlbnRpcmUgTEMgdHJlZSxcbiAgICAgIC8vIHRoZXJlZm9yZSBjaGFuZ2VUcmFja2luZyBpcyBmYWxzZTsgaG93ZXZlciwgd2UgbmVlZCB0byBrZWVwIGFsbCB0aGUgbWFnaWNJZHNcbiAgICAgIC8vIGZyb20gYW55IGZ1bmN0aW9uIGNvbXBvbmVudCBzbyB0aGUgbmV4dCB0aW1lIHRoZSBMQyBpcyB1cGRhdGVkLCB3ZSBjYW4gYXBwbHlcbiAgICAgIC8vIHRoZSBza2lwIG9wdGltaXphdGlvblxuICAgICAgaWYgKGNoYW5nZVRyYWNraW5nIHx8IHJlbmRlcmVkLm1hZ2ljSWQpIHtcbiAgICAgICAgc2tpcCA9IGNoYW5nZVRyYWNraW5nICYmICFyZW5kZXJlZC5uZXdSZW5kZXI7XG4gICAgICAgIGF0dHJzID0geyBbUEhYX01BR0lDX0lEXTogcmVuZGVyZWQubWFnaWNJZCwgLi4ucm9vdEF0dHJzIH07XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBhdHRycyA9IHJvb3RBdHRycztcbiAgICAgIH1cbiAgICAgIGlmIChza2lwKSB7XG4gICAgICAgIGF0dHJzW1BIWF9TS0lQXSA9IHRydWU7XG4gICAgICB9XG4gICAgICBjb25zdCBbbmV3Um9vdCwgY29tbWVudEJlZm9yZSwgY29tbWVudEFmdGVyXSA9IG1vZGlmeVJvb3QoXG4gICAgICAgIG91dHB1dC5idWZmZXIsXG4gICAgICAgIGF0dHJzLFxuICAgICAgICBza2lwLFxuICAgICAgKTtcbiAgICAgIHJlbmRlcmVkLm5ld1JlbmRlciA9IGZhbHNlO1xuICAgICAgb3V0cHV0LmJ1ZmZlciA9IHByZXZCdWZmZXIgKyBjb21tZW50QmVmb3JlICsgbmV3Um9vdCArIGNvbW1lbnRBZnRlcjtcbiAgICB9XG4gIH1cblxuICBjb21wcmVoZW5zaW9uVG9CdWZmZXIocmVuZGVyZWQsIHRlbXBsYXRlcywgb3V0cHV0LCBjaGFuZ2VUcmFja2luZykge1xuICAgIGNvbnN0IGtleWVkVGVtcGxhdGVzID0gdGVtcGxhdGVzIHx8IHJlbmRlcmVkW1RFTVBMQVRFU107XG4gICAgY29uc3Qgc3RhdGljcyA9IHRoaXMudGVtcGxhdGVTdGF0aWMocmVuZGVyZWRbU1RBVElDXSwgdGVtcGxhdGVzKTtcbiAgICByZW5kZXJlZFtTVEFUSUNdID0gc3RhdGljcztcbiAgICBkZWxldGUgcmVuZGVyZWRbVEVNUExBVEVTXTtcbiAgICBmb3IgKGxldCBpID0gMDsgaSA8IHJlbmRlcmVkW0tFWUVEXVtLRVlFRF9DT1VOVF07IGkrKykge1xuICAgICAgb3V0cHV0LmJ1ZmZlciArPSBzdGF0aWNzWzBdO1xuICAgICAgZm9yIChsZXQgaiA9IDE7IGogPCBzdGF0aWNzLmxlbmd0aDsgaisrKSB7XG4gICAgICAgIHRoaXMuZHluYW1pY1RvQnVmZmVyKFxuICAgICAgICAgIHJlbmRlcmVkW0tFWUVEXVtpXVtqIC0gMV0sXG4gICAgICAgICAga2V5ZWRUZW1wbGF0ZXMsXG4gICAgICAgICAgb3V0cHV0LFxuICAgICAgICAgIGNoYW5nZVRyYWNraW5nLFxuICAgICAgICApO1xuICAgICAgICBvdXRwdXQuYnVmZmVyICs9IHN0YXRpY3Nbal07XG4gICAgICB9XG4gICAgfVxuICAgIC8vIHdlIGRvbid0IG5lZWQgdG8gc3RvcmUgdGhlIHJlbmRlcmVkIHRyZWUgZm9yIHN0cmVhbXNcbiAgICBpZiAocmVuZGVyZWRbU1RSRUFNXSkge1xuICAgICAgY29uc3Qgc3RyZWFtID0gcmVuZGVyZWRbU1RSRUFNXTtcbiAgICAgIGNvbnN0IFtfcmVmLCBfaW5zZXJ0cywgZGVsZXRlSWRzLCByZXNldF0gPSBzdHJlYW0gfHwgW251bGwsIHt9LCBbXSwgbnVsbF07XG4gICAgICBpZiAoXG4gICAgICAgIHN0cmVhbSAhPT0gdW5kZWZpbmVkICYmXG4gICAgICAgIChyZW5kZXJlZFtLRVlFRF1bS0VZRURfQ09VTlRdID4gMCB8fCBkZWxldGVJZHMubGVuZ3RoID4gMCB8fCByZXNldClcbiAgICAgICkge1xuICAgICAgICBkZWxldGUgcmVuZGVyZWRbU1RSRUFNXTtcbiAgICAgICAgcmVuZGVyZWRbS0VZRURdID0ge1xuICAgICAgICAgIFtLRVlFRF9DT1VOVF06IDAsXG4gICAgICAgIH07XG4gICAgICAgIG91dHB1dC5zdHJlYW1zLmFkZChzdHJlYW0pO1xuICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIGR5bmFtaWNUb0J1ZmZlcihyZW5kZXJlZCwgdGVtcGxhdGVzLCBvdXRwdXQsIGNoYW5nZVRyYWNraW5nKSB7XG4gICAgaWYgKHR5cGVvZiByZW5kZXJlZCA9PT0gXCJudW1iZXJcIikge1xuICAgICAgY29uc3QgeyBidWZmZXI6IHN0ciwgc3RyZWFtcyB9ID0gdGhpcy5yZWN1cnNpdmVDSURUb1N0cmluZyhcbiAgICAgICAgb3V0cHV0LmNvbXBvbmVudHMsXG4gICAgICAgIHJlbmRlcmVkLFxuICAgICAgICBvdXRwdXQub25seUNpZHMsXG4gICAgICApO1xuICAgICAgb3V0cHV0LmJ1ZmZlciArPSBzdHI7XG4gICAgICBvdXRwdXQuc3RyZWFtcyA9IG5ldyBTZXQoWy4uLm91dHB1dC5zdHJlYW1zLCAuLi5zdHJlYW1zXSk7XG4gICAgfSBlbHNlIGlmIChpc09iamVjdChyZW5kZXJlZCkpIHtcbiAgICAgIHRoaXMudG9PdXRwdXRCdWZmZXIocmVuZGVyZWQsIHRlbXBsYXRlcywgb3V0cHV0LCBjaGFuZ2VUcmFja2luZywge30pO1xuICAgIH0gZWxzZSB7XG4gICAgICBvdXRwdXQuYnVmZmVyICs9IHJlbmRlcmVkO1xuICAgIH1cbiAgfVxuXG4gIHJlY3Vyc2l2ZUNJRFRvU3RyaW5nKGNvbXBvbmVudHMsIGNpZCwgb25seUNpZHMpIHtcbiAgICBjb25zdCBjb21wb25lbnQgPVxuICAgICAgY29tcG9uZW50c1tjaWRdIHx8IGxvZ0Vycm9yKGBubyBjb21wb25lbnQgZm9yIENJRCAke2NpZH1gLCBjb21wb25lbnRzKTtcbiAgICBjb25zdCBhdHRycyA9IHsgW1BIWF9DT01QT05FTlRdOiBjaWQsIFtQSFhfVklFV19SRUZdOiB0aGlzLnZpZXdJZCB9O1xuICAgIGNvbnN0IHNraXAgPSBvbmx5Q2lkcyAmJiAhb25seUNpZHMuaGFzKGNpZCk7XG4gICAgLy8gVHdvIG9wdGltaXphdGlvbiBwYXRocyBhcHBseSBoZXJlOlxuICAgIC8vXG4gICAgLy8gICAxLiBUaGUgb25seUNpZHMgb3B0aW1pemF0aW9uIHdvcmtzIGJ5IHRoZSBzZXJ2ZXIgZGlmZiB0ZWxsaW5nIHVzIG9ubHkgc3BlY2lmaWNcbiAgICAvLyAgICAgY2lkJ3MgaGF2ZSBjaGFuZ2VkLiBUaGlzIGFsbG93cyB1cyB0byBza2lwIHJlbmRlcmluZyBhbnkgY29tcG9uZW50IHRoYXQgaGFzbid0IGNoYW5nZWQsXG4gICAgLy8gICAgIHdoaWNoIHVsdGltYXRlbHkgc2V0cyBQSFhfU0tJUCByb290IGF0dHJpYnV0ZSBhbmQgYXZvaWRzIHJlbmRlcmluZyB0aGUgaW5uZXJIVE1MLlxuICAgIC8vXG4gICAgLy8gICAyLiBUaGUgcm9vdCBQSFhfU0tJUCBvcHRpbWl6YXRpb24gZ2VuZXJhbGl6ZXMgdG8gYWxsIEhFRXggZnVuY3Rpb24gY29tcG9uZW50cywgYW5kXG4gICAgLy8gICAgIHdvcmtzIGluIHRoZSBzYW1lIFBIWF9TS0lQIGF0dHJpYnV0ZSBmYXNoaW9uIGFzIDEsIGJ1dCB0aGUgbmV3UmVuZGVyIHRyYWNraW5nIGlzIGRvbmVcbiAgICAvLyAgICAgYXQgdGhlIGdlbmVyYWwgZGlmZiBtZXJnZSBsZXZlbC4gSWYgd2UgbWVyZ2UgYSBkaWZmIHdpdGggbmV3IGR5bmFtaWNzLCB3ZSBuZWNlc3NhcmlseSBoYXZlXG4gICAgLy8gICAgIGV4cGVyaWVuY2VkIGEgY2hhbmdlIHdoaWNoIG11c3QgYmUgYSBuZXdSZW5kZXIsIGFuZCB0aHVzIHdlIGNhbid0IHNraXAgdGhlIHJlbmRlci5cbiAgICAvL1xuICAgIC8vIEJvdGggb3B0aW1pemF0aW9uIGZsb3dzIGFwcGx5IGhlcmUuIG5ld1JlbmRlciBpcyBzZXQgYmFzZWQgb24gdGhlIG9ubHlDaWRzIG9wdGltaXphdGlvbiwgYW5kXG4gICAgLy8gd2UgdHJhY2sgYSBkZXRlcm1pbmlzdGljIG1hZ2ljSWQgYmFzZWQgb24gdGhlIGNpZC5cbiAgICAvL1xuICAgIC8vIGNoYW5nZVRyYWNraW5nIGlzIGFib3V0IHRoZSBlbnRpcmUgdHJlZVxuICAgIC8vIG5ld1JlbmRlciBpcyBhYm91dCB0aGUgY3VycmVudCByb290IGluIHRoZSB0cmVlXG4gICAgLy9cbiAgICAvLyBCeSBkZWZhdWx0IGNoYW5nZVRyYWNraW5nIGlzIGVuYWJsZWQsIGJ1dCB3ZSBzcGVjaWFsIGNhc2UgdGhlIGZsb3cgd2hlcmUgdGhlIGNsaWVudCBpcyBwcnVuaW5nXG4gICAgLy8gY2lkcyBhbmQgdGhlIHNlcnZlciBhZGRzIHRoZSBjb21wb25lbnQgYmFjay4gSW4gc3VjaCBjYXNlcywgd2UgZXhwbGljaXRseSBkaXNhYmxlIGNoYW5nZVRyYWNraW5nXG4gICAgLy8gd2l0aCByZXNldFJlbmRlciBmb3IgdGhpcyBjaWQsIHRoZW4gcmUtZW5hYmxlIGl0IGFmdGVyIHRoZSByZWN1cnNpdmUgY2FsbCB0byBza2lwIHRoZSBvcHRpbWl6YXRpb25cbiAgICAvLyBmb3IgdGhlIGVudGlyZSBjb21wb25lbnQgdHJlZS5cbiAgICBjb21wb25lbnQubmV3UmVuZGVyID0gIXNraXA7XG4gICAgY29tcG9uZW50Lm1hZ2ljSWQgPSBgYyR7Y2lkfS0ke3RoaXMucGFyZW50Vmlld0lkKCl9YDtcbiAgICAvLyBlbmFibGUgY2hhbmdlIHRyYWNraW5nIGFzIGxvbmcgYXMgdGhlIGNvbXBvbmVudCBoYXNuJ3QgYmVlbiByZXNldFxuICAgIGNvbnN0IGNoYW5nZVRyYWNraW5nID0gIWNvbXBvbmVudC5yZXNldDtcbiAgICBjb25zdCB7IGJ1ZmZlcjogaHRtbCwgc3RyZWFtcyB9ID0gdGhpcy5yZWN1cnNpdmVUb1N0cmluZyhcbiAgICAgIGNvbXBvbmVudCxcbiAgICAgIGNvbXBvbmVudHMsXG4gICAgICBvbmx5Q2lkcyxcbiAgICAgIGNoYW5nZVRyYWNraW5nLFxuICAgICAgYXR0cnMsXG4gICAgKTtcbiAgICAvLyBkaXNhYmxlIHJlc2V0IGFmdGVyIHdlJ3ZlIHJlbmRlcmVkXG4gICAgZGVsZXRlIGNvbXBvbmVudC5yZXNldDtcblxuICAgIHJldHVybiB7IGJ1ZmZlcjogaHRtbCwgc3RyZWFtczogc3RyZWFtcyB9O1xuICB9XG59XG4iLCAiaW1wb3J0IERPTSBmcm9tIFwiLi9kb21cIjtcbmltcG9ydCBBUklBIGZyb20gXCIuL2FyaWFcIjtcblxuY29uc3QgZm9jdXNTdGFjayA9IFtdO1xuY29uc3QgZGVmYXVsdF90cmFuc2l0aW9uX3RpbWUgPSAyMDA7XG5cbmNvbnN0IEpTID0ge1xuICAvLyBwcml2YXRlXG4gIGV4ZWMoZSwgZXZlbnRUeXBlLCBwaHhFdmVudCwgdmlldywgc291cmNlRWwsIGRlZmF1bHRzKSB7XG4gICAgY29uc3QgW2RlZmF1bHRLaW5kLCBkZWZhdWx0QXJnc10gPSBkZWZhdWx0cyB8fCBbXG4gICAgICBudWxsLFxuICAgICAgeyBjYWxsYmFjazogZGVmYXVsdHMgJiYgZGVmYXVsdHMuY2FsbGJhY2sgfSxcbiAgICBdO1xuICAgIGNvbnN0IGNvbW1hbmRzID1cbiAgICAgIHBoeEV2ZW50LmNoYXJBdCgwKSA9PT0gXCJbXCJcbiAgICAgICAgPyBKU09OLnBhcnNlKHBoeEV2ZW50KVxuICAgICAgICA6IFtbZGVmYXVsdEtpbmQsIGRlZmF1bHRBcmdzXV07XG5cbiAgICBjb21tYW5kcy5mb3JFYWNoKChba2luZCwgYXJnc10pID0+IHtcbiAgICAgIGlmIChraW5kID09PSBkZWZhdWx0S2luZCkge1xuICAgICAgICAvLyBhbHdheXMgcHJlZmVyIHRoZSBhcmdzLCBidXQga2VlcCBleGlzdGluZyBrZXlzIGZyb20gdGhlIGRlZmF1bHRBcmdzXG4gICAgICAgIGFyZ3MgPSB7IC4uLmRlZmF1bHRBcmdzLCAuLi5hcmdzIH07XG4gICAgICAgIGFyZ3MuY2FsbGJhY2sgPSBhcmdzLmNhbGxiYWNrIHx8IGRlZmF1bHRBcmdzLmNhbGxiYWNrO1xuICAgICAgfVxuICAgICAgdGhpcy5maWx0ZXJUb0Vscyh2aWV3LmxpdmVTb2NrZXQsIHNvdXJjZUVsLCBhcmdzKS5mb3JFYWNoKChlbCkgPT4ge1xuICAgICAgICB0aGlzW2BleGVjXyR7a2luZH1gXShlLCBldmVudFR5cGUsIHBoeEV2ZW50LCB2aWV3LCBzb3VyY2VFbCwgZWwsIGFyZ3MpO1xuICAgICAgfSk7XG4gICAgfSk7XG4gIH0sXG5cbiAgaXNWaXNpYmxlKGVsKSB7XG4gICAgcmV0dXJuICEhKFxuICAgICAgZWwub2Zmc2V0V2lkdGggfHxcbiAgICAgIGVsLm9mZnNldEhlaWdodCB8fFxuICAgICAgZWwuZ2V0Q2xpZW50UmVjdHMoKS5sZW5ndGggPiAwXG4gICAgKTtcbiAgfSxcblxuICAvLyByZXR1cm5zIHRydWUgaWYgYW55IHBhcnQgb2YgdGhlIGVsZW1lbnQgaXMgaW5zaWRlIHRoZSB2aWV3cG9ydFxuICBpc0luVmlld3BvcnQoZWwpIHtcbiAgICBjb25zdCByZWN0ID0gZWwuZ2V0Qm91bmRpbmdDbGllbnRSZWN0KCk7XG4gICAgY29uc3Qgd2luZG93SGVpZ2h0ID1cbiAgICAgIHdpbmRvdy5pbm5lckhlaWdodCB8fCBkb2N1bWVudC5kb2N1bWVudEVsZW1lbnQuY2xpZW50SGVpZ2h0O1xuICAgIGNvbnN0IHdpbmRvd1dpZHRoID1cbiAgICAgIHdpbmRvdy5pbm5lcldpZHRoIHx8IGRvY3VtZW50LmRvY3VtZW50RWxlbWVudC5jbGllbnRXaWR0aDtcblxuICAgIHJldHVybiAoXG4gICAgICByZWN0LnJpZ2h0ID4gMCAmJlxuICAgICAgcmVjdC5ib3R0b20gPiAwICYmXG4gICAgICByZWN0LmxlZnQgPCB3aW5kb3dXaWR0aCAmJlxuICAgICAgcmVjdC50b3AgPCB3aW5kb3dIZWlnaHRcbiAgICApO1xuICB9LFxuXG4gIC8vIHByaXZhdGVcblxuICAvLyBjb21tYW5kc1xuXG4gIGV4ZWNfZXhlYyhlLCBldmVudFR5cGUsIHBoeEV2ZW50LCB2aWV3LCBzb3VyY2VFbCwgZWwsIHsgYXR0ciwgdG8gfSkge1xuICAgIGNvbnN0IGVuY29kZWRKUyA9IGVsLmdldEF0dHJpYnV0ZShhdHRyKTtcbiAgICBpZiAoIWVuY29kZWRKUykge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKGBleHBlY3RlZCAke2F0dHJ9IHRvIGNvbnRhaW4gSlMgY29tbWFuZCBvbiBcIiR7dG99XCJgKTtcbiAgICB9XG4gICAgdmlldy5saXZlU29ja2V0LmV4ZWNKUyhlbCwgZW5jb2RlZEpTLCBldmVudFR5cGUpO1xuICB9LFxuXG4gIGV4ZWNfZGlzcGF0Y2goXG4gICAgZSxcbiAgICBldmVudFR5cGUsXG4gICAgcGh4RXZlbnQsXG4gICAgdmlldyxcbiAgICBzb3VyY2VFbCxcbiAgICBlbCxcbiAgICB7IGV2ZW50LCBkZXRhaWwsIGJ1YmJsZXMsIGJsb2NraW5nIH0sXG4gICkge1xuICAgIGRldGFpbCA9IGRldGFpbCB8fCB7fTtcbiAgICBkZXRhaWwuZGlzcGF0Y2hlciA9IHNvdXJjZUVsO1xuICAgIGlmIChibG9ja2luZykge1xuICAgICAgY29uc3QgcHJvbWlzZSA9IG5ldyBQcm9taXNlKChyZXNvbHZlLCBfcmVqZWN0KSA9PiB7XG4gICAgICAgIGRldGFpbC5kb25lID0gcmVzb2x2ZTtcbiAgICAgIH0pO1xuICAgICAgdmlldy5saXZlU29ja2V0LmFzeW5jVHJhbnNpdGlvbihwcm9taXNlKTtcbiAgICB9XG4gICAgRE9NLmRpc3BhdGNoRXZlbnQoZWwsIGV2ZW50LCB7IGRldGFpbCwgYnViYmxlcyB9KTtcbiAgfSxcblxuICBleGVjX3B1c2goZSwgZXZlbnRUeXBlLCBwaHhFdmVudCwgdmlldywgc291cmNlRWwsIGVsLCBhcmdzKSB7XG4gICAgY29uc3Qge1xuICAgICAgZXZlbnQsXG4gICAgICBkYXRhLFxuICAgICAgdGFyZ2V0LFxuICAgICAgcGFnZV9sb2FkaW5nLFxuICAgICAgbG9hZGluZyxcbiAgICAgIHZhbHVlLFxuICAgICAgZGlzcGF0Y2hlcixcbiAgICAgIGNhbGxiYWNrLFxuICAgIH0gPSBhcmdzO1xuICAgIGNvbnN0IHB1c2hPcHRzID0ge1xuICAgICAgbG9hZGluZyxcbiAgICAgIHZhbHVlLFxuICAgICAgdGFyZ2V0LFxuICAgICAgcGFnZV9sb2FkaW5nOiAhIXBhZ2VfbG9hZGluZyxcbiAgICAgIG9yaWdpbmFsRXZlbnQ6IGUsXG4gICAgfTtcbiAgICBjb25zdCB0YXJnZXRTcmMgPVxuICAgICAgZXZlbnRUeXBlID09PSBcImNoYW5nZVwiICYmIGRpc3BhdGNoZXIgPyBkaXNwYXRjaGVyIDogc291cmNlRWw7XG4gICAgY29uc3QgcGh4VGFyZ2V0ID1cbiAgICAgIHRhcmdldCB8fCB0YXJnZXRTcmMuZ2V0QXR0cmlidXRlKHZpZXcuYmluZGluZyhcInRhcmdldFwiKSkgfHwgdGFyZ2V0U3JjO1xuICAgIGNvbnN0IGhhbmRsZXIgPSAodGFyZ2V0VmlldywgdGFyZ2V0Q3R4KSA9PiB7XG4gICAgICBpZiAoIXRhcmdldFZpZXcuaXNDb25uZWN0ZWQoKSkge1xuICAgICAgICByZXR1cm47XG4gICAgICB9XG4gICAgICBpZiAoZXZlbnRUeXBlID09PSBcImNoYW5nZVwiKSB7XG4gICAgICAgIGxldCB7IG5ld0NpZCwgX3RhcmdldCB9ID0gYXJncztcbiAgICAgICAgX3RhcmdldCA9XG4gICAgICAgICAgX3RhcmdldCB8fCAoRE9NLmlzRm9ybUlucHV0KHNvdXJjZUVsKSA/IHNvdXJjZUVsLm5hbWUgOiB1bmRlZmluZWQpO1xuICAgICAgICBpZiAoX3RhcmdldCkge1xuICAgICAgICAgIHB1c2hPcHRzLl90YXJnZXQgPSBfdGFyZ2V0O1xuICAgICAgICB9XG4gICAgICAgIHRhcmdldFZpZXcucHVzaElucHV0KFxuICAgICAgICAgIHNvdXJjZUVsLFxuICAgICAgICAgIHRhcmdldEN0eCxcbiAgICAgICAgICBuZXdDaWQsXG4gICAgICAgICAgZXZlbnQgfHwgcGh4RXZlbnQsXG4gICAgICAgICAgcHVzaE9wdHMsXG4gICAgICAgICAgY2FsbGJhY2ssXG4gICAgICAgICk7XG4gICAgICB9IGVsc2UgaWYgKGV2ZW50VHlwZSA9PT0gXCJzdWJtaXRcIikge1xuICAgICAgICBjb25zdCB7IHN1Ym1pdHRlciB9ID0gYXJncztcbiAgICAgICAgdGFyZ2V0Vmlldy5zdWJtaXRGb3JtKFxuICAgICAgICAgIHNvdXJjZUVsLFxuICAgICAgICAgIHRhcmdldEN0eCxcbiAgICAgICAgICBldmVudCB8fCBwaHhFdmVudCxcbiAgICAgICAgICBzdWJtaXR0ZXIsXG4gICAgICAgICAgcHVzaE9wdHMsXG4gICAgICAgICAgY2FsbGJhY2ssXG4gICAgICAgICk7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICB0YXJnZXRWaWV3LnB1c2hFdmVudChcbiAgICAgICAgICBldmVudFR5cGUsXG4gICAgICAgICAgc291cmNlRWwsXG4gICAgICAgICAgdGFyZ2V0Q3R4LFxuICAgICAgICAgIGV2ZW50IHx8IHBoeEV2ZW50LFxuICAgICAgICAgIGRhdGEsXG4gICAgICAgICAgcHVzaE9wdHMsXG4gICAgICAgICAgY2FsbGJhY2ssXG4gICAgICAgICk7XG4gICAgICB9XG4gICAgfTtcbiAgICAvLyBpbiBjYXNlIG9mIGZvcm1SZWNvdmVyeSwgdGFyZ2V0VmlldyBhbmQgdGFyZ2V0Q3R4IGFyZSBwYXNzZWQgYXMgYXJndW1lbnRcbiAgICAvLyBhcyB0aGV5IGFyZSBsb29rZWQgdXAgaW4gYSB0ZW1wbGF0ZSBlbGVtZW50LCBub3QgdGhlIHJlYWwgRE9NXG4gICAgaWYgKGFyZ3MudGFyZ2V0VmlldyAmJiBhcmdzLnRhcmdldEN0eCkge1xuICAgICAgaGFuZGxlcihhcmdzLnRhcmdldFZpZXcsIGFyZ3MudGFyZ2V0Q3R4KTtcbiAgICB9IGVsc2Uge1xuICAgICAgdmlldy53aXRoaW5UYXJnZXRzKHBoeFRhcmdldCwgaGFuZGxlcik7XG4gICAgfVxuICB9LFxuXG4gIGV4ZWNfbmF2aWdhdGUoZSwgZXZlbnRUeXBlLCBwaHhFdmVudCwgdmlldywgc291cmNlRWwsIGVsLCB7IGhyZWYsIHJlcGxhY2UgfSkge1xuICAgIHZpZXcubGl2ZVNvY2tldC5oaXN0b3J5UmVkaXJlY3QoXG4gICAgICBlLFxuICAgICAgaHJlZixcbiAgICAgIHJlcGxhY2UgPyBcInJlcGxhY2VcIiA6IFwicHVzaFwiLFxuICAgICAgbnVsbCxcbiAgICAgIHNvdXJjZUVsLFxuICAgICk7XG4gIH0sXG5cbiAgZXhlY19wYXRjaChlLCBldmVudFR5cGUsIHBoeEV2ZW50LCB2aWV3LCBzb3VyY2VFbCwgZWwsIHsgaHJlZiwgcmVwbGFjZSB9KSB7XG4gICAgdmlldy5saXZlU29ja2V0LnB1c2hIaXN0b3J5UGF0Y2goXG4gICAgICBlLFxuICAgICAgaHJlZixcbiAgICAgIHJlcGxhY2UgPyBcInJlcGxhY2VcIiA6IFwicHVzaFwiLFxuICAgICAgc291cmNlRWwsXG4gICAgKTtcbiAgfSxcblxuICBleGVjX2ZvY3VzKGUsIGV2ZW50VHlwZSwgcGh4RXZlbnQsIHZpZXcsIHNvdXJjZUVsLCBlbCkge1xuICAgIEFSSUEuYXR0ZW1wdEZvY3VzKGVsKTtcbiAgICAvLyBpbiBjYXNlIHRoZSBKUy5mb2N1cyBjb21tYW5kIGlzIGluIGEgSlMuc2hvdy9oaWRlL3RvZ2dsZSBjaGFpbiwgZm9yIHNob3cgd2UgbmVlZFxuICAgIC8vIHRvIHdhaXQgZm9yIEpTLnNob3cgdG8gaGF2ZSB1cGRhdGVkIHRoZSBlbGVtZW50J3MgZGlzcGxheSBwcm9wZXJ0eSAoc2VlIGV4ZWNfdG9nZ2xlKVxuICAgIC8vIGJ1dCB0aGF0IHJ1biBpbiBuZXN0ZWQgYW5pbWF0aW9uIGZyYW1lcywgdGhlcmVmb3JlIHdlIG5lZWQgdG8gdXNlIHRoZW0gaGVyZSBhcyB3ZWxsXG4gICAgd2luZG93LnJlcXVlc3RBbmltYXRpb25GcmFtZSgoKSA9PiB7XG4gICAgICB3aW5kb3cucmVxdWVzdEFuaW1hdGlvbkZyYW1lKCgpID0+IEFSSUEuYXR0ZW1wdEZvY3VzKGVsKSk7XG4gICAgfSk7XG4gIH0sXG5cbiAgZXhlY19mb2N1c19maXJzdChlLCBldmVudFR5cGUsIHBoeEV2ZW50LCB2aWV3LCBzb3VyY2VFbCwgZWwpIHtcbiAgICBBUklBLmZvY3VzRmlyc3RJbnRlcmFjdGl2ZShlbCkgfHwgQVJJQS5mb2N1c0ZpcnN0KGVsKTtcbiAgICAvLyBpZiB5b3Ugd29uZGVyIGFib3V0IHRoZSBuZXN0ZWQgYW5pbWF0aW9uIGZyYW1lcywgc2VlIGV4ZWNfZm9jdXNcbiAgICB3aW5kb3cucmVxdWVzdEFuaW1hdGlvbkZyYW1lKCgpID0+IHtcbiAgICAgIHdpbmRvdy5yZXF1ZXN0QW5pbWF0aW9uRnJhbWUoXG4gICAgICAgICgpID0+IEFSSUEuZm9jdXNGaXJzdEludGVyYWN0aXZlKGVsKSB8fCBBUklBLmZvY3VzRmlyc3QoZWwpLFxuICAgICAgKTtcbiAgICB9KTtcbiAgfSxcblxuICBleGVjX3B1c2hfZm9jdXMoZSwgZXZlbnRUeXBlLCBwaHhFdmVudCwgdmlldywgc291cmNlRWwsIGVsKSB7XG4gICAgZm9jdXNTdGFjay5wdXNoKGVsIHx8IHNvdXJjZUVsKTtcbiAgfSxcblxuICBleGVjX3BvcF9mb2N1cyhfZSwgX2V2ZW50VHlwZSwgX3BoeEV2ZW50LCBfdmlldywgX3NvdXJjZUVsLCBfZWwpIHtcbiAgICBjb25zdCBlbCA9IGZvY3VzU3RhY2sucG9wKCk7XG4gICAgaWYgKGVsKSB7XG4gICAgICBlbC5mb2N1cygpO1xuICAgICAgLy8gaWYgeW91IHdvbmRlciBhYm91dCB0aGUgbmVzdGVkIGFuaW1hdGlvbiBmcmFtZXMsIHNlZSBleGVjX2ZvY3VzXG4gICAgICB3aW5kb3cucmVxdWVzdEFuaW1hdGlvbkZyYW1lKCgpID0+IHtcbiAgICAgICAgd2luZG93LnJlcXVlc3RBbmltYXRpb25GcmFtZSgoKSA9PiBlbC5mb2N1cygpKTtcbiAgICAgIH0pO1xuICAgIH1cbiAgfSxcblxuICBleGVjX2FkZF9jbGFzcyhcbiAgICBlLFxuICAgIGV2ZW50VHlwZSxcbiAgICBwaHhFdmVudCxcbiAgICB2aWV3LFxuICAgIHNvdXJjZUVsLFxuICAgIGVsLFxuICAgIHsgbmFtZXMsIHRyYW5zaXRpb24sIHRpbWUsIGJsb2NraW5nIH0sXG4gICkge1xuICAgIHRoaXMuYWRkT3JSZW1vdmVDbGFzc2VzKGVsLCBuYW1lcywgW10sIHRyYW5zaXRpb24sIHRpbWUsIHZpZXcsIGJsb2NraW5nKTtcbiAgfSxcblxuICBleGVjX3JlbW92ZV9jbGFzcyhcbiAgICBlLFxuICAgIGV2ZW50VHlwZSxcbiAgICBwaHhFdmVudCxcbiAgICB2aWV3LFxuICAgIHNvdXJjZUVsLFxuICAgIGVsLFxuICAgIHsgbmFtZXMsIHRyYW5zaXRpb24sIHRpbWUsIGJsb2NraW5nIH0sXG4gICkge1xuICAgIHRoaXMuYWRkT3JSZW1vdmVDbGFzc2VzKGVsLCBbXSwgbmFtZXMsIHRyYW5zaXRpb24sIHRpbWUsIHZpZXcsIGJsb2NraW5nKTtcbiAgfSxcblxuICBleGVjX3RvZ2dsZV9jbGFzcyhcbiAgICBlLFxuICAgIGV2ZW50VHlwZSxcbiAgICBwaHhFdmVudCxcbiAgICB2aWV3LFxuICAgIHNvdXJjZUVsLFxuICAgIGVsLFxuICAgIHsgbmFtZXMsIHRyYW5zaXRpb24sIHRpbWUsIGJsb2NraW5nIH0sXG4gICkge1xuICAgIHRoaXMudG9nZ2xlQ2xhc3NlcyhlbCwgbmFtZXMsIHRyYW5zaXRpb24sIHRpbWUsIHZpZXcsIGJsb2NraW5nKTtcbiAgfSxcblxuICBleGVjX3RvZ2dsZV9hdHRyKFxuICAgIGUsXG4gICAgZXZlbnRUeXBlLFxuICAgIHBoeEV2ZW50LFxuICAgIHZpZXcsXG4gICAgc291cmNlRWwsXG4gICAgZWwsXG4gICAgeyBhdHRyOiBbYXR0ciwgdmFsMSwgdmFsMl0gfSxcbiAgKSB7XG4gICAgdGhpcy50b2dnbGVBdHRyKGVsLCBhdHRyLCB2YWwxLCB2YWwyKTtcbiAgfSxcblxuICBleGVjX2lnbm9yZV9hdHRycyhlLCBldmVudFR5cGUsIHBoeEV2ZW50LCB2aWV3LCBzb3VyY2VFbCwgZWwsIHsgYXR0cnMgfSkge1xuICAgIHRoaXMuaWdub3JlQXR0cnMoZWwsIGF0dHJzKTtcbiAgfSxcblxuICBleGVjX3RyYW5zaXRpb24oXG4gICAgZSxcbiAgICBldmVudFR5cGUsXG4gICAgcGh4RXZlbnQsXG4gICAgdmlldyxcbiAgICBzb3VyY2VFbCxcbiAgICBlbCxcbiAgICB7IHRpbWUsIHRyYW5zaXRpb24sIGJsb2NraW5nIH0sXG4gICkge1xuICAgIHRoaXMuYWRkT3JSZW1vdmVDbGFzc2VzKGVsLCBbXSwgW10sIHRyYW5zaXRpb24sIHRpbWUsIHZpZXcsIGJsb2NraW5nKTtcbiAgfSxcblxuICBleGVjX3RvZ2dsZShcbiAgICBlLFxuICAgIGV2ZW50VHlwZSxcbiAgICBwaHhFdmVudCxcbiAgICB2aWV3LFxuICAgIHNvdXJjZUVsLFxuICAgIGVsLFxuICAgIHsgZGlzcGxheSwgaW5zLCBvdXRzLCB0aW1lLCBibG9ja2luZyB9LFxuICApIHtcbiAgICB0aGlzLnRvZ2dsZShldmVudFR5cGUsIHZpZXcsIGVsLCBkaXNwbGF5LCBpbnMsIG91dHMsIHRpbWUsIGJsb2NraW5nKTtcbiAgfSxcblxuICBleGVjX3Nob3coXG4gICAgZSxcbiAgICBldmVudFR5cGUsXG4gICAgcGh4RXZlbnQsXG4gICAgdmlldyxcbiAgICBzb3VyY2VFbCxcbiAgICBlbCxcbiAgICB7IGRpc3BsYXksIHRyYW5zaXRpb24sIHRpbWUsIGJsb2NraW5nIH0sXG4gICkge1xuICAgIHRoaXMuc2hvdyhldmVudFR5cGUsIHZpZXcsIGVsLCBkaXNwbGF5LCB0cmFuc2l0aW9uLCB0aW1lLCBibG9ja2luZyk7XG4gIH0sXG5cbiAgZXhlY19oaWRlKFxuICAgIGUsXG4gICAgZXZlbnRUeXBlLFxuICAgIHBoeEV2ZW50LFxuICAgIHZpZXcsXG4gICAgc291cmNlRWwsXG4gICAgZWwsXG4gICAgeyBkaXNwbGF5LCB0cmFuc2l0aW9uLCB0aW1lLCBibG9ja2luZyB9LFxuICApIHtcbiAgICB0aGlzLmhpZGUoZXZlbnRUeXBlLCB2aWV3LCBlbCwgZGlzcGxheSwgdHJhbnNpdGlvbiwgdGltZSwgYmxvY2tpbmcpO1xuICB9LFxuXG4gIGV4ZWNfc2V0X2F0dHIoXG4gICAgZSxcbiAgICBldmVudFR5cGUsXG4gICAgcGh4RXZlbnQsXG4gICAgdmlldyxcbiAgICBzb3VyY2VFbCxcbiAgICBlbCxcbiAgICB7IGF0dHI6IFthdHRyLCB2YWxdIH0sXG4gICkge1xuICAgIHRoaXMuc2V0T3JSZW1vdmVBdHRycyhlbCwgW1thdHRyLCB2YWxdXSwgW10pO1xuICB9LFxuXG4gIGV4ZWNfcmVtb3ZlX2F0dHIoZSwgZXZlbnRUeXBlLCBwaHhFdmVudCwgdmlldywgc291cmNlRWwsIGVsLCB7IGF0dHIgfSkge1xuICAgIHRoaXMuc2V0T3JSZW1vdmVBdHRycyhlbCwgW10sIFthdHRyXSk7XG4gIH0sXG5cbiAgaWdub3JlQXR0cnMoZWwsIGF0dHJzKSB7XG4gICAgRE9NLnB1dFByaXZhdGUoZWwsIFwiSlM6aWdub3JlX2F0dHJzXCIsIHtcbiAgICAgIGFwcGx5OiAoZnJvbUVsLCB0b0VsKSA9PiB7XG4gICAgICAgIEFycmF5LmZyb20oZnJvbUVsLmF0dHJpYnV0ZXMpLmZvckVhY2goKGF0dHIpID0+IHtcbiAgICAgICAgICBpZiAoXG4gICAgICAgICAgICBhdHRycy5zb21lKFxuICAgICAgICAgICAgICAodG9JZ25vcmUpID0+XG4gICAgICAgICAgICAgICAgYXR0ci5uYW1lID09IHRvSWdub3JlIHx8XG4gICAgICAgICAgICAgICAgdG9JZ25vcmUgPT09IFwiKlwiIHx8XG4gICAgICAgICAgICAgICAgKHRvSWdub3JlLmluY2x1ZGVzKFwiKlwiKSAmJiBhdHRyLm5hbWUubWF0Y2godG9JZ25vcmUpICE9IG51bGwpLFxuICAgICAgICAgICAgKVxuICAgICAgICAgICkge1xuICAgICAgICAgICAgdG9FbC5zZXRBdHRyaWJ1dGUoYXR0ci5uYW1lLCBhdHRyLnZhbHVlKTtcbiAgICAgICAgICB9XG4gICAgICAgIH0pO1xuICAgICAgfSxcbiAgICB9KTtcbiAgfSxcblxuICBvbkJlZm9yZUVsVXBkYXRlZChmcm9tRWwsIHRvRWwpIHtcbiAgICBjb25zdCBpZ25vcmVBdHRycyA9IERPTS5wcml2YXRlKGZyb21FbCwgXCJKUzppZ25vcmVfYXR0cnNcIik7XG4gICAgaWYgKGlnbm9yZUF0dHJzKSB7XG4gICAgICBpZ25vcmVBdHRycy5hcHBseShmcm9tRWwsIHRvRWwpO1xuICAgIH1cbiAgfSxcblxuICAvLyB1dGlscyBmb3IgY29tbWFuZHNcblxuICBzaG93KGV2ZW50VHlwZSwgdmlldywgZWwsIGRpc3BsYXksIHRyYW5zaXRpb24sIHRpbWUsIGJsb2NraW5nKSB7XG4gICAgaWYgKCF0aGlzLmlzVmlzaWJsZShlbCkpIHtcbiAgICAgIHRoaXMudG9nZ2xlKFxuICAgICAgICBldmVudFR5cGUsXG4gICAgICAgIHZpZXcsXG4gICAgICAgIGVsLFxuICAgICAgICBkaXNwbGF5LFxuICAgICAgICB0cmFuc2l0aW9uLFxuICAgICAgICBudWxsLFxuICAgICAgICB0aW1lLFxuICAgICAgICBibG9ja2luZyxcbiAgICAgICk7XG4gICAgfVxuICB9LFxuXG4gIGhpZGUoZXZlbnRUeXBlLCB2aWV3LCBlbCwgZGlzcGxheSwgdHJhbnNpdGlvbiwgdGltZSwgYmxvY2tpbmcpIHtcbiAgICBpZiAodGhpcy5pc1Zpc2libGUoZWwpKSB7XG4gICAgICB0aGlzLnRvZ2dsZShcbiAgICAgICAgZXZlbnRUeXBlLFxuICAgICAgICB2aWV3LFxuICAgICAgICBlbCxcbiAgICAgICAgZGlzcGxheSxcbiAgICAgICAgbnVsbCxcbiAgICAgICAgdHJhbnNpdGlvbixcbiAgICAgICAgdGltZSxcbiAgICAgICAgYmxvY2tpbmcsXG4gICAgICApO1xuICAgIH1cbiAgfSxcblxuICB0b2dnbGUoZXZlbnRUeXBlLCB2aWV3LCBlbCwgZGlzcGxheSwgaW5zLCBvdXRzLCB0aW1lLCBibG9ja2luZykge1xuICAgIHRpbWUgPSB0aW1lIHx8IGRlZmF1bHRfdHJhbnNpdGlvbl90aW1lO1xuICAgIGNvbnN0IFtpbkNsYXNzZXMsIGluU3RhcnRDbGFzc2VzLCBpbkVuZENsYXNzZXNdID0gaW5zIHx8IFtbXSwgW10sIFtdXTtcbiAgICBjb25zdCBbb3V0Q2xhc3Nlcywgb3V0U3RhcnRDbGFzc2VzLCBvdXRFbmRDbGFzc2VzXSA9IG91dHMgfHwgW1tdLCBbXSwgW11dO1xuICAgIGlmIChpbkNsYXNzZXMubGVuZ3RoID4gMCB8fCBvdXRDbGFzc2VzLmxlbmd0aCA+IDApIHtcbiAgICAgIGlmICh0aGlzLmlzVmlzaWJsZShlbCkpIHtcbiAgICAgICAgY29uc3Qgb25TdGFydCA9ICgpID0+IHtcbiAgICAgICAgICB0aGlzLmFkZE9yUmVtb3ZlQ2xhc3NlcyhcbiAgICAgICAgICAgIGVsLFxuICAgICAgICAgICAgb3V0U3RhcnRDbGFzc2VzLFxuICAgICAgICAgICAgaW5DbGFzc2VzLmNvbmNhdChpblN0YXJ0Q2xhc3NlcykuY29uY2F0KGluRW5kQ2xhc3NlcyksXG4gICAgICAgICAgKTtcbiAgICAgICAgICB3aW5kb3cucmVxdWVzdEFuaW1hdGlvbkZyYW1lKCgpID0+IHtcbiAgICAgICAgICAgIHRoaXMuYWRkT3JSZW1vdmVDbGFzc2VzKGVsLCBvdXRDbGFzc2VzLCBbXSk7XG4gICAgICAgICAgICB3aW5kb3cucmVxdWVzdEFuaW1hdGlvbkZyYW1lKCgpID0+XG4gICAgICAgICAgICAgIHRoaXMuYWRkT3JSZW1vdmVDbGFzc2VzKGVsLCBvdXRFbmRDbGFzc2VzLCBvdXRTdGFydENsYXNzZXMpLFxuICAgICAgICAgICAgKTtcbiAgICAgICAgICB9KTtcbiAgICAgICAgfTtcbiAgICAgICAgY29uc3Qgb25FbmQgPSAoKSA9PiB7XG4gICAgICAgICAgdGhpcy5hZGRPclJlbW92ZUNsYXNzZXMoZWwsIFtdLCBvdXRDbGFzc2VzLmNvbmNhdChvdXRFbmRDbGFzc2VzKSk7XG4gICAgICAgICAgRE9NLnB1dFN0aWNreShcbiAgICAgICAgICAgIGVsLFxuICAgICAgICAgICAgXCJ0b2dnbGVcIixcbiAgICAgICAgICAgIChjdXJyZW50RWwpID0+IChjdXJyZW50RWwuc3R5bGUuZGlzcGxheSA9IFwibm9uZVwiKSxcbiAgICAgICAgICApO1xuICAgICAgICAgIGVsLmRpc3BhdGNoRXZlbnQobmV3IEV2ZW50KFwicGh4OmhpZGUtZW5kXCIpKTtcbiAgICAgICAgfTtcbiAgICAgICAgZWwuZGlzcGF0Y2hFdmVudChuZXcgRXZlbnQoXCJwaHg6aGlkZS1zdGFydFwiKSk7XG4gICAgICAgIGlmIChibG9ja2luZyA9PT0gZmFsc2UpIHtcbiAgICAgICAgICBvblN0YXJ0KCk7XG4gICAgICAgICAgc2V0VGltZW91dChvbkVuZCwgdGltZSk7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgdmlldy50cmFuc2l0aW9uKHRpbWUsIG9uU3RhcnQsIG9uRW5kKTtcbiAgICAgICAgfVxuICAgICAgfSBlbHNlIHtcbiAgICAgICAgaWYgKGV2ZW50VHlwZSA9PT0gXCJyZW1vdmVcIikge1xuICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuICAgICAgICBjb25zdCBvblN0YXJ0ID0gKCkgPT4ge1xuICAgICAgICAgIHRoaXMuYWRkT3JSZW1vdmVDbGFzc2VzKFxuICAgICAgICAgICAgZWwsXG4gICAgICAgICAgICBpblN0YXJ0Q2xhc3NlcyxcbiAgICAgICAgICAgIG91dENsYXNzZXMuY29uY2F0KG91dFN0YXJ0Q2xhc3NlcykuY29uY2F0KG91dEVuZENsYXNzZXMpLFxuICAgICAgICAgICk7XG4gICAgICAgICAgY29uc3Qgc3RpY2t5RGlzcGxheSA9IGRpc3BsYXkgfHwgdGhpcy5kZWZhdWx0RGlzcGxheShlbCk7XG4gICAgICAgICAgd2luZG93LnJlcXVlc3RBbmltYXRpb25GcmFtZSgoKSA9PiB7XG4gICAgICAgICAgICAvLyBmaXJzdCBhZGQgdGhlIHN0YXJ0aW5nICsgYWN0aXZlIGNsYXNzLCBUSEVOIG1ha2UgdGhlIGVsZW1lbnQgdmlzaWJsZVxuICAgICAgICAgICAgLy8gb3RoZXJ3aXNlIGlmIHdlIHRvZ2dsZWQgdGhlIHZpc2liaWxpdHkgZWFybGllciBjc3MgYW5pbWF0aW9uc1xuICAgICAgICAgICAgLy8gd291bGQgZmxpY2tlciwgYXMgdGhlIGVsZW1lbnQgYmVjb21lcyB2aXNpYmxlIGJlZm9yZSB0aGUgYWN0aXZlIGFuaW1hdGlvblxuICAgICAgICAgICAgLy8gY2xhc3MgaXMgc2V0IChzZWUgaHR0cHM6Ly9naXRodWIuY29tL3Bob2VuaXhmcmFtZXdvcmsvcGhvZW5peF9saXZlX3ZpZXcvaXNzdWVzLzM0NTYpXG4gICAgICAgICAgICB0aGlzLmFkZE9yUmVtb3ZlQ2xhc3NlcyhlbCwgaW5DbGFzc2VzLCBbXSk7XG4gICAgICAgICAgICAvLyBhZGRPclJlbW92ZUNsYXNzZXMgdXNlcyBhIHJlcXVlc3RBbmltYXRpb25GcmFtZSBpdHNlbGYsIHRoZXJlZm9yZSB3ZSBuZWVkIHRvIG1vdmUgdGhlIHB1dFN0aWNreVxuICAgICAgICAgICAgLy8gaW50byB0aGUgbmV4dCByZXF1ZXN0QW5pbWF0aW9uRnJhbWUuLi5cbiAgICAgICAgICAgIHdpbmRvdy5yZXF1ZXN0QW5pbWF0aW9uRnJhbWUoKCkgPT4ge1xuICAgICAgICAgICAgICBET00ucHV0U3RpY2t5KFxuICAgICAgICAgICAgICAgIGVsLFxuICAgICAgICAgICAgICAgIFwidG9nZ2xlXCIsXG4gICAgICAgICAgICAgICAgKGN1cnJlbnRFbCkgPT4gKGN1cnJlbnRFbC5zdHlsZS5kaXNwbGF5ID0gc3RpY2t5RGlzcGxheSksXG4gICAgICAgICAgICAgICk7XG4gICAgICAgICAgICAgIHRoaXMuYWRkT3JSZW1vdmVDbGFzc2VzKGVsLCBpbkVuZENsYXNzZXMsIGluU3RhcnRDbGFzc2VzKTtcbiAgICAgICAgICAgIH0pO1xuICAgICAgICAgIH0pO1xuICAgICAgICB9O1xuICAgICAgICBjb25zdCBvbkVuZCA9ICgpID0+IHtcbiAgICAgICAgICB0aGlzLmFkZE9yUmVtb3ZlQ2xhc3NlcyhlbCwgW10sIGluQ2xhc3Nlcy5jb25jYXQoaW5FbmRDbGFzc2VzKSk7XG4gICAgICAgICAgZWwuZGlzcGF0Y2hFdmVudChuZXcgRXZlbnQoXCJwaHg6c2hvdy1lbmRcIikpO1xuICAgICAgICB9O1xuICAgICAgICBlbC5kaXNwYXRjaEV2ZW50KG5ldyBFdmVudChcInBoeDpzaG93LXN0YXJ0XCIpKTtcbiAgICAgICAgaWYgKGJsb2NraW5nID09PSBmYWxzZSkge1xuICAgICAgICAgIG9uU3RhcnQoKTtcbiAgICAgICAgICBzZXRUaW1lb3V0KG9uRW5kLCB0aW1lKTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICB2aWV3LnRyYW5zaXRpb24odGltZSwgb25TdGFydCwgb25FbmQpO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfSBlbHNlIHtcbiAgICAgIGlmICh0aGlzLmlzVmlzaWJsZShlbCkpIHtcbiAgICAgICAgd2luZG93LnJlcXVlc3RBbmltYXRpb25GcmFtZSgoKSA9PiB7XG4gICAgICAgICAgZWwuZGlzcGF0Y2hFdmVudChuZXcgRXZlbnQoXCJwaHg6aGlkZS1zdGFydFwiKSk7XG4gICAgICAgICAgRE9NLnB1dFN0aWNreShcbiAgICAgICAgICAgIGVsLFxuICAgICAgICAgICAgXCJ0b2dnbGVcIixcbiAgICAgICAgICAgIChjdXJyZW50RWwpID0+IChjdXJyZW50RWwuc3R5bGUuZGlzcGxheSA9IFwibm9uZVwiKSxcbiAgICAgICAgICApO1xuICAgICAgICAgIGVsLmRpc3BhdGNoRXZlbnQobmV3IEV2ZW50KFwicGh4OmhpZGUtZW5kXCIpKTtcbiAgICAgICAgfSk7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICB3aW5kb3cucmVxdWVzdEFuaW1hdGlvbkZyYW1lKCgpID0+IHtcbiAgICAgICAgICBlbC5kaXNwYXRjaEV2ZW50KG5ldyBFdmVudChcInBoeDpzaG93LXN0YXJ0XCIpKTtcbiAgICAgICAgICBjb25zdCBzdGlja3lEaXNwbGF5ID0gZGlzcGxheSB8fCB0aGlzLmRlZmF1bHREaXNwbGF5KGVsKTtcbiAgICAgICAgICBET00ucHV0U3RpY2t5KFxuICAgICAgICAgICAgZWwsXG4gICAgICAgICAgICBcInRvZ2dsZVwiLFxuICAgICAgICAgICAgKGN1cnJlbnRFbCkgPT4gKGN1cnJlbnRFbC5zdHlsZS5kaXNwbGF5ID0gc3RpY2t5RGlzcGxheSksXG4gICAgICAgICAgKTtcbiAgICAgICAgICBlbC5kaXNwYXRjaEV2ZW50KG5ldyBFdmVudChcInBoeDpzaG93LWVuZFwiKSk7XG4gICAgICAgIH0pO1xuICAgICAgfVxuICAgIH1cbiAgfSxcblxuICB0b2dnbGVDbGFzc2VzKGVsLCBjbGFzc2VzLCB0cmFuc2l0aW9uLCB0aW1lLCB2aWV3LCBibG9ja2luZykge1xuICAgIHdpbmRvdy5yZXF1ZXN0QW5pbWF0aW9uRnJhbWUoKCkgPT4ge1xuICAgICAgY29uc3QgW3ByZXZBZGRzLCBwcmV2UmVtb3Zlc10gPSBET00uZ2V0U3RpY2t5KGVsLCBcImNsYXNzZXNcIiwgW1tdLCBbXV0pO1xuICAgICAgY29uc3QgbmV3QWRkcyA9IGNsYXNzZXMuZmlsdGVyKFxuICAgICAgICAobmFtZSkgPT4gcHJldkFkZHMuaW5kZXhPZihuYW1lKSA8IDAgJiYgIWVsLmNsYXNzTGlzdC5jb250YWlucyhuYW1lKSxcbiAgICAgICk7XG4gICAgICBjb25zdCBuZXdSZW1vdmVzID0gY2xhc3Nlcy5maWx0ZXIoXG4gICAgICAgIChuYW1lKSA9PiBwcmV2UmVtb3Zlcy5pbmRleE9mKG5hbWUpIDwgMCAmJiBlbC5jbGFzc0xpc3QuY29udGFpbnMobmFtZSksXG4gICAgICApO1xuICAgICAgdGhpcy5hZGRPclJlbW92ZUNsYXNzZXMoXG4gICAgICAgIGVsLFxuICAgICAgICBuZXdBZGRzLFxuICAgICAgICBuZXdSZW1vdmVzLFxuICAgICAgICB0cmFuc2l0aW9uLFxuICAgICAgICB0aW1lLFxuICAgICAgICB2aWV3LFxuICAgICAgICBibG9ja2luZyxcbiAgICAgICk7XG4gICAgfSk7XG4gIH0sXG5cbiAgdG9nZ2xlQXR0cihlbCwgYXR0ciwgdmFsMSwgdmFsMikge1xuICAgIGlmIChlbC5oYXNBdHRyaWJ1dGUoYXR0cikpIHtcbiAgICAgIGlmICh2YWwyICE9PSB1bmRlZmluZWQpIHtcbiAgICAgICAgLy8gdG9nZ2xlIGJldHdlZW4gdmFsMSBhbmQgdmFsMlxuICAgICAgICBpZiAoZWwuZ2V0QXR0cmlidXRlKGF0dHIpID09PSB2YWwxKSB7XG4gICAgICAgICAgdGhpcy5zZXRPclJlbW92ZUF0dHJzKGVsLCBbW2F0dHIsIHZhbDJdXSwgW10pO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIHRoaXMuc2V0T3JSZW1vdmVBdHRycyhlbCwgW1thdHRyLCB2YWwxXV0sIFtdKTtcbiAgICAgICAgfVxuICAgICAgfSBlbHNlIHtcbiAgICAgICAgLy8gcmVtb3ZlIGF0dHJcbiAgICAgICAgdGhpcy5zZXRPclJlbW92ZUF0dHJzKGVsLCBbXSwgW2F0dHJdKTtcbiAgICAgIH1cbiAgICB9IGVsc2Uge1xuICAgICAgdGhpcy5zZXRPclJlbW92ZUF0dHJzKGVsLCBbW2F0dHIsIHZhbDFdXSwgW10pO1xuICAgIH1cbiAgfSxcblxuICBhZGRPclJlbW92ZUNsYXNzZXMoZWwsIGFkZHMsIHJlbW92ZXMsIHRyYW5zaXRpb24sIHRpbWUsIHZpZXcsIGJsb2NraW5nKSB7XG4gICAgdGltZSA9IHRpbWUgfHwgZGVmYXVsdF90cmFuc2l0aW9uX3RpbWU7XG4gICAgY29uc3QgW3RyYW5zaXRpb25SdW4sIHRyYW5zaXRpb25TdGFydCwgdHJhbnNpdGlvbkVuZF0gPSB0cmFuc2l0aW9uIHx8IFtcbiAgICAgIFtdLFxuICAgICAgW10sXG4gICAgICBbXSxcbiAgICBdO1xuICAgIGlmICh0cmFuc2l0aW9uUnVuLmxlbmd0aCA+IDApIHtcbiAgICAgIGNvbnN0IG9uU3RhcnQgPSAoKSA9PiB7XG4gICAgICAgIHRoaXMuYWRkT3JSZW1vdmVDbGFzc2VzKFxuICAgICAgICAgIGVsLFxuICAgICAgICAgIHRyYW5zaXRpb25TdGFydCxcbiAgICAgICAgICBbXS5jb25jYXQodHJhbnNpdGlvblJ1bikuY29uY2F0KHRyYW5zaXRpb25FbmQpLFxuICAgICAgICApO1xuICAgICAgICB3aW5kb3cucmVxdWVzdEFuaW1hdGlvbkZyYW1lKCgpID0+IHtcbiAgICAgICAgICB0aGlzLmFkZE9yUmVtb3ZlQ2xhc3NlcyhlbCwgdHJhbnNpdGlvblJ1biwgW10pO1xuICAgICAgICAgIHdpbmRvdy5yZXF1ZXN0QW5pbWF0aW9uRnJhbWUoKCkgPT5cbiAgICAgICAgICAgIHRoaXMuYWRkT3JSZW1vdmVDbGFzc2VzKGVsLCB0cmFuc2l0aW9uRW5kLCB0cmFuc2l0aW9uU3RhcnQpLFxuICAgICAgICAgICk7XG4gICAgICAgIH0pO1xuICAgICAgfTtcbiAgICAgIGNvbnN0IG9uRG9uZSA9ICgpID0+XG4gICAgICAgIHRoaXMuYWRkT3JSZW1vdmVDbGFzc2VzKFxuICAgICAgICAgIGVsLFxuICAgICAgICAgIGFkZHMuY29uY2F0KHRyYW5zaXRpb25FbmQpLFxuICAgICAgICAgIHJlbW92ZXMuY29uY2F0KHRyYW5zaXRpb25SdW4pLmNvbmNhdCh0cmFuc2l0aW9uU3RhcnQpLFxuICAgICAgICApO1xuICAgICAgaWYgKGJsb2NraW5nID09PSBmYWxzZSkge1xuICAgICAgICBvblN0YXJ0KCk7XG4gICAgICAgIHNldFRpbWVvdXQob25Eb25lLCB0aW1lKTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHZpZXcudHJhbnNpdGlvbih0aW1lLCBvblN0YXJ0LCBvbkRvbmUpO1xuICAgICAgfVxuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIHdpbmRvdy5yZXF1ZXN0QW5pbWF0aW9uRnJhbWUoKCkgPT4ge1xuICAgICAgY29uc3QgW3ByZXZBZGRzLCBwcmV2UmVtb3Zlc10gPSBET00uZ2V0U3RpY2t5KGVsLCBcImNsYXNzZXNcIiwgW1tdLCBbXV0pO1xuICAgICAgY29uc3Qga2VlcEFkZHMgPSBhZGRzLmZpbHRlcihcbiAgICAgICAgKG5hbWUpID0+IHByZXZBZGRzLmluZGV4T2YobmFtZSkgPCAwICYmICFlbC5jbGFzc0xpc3QuY29udGFpbnMobmFtZSksXG4gICAgICApO1xuICAgICAgY29uc3Qga2VlcFJlbW92ZXMgPSByZW1vdmVzLmZpbHRlcihcbiAgICAgICAgKG5hbWUpID0+IHByZXZSZW1vdmVzLmluZGV4T2YobmFtZSkgPCAwICYmIGVsLmNsYXNzTGlzdC5jb250YWlucyhuYW1lKSxcbiAgICAgICk7XG4gICAgICBjb25zdCBuZXdBZGRzID0gcHJldkFkZHNcbiAgICAgICAgLmZpbHRlcigobmFtZSkgPT4gcmVtb3Zlcy5pbmRleE9mKG5hbWUpIDwgMClcbiAgICAgICAgLmNvbmNhdChrZWVwQWRkcyk7XG4gICAgICBjb25zdCBuZXdSZW1vdmVzID0gcHJldlJlbW92ZXNcbiAgICAgICAgLmZpbHRlcigobmFtZSkgPT4gYWRkcy5pbmRleE9mKG5hbWUpIDwgMClcbiAgICAgICAgLmNvbmNhdChrZWVwUmVtb3Zlcyk7XG5cbiAgICAgIERPTS5wdXRTdGlja3koZWwsIFwiY2xhc3Nlc1wiLCAoY3VycmVudEVsKSA9PiB7XG4gICAgICAgIGN1cnJlbnRFbC5jbGFzc0xpc3QucmVtb3ZlKC4uLm5ld1JlbW92ZXMpO1xuICAgICAgICBjdXJyZW50RWwuY2xhc3NMaXN0LmFkZCguLi5uZXdBZGRzKTtcbiAgICAgICAgcmV0dXJuIFtuZXdBZGRzLCBuZXdSZW1vdmVzXTtcbiAgICAgIH0pO1xuICAgIH0pO1xuICB9LFxuXG4gIHNldE9yUmVtb3ZlQXR0cnMoZWwsIHNldHMsIHJlbW92ZXMpIHtcbiAgICBjb25zdCBbcHJldlNldHMsIHByZXZSZW1vdmVzXSA9IERPTS5nZXRTdGlja3koZWwsIFwiYXR0cnNcIiwgW1tdLCBbXV0pO1xuXG4gICAgY29uc3QgYWx0ZXJlZEF0dHJzID0gc2V0cy5tYXAoKFthdHRyLCBfdmFsXSkgPT4gYXR0cikuY29uY2F0KHJlbW92ZXMpO1xuICAgIGNvbnN0IG5ld1NldHMgPSBwcmV2U2V0c1xuICAgICAgLmZpbHRlcigoW2F0dHIsIF92YWxdKSA9PiAhYWx0ZXJlZEF0dHJzLmluY2x1ZGVzKGF0dHIpKVxuICAgICAgLmNvbmNhdChzZXRzKTtcbiAgICBjb25zdCBuZXdSZW1vdmVzID0gcHJldlJlbW92ZXNcbiAgICAgIC5maWx0ZXIoKGF0dHIpID0+ICFhbHRlcmVkQXR0cnMuaW5jbHVkZXMoYXR0cikpXG4gICAgICAuY29uY2F0KHJlbW92ZXMpO1xuXG4gICAgRE9NLnB1dFN0aWNreShlbCwgXCJhdHRyc1wiLCAoY3VycmVudEVsKSA9PiB7XG4gICAgICBuZXdSZW1vdmVzLmZvckVhY2goKGF0dHIpID0+IGN1cnJlbnRFbC5yZW1vdmVBdHRyaWJ1dGUoYXR0cikpO1xuICAgICAgbmV3U2V0cy5mb3JFYWNoKChbYXR0ciwgdmFsXSkgPT4gY3VycmVudEVsLnNldEF0dHJpYnV0ZShhdHRyLCB2YWwpKTtcbiAgICAgIHJldHVybiBbbmV3U2V0cywgbmV3UmVtb3Zlc107XG4gICAgfSk7XG4gIH0sXG5cbiAgaGFzQWxsQ2xhc3NlcyhlbCwgY2xhc3Nlcykge1xuICAgIHJldHVybiBjbGFzc2VzLmV2ZXJ5KChuYW1lKSA9PiBlbC5jbGFzc0xpc3QuY29udGFpbnMobmFtZSkpO1xuICB9LFxuXG4gIGlzVG9nZ2xlZE91dChlbCwgb3V0Q2xhc3Nlcykge1xuICAgIHJldHVybiAhdGhpcy5pc1Zpc2libGUoZWwpIHx8IHRoaXMuaGFzQWxsQ2xhc3NlcyhlbCwgb3V0Q2xhc3Nlcyk7XG4gIH0sXG5cbiAgZmlsdGVyVG9FbHMobGl2ZVNvY2tldCwgc291cmNlRWwsIHsgdG8gfSkge1xuICAgIGNvbnN0IGRlZmF1bHRRdWVyeSA9ICgpID0+IHtcbiAgICAgIGlmICh0eXBlb2YgdG8gPT09IFwic3RyaW5nXCIpIHtcbiAgICAgICAgcmV0dXJuIGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3JBbGwodG8pO1xuICAgICAgfSBlbHNlIGlmICh0by5jbG9zZXN0KSB7XG4gICAgICAgIGNvbnN0IHRvRWwgPSBzb3VyY2VFbC5jbG9zZXN0KHRvLmNsb3Nlc3QpO1xuICAgICAgICByZXR1cm4gdG9FbCA/IFt0b0VsXSA6IFtdO1xuICAgICAgfSBlbHNlIGlmICh0by5pbm5lcikge1xuICAgICAgICByZXR1cm4gc291cmNlRWwucXVlcnlTZWxlY3RvckFsbCh0by5pbm5lcik7XG4gICAgICB9XG4gICAgfTtcbiAgICByZXR1cm4gdG9cbiAgICAgID8gbGl2ZVNvY2tldC5qc1F1ZXJ5U2VsZWN0b3JBbGwoc291cmNlRWwsIHRvLCBkZWZhdWx0UXVlcnkpXG4gICAgICA6IFtzb3VyY2VFbF07XG4gIH0sXG5cbiAgZGVmYXVsdERpc3BsYXkoZWwpIHtcbiAgICByZXR1cm4gKFxuICAgICAgeyB0cjogXCJ0YWJsZS1yb3dcIiwgdGQ6IFwidGFibGUtY2VsbFwiIH1bZWwudGFnTmFtZS50b0xvd2VyQ2FzZSgpXSB8fCBcImJsb2NrXCJcbiAgICApO1xuICB9LFxuXG4gIHRyYW5zaXRpb25DbGFzc2VzKHZhbCkge1xuICAgIGlmICghdmFsKSB7XG4gICAgICByZXR1cm4gbnVsbDtcbiAgICB9XG5cbiAgICBsZXQgW3RyYW5zLCB0U3RhcnQsIHRFbmRdID0gQXJyYXkuaXNBcnJheSh2YWwpXG4gICAgICA/IHZhbFxuICAgICAgOiBbdmFsLnNwbGl0KFwiIFwiKSwgW10sIFtdXTtcbiAgICB0cmFucyA9IEFycmF5LmlzQXJyYXkodHJhbnMpID8gdHJhbnMgOiB0cmFucy5zcGxpdChcIiBcIik7XG4gICAgdFN0YXJ0ID0gQXJyYXkuaXNBcnJheSh0U3RhcnQpID8gdFN0YXJ0IDogdFN0YXJ0LnNwbGl0KFwiIFwiKTtcbiAgICB0RW5kID0gQXJyYXkuaXNBcnJheSh0RW5kKSA/IHRFbmQgOiB0RW5kLnNwbGl0KFwiIFwiKTtcbiAgICByZXR1cm4gW3RyYW5zLCB0U3RhcnQsIHRFbmRdO1xuICB9LFxufTtcblxuZXhwb3J0IGRlZmF1bHQgSlM7XG4iLCAiaW1wb3J0IEpTIGZyb20gXCIuL2pzXCI7XG5pbXBvcnQgTGl2ZVNvY2tldCBmcm9tIFwiLi9saXZlX3NvY2tldFwiO1xuXG50eXBlIFRyYW5zaXRpb24gPSBzdHJpbmcgfCBzdHJpbmdbXTtcblxuLy8gQmFzZSBvcHRpb25zIGZvciBjb21tYW5kcyBpbnZvbHZpbmcgdHJhbnNpdGlvbnMgYW5kIHRpbWluZ1xudHlwZSBCYXNlT3B0cyA9IHtcbiAgLyoqXG4gICAqIFRoZSBDU1MgdHJhbnNpdGlvbiBjbGFzc2VzIHRvIHNldC5cbiAgICogQWNjZXB0cyBhIHN0cmluZyBvZiBjbGFzc2VzIG9yIGEgMy10dXBsZSBsaWtlOlxuICAgKiBgW1wiZWFzZS1vdXQgZHVyYXRpb24tMzAwXCIsIFwib3BhY2l0eS0wXCIsIFwib3BhY2l0eS0xMDBcIl1gXG4gICAqL1xuICB0cmFuc2l0aW9uPzogVHJhbnNpdGlvbjtcbiAgLyoqIFRoZSB0cmFuc2l0aW9uIGR1cmF0aW9uIGluIG1pbGxpc2Vjb25kcy4gRGVmYXVsdHMgMjAwLiAqL1xuICB0aW1lPzogbnVtYmVyO1xuICAvKiogV2hldGhlciB0byBibG9jayBVSSBkdXJpbmcgdHJhbnNpdGlvbi4gRGVmYXVsdHMgYHRydWVgLiAqL1xuICBibG9ja2luZz86IGJvb2xlYW47XG59O1xuXG50eXBlIFNob3dPcHRzID0gQmFzZU9wdHMgJiB7XG4gIC8qKiBUaGUgQ1NTIGRpc3BsYXkgdmFsdWUgdG8gc2V0LiBEZWZhdWx0cyBcImJsb2NrXCIuICovXG4gIGRpc3BsYXk/OiBzdHJpbmc7XG59O1xuXG50eXBlIFRvZ2dsZU9wdHMgPSB7XG4gIC8qKiBUaGUgQ1NTIGRpc3BsYXkgdmFsdWUgdG8gc2V0LiBEZWZhdWx0cyBcImJsb2NrXCIuICovXG4gIGRpc3BsYXk/OiBzdHJpbmc7XG4gIC8qKlxuICAgKiBUaGUgQ1NTIHRyYW5zaXRpb24gY2xhc3NlcyBmb3Igc2hvd2luZy5cbiAgICogQWNjZXB0cyBlaXRoZXIgdGhlIHN0cmluZyBvZiBjbGFzc2VzIHRvIGFwcGx5IHdoZW4gdG9nZ2xpbmcgaW4sIG9yXG4gICAqIGEgMy10dXBsZSBjb250YWluaW5nIHRoZSB0cmFuc2l0aW9uIGNsYXNzLCB0aGUgY2xhc3MgdG8gYXBwbHlcbiAgICogdG8gc3RhcnQgdGhlIHRyYW5zaXRpb24sIGFuZCB0aGUgZW5kaW5nIHRyYW5zaXRpb24gY2xhc3MsIHN1Y2ggYXM6XG4gICAqIGBbXCJlYXNlLW91dCBkdXJhdGlvbi0zMDBcIiwgXCJvcGFjaXR5LTBcIiwgXCJvcGFjaXR5LTEwMFwiXWBcbiAgICovXG4gIGluPzogVHJhbnNpdGlvbjtcbiAgLyoqXG4gICAqIFRoZSBDU1MgdHJhbnNpdGlvbiBjbGFzc2VzIGZvciBoaWRpbmcuXG4gICAqIEFjY2VwdHMgZWl0aGVyIHN0cmluZyBvZiBjbGFzc2VzIHRvIGFwcGx5IHdoZW4gdG9nZ2xpbmcgb3V0LCBvclxuICAgKiBhIDMtdHVwbGUgY29udGFpbmluZyB0aGUgdHJhbnNpdGlvbiBjbGFzcywgdGhlIGNsYXNzIHRvIGFwcGx5XG4gICAqIHRvIHN0YXJ0IHRoZSB0cmFuc2l0aW9uLCBhbmQgdGhlIGVuZGluZyB0cmFuc2l0aW9uIGNsYXNzLCBzdWNoIGFzOlxuICAgKiBgW1wiZWFzZS1vdXQgZHVyYXRpb24tMzAwXCIsIFwib3BhY2l0eS0xMDBcIiwgXCJvcGFjaXR5LTBcIl1gXG4gICAqL1xuICBvdXQ/OiBUcmFuc2l0aW9uO1xuICAvKiogVGhlIHRyYW5zaXRpb24gZHVyYXRpb24gaW4gbWlsbGlzZWNvbmRzLiAqL1xuICB0aW1lPzogbnVtYmVyO1xuICAvKiogV2hldGhlciB0byBibG9jayBVSSBkdXJpbmcgdHJhbnNpdGlvbi4gRGVmYXVsdHMgYHRydWVgLiAqL1xuICBibG9ja2luZz86IGJvb2xlYW47XG59O1xuXG4vLyBPcHRpb25zIHNwZWNpZmljIHRvIHRoZSAndHJhbnNpdGlvbicgY29tbWFuZFxudHlwZSBUcmFuc2l0aW9uQ29tbWFuZE9wdHMgPSB7XG4gIC8qKiBUaGUgdHJhbnNpdGlvbiBkdXJhdGlvbiBpbiBtaWxsaXNlY29uZHMuICovXG4gIHRpbWU/OiBudW1iZXI7XG4gIC8qKiBXaGV0aGVyIHRvIGJsb2NrIFVJIGR1cmluZyB0cmFuc2l0aW9uLiBEZWZhdWx0cyBgdHJ1ZWAuICovXG4gIGJsb2NraW5nPzogYm9vbGVhbjtcbn07XG5cbnR5cGUgUHVzaE9wdHMgPSB7XG4gIC8qKiBEYXRhIHRvIGJlIG1lcmdlZCBpbnRvIHRoZSBldmVudCBwYXlsb2FkLiAqL1xuICB2YWx1ZT86IGFueTtcbiAgLyoqIEZvciB0YXJnZXRpbmcgYSBMaXZlQ29tcG9uZW50IGJ5IGl0cyBJRCwgYSBjb21wb25lbnQgSUQgKG51bWJlciksIG9yIGEgQ1NTIHNlbGVjdG9yIHN0cmluZy4gKi9cbiAgdGFyZ2V0PzogSFRNTEVsZW1lbnQgfCBudW1iZXIgfCBzdHJpbmc7XG4gIC8qKiBJbmRpY2F0ZXMgaWYgYSBwYWdlIGxvYWRpbmcgc3RhdGUgc2hvdWxkIGJlIHNob3duLiAqL1xuICBwYWdlX2xvYWRpbmc/OiBib29sZWFuO1xuICBba2V5OiBzdHJpbmddOiBhbnk7IC8vIEFsbG93IG90aGVyIHByb3BlcnRpZXMgbGlrZSAnY2lkJywgJ3JlZGlyZWN0JywgZXRjLlxufTtcblxudHlwZSBOYXZpZ2F0aW9uT3B0cyA9IHtcbiAgLyoqIFdoZXRoZXIgdG8gcmVwbGFjZSB0aGUgY3VycmVudCBoaXN0b3J5IGVudHJ5IGluc3RlYWQgb2YgcHVzaGluZyBhIG5ldyBvbmUuICovXG4gIHJlcGxhY2U/OiBib29sZWFuO1xufTtcblxuLyoqXG4gKiBSZXByZXNlbnRzIGFsbCBwb3NzaWJsZSBKUyBjb21tYW5kcyB0aGF0IGNhbiBiZSBnZW5lcmF0ZWQgYnkgdGhlIGZhY3RvcnkuXG4gKiBUaGlzIGlzIHVzZWQgYXMgYSBiYXNlIGZvciBMaXZlU29ja2V0SlNDb21tYW5kcyBhbmQgSG9va0pTQ29tbWFuZHMuXG4gKi9cbmludGVyZmFjZSBBbGxKU0NvbW1hbmRzIHtcbiAgLyoqXG4gICAqIEV4ZWN1dGVzIGVuY29kZWQgSmF2YVNjcmlwdCBpbiB0aGUgY29udGV4dCBvZiB0aGUgZWxlbWVudC5cbiAgICogVGhpcyB2ZXJzaW9uIGlzIGZvciBnZW5lcmFsIHVzZSB2aWEgbGl2ZVNvY2tldC5qcygpLlxuICAgKlxuICAgKiBAcGFyYW0gZWwgLSBUaGUgZWxlbWVudCBpbiB3aG9zZSBjb250ZXh0IHRvIGV4ZWN1dGUgdGhlIEphdmFTY3JpcHQuXG4gICAqIEBwYXJhbSBlbmNvZGVkSlMgLSBUaGUgZW5jb2RlZCBKYXZhU2NyaXB0IHN0cmluZyB0byBleGVjdXRlLlxuICAgKi9cbiAgZXhlYyhlbDogSFRNTEVsZW1lbnQsIGVuY29kZWRKUzogc3RyaW5nKTogdm9pZDtcblxuICAvKipcbiAgICogU2hvd3MgYW4gZWxlbWVudC5cbiAgICpcbiAgICogQHBhcmFtIGVsIC0gVGhlIGVsZW1lbnQgdG8gc2hvdy5cbiAgICogQHBhcmFtIHtTaG93T3B0c30gW29wdHM9e31dIC0gT3B0aW9uYWwgc2V0dGluZ3MuXG4gICAqICAgQWNjZXB0czogYGRpc3BsYXlgLCBgdHJhbnNpdGlvbmAsIGB0aW1lYCwgYW5kIGBibG9ja2luZ2AuXG4gICAqL1xuICBzaG93KGVsOiBIVE1MRWxlbWVudCwgb3B0cz86IFNob3dPcHRzKTogdm9pZDtcblxuICAvKipcbiAgICogSGlkZXMgYW4gZWxlbWVudC5cbiAgICpcbiAgICogQHBhcmFtIGVsIC0gVGhlIGVsZW1lbnQgdG8gaGlkZS5cbiAgICogQHBhcmFtIFtvcHRzPXt9XSAtIE9wdGlvbmFsIHNldHRpbmdzLlxuICAgKiAgIEFjY2VwdHM6IGB0cmFuc2l0aW9uYCwgYHRpbWVgLCBhbmQgYGJsb2NraW5nYC5cbiAgICovXG4gIGhpZGUoZWw6IEhUTUxFbGVtZW50LCBvcHRzPzogQmFzZU9wdHMpOiB2b2lkO1xuXG4gIC8qKlxuICAgKiBUb2dnbGVzIHRoZSB2aXNpYmlsaXR5IG9mIGFuIGVsZW1lbnQuXG4gICAqXG4gICAqIEBwYXJhbSBlbCAtIFRoZSBlbGVtZW50IHRvIHRvZ2dsZS5cbiAgICogQHBhcmFtIFtvcHRzPXt9XSAtIE9wdGlvbmFsIHNldHRpbmdzLlxuICAgKiAgIEFjY2VwdHM6IGBkaXNwbGF5YCwgYGluYCwgYG91dGAsIGB0aW1lYCwgYW5kIGBibG9ja2luZ2AuXG4gICAqL1xuICB0b2dnbGUoZWw6IEhUTUxFbGVtZW50LCBvcHRzPzogVG9nZ2xlT3B0cyk6IHZvaWQ7XG5cbiAgLyoqXG4gICAqIEFkZHMgQ1NTIGNsYXNzZXMgdG8gYW4gZWxlbWVudC5cbiAgICpcbiAgICogQHBhcmFtIGVsIC0gVGhlIGVsZW1lbnQgdG8gYWRkIGNsYXNzZXMgdG8uXG4gICAqIEBwYXJhbSBuYW1lcyAtIFRoZSBjbGFzcyBuYW1lKHMpIHRvIGFkZC5cbiAgICogQHBhcmFtIFtvcHRzPXt9XSAtIE9wdGlvbmFsIHNldHRpbmdzLlxuICAgKiAgIEFjY2VwdHM6IGB0cmFuc2l0aW9uYCwgYHRpbWVgLCBhbmQgYGJsb2NraW5nYC5cbiAgICovXG4gIGFkZENsYXNzKGVsOiBIVE1MRWxlbWVudCwgbmFtZXM6IHN0cmluZyB8IHN0cmluZ1tdLCBvcHRzPzogQmFzZU9wdHMpOiB2b2lkO1xuXG4gIC8qKlxuICAgKiBSZW1vdmVzIENTUyBjbGFzc2VzIGZyb20gYW4gZWxlbWVudC5cbiAgICpcbiAgICogQHBhcmFtIGVsIC0gVGhlIGVsZW1lbnQgdG8gcmVtb3ZlIGNsYXNzZXMgZnJvbS5cbiAgICogQHBhcmFtIG5hbWVzIC0gVGhlIGNsYXNzIG5hbWUocykgdG8gcmVtb3ZlLlxuICAgKiBAcGFyYW0gW29wdHM9e31dIC0gT3B0aW9uYWwgc2V0dGluZ3MuXG4gICAqICAgQWNjZXB0czogYHRyYW5zaXRpb25gLCBgdGltZWAsIGFuZCBgYmxvY2tpbmdgLlxuICAgKi9cbiAgcmVtb3ZlQ2xhc3MoZWw6IEhUTUxFbGVtZW50LCBuYW1lczogc3RyaW5nIHwgc3RyaW5nW10sIG9wdHM/OiBCYXNlT3B0cyk6IHZvaWQ7XG5cbiAgLyoqXG4gICAqIFRvZ2dsZXMgQ1NTIGNsYXNzZXMgb24gYW4gZWxlbWVudC5cbiAgICpcbiAgICogQHBhcmFtIGVsIC0gVGhlIGVsZW1lbnQgdG8gdG9nZ2xlIGNsYXNzZXMgb24uXG4gICAqIEBwYXJhbSBuYW1lcyAtIFRoZSBjbGFzcyBuYW1lKHMpIHRvIHRvZ2dsZS5cbiAgICogQHBhcmFtIFtvcHRzPXt9XSAtIE9wdGlvbmFsIHNldHRpbmdzLlxuICAgKiAgIEFjY2VwdHM6IGB0cmFuc2l0aW9uYCwgYHRpbWVgLCBhbmQgYGJsb2NraW5nYC5cbiAgICovXG4gIHRvZ2dsZUNsYXNzKGVsOiBIVE1MRWxlbWVudCwgbmFtZXM6IHN0cmluZyB8IHN0cmluZ1tdLCBvcHRzPzogQmFzZU9wdHMpOiB2b2lkO1xuXG4gIC8qKlxuICAgKiBBcHBsaWVzIGEgQ1NTIHRyYW5zaXRpb24gdG8gYW4gZWxlbWVudC5cbiAgICpcbiAgICogQHBhcmFtIGVsIC0gVGhlIGVsZW1lbnQgdG8gYXBwbHkgdGhlIHRyYW5zaXRpb24gdG8uXG4gICAqIEBwYXJhbSB0cmFuc2l0aW9uIC0gVGhlIHRyYW5zaXRpb24gY2xhc3MoZXMpIHRvIGFwcGx5LlxuICAgKiAgIEFjY2VwdHMgYSBzdHJpbmcgb2YgY2xhc3NlcyB0byBhcHBseSB3aGVuIHRyYW5zaXRpb25pbmcgb3JcbiAgICogICBhIDMtdHVwbGUgY29udGFpbmluZyB0aGUgdHJhbnNpdGlvbiBjbGFzcywgdGhlIGNsYXNzIHRvIGFwcGx5XG4gICAqICAgdG8gc3RhcnQgdGhlIHRyYW5zaXRpb24sIGFuZCB0aGUgZW5kaW5nIHRyYW5zaXRpb24gY2xhc3MsIHN1Y2ggYXM6XG4gICAqXG4gICAqICAgICAgIFtcImVhc2Utb3V0IGR1cmF0aW9uLTMwMFwiLCBcIm9wYWNpdHktMTAwXCIsIFwib3BhY2l0eS0wXCJdXG4gICAqXG4gICAqIEBwYXJhbSBbb3B0cz17fV0gLSBPcHRpb25hbCBzZXR0aW5ncyBmb3IgdGltaW5nIGFuZCBibG9ja2luZyBiZWhhdmlvci5cbiAgICogICBBY2NlcHRzOiBgdGltZWAgYW5kIGBibG9ja2luZ2AuXG4gICAqL1xuICB0cmFuc2l0aW9uKFxuICAgIGVsOiBIVE1MRWxlbWVudCxcbiAgICB0cmFuc2l0aW9uOiBzdHJpbmcgfCBzdHJpbmdbXSxcbiAgICBvcHRzPzogVHJhbnNpdGlvbkNvbW1hbmRPcHRzLFxuICApOiB2b2lkO1xuXG4gIC8qKlxuICAgKiBTZXRzIGFuIGF0dHJpYnV0ZSBvbiBhbiBlbGVtZW50LlxuICAgKlxuICAgKiBAcGFyYW0gZWwgLSBUaGUgZWxlbWVudCB0byBzZXQgdGhlIGF0dHJpYnV0ZSBvbi5cbiAgICogQHBhcmFtIGF0dHIgLSBUaGUgYXR0cmlidXRlIG5hbWUgdG8gc2V0LlxuICAgKiBAcGFyYW0gdmFsIC0gVGhlIHZhbHVlIHRvIHNldCBmb3IgdGhlIGF0dHJpYnV0ZS5cbiAgICovXG4gIHNldEF0dHJpYnV0ZShlbDogSFRNTEVsZW1lbnQsIGF0dHI6IHN0cmluZywgdmFsOiBzdHJpbmcpOiB2b2lkO1xuXG4gIC8qKlxuICAgKiBSZW1vdmVzIGFuIGF0dHJpYnV0ZSBmcm9tIGFuIGVsZW1lbnQuXG4gICAqXG4gICAqIEBwYXJhbSBlbCAtIFRoZSBlbGVtZW50IHRvIHJlbW92ZSB0aGUgYXR0cmlidXRlIGZyb20uXG4gICAqIEBwYXJhbSBhdHRyIC0gVGhlIGF0dHJpYnV0ZSBuYW1lIHRvIHJlbW92ZS5cbiAgICovXG4gIHJlbW92ZUF0dHJpYnV0ZShlbDogSFRNTEVsZW1lbnQsIGF0dHI6IHN0cmluZyk6IHZvaWQ7XG5cbiAgLyoqXG4gICAqIFRvZ2dsZXMgYW4gYXR0cmlidXRlIG9uIGFuIGVsZW1lbnQgYmV0d2VlbiB0d28gdmFsdWVzLlxuICAgKlxuICAgKiBAcGFyYW0gZWwgLSBUaGUgZWxlbWVudCB0byB0b2dnbGUgdGhlIGF0dHJpYnV0ZSBvbi5cbiAgICogQHBhcmFtIGF0dHIgLSBUaGUgYXR0cmlidXRlIG5hbWUgdG8gdG9nZ2xlLlxuICAgKiBAcGFyYW0gdmFsMSAtIFRoZSBmaXJzdCB2YWx1ZSB0byB0b2dnbGUgYmV0d2Vlbi5cbiAgICogQHBhcmFtIHZhbDIgLSBUaGUgc2Vjb25kIHZhbHVlIHRvIHRvZ2dsZSBiZXR3ZWVuLlxuICAgKi9cbiAgdG9nZ2xlQXR0cmlidXRlKFxuICAgIGVsOiBIVE1MRWxlbWVudCxcbiAgICBhdHRyOiBzdHJpbmcsXG4gICAgdmFsMTogc3RyaW5nLFxuICAgIHZhbDI6IHN0cmluZyxcbiAgKTogdm9pZDtcblxuICAvKipcbiAgICogUHVzaGVzIGFuIGV2ZW50IHRvIHRoZSBzZXJ2ZXIuXG4gICAqXG4gICAqIEBwYXJhbSBlbCAtIEFuIGVsZW1lbnQgdGhhdCBiZWxvbmdzIHRvIHRoZSB0YXJnZXQgTGl2ZVZpZXcgLyBMaXZlQ29tcG9uZW50IG9yIGEgY29tcG9uZW50IElELlxuICAgKiAgIFRvIHRhcmdldCBhIExpdmVDb21wb25lbnQgYnkgaXRzIElELCBwYXNzIGEgc2VwYXJhdGUgYHRhcmdldGAgaW4gdGhlIG9wdGlvbnMuXG4gICAqIEBwYXJhbSB0eXBlIC0gVGhlIGV2ZW50IG5hbWUgdG8gcHVzaC5cbiAgICogQHBhcmFtIFtvcHRzPXt9XSAtIE9wdGlvbmFsIHNldHRpbmdzLlxuICAgKiAgIEFjY2VwdHM6IGB2YWx1ZWAsIGB0YXJnZXRgLCBgcGFnZV9sb2FkaW5nYC5cbiAgICovXG4gIHB1c2goZWw6IEhUTUxFbGVtZW50LCB0eXBlOiBzdHJpbmcsIG9wdHM/OiBQdXNoT3B0cyk6IHZvaWQ7XG5cbiAgLyoqXG4gICAqIFNlbmRzIGEgbmF2aWdhdGlvbiBldmVudCB0byB0aGUgc2VydmVyIGFuZCB1cGRhdGVzIHRoZSBicm93c2VyJ3MgcHVzaFN0YXRlIGhpc3RvcnkuXG4gICAqXG4gICAqIEBwYXJhbSBocmVmIC0gVGhlIFVSTCB0byBuYXZpZ2F0ZSB0by5cbiAgICogQHBhcmFtIFtvcHRzPXt9XSAtIE9wdGlvbmFsIHNldHRpbmdzLlxuICAgKiAgIEFjY2VwdHM6IGByZXBsYWNlYC5cbiAgICovXG4gIG5hdmlnYXRlKGhyZWY6IHN0cmluZywgb3B0cz86IE5hdmlnYXRpb25PcHRzKTogdm9pZDtcblxuICAvKipcbiAgICogU2VuZHMgYSBwYXRjaCBldmVudCB0byB0aGUgc2VydmVyIGFuZCB1cGRhdGVzIHRoZSBicm93c2VyJ3MgcHVzaFN0YXRlIGhpc3RvcnkuXG4gICAqXG4gICAqIEBwYXJhbSBocmVmIC0gVGhlIFVSTCB0byBwYXRjaCB0by5cbiAgICogQHBhcmFtIFtvcHRzPXt9XSAtIE9wdGlvbmFsIHNldHRpbmdzLlxuICAgKiAgIEFjY2VwdHM6IGByZXBsYWNlYC5cbiAgICovXG4gIHBhdGNoKGhyZWY6IHN0cmluZywgb3B0cz86IE5hdmlnYXRpb25PcHRzKTogdm9pZDtcblxuICAvKipcbiAgICogTWFyayBhdHRyaWJ1dGVzIGFzIGlnbm9yZWQsIHNraXBwaW5nIHRoZW0gd2hlbiBwYXRjaGluZyB0aGUgRE9NLlxuICAgKlxuICAgKiBAcGFyYW0gZWwgLSBUaGUgZWxlbWVudCB0byBpZ25vcmUgYXR0cmlidXRlcyBvbi5cbiAgICogQHBhcmFtIGF0dHJzIC0gVGhlIGF0dHJpYnV0ZSBuYW1lIG9yIG5hbWVzIHRvIGlnbm9yZS5cbiAgICovXG4gIGlnbm9yZUF0dHJpYnV0ZXMoZWw6IEhUTUxFbGVtZW50LCBhdHRyczogc3RyaW5nIHwgc3RyaW5nW10pOiB2b2lkO1xufVxuXG5leHBvcnQgZGVmYXVsdCAoXG4gIGxpdmVTb2NrZXQ6IExpdmVTb2NrZXQsXG4gIGV2ZW50VHlwZTogc3RyaW5nIHwgbnVsbCxcbik6IEFsbEpTQ29tbWFuZHMgPT4ge1xuICByZXR1cm4ge1xuICAgIGV4ZWMoZWwsIGVuY29kZWRKUykge1xuICAgICAgbGl2ZVNvY2tldC5leGVjSlMoZWwsIGVuY29kZWRKUywgZXZlbnRUeXBlKTtcbiAgICB9LFxuICAgIHNob3coZWwsIG9wdHMgPSB7fSkge1xuICAgICAgY29uc3Qgb3duZXIgPSBsaXZlU29ja2V0Lm93bmVyKGVsKTtcbiAgICAgIEpTLnNob3coXG4gICAgICAgIGV2ZW50VHlwZSxcbiAgICAgICAgb3duZXIsXG4gICAgICAgIGVsLFxuICAgICAgICBvcHRzLmRpc3BsYXksXG4gICAgICAgIEpTLnRyYW5zaXRpb25DbGFzc2VzKG9wdHMudHJhbnNpdGlvbiksXG4gICAgICAgIG9wdHMudGltZSxcbiAgICAgICAgb3B0cy5ibG9ja2luZyxcbiAgICAgICk7XG4gICAgfSxcbiAgICBoaWRlKGVsLCBvcHRzID0ge30pIHtcbiAgICAgIGNvbnN0IG93bmVyID0gbGl2ZVNvY2tldC5vd25lcihlbCk7XG4gICAgICBKUy5oaWRlKFxuICAgICAgICBldmVudFR5cGUsXG4gICAgICAgIG93bmVyLFxuICAgICAgICBlbCxcbiAgICAgICAgbnVsbCxcbiAgICAgICAgSlMudHJhbnNpdGlvbkNsYXNzZXMob3B0cy50cmFuc2l0aW9uKSxcbiAgICAgICAgb3B0cy50aW1lLFxuICAgICAgICBvcHRzLmJsb2NraW5nLFxuICAgICAgKTtcbiAgICB9LFxuICAgIHRvZ2dsZShlbCwgb3B0cyA9IHt9KSB7XG4gICAgICBjb25zdCBvd25lciA9IGxpdmVTb2NrZXQub3duZXIoZWwpO1xuICAgICAgY29uc3QgaW5UcmFuc2l0aW9uID0gSlMudHJhbnNpdGlvbkNsYXNzZXMob3B0cy5pbik7XG4gICAgICBjb25zdCBvdXRUcmFuc2l0aW9uID0gSlMudHJhbnNpdGlvbkNsYXNzZXMob3B0cy5vdXQpO1xuICAgICAgSlMudG9nZ2xlKFxuICAgICAgICBldmVudFR5cGUsXG4gICAgICAgIG93bmVyLFxuICAgICAgICBlbCxcbiAgICAgICAgb3B0cy5kaXNwbGF5LFxuICAgICAgICBpblRyYW5zaXRpb24sXG4gICAgICAgIG91dFRyYW5zaXRpb24sXG4gICAgICAgIG9wdHMudGltZSxcbiAgICAgICAgb3B0cy5ibG9ja2luZyxcbiAgICAgICk7XG4gICAgfSxcbiAgICBhZGRDbGFzcyhlbCwgbmFtZXMsIG9wdHMgPSB7fSkge1xuICAgICAgY29uc3QgY2xhc3NOYW1lcyA9IEFycmF5LmlzQXJyYXkobmFtZXMpID8gbmFtZXMgOiBuYW1lcy5zcGxpdChcIiBcIik7XG4gICAgICBjb25zdCBvd25lciA9IGxpdmVTb2NrZXQub3duZXIoZWwpO1xuICAgICAgSlMuYWRkT3JSZW1vdmVDbGFzc2VzKFxuICAgICAgICBlbCxcbiAgICAgICAgY2xhc3NOYW1lcyxcbiAgICAgICAgW10sXG4gICAgICAgIEpTLnRyYW5zaXRpb25DbGFzc2VzKG9wdHMudHJhbnNpdGlvbiksXG4gICAgICAgIG9wdHMudGltZSxcbiAgICAgICAgb3duZXIsXG4gICAgICAgIG9wdHMuYmxvY2tpbmcsXG4gICAgICApO1xuICAgIH0sXG4gICAgcmVtb3ZlQ2xhc3MoZWwsIG5hbWVzLCBvcHRzID0ge30pIHtcbiAgICAgIGNvbnN0IGNsYXNzTmFtZXMgPSBBcnJheS5pc0FycmF5KG5hbWVzKSA/IG5hbWVzIDogbmFtZXMuc3BsaXQoXCIgXCIpO1xuICAgICAgY29uc3Qgb3duZXIgPSBsaXZlU29ja2V0Lm93bmVyKGVsKTtcbiAgICAgIEpTLmFkZE9yUmVtb3ZlQ2xhc3NlcyhcbiAgICAgICAgZWwsXG4gICAgICAgIFtdLFxuICAgICAgICBjbGFzc05hbWVzLFxuICAgICAgICBKUy50cmFuc2l0aW9uQ2xhc3NlcyhvcHRzLnRyYW5zaXRpb24pLFxuICAgICAgICBvcHRzLnRpbWUsXG4gICAgICAgIG93bmVyLFxuICAgICAgICBvcHRzLmJsb2NraW5nLFxuICAgICAgKTtcbiAgICB9LFxuICAgIHRvZ2dsZUNsYXNzKGVsLCBuYW1lcywgb3B0cyA9IHt9KSB7XG4gICAgICBjb25zdCBjbGFzc05hbWVzID0gQXJyYXkuaXNBcnJheShuYW1lcykgPyBuYW1lcyA6IG5hbWVzLnNwbGl0KFwiIFwiKTtcbiAgICAgIGNvbnN0IG93bmVyID0gbGl2ZVNvY2tldC5vd25lcihlbCk7XG4gICAgICBKUy50b2dnbGVDbGFzc2VzKFxuICAgICAgICBlbCxcbiAgICAgICAgY2xhc3NOYW1lcyxcbiAgICAgICAgSlMudHJhbnNpdGlvbkNsYXNzZXMob3B0cy50cmFuc2l0aW9uKSxcbiAgICAgICAgb3B0cy50aW1lLFxuICAgICAgICBvd25lcixcbiAgICAgICAgb3B0cy5ibG9ja2luZyxcbiAgICAgICk7XG4gICAgfSxcbiAgICB0cmFuc2l0aW9uKGVsLCB0cmFuc2l0aW9uLCBvcHRzID0ge30pIHtcbiAgICAgIGNvbnN0IG93bmVyID0gbGl2ZVNvY2tldC5vd25lcihlbCk7XG4gICAgICBKUy5hZGRPclJlbW92ZUNsYXNzZXMoXG4gICAgICAgIGVsLFxuICAgICAgICBbXSxcbiAgICAgICAgW10sXG4gICAgICAgIEpTLnRyYW5zaXRpb25DbGFzc2VzKHRyYW5zaXRpb24pLFxuICAgICAgICBvcHRzLnRpbWUsXG4gICAgICAgIG93bmVyLFxuICAgICAgICBvcHRzLmJsb2NraW5nLFxuICAgICAgKTtcbiAgICB9LFxuICAgIHNldEF0dHJpYnV0ZShlbCwgYXR0ciwgdmFsKSB7XG4gICAgICBKUy5zZXRPclJlbW92ZUF0dHJzKGVsLCBbW2F0dHIsIHZhbF1dLCBbXSk7XG4gICAgfSxcbiAgICByZW1vdmVBdHRyaWJ1dGUoZWwsIGF0dHIpIHtcbiAgICAgIEpTLnNldE9yUmVtb3ZlQXR0cnMoZWwsIFtdLCBbYXR0cl0pO1xuICAgIH0sXG4gICAgdG9nZ2xlQXR0cmlidXRlKGVsLCBhdHRyLCB2YWwxLCB2YWwyKSB7XG4gICAgICBKUy50b2dnbGVBdHRyKGVsLCBhdHRyLCB2YWwxLCB2YWwyKTtcbiAgICB9LFxuICAgIHB1c2goZWwsIHR5cGUsIG9wdHMgPSB7fSkge1xuICAgICAgbGl2ZVNvY2tldC53aXRoaW5Pd25lcnMoZWwsICh2aWV3KSA9PiB7XG4gICAgICAgIGNvbnN0IGRhdGEgPSBvcHRzLnZhbHVlIHx8IHt9O1xuICAgICAgICBkZWxldGUgb3B0cy52YWx1ZTtcbiAgICAgICAgbGV0IGUgPSBuZXcgQ3VzdG9tRXZlbnQoXCJwaHg6ZXhlY1wiLCB7IGRldGFpbDogeyBzb3VyY2VFbGVtZW50OiBlbCB9IH0pO1xuICAgICAgICBKUy5leGVjKGUsIGV2ZW50VHlwZSwgdHlwZSwgdmlldywgZWwsIFtcInB1c2hcIiwgeyBkYXRhLCAuLi5vcHRzIH1dKTtcbiAgICAgIH0pO1xuICAgIH0sXG4gICAgbmF2aWdhdGUoaHJlZiwgb3B0cyA9IHt9KSB7XG4gICAgICBjb25zdCBjdXN0b21FdmVudCA9IG5ldyBDdXN0b21FdmVudChcInBoeDpleGVjXCIpO1xuICAgICAgbGl2ZVNvY2tldC5oaXN0b3J5UmVkaXJlY3QoXG4gICAgICAgIGN1c3RvbUV2ZW50LFxuICAgICAgICBocmVmLFxuICAgICAgICBvcHRzLnJlcGxhY2UgPyBcInJlcGxhY2VcIiA6IFwicHVzaFwiLFxuICAgICAgICBudWxsLFxuICAgICAgICBudWxsLFxuICAgICAgKTtcbiAgICB9LFxuICAgIHBhdGNoKGhyZWYsIG9wdHMgPSB7fSkge1xuICAgICAgY29uc3QgY3VzdG9tRXZlbnQgPSBuZXcgQ3VzdG9tRXZlbnQoXCJwaHg6ZXhlY1wiKTtcbiAgICAgIGxpdmVTb2NrZXQucHVzaEhpc3RvcnlQYXRjaChcbiAgICAgICAgY3VzdG9tRXZlbnQsXG4gICAgICAgIGhyZWYsXG4gICAgICAgIG9wdHMucmVwbGFjZSA/IFwicmVwbGFjZVwiIDogXCJwdXNoXCIsXG4gICAgICAgIG51bGwsXG4gICAgICApO1xuICAgIH0sXG4gICAgaWdub3JlQXR0cmlidXRlcyhlbCwgYXR0cnMpIHtcbiAgICAgIEpTLmlnbm9yZUF0dHJzKGVsLCBBcnJheS5pc0FycmF5KGF0dHJzKSA/IGF0dHJzIDogW2F0dHJzXSk7XG4gICAgfSxcbiAgfTtcbn07XG5cbi8qKlxuICogSlNDb21tYW5kcyBmb3IgdXNlIHdpdGggYGxpdmVTb2NrZXQuanMoKWAuXG4gKiBJbmNsdWRlcyB0aGUgZ2VuZXJhbCBgZXhlY2AgY29tbWFuZCB0aGF0IHJlcXVpcmVzIGFuIGVsZW1lbnQuXG4gKi9cbmV4cG9ydCB0eXBlIExpdmVTb2NrZXRKU0NvbW1hbmRzID0gQWxsSlNDb21tYW5kcztcblxuLyoqXG4gKiBKU0NvbW1hbmRzIGZvciB1c2Ugd2l0aGluIGEgSG9vay5cbiAqIFRoZSBgZXhlY2AgY29tbWFuZCBpcyB0YWlsb3JlZCBmb3IgaG9va3MsIG5vdCByZXF1aXJpbmcgYW4gZXhwbGljaXQgZWxlbWVudC5cbiAqL1xuZXhwb3J0IGludGVyZmFjZSBIb29rSlNDb21tYW5kcyBleHRlbmRzIE9taXQ8QWxsSlNDb21tYW5kcywgXCJleGVjXCI+IHtcbiAgLyoqXG4gICAqIEV4ZWN1dGVzIGVuY29kZWQgSmF2YVNjcmlwdCBpbiB0aGUgY29udGV4dCBvZiB0aGUgaG9vaydzIGVsZW1lbnQuXG4gICAqXG4gICAqIEBwYXJhbSB7c3RyaW5nfSBlbmNvZGVkSlMgLSBUaGUgZW5jb2RlZCBKYXZhU2NyaXB0IHN0cmluZyB0byBleGVjdXRlLlxuICAgKi9cbiAgZXhlYyhlbmNvZGVkSlM6IHN0cmluZyk6IHZvaWQ7XG59XG4iLCAiaW1wb3J0IGpzQ29tbWFuZHMsIHsgSG9va0pTQ29tbWFuZHMgfSBmcm9tIFwiLi9qc19jb21tYW5kc1wiO1xuaW1wb3J0IERPTSBmcm9tIFwiLi9kb21cIjtcbmltcG9ydCBMaXZlU29ja2V0IGZyb20gXCIuL2xpdmVfc29ja2V0XCI7XG5pbXBvcnQgVmlldyBmcm9tIFwiLi92aWV3XCI7XG5cbmNvbnN0IEhPT0tfSUQgPSBcImhvb2tJZFwiO1xubGV0IHZpZXdIb29rSUQgPSAxO1xuXG5leHBvcnQgdHlwZSBPblJlcGx5ID0gKHJlcGx5OiBhbnksIHJlZjogbnVtYmVyKSA9PiBhbnk7XG5leHBvcnQgdHlwZSBDYWxsYmFja1JlZiA9IHsgZXZlbnQ6IHN0cmluZzsgY2FsbGJhY2s6IChwYXlsb2FkOiBhbnkpID0+IGFueSB9O1xuXG5leHBvcnQgdHlwZSBQaHhUYXJnZXQgPSBzdHJpbmcgfCBudW1iZXIgfCBIVE1MRWxlbWVudDtcblxuZXhwb3J0IGludGVyZmFjZSBIb29rSW50ZXJmYWNlPEUgZXh0ZW5kcyBIVE1MRWxlbWVudCA9IEhUTUxFbGVtZW50PiB7XG4gIC8qKlxuICAgKiBUaGUgRE9NIGVsZW1lbnQgdGhhdCB0aGUgaG9vayBpcyBhdHRhY2hlZCB0by5cbiAgICovXG4gIGVsOiBFO1xuXG4gIC8qKlxuICAgKiBUaGUgTGl2ZVNvY2tldCBpbnN0YW5jZSB0aGF0IHRoZSBob29rIGlzIGF0dGFjaGVkIHRvLlxuICAgKi9cbiAgbGl2ZVNvY2tldDogTGl2ZVNvY2tldDtcblxuICAvKipcbiAgICogVGhlIG1vdW50ZWQgY2FsbGJhY2suXG4gICAqXG4gICAqIENhbGxlZCB3aGVuIHRoZSBlbGVtZW50IGhhcyBiZWVuIGFkZGVkIHRvIHRoZSBET00gYW5kIGl0cyBzZXJ2ZXIgTGl2ZVZpZXcgaGFzIGZpbmlzaGVkIG1vdW50aW5nLlxuICAgKi9cbiAgbW91bnRlZD86ICgpID0+IHZvaWQ7XG5cbiAgLyoqXG4gICAqIFRoZSBiZWZvcmVVcGRhdGUgY2FsbGJhY2suXG4gICAqXG4gICAqIENhbGxlZCB3aGVuIHRoZSBlbGVtZW50IGlzIGFib3V0IHRvIGJlIHVwZGF0ZWQgaW4gdGhlIERPTS5cbiAgICogTm90ZTogYW55IGNhbGwgaGVyZSBtdXN0IGJlIHN5bmNocm9ub3VzIGFzIHRoZSBvcGVyYXRpb24gY2Fubm90IGJlIGRlZmVycmVkIG9yIGNhbmNlbGxlZC5cbiAgICovXG4gIGJlZm9yZVVwZGF0ZT86ICgpID0+IHZvaWQ7XG5cbiAgLyoqXG4gICAqIFRoZSB1cGRhdGVkIGNhbGxiYWNrLlxuICAgKlxuICAgKiBDYWxsZWQgd2hlbiB0aGUgZWxlbWVudCBoYXMgYmVlbiB1cGRhdGVkIGluIHRoZSBET00gYnkgdGhlIHNlcnZlclxuICAgKi9cbiAgdXBkYXRlZD86ICgpID0+IHZvaWQ7XG5cbiAgLyoqXG4gICAqIFRoZSBkZXN0cm95ZWQgY2FsbGJhY2suXG4gICAqXG4gICAqIENhbGxlZCB3aGVuIHRoZSBlbGVtZW50IGhhcyBiZWVuIHJlbW92ZWQgZnJvbSB0aGUgcGFnZSwgZWl0aGVyIGJ5IGEgcGFyZW50IHVwZGF0ZSwgb3IgYnkgdGhlIHBhcmVudCBiZWluZyByZW1vdmVkIGVudGlyZWx5XG4gICAqL1xuICBkZXN0cm95ZWQ/OiAoKSA9PiB2b2lkO1xuXG4gIC8qKlxuICAgKiBUaGUgZGlzY29ubmVjdGVkIGNhbGxiYWNrLlxuICAgKlxuICAgKiBDYWxsZWQgd2hlbiB0aGUgZWxlbWVudCdzIHBhcmVudCBMaXZlVmlldyBoYXMgZGlzY29ubmVjdGVkIGZyb20gdGhlIHNlcnZlci5cbiAgICovXG4gIGRpc2Nvbm5lY3RlZD86ICgpID0+IHZvaWQ7XG5cbiAgLyoqXG4gICAqIFRoZSByZWNvbm5lY3RlZCBjYWxsYmFjay5cbiAgICpcbiAgICogQ2FsbGVkIHdoZW4gdGhlIGVsZW1lbnQncyBwYXJlbnQgTGl2ZVZpZXcgaGFzIHJlY29ubmVjdGVkIHRvIHRoZSBzZXJ2ZXIuXG4gICAqL1xuICByZWNvbm5lY3RlZD86ICgpID0+IHZvaWQ7XG5cbiAgLyoqXG4gICAqIFJldHVybnMgYW4gb2JqZWN0IHdpdGggbWV0aG9kcyB0byBtYW5pcGx1YXRlIHRoZSBET00gYW5kIGV4ZWN1dGUgSmF2YVNjcmlwdC5cbiAgICogVGhlIGFwcGxpZWQgY2hhbmdlcyBpbnRlZ3JhdGUgd2l0aCBzZXJ2ZXIgRE9NIHBhdGNoaW5nLlxuICAgKi9cbiAganMoKTogSG9va0pTQ29tbWFuZHM7XG5cbiAgLyoqXG4gICAqIFB1c2hlcyBhbiBldmVudCB0byB0aGUgc2VydmVyLlxuICAgKlxuICAgKiBAcGFyYW0gZXZlbnQgLSBUaGUgZXZlbnQgbmFtZS5cbiAgICogQHBhcmFtIFtwYXlsb2FkXSAtIFRoZSBwYXlsb2FkIHRvIHNlbmQgdG8gdGhlIHNlcnZlci4gRGVmYXVsdHMgdG8gYW4gZW1wdHkgb2JqZWN0LlxuICAgKiBAcGFyYW0gW29uUmVwbHldIC0gQSBjYWxsYmFjayB0byBoYW5kbGUgdGhlIHNlcnZlcidzIHJlcGx5LlxuICAgKlxuICAgKiBXaGVuIG9uUmVwbHkgaXMgbm90IHByb3ZpZGVkLCB0aGUgbWV0aG9kIHJldHVybnMgYSBQcm9taXNlIHRoYXRcbiAgICogV2hlbiBvblJlcGx5IGlzIHByb3ZpZGVkLCB0aGUgbWV0aG9kIHJldHVybnMgdm9pZC5cbiAgICovXG4gIHB1c2hFdmVudChldmVudDogc3RyaW5nLCBwYXlsb2FkOiBhbnksIG9uUmVwbHk6IE9uUmVwbHkpOiB2b2lkO1xuICBwdXNoRXZlbnQoZXZlbnQ6IHN0cmluZywgcGF5bG9hZD86IGFueSk6IFByb21pc2U8YW55PjtcblxuICAvKipcbiAgICogUHVzaGVkIGEgdGFyZ2V0ZWQgZXZlbnQgdG8gdGhlIHNlcnZlci5cbiAgICpcbiAgICogSXQgc2VuZHMgdGhlIGV2ZW50IHRvIHRoZSBMaXZlQ29tcG9uZW50IG9yIExpdmVWaWV3IHRoZSBgc2VsZWN0b3JPclRhcmdldGAgaXMgZGVmaW5lZCBpbixcbiAgICogd2hlcmUgaXRzIHZhbHVlIGNhbiBiZSBlaXRoZXIgYSBxdWVyeSBzZWxlY3RvciwgYW4gYWN0dWFsIERPTSBlbGVtZW50LCBvciBhIENJRCAoY29tcG9uZW50IGlkKVxuICAgKiByZXR1cm5lZCBieSB0aGUgYEBteXNlbGZgIGFzc2lnbi5cbiAgICpcbiAgICogSWYgdGhlIHF1ZXJ5IHNlbGVjdG9yIHJldHVybnMgbW9yZSB0aGFuIG9uZSBlbGVtZW50IGl0IHdpbGwgc2VuZCB0aGUgZXZlbnQgdG8gYWxsIG9mIHRoZW0sXG4gICAqIGV2ZW4gaWYgYWxsIHRoZSBlbGVtZW50cyBhcmUgaW4gdGhlIHNhbWUgTGl2ZUNvbXBvbmVudCBvciBMaXZlVmlldy4gQmVjYXVzZSBvZiB0aGlzLFxuICAgKiBpZiBubyBjYWxsYmFjayBpcyBwYXNzZWQsIGEgcHJvbWlzZSBpcyByZXR1cm5lZCB0aGF0IG1hdGNoZXMgdGhlIHJldHVybiB2YWx1ZSBvZlxuICAgKiBbYFByb21pc2UuYWxsU2V0dGxlZCgpYF0oaHR0cHM6Ly9kZXZlbG9wZXIubW96aWxsYS5vcmcvZW4tVVMvZG9jcy9XZWIvSmF2YVNjcmlwdC9SZWZlcmVuY2UvR2xvYmFsX09iamVjdHMvUHJvbWlzZS9hbGxTZXR0bGVkI3JldHVybl92YWx1ZSkuXG4gICAqIEluZGl2aWR1YWwgZnVsZmlsbGVkIHZhbHVlcyBhcmUgb2YgdGhlIGZvcm1hdCBgeyByZXBseSwgcmVmIH1gLCB3aGVyZSBgcmVwbHlgIGlzIHRoZSBzZXJ2ZXIncyByZXBseS5cbiAgICpcbiAgICogQHBhcmFtIHNlbGVjdG9yT3JUYXJnZXQgLSBUaGUgc2VsZWN0b3IsIGVsZW1lbnQsIG9yIENJRCB0byB0YXJnZXQuXG4gICAqIEBwYXJhbSBldmVudCAtIFRoZSBldmVudCBuYW1lLlxuICAgKiBAcGFyYW0gW3BheWxvYWRdIC0gVGhlIHBheWxvYWQgdG8gc2VuZCB0byB0aGUgc2VydmVyLiBEZWZhdWx0cyB0byBhbiBlbXB0eSBvYmplY3QuXG4gICAqIEBwYXJhbSBbb25SZXBseV0gLSBBIGNhbGxiYWNrIHRvIGhhbmRsZSB0aGUgc2VydmVyJ3MgcmVwbHkuXG4gICAqXG4gICAqIFdoZW4gb25SZXBseSBpcyBub3QgcHJvdmlkZWQsIHRoZSBtZXRob2QgcmV0dXJucyBhIFByb21pc2UuXG4gICAqIFdoZW4gb25SZXBseSBpcyBwcm92aWRlZCwgdGhlIG1ldGhvZCByZXR1cm5zIHZvaWQuXG4gICAqL1xuICBwdXNoRXZlbnRUbyhcbiAgICBzZWxlY3Rvck9yVGFyZ2V0OiBQaHhUYXJnZXQsXG4gICAgZXZlbnQ6IHN0cmluZyxcbiAgICBwYXlsb2FkOiBvYmplY3QsXG4gICAgb25SZXBseTogT25SZXBseSxcbiAgKTogdm9pZDtcbiAgcHVzaEV2ZW50VG8oXG4gICAgc2VsZWN0b3JPclRhcmdldDogUGh4VGFyZ2V0LFxuICAgIGV2ZW50OiBzdHJpbmcsXG4gICAgcGF5bG9hZD86IG9iamVjdCxcbiAgKTogUHJvbWlzZTxQcm9taXNlU2V0dGxlZFJlc3VsdDx7IHJlcGx5OiBhbnk7IHJlZjogbnVtYmVyIH0+W10+O1xuXG4gIC8qKlxuICAgKiBBbGxvd3MgdG8gcmVnaXN0ZXIgYSBjYWxsYmFjayB0byBiZSBjYWxsZWQgd2hlbiBhbiBldmVudCBpcyByZWNlaXZlZCBmcm9tIHRoZSBzZXJ2ZXIuXG4gICAqXG4gICAqIFRoaXMgaXMgdXNlZCB0byBoYW5kbGUgYHB1c2hFdmVudGAgY2FsbHMgZnJvbSB0aGUgc2VydmVyLiBUaGUgY2FsbGJhY2sgaXMgY2FsbGVkIHdpdGggdGhlIHBheWxvYWQgZnJvbSB0aGUgc2VydmVyLlxuICAgKlxuICAgKiBAcGFyYW0gZXZlbnQgLSBUaGUgZXZlbnQgbmFtZS5cbiAgICogQHBhcmFtIGNhbGxiYWNrIC0gVGhlIGNhbGxiYWNrIHRvIGNhbGwgd2hlbiB0aGUgZXZlbnQgaXMgcmVjZWl2ZWQuXG4gICAqXG4gICAqIEByZXR1cm5zIEEgcmVmZXJlbmNlIHRvIHRoZSBjYWxsYmFjaywgd2hpY2ggY2FuIGJlIHVzZWQgaW4gYHJlbW92ZUhhbmRsZUV2ZW50YCB0byByZW1vdmUgdGhlIGNhbGxiYWNrLlxuICAgKi9cbiAgaGFuZGxlRXZlbnQoZXZlbnQ6IHN0cmluZywgY2FsbGJhY2s6IChwYXlsb2FkOiBhbnkpID0+IGFueSk6IENhbGxiYWNrUmVmO1xuXG4gIC8qKlxuICAgKiBSZW1vdmVzIGEgY2FsbGJhY2sgcmVnaXN0ZXJlZCB3aXRoIGBoYW5kbGVFdmVudGAuXG4gICAqXG4gICAqIEBwYXJhbSBjYWxsYmFja1JlZiAtIFRoZSByZWZlcmVuY2UgdG8gdGhlIGNhbGxiYWNrIHRvIHJlbW92ZS5cbiAgICovXG4gIHJlbW92ZUhhbmRsZUV2ZW50KHJlZjogQ2FsbGJhY2tSZWYpOiB2b2lkO1xuXG4gIC8qKlxuICAgKiBBbGxvd3MgdG8gdHJpZ2dlciBhIGxpdmUgZmlsZSB1cGxvYWQuXG4gICAqXG4gICAqIEBwYXJhbSBuYW1lIC0gVGhlIHVwbG9hZCBuYW1lIGNvcnJlc3BvbmRpbmcgdG8gdGhlIGBQaG9lbml4LkxpdmVWaWV3LmFsbG93X3VwbG9hZC8zYCBjYWxsLlxuICAgKiBAcGFyYW0gZmlsZXMgLSBUaGUgZmlsZXMgdG8gdXBsb2FkLlxuICAgKi9cbiAgdXBsb2FkKG5hbWU6IGFueSwgZmlsZXM6IGFueSk6IGFueTtcblxuICAvKipcbiAgICogQWxsb3dzIHRvIHRyaWdnZXIgYSBsaXZlIGZpbGUgdXBsb2FkIHRvIGEgc3BlY2lmaWMgdGFyZ2V0LlxuICAgKlxuICAgKiBAcGFyYW0gc2VsZWN0b3JPclRhcmdldCAtIFRoZSB0YXJnZXQgdG8gdXBsb2FkIHRoZSBmaWxlcyB0by5cbiAgICogQHBhcmFtIG5hbWUgLSBUaGUgdXBsb2FkIG5hbWUgY29ycmVzcG9uZGluZyB0byB0aGUgYFBob2VuaXguTGl2ZVZpZXcuYWxsb3dfdXBsb2FkLzNgIGNhbGwuXG4gICAqIEBwYXJhbSBmaWxlcyAtIFRoZSBmaWxlcyB0byB1cGxvYWQuXG4gICAqL1xuICB1cGxvYWRUbyhzZWxlY3Rvck9yVGFyZ2V0OiBQaHhUYXJnZXQsIG5hbWU6IGFueSwgZmlsZXM6IGFueSk6IGFueTtcblxuICAvLyBhbGxvdyB1bmtub3duIG1ldGhvZHMsIGFzIHBlb3BsZSBjYW4gZGVmaW5lIHRoZW0gaW4gdGhlaXIgaG9va3NcbiAgW2tleTogUHJvcGVydHlLZXldOiBhbnk7XG59XG5cbi8vIGJhc2VkIG9uIGh0dHBzOi8vZ2l0aHViLmNvbS9EZWZpbml0ZWx5VHlwZWQvRGVmaW5pdGVseVR5cGVkL2Jsb2IvZmFjMWFhNzVhY2RkZGJmNGYxYTk1ZTk4ZWUyMjk3YjU0Y2U0YjRjOS90eXBlcy9waG9lbml4X2xpdmVfdmlldy9ob29rcy5kLnRzI0wyNlxuLy8gbGljZW5zZWQgdW5kZXIgTUlUXG5leHBvcnQgaW50ZXJmYWNlIEhvb2s8b3V0IFQgPSBvYmplY3QsIEUgZXh0ZW5kcyBIVE1MRWxlbWVudCA9IEhUTUxFbGVtZW50PiB7XG4gIC8qKlxuICAgKiBUaGUgbW91bnRlZCBjYWxsYmFjay5cbiAgICpcbiAgICogQ2FsbGVkIHdoZW4gdGhlIGVsZW1lbnQgaGFzIGJlZW4gYWRkZWQgdG8gdGhlIERPTSBhbmQgaXRzIHNlcnZlciBMaXZlVmlldyBoYXMgZmluaXNoZWQgbW91bnRpbmcuXG4gICAqL1xuICBtb3VudGVkPzogKHRoaXM6IFQgJiBIb29rSW50ZXJmYWNlPEU+KSA9PiB2b2lkO1xuXG4gIC8qKlxuICAgKiBUaGUgYmVmb3JlVXBkYXRlIGNhbGxiYWNrLlxuICAgKlxuICAgKiBDYWxsZWQgd2hlbiB0aGUgZWxlbWVudCBpcyBhYm91dCB0byBiZSB1cGRhdGVkIGluIHRoZSBET00uXG4gICAqIE5vdGU6IGFueSBjYWxsIGhlcmUgbXVzdCBiZSBzeW5jaHJvbm91cyBhcyB0aGUgb3BlcmF0aW9uIGNhbm5vdCBiZSBkZWZlcnJlZCBvciBjYW5jZWxsZWQuXG4gICAqL1xuICBiZWZvcmVVcGRhdGU/OiAodGhpczogVCAmIEhvb2tJbnRlcmZhY2U8RT4pID0+IHZvaWQ7XG5cbiAgLyoqXG4gICAqIFRoZSB1cGRhdGVkIGNhbGxiYWNrLlxuICAgKlxuICAgKiBDYWxsZWQgd2hlbiB0aGUgZWxlbWVudCBoYXMgYmVlbiB1cGRhdGVkIGluIHRoZSBET00gYnkgdGhlIHNlcnZlclxuICAgKi9cbiAgdXBkYXRlZD86ICh0aGlzOiBUICYgSG9va0ludGVyZmFjZTxFPikgPT4gdm9pZDtcblxuICAvKipcbiAgICogVGhlIGRlc3Ryb3llZCBjYWxsYmFjay5cbiAgICpcbiAgICogQ2FsbGVkIHdoZW4gdGhlIGVsZW1lbnQgaGFzIGJlZW4gcmVtb3ZlZCBmcm9tIHRoZSBwYWdlLCBlaXRoZXIgYnkgYSBwYXJlbnQgdXBkYXRlLCBvciBieSB0aGUgcGFyZW50IGJlaW5nIHJlbW92ZWQgZW50aXJlbHlcbiAgICovXG4gIGRlc3Ryb3llZD86ICh0aGlzOiBUICYgSG9va0ludGVyZmFjZTxFPikgPT4gdm9pZDtcblxuICAvKipcbiAgICogVGhlIGRpc2Nvbm5lY3RlZCBjYWxsYmFjay5cbiAgICpcbiAgICogQ2FsbGVkIHdoZW4gdGhlIGVsZW1lbnQncyBwYXJlbnQgTGl2ZVZpZXcgaGFzIGRpc2Nvbm5lY3RlZCBmcm9tIHRoZSBzZXJ2ZXIuXG4gICAqL1xuICBkaXNjb25uZWN0ZWQ/OiAodGhpczogVCAmIEhvb2tJbnRlcmZhY2U8RT4pID0+IHZvaWQ7XG5cbiAgLyoqXG4gICAqIFRoZSByZWNvbm5lY3RlZCBjYWxsYmFjay5cbiAgICpcbiAgICogQ2FsbGVkIHdoZW4gdGhlIGVsZW1lbnQncyBwYXJlbnQgTGl2ZVZpZXcgaGFzIHJlY29ubmVjdGVkIHRvIHRoZSBzZXJ2ZXIuXG4gICAqL1xuICByZWNvbm5lY3RlZD86ICh0aGlzOiBUICYgSG9va0ludGVyZmFjZTxFPikgPT4gdm9pZDtcblxuICAvLyBBbGxvdyBjdXN0b20gbWV0aG9kcyB3aXRoIGFueSBzaWduYXR1cmUgYW5kIGN1c3RvbSBwcm9wZXJ0aWVzXG4gIFtrZXk6IFByb3BlcnR5S2V5XTogYW55O1xufVxuXG4vKipcbiAqIEJhc2UgY2xhc3MgZm9yIExpdmVWaWV3IGhvb2tzLiBVc2VycyBleHRlbmQgdGhpcyBjbGFzcyB0byBkZWZpbmUgdGhlaXIgaG9va3MuXG4gKlxuICogRXhhbXBsZTpcbiAqIGBgYHR5cGVzY3JpcHRcbiAqIGNsYXNzIE15Q3VzdG9tSG9vayBleHRlbmRzIFZpZXdIb29rIHtcbiAqICAgbXlTdGF0ZSA9IFwiaW5pdGlhbFwiO1xuICpcbiAqICAgbW91bnRlZCgpIHtcbiAqICAgICBjb25zb2xlLmxvZyhcIkhvb2sgbW91bnRlZCBvbiBlbGVtZW50OlwiLCB0aGlzLmVsKTtcbiAqICAgICB0aGlzLmVsLmFkZEV2ZW50TGlzdGVuZXIoXCJjbGlja1wiLCAoKSA9PiB7XG4gKiAgICAgICB0aGlzLnB1c2hFdmVudChcImVsZW1lbnQtY2xpY2tlZFwiLCB7IHN0YXRlOiB0aGlzLm15U3RhdGUgfSk7XG4gKiAgICAgfSk7XG4gKiAgIH1cbiAqXG4gKiAgIHVwZGF0ZWQoKSB7XG4gKiAgICAgY29uc29sZS5sb2coXCJIb29rIHVwZGF0ZWRcIiwgdGhpcy5lbC5pZCk7XG4gKiAgIH1cbiAqXG4gKiAgIG15Q3VzdG9tTWV0aG9kKHNvbWVBcmc6IHN0cmluZykge1xuICogICAgIGNvbnNvbGUubG9nKFwibXlDdXN0b21NZXRob2QgY2FsbGVkIHdpdGg6XCIsIHNvbWVBcmcsIFwiQ3VycmVudCBzdGF0ZTpcIiwgdGhpcy5teVN0YXRlKTtcbiAqICAgfVxuICogfVxuICogYGBgXG4gKlxuICogVGhlIGB0aGlzYCBjb250ZXh0IHdpdGhpbiB0aGUgaG9vayBtZXRob2RzIChtb3VudGVkLCB1cGRhdGVkLCBjdXN0b20gbWV0aG9kcywgZXRjLilcbiAqIHdpbGwgcmVmZXIgdG8gdGhlIGhvb2sgaW5zdGFuY2UsIHByb3ZpZGluZyBhY2Nlc3MgdG8gYHRoaXMuZWxgLCBgdGhpcy5saXZlU29ja2V0YCxcbiAqIGB0aGlzLnB1c2hFdmVudCgpYCwgZXRjLiwgYXMgd2VsbCBhcyBhbnkgcHJvcGVydGllcyBvciBtZXRob2RzIGRlZmluZWQgb24gdGhlIHN1YmNsYXNzLlxuICovXG5leHBvcnQgY2xhc3MgVmlld0hvb2s8RSBleHRlbmRzIEhUTUxFbGVtZW50ID0gSFRNTEVsZW1lbnQ+XG4gIGltcGxlbWVudHMgSG9va0ludGVyZmFjZTxFPlxue1xuICBlbDogRTtcbiAgbGl2ZVNvY2tldDogTGl2ZVNvY2tldDtcblxuICBwcml2YXRlIF9fbGlzdGVuZXJzOiBTZXQ8Q2FsbGJhY2tSZWY+O1xuICBwcml2YXRlIF9faXNEaXNjb25uZWN0ZWQ6IGJvb2xlYW47XG4gIHByaXZhdGUgX192aWV3OiAoKSA9PiBWaWV3O1xuXG4gIHN0YXRpYyBtYWtlSUQoKSB7XG4gICAgcmV0dXJuIHZpZXdIb29rSUQrKztcbiAgfVxuICBzdGF0aWMgZWxlbWVudElEKGVsOiBIVE1MRWxlbWVudCkge1xuICAgIHJldHVybiBET00ucHJpdmF0ZShlbCwgSE9PS19JRCk7XG4gIH1cblxuICBjb25zdHJ1Y3Rvcih2aWV3OiBWaWV3IHwgbnVsbCwgZWw6IEUsIGNhbGxiYWNrcz86IEhvb2spIHtcbiAgICB0aGlzLmVsID0gZWw7XG4gICAgdGhpcy5fX2F0dGFjaFZpZXcodmlldyk7XG4gICAgdGhpcy5fX2xpc3RlbmVycyA9IG5ldyBTZXQoKTtcbiAgICB0aGlzLl9faXNEaXNjb25uZWN0ZWQgPSBmYWxzZTtcbiAgICBET00ucHV0UHJpdmF0ZSh0aGlzLmVsLCBIT09LX0lELCBWaWV3SG9vay5tYWtlSUQoKSk7XG5cbiAgICBpZiAoY2FsbGJhY2tzKSB7XG4gICAgICAvLyBUaGlzIGluc3RhbmNlIGlzIGZvciBhbiBvYmplY3QtbGl0ZXJhbCBob29rLiBDb3B5IG1ldGhvZHMvcHJvcGVydGllcy5cbiAgICAgIC8vIFRoZXNlIGFyZSBwcm9wZXJ0aWVzIHRoYXQgc2hvdWxkIE5PVCBiZSBvdmVycmlkZGVuIGJ5IHRoZSBjYWxsYmFja3Mgb2JqZWN0LlxuICAgICAgY29uc3QgcHJvdGVjdGVkUHJvcHMgPSBuZXcgU2V0KFtcbiAgICAgICAgXCJlbFwiLFxuICAgICAgICBcImxpdmVTb2NrZXRcIixcbiAgICAgICAgXCJfX3ZpZXdcIixcbiAgICAgICAgXCJfX2xpc3RlbmVyc1wiLFxuICAgICAgICBcIl9faXNEaXNjb25uZWN0ZWRcIixcbiAgICAgICAgXCJjb25zdHJ1Y3RvclwiLCAvLyBTdGFuZGFyZCBvYmplY3QgcHJvcGVydGllc1xuICAgICAgICAvLyBDb3JlIFZpZXdIb29rIEFQSSBtZXRob2RzXG4gICAgICAgIFwianNcIixcbiAgICAgICAgXCJwdXNoRXZlbnRcIixcbiAgICAgICAgXCJwdXNoRXZlbnRUb1wiLFxuICAgICAgICBcImhhbmRsZUV2ZW50XCIsXG4gICAgICAgIFwicmVtb3ZlSGFuZGxlRXZlbnRcIixcbiAgICAgICAgXCJ1cGxvYWRcIixcbiAgICAgICAgXCJ1cGxvYWRUb1wiLFxuICAgICAgICAvLyBJbnRlcm5hbCBsaWZlY3ljbGUgY2FsbGVyc1xuICAgICAgICBcIl9fbW91bnRlZFwiLFxuICAgICAgICBcIl9fdXBkYXRlZFwiLFxuICAgICAgICBcIl9fYmVmb3JlVXBkYXRlXCIsXG4gICAgICAgIFwiX19kZXN0cm95ZWRcIixcbiAgICAgICAgXCJfX3JlY29ubmVjdGVkXCIsXG4gICAgICAgIFwiX19kaXNjb25uZWN0ZWRcIixcbiAgICAgICAgXCJfX2NsZWFudXBfX1wiLFxuICAgICAgXSk7XG5cbiAgICAgIGZvciAoY29uc3Qga2V5IGluIGNhbGxiYWNrcykge1xuICAgICAgICBpZiAoT2JqZWN0LnByb3RvdHlwZS5oYXNPd25Qcm9wZXJ0eS5jYWxsKGNhbGxiYWNrcywga2V5KSkge1xuICAgICAgICAgICh0aGlzIGFzIGFueSlba2V5XSA9IGNhbGxiYWNrc1trZXldO1xuICAgICAgICAgIC8vIGZvciBiYWNrd2FyZHMgY29tcGF0aWJpbGl0eSwgd2UgYWxsb3cgdGhlIG92ZXJ3cml0ZSwgYnV0IHdlIGxvZyBhIHdhcm5pbmdcbiAgICAgICAgICBpZiAocHJvdGVjdGVkUHJvcHMuaGFzKGtleSkpIHtcbiAgICAgICAgICAgIGNvbnNvbGUud2FybihcbiAgICAgICAgICAgICAgYEhvb2sgb2JqZWN0IGZvciBlbGVtZW50ICMke2VsLmlkfSBvdmVyd3JpdGVzIGNvcmUgcHJvcGVydHkgJyR7a2V5fSchYCxcbiAgICAgICAgICAgICk7XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICB9XG5cbiAgICAgIGNvbnN0IGxpZmVjeWNsZU1ldGhvZHM6IChrZXlvZiBIb29rKVtdID0gW1xuICAgICAgICBcIm1vdW50ZWRcIixcbiAgICAgICAgXCJiZWZvcmVVcGRhdGVcIixcbiAgICAgICAgXCJ1cGRhdGVkXCIsXG4gICAgICAgIFwiZGVzdHJveWVkXCIsXG4gICAgICAgIFwiZGlzY29ubmVjdGVkXCIsXG4gICAgICAgIFwicmVjb25uZWN0ZWRcIixcbiAgICAgIF07XG4gICAgICBsaWZlY3ljbGVNZXRob2RzLmZvckVhY2goKG1ldGhvZE5hbWUpID0+IHtcbiAgICAgICAgaWYgKFxuICAgICAgICAgIGNhbGxiYWNrc1ttZXRob2ROYW1lXSAmJlxuICAgICAgICAgIHR5cGVvZiBjYWxsYmFja3NbbWV0aG9kTmFtZV0gPT09IFwiZnVuY3Rpb25cIlxuICAgICAgICApIHtcbiAgICAgICAgICAodGhpcyBhcyBhbnkpW21ldGhvZE5hbWVdID0gY2FsbGJhY2tzW21ldGhvZE5hbWVdO1xuICAgICAgICB9XG4gICAgICB9KTtcbiAgICB9XG4gICAgLy8gSWYgJ2NhbGxiYWNrcycgaXMgbm90IHByb3ZpZGVkLCB0aGlzIGlzIGFuIGluc3RhbmNlIG9mIGEgdXNlci1kZWZpbmVkIGNsYXNzIChlLmcuLCBNeUhvb2spLlxuICAgIC8vIEl0cyBtZXRob2RzIChtb3VudGVkLCB1cGRhdGVkLCBjdXN0b20pIGFyZSBhbHJlYWR5IHBhcnQgb2YgaXRzIHByb3RvdHlwZSBvciBpbnN0YW5jZSxcbiAgICAvLyBhbmQgd2lsbCBjb3JyZWN0bHkgb3ZlcnJpZGUgdGhlIGRlZmF1bHRzIGZyb20gVmlld0hvb2sucHJvdG90eXBlLlxuICB9XG5cbiAgLyoqIEBpbnRlcm5hbCAqL1xuICBfX2F0dGFjaFZpZXcodmlldzogVmlldyB8IG51bGwpIHtcbiAgICBpZiAodmlldykge1xuICAgICAgdGhpcy5fX3ZpZXcgPSAoKSA9PiB2aWV3O1xuICAgICAgdGhpcy5saXZlU29ja2V0ID0gdmlldy5saXZlU29ja2V0O1xuICAgIH0gZWxzZSB7XG4gICAgICB0aGlzLl9fdmlldyA9ICgpID0+IHtcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKFxuICAgICAgICAgIGBob29rIG5vdCB5ZXQgYXR0YWNoZWQgdG8gYSBsaXZlIHZpZXc6ICR7dGhpcy5lbC5vdXRlckhUTUx9YCxcbiAgICAgICAgKTtcbiAgICAgIH07XG4gICAgICB0aGlzLmxpdmVTb2NrZXQgPSBudWxsO1xuICAgIH1cbiAgfVxuXG4gIC8vIERlZmF1bHQgbGlmZWN5Y2xlIG1ldGhvZHNcbiAgbW91bnRlZCgpOiB2b2lkIHt9XG4gIGJlZm9yZVVwZGF0ZSgpOiB2b2lkIHt9XG4gIHVwZGF0ZWQoKTogdm9pZCB7fVxuICBkZXN0cm95ZWQoKTogdm9pZCB7fVxuICBkaXNjb25uZWN0ZWQoKTogdm9pZCB7fVxuICByZWNvbm5lY3RlZCgpOiB2b2lkIHt9XG5cbiAgLy8gSW50ZXJuYWwgbGlmZWN5Y2xlIGNhbGxlcnMgLSBjYWxsZWQgYnkgdGhlIFZpZXdcblxuICAvKiogQGludGVybmFsICovXG4gIF9fbW91bnRlZCgpIHtcbiAgICB0aGlzLm1vdW50ZWQoKTtcbiAgfVxuICAvKiogQGludGVybmFsICovXG4gIF9fdXBkYXRlZCgpIHtcbiAgICB0aGlzLnVwZGF0ZWQoKTtcbiAgfVxuICAvKiogQGludGVybmFsICovXG4gIF9fYmVmb3JlVXBkYXRlKCkge1xuICAgIHRoaXMuYmVmb3JlVXBkYXRlKCk7XG4gIH1cbiAgLyoqIEBpbnRlcm5hbCAqL1xuICBfX2Rlc3Ryb3llZCgpIHtcbiAgICB0aGlzLmRlc3Ryb3llZCgpO1xuICAgIERPTS5kZWxldGVQcml2YXRlKHRoaXMuZWwsIEhPT0tfSUQpOyAvLyBodHRwczovL2dpdGh1Yi5jb20vcGhvZW5peGZyYW1ld29yay9waG9lbml4X2xpdmVfdmlldy9pc3N1ZXMvMzQ5NlxuICB9XG4gIC8qKiBAaW50ZXJuYWwgKi9cbiAgX19yZWNvbm5lY3RlZCgpIHtcbiAgICBpZiAodGhpcy5fX2lzRGlzY29ubmVjdGVkKSB7XG4gICAgICB0aGlzLl9faXNEaXNjb25uZWN0ZWQgPSBmYWxzZTtcbiAgICAgIHRoaXMucmVjb25uZWN0ZWQoKTtcbiAgICB9XG4gIH1cbiAgLyoqIEBpbnRlcm5hbCAqL1xuICBfX2Rpc2Nvbm5lY3RlZCgpIHtcbiAgICB0aGlzLl9faXNEaXNjb25uZWN0ZWQgPSB0cnVlO1xuICAgIHRoaXMuZGlzY29ubmVjdGVkKCk7XG4gIH1cblxuICBqcygpOiBIb29rSlNDb21tYW5kcyB7XG4gICAgcmV0dXJuIHtcbiAgICAgIC4uLmpzQ29tbWFuZHModGhpcy5fX3ZpZXcoKS5saXZlU29ja2V0LCBcImhvb2tcIiksXG4gICAgICBleGVjOiAoZW5jb2RlZEpTOiBzdHJpbmcpID0+IHtcbiAgICAgICAgdGhpcy5fX3ZpZXcoKS5saXZlU29ja2V0LmV4ZWNKUyh0aGlzLmVsLCBlbmNvZGVkSlMsIFwiaG9va1wiKTtcbiAgICAgIH0sXG4gICAgfTtcbiAgfVxuXG4gIHB1c2hFdmVudChldmVudDogc3RyaW5nLCBwYXlsb2FkPzogYW55LCBvblJlcGx5PzogT25SZXBseSkge1xuICAgIGNvbnN0IHByb21pc2UgPSB0aGlzLl9fdmlldygpLnB1c2hIb29rRXZlbnQoXG4gICAgICB0aGlzLmVsLFxuICAgICAgbnVsbCxcbiAgICAgIGV2ZW50LFxuICAgICAgcGF5bG9hZCB8fCB7fSxcbiAgICApO1xuICAgIGlmIChvblJlcGx5ID09PSB1bmRlZmluZWQpIHtcbiAgICAgIHJldHVybiBwcm9taXNlLnRoZW4oKHsgcmVwbHkgfSkgPT4gcmVwbHkpO1xuICAgIH1cbiAgICBwcm9taXNlLnRoZW4oKHsgcmVwbHksIHJlZiB9KSA9PiBvblJlcGx5KHJlcGx5LCByZWYpKS5jYXRjaCgoKSA9PiB7fSk7XG4gICAgcmV0dXJuO1xuICB9XG5cbiAgcHVzaEV2ZW50VG8oXG4gICAgc2VsZWN0b3JPclRhcmdldDogUGh4VGFyZ2V0LFxuICAgIGV2ZW50OiBzdHJpbmcsXG4gICAgcGF5bG9hZD86IG9iamVjdCxcbiAgICBvblJlcGx5PzogT25SZXBseSxcbiAgKSB7XG4gICAgaWYgKG9uUmVwbHkgPT09IHVuZGVmaW5lZCkge1xuICAgICAgY29uc3QgdGFyZ2V0UGFpcjogeyB2aWV3OiBWaWV3OyB0YXJnZXRDdHg6IGFueSB9W10gPSBbXTtcbiAgICAgIHRoaXMuX192aWV3KCkud2l0aGluVGFyZ2V0cyhzZWxlY3Rvck9yVGFyZ2V0LCAodmlldywgdGFyZ2V0Q3R4KSA9PiB7XG4gICAgICAgIHRhcmdldFBhaXIucHVzaCh7IHZpZXcsIHRhcmdldEN0eCB9KTtcbiAgICAgIH0pO1xuICAgICAgY29uc3QgcHJvbWlzZXMgPSB0YXJnZXRQYWlyLm1hcCgoeyB2aWV3LCB0YXJnZXRDdHggfSkgPT4ge1xuICAgICAgICByZXR1cm4gdmlldy5wdXNoSG9va0V2ZW50KHRoaXMuZWwsIHRhcmdldEN0eCwgZXZlbnQsIHBheWxvYWQgfHwge30pO1xuICAgICAgfSk7XG4gICAgICByZXR1cm4gUHJvbWlzZS5hbGxTZXR0bGVkKHByb21pc2VzKTtcbiAgICB9XG4gICAgdGhpcy5fX3ZpZXcoKS53aXRoaW5UYXJnZXRzKHNlbGVjdG9yT3JUYXJnZXQsICh2aWV3LCB0YXJnZXRDdHgpID0+IHtcbiAgICAgIHZpZXdcbiAgICAgICAgLnB1c2hIb29rRXZlbnQodGhpcy5lbCwgdGFyZ2V0Q3R4LCBldmVudCwgcGF5bG9hZCB8fCB7fSlcbiAgICAgICAgLnRoZW4oKHsgcmVwbHksIHJlZiB9KSA9PiBvblJlcGx5KHJlcGx5LCByZWYpKVxuICAgICAgICAuY2F0Y2goKCkgPT4ge30pO1xuICAgIH0pO1xuICAgIHJldHVybjtcbiAgfVxuXG4gIGhhbmRsZUV2ZW50KGV2ZW50OiBzdHJpbmcsIGNhbGxiYWNrOiAocGF5bG9hZDogYW55KSA9PiBhbnkpOiBDYWxsYmFja1JlZiB7XG4gICAgY29uc3QgY2FsbGJhY2tSZWY6IENhbGxiYWNrUmVmID0ge1xuICAgICAgZXZlbnQsXG4gICAgICBjYWxsYmFjazogKGN1c3RvbUV2ZW50OiBDdXN0b21FdmVudCkgPT4gY2FsbGJhY2soY3VzdG9tRXZlbnQuZGV0YWlsKSxcbiAgICB9O1xuICAgIHdpbmRvdy5hZGRFdmVudExpc3RlbmVyKFxuICAgICAgYHBoeDoke2V2ZW50fWAsXG4gICAgICBjYWxsYmFja1JlZi5jYWxsYmFjayBhcyBFdmVudExpc3RlbmVyLFxuICAgICk7XG4gICAgdGhpcy5fX2xpc3RlbmVycy5hZGQoY2FsbGJhY2tSZWYpO1xuICAgIHJldHVybiBjYWxsYmFja1JlZjtcbiAgfVxuXG4gIHJlbW92ZUhhbmRsZUV2ZW50KHJlZjogQ2FsbGJhY2tSZWYpOiB2b2lkIHtcbiAgICB3aW5kb3cucmVtb3ZlRXZlbnRMaXN0ZW5lcihcbiAgICAgIGBwaHg6JHtyZWYuZXZlbnR9YCxcbiAgICAgIHJlZi5jYWxsYmFjayBhcyBFdmVudExpc3RlbmVyLFxuICAgICk7XG4gICAgdGhpcy5fX2xpc3RlbmVycy5kZWxldGUocmVmKTtcbiAgfVxuXG4gIHVwbG9hZChuYW1lOiBzdHJpbmcsIGZpbGVzOiBGaWxlTGlzdCk6IGFueSB7XG4gICAgcmV0dXJuIHRoaXMuX192aWV3KCkuZGlzcGF0Y2hVcGxvYWRzKG51bGwsIG5hbWUsIGZpbGVzKTtcbiAgfVxuXG4gIHVwbG9hZFRvKHNlbGVjdG9yT3JUYXJnZXQ6IFBoeFRhcmdldCwgbmFtZTogc3RyaW5nLCBmaWxlczogRmlsZUxpc3QpOiBhbnkge1xuICAgIHJldHVybiB0aGlzLl9fdmlldygpLndpdGhpblRhcmdldHMoc2VsZWN0b3JPclRhcmdldCwgKHZpZXcsIHRhcmdldEN0eCkgPT4ge1xuICAgICAgdmlldy5kaXNwYXRjaFVwbG9hZHModGFyZ2V0Q3R4LCBuYW1lLCBmaWxlcyk7XG4gICAgfSk7XG4gIH1cblxuICAvKiogQGludGVybmFsICovXG4gIF9fY2xlYW51cF9fKCkge1xuICAgIHRoaXMuX19saXN0ZW5lcnMuZm9yRWFjaCgoY2FsbGJhY2tSZWYpID0+XG4gICAgICB0aGlzLnJlbW92ZUhhbmRsZUV2ZW50KGNhbGxiYWNrUmVmKSxcbiAgICApO1xuICB9XG59XG5cbmV4cG9ydCB0eXBlIEhvb2tzT3B0aW9ucyA9IFJlY29yZDxzdHJpbmcsIHR5cGVvZiBWaWV3SG9vayB8IEhvb2s+O1xuXG5leHBvcnQgZGVmYXVsdCBWaWV3SG9vaztcbiIsICJpbXBvcnQge1xuICBCRUZPUkVfVU5MT0FEX0xPQURFUl9USU1FT1VULFxuICBDSEVDS0FCTEVfSU5QVVRTLFxuICBDT05TRUNVVElWRV9SRUxPQURTLFxuICBQSFhfQVVUT19SRUNPVkVSLFxuICBQSFhfQ09NUE9ORU5ULFxuICBQSFhfVklFV19SRUYsXG4gIFBIWF9DT05ORUNURURfQ0xBU1MsXG4gIFBIWF9ESVNBQkxFX1dJVEgsXG4gIFBIWF9ESVNBQkxFX1dJVEhfUkVTVE9SRSxcbiAgUEhYX0RJU0FCTEVELFxuICBQSFhfTE9BRElOR19DTEFTUyxcbiAgUEhYX0VSUk9SX0NMQVNTLFxuICBQSFhfQ0xJRU5UX0VSUk9SX0NMQVNTLFxuICBQSFhfU0VSVkVSX0VSUk9SX0NMQVNTLFxuICBQSFhfSEFTX0ZPQ1VTRUQsXG4gIFBIWF9IQVNfU1VCTUlUVEVELFxuICBQSFhfSE9PSyxcbiAgUEhYX1BBUkVOVF9JRCxcbiAgUEhYX1BST0dSRVNTLFxuICBQSFhfUkVBRE9OTFksXG4gIFBIWF9SRUZfTE9BRElORyxcbiAgUEhYX1JFRl9TUkMsXG4gIFBIWF9SRUZfTE9DSyxcbiAgUEhYX1JPT1RfSUQsXG4gIFBIWF9TRVNTSU9OLFxuICBQSFhfU1RBVElDLFxuICBQSFhfU1RJQ0tZLFxuICBQSFhfVFJBQ0tfU1RBVElDLFxuICBQSFhfVFJBQ0tfVVBMT0FEUyxcbiAgUEhYX1VQREFURSxcbiAgUEhYX1VQTE9BRF9SRUYsXG4gIFBIWF9WSUVXX1NFTEVDVE9SLFxuICBQSFhfTUFJTixcbiAgUEhYX01PVU5URUQsXG4gIFBVU0hfVElNRU9VVCxcbiAgUEhYX1ZJRVdQT1JUX1RPUCxcbiAgUEhYX1ZJRVdQT1JUX0JPVFRPTSxcbiAgTUFYX0NISUxEX0pPSU5fQVRURU1QVFMsXG4gIFBIWF9MVl9QSUQsXG4gIFBIWF9QT1JUQUwsXG4gIFBIWF9URUxFUE9SVEVEX1JFRixcbn0gZnJvbSBcIi4vY29uc3RhbnRzXCI7XG5cbmltcG9ydCB7XG4gIGNsb25lLFxuICBjbG9zZXN0UGh4QmluZGluZyxcbiAgaXNFbXB0eSxcbiAgaXNFcXVhbE9iaixcbiAgbG9nRXJyb3IsXG4gIG1heWJlLFxuICBpc0NpZCxcbn0gZnJvbSBcIi4vdXRpbHNcIjtcblxuaW1wb3J0IEJyb3dzZXIgZnJvbSBcIi4vYnJvd3NlclwiO1xuaW1wb3J0IERPTSBmcm9tIFwiLi9kb21cIjtcbmltcG9ydCBFbGVtZW50UmVmIGZyb20gXCIuL2VsZW1lbnRfcmVmXCI7XG5pbXBvcnQgRE9NUGF0Y2ggZnJvbSBcIi4vZG9tX3BhdGNoXCI7XG5pbXBvcnQgTGl2ZVVwbG9hZGVyIGZyb20gXCIuL2xpdmVfdXBsb2FkZXJcIjtcbmltcG9ydCBSZW5kZXJlZCBmcm9tIFwiLi9yZW5kZXJlZFwiO1xuaW1wb3J0IHsgVmlld0hvb2sgfSBmcm9tIFwiLi92aWV3X2hvb2tcIjtcbmltcG9ydCBKUyBmcm9tIFwiLi9qc1wiO1xuXG5pbXBvcnQgbW9ycGhkb20gZnJvbSBcIm1vcnBoZG9tXCI7XG5cbmV4cG9ydCBjb25zdCBwcmVwZW5kRm9ybURhdGFLZXkgPSAoa2V5LCBwcmVmaXgpID0+IHtcbiAgY29uc3QgaXNBcnJheSA9IGtleS5lbmRzV2l0aChcIltdXCIpO1xuICAvLyBSZW1vdmUgdGhlIFwiW11cIiBpZiBpdCdzIGFuIGFycmF5XG4gIGxldCBiYXNlS2V5ID0gaXNBcnJheSA/IGtleS5zbGljZSgwLCAtMikgOiBrZXk7XG4gIC8vIFJlcGxhY2UgbGFzdCBvY2N1cnJlbmNlIG9mIGtleSBiZWZvcmUgYSBjbG9zaW5nIGJyYWNrZXQgb3IgdGhlIGVuZCB3aXRoIGtleSBwbHVzIHN1ZmZpeFxuICBiYXNlS2V5ID0gYmFzZUtleS5yZXBsYWNlKC8oW15cXFtcXF1dKykoXFxdPyQpLywgYCR7cHJlZml4fSQxJDJgKTtcbiAgLy8gQWRkIGJhY2sgdGhlIFwiW11cIiBpZiBpdCB3YXMgYW4gYXJyYXlcbiAgaWYgKGlzQXJyYXkpIHtcbiAgICBiYXNlS2V5ICs9IFwiW11cIjtcbiAgfVxuICByZXR1cm4gYmFzZUtleTtcbn07XG5cbmNvbnN0IHNlcmlhbGl6ZUZvcm0gPSAoZm9ybSwgb3B0cywgb25seU5hbWVzID0gW10pID0+IHtcbiAgY29uc3QgeyBzdWJtaXR0ZXIgfSA9IG9wdHM7XG5cbiAgLy8gV2UgbXVzdCBpbmplY3QgdGhlIHN1Ym1pdHRlciBpbiB0aGUgb3JkZXIgdGhhdCBpdCBleGlzdHMgaW4gdGhlIERPTVxuICAvLyByZWxhdGl2ZSB0byBvdGhlciBpbnB1dHMuIEZvciBleGFtcGxlLCBmb3IgY2hlY2tib3ggZ3JvdXBzLCB0aGUgb3JkZXIgbXVzdCBiZSBtYWludGFpbmVkLlxuICBsZXQgaW5qZWN0ZWRFbGVtZW50O1xuICBpZiAoc3VibWl0dGVyICYmIHN1Ym1pdHRlci5uYW1lKSB7XG4gICAgY29uc3QgaW5wdXQgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KFwiaW5wdXRcIik7XG4gICAgaW5wdXQudHlwZSA9IFwiaGlkZGVuXCI7XG4gICAgLy8gc2V0IHRoZSBmb3JtIGF0dHJpYnV0ZSBpZiB0aGUgc3VibWl0dGVyIGhhcyBvbmU7XG4gICAgLy8gdGhpcyBjYW4gaGFwcGVuIGlmIHRoZSBlbGVtZW50IGlzIG91dHNpZGUgdGhlIGFjdHVhbCBmb3JtIGVsZW1lbnRcbiAgICBjb25zdCBmb3JtSWQgPSBzdWJtaXR0ZXIuZ2V0QXR0cmlidXRlKFwiZm9ybVwiKTtcbiAgICBpZiAoZm9ybUlkKSB7XG4gICAgICBpbnB1dC5zZXRBdHRyaWJ1dGUoXCJmb3JtXCIsIGZvcm1JZCk7XG4gICAgfVxuICAgIGlucHV0Lm5hbWUgPSBzdWJtaXR0ZXIubmFtZTtcbiAgICBpbnB1dC52YWx1ZSA9IHN1Ym1pdHRlci52YWx1ZTtcbiAgICBzdWJtaXR0ZXIucGFyZW50RWxlbWVudC5pbnNlcnRCZWZvcmUoaW5wdXQsIHN1Ym1pdHRlcik7XG4gICAgaW5qZWN0ZWRFbGVtZW50ID0gaW5wdXQ7XG4gIH1cblxuICBjb25zdCBmb3JtRGF0YSA9IG5ldyBGb3JtRGF0YShmb3JtKTtcbiAgY29uc3QgdG9SZW1vdmUgPSBbXTtcblxuICBmb3JtRGF0YS5mb3JFYWNoKCh2YWwsIGtleSwgX2luZGV4KSA9PiB7XG4gICAgaWYgKHZhbCBpbnN0YW5jZW9mIEZpbGUpIHtcbiAgICAgIHRvUmVtb3ZlLnB1c2goa2V5KTtcbiAgICB9XG4gIH0pO1xuXG4gIC8vIENsZWFudXAgYWZ0ZXIgYnVpbGRpbmcgZmlsZURhdGFcbiAgdG9SZW1vdmUuZm9yRWFjaCgoa2V5KSA9PiBmb3JtRGF0YS5kZWxldGUoa2V5KSk7XG5cbiAgY29uc3QgcGFyYW1zID0gbmV3IFVSTFNlYXJjaFBhcmFtcygpO1xuXG4gIGNvbnN0IHsgaW5wdXRzVW51c2VkLCBvbmx5SGlkZGVuSW5wdXRzIH0gPSBBcnJheS5mcm9tKGZvcm0uZWxlbWVudHMpLnJlZHVjZShcbiAgICAoYWNjLCBpbnB1dCkgPT4ge1xuICAgICAgY29uc3QgeyBpbnB1dHNVbnVzZWQsIG9ubHlIaWRkZW5JbnB1dHMgfSA9IGFjYztcbiAgICAgIGNvbnN0IGtleSA9IGlucHV0Lm5hbWU7XG4gICAgICBpZiAoIWtleSkge1xuICAgICAgICByZXR1cm4gYWNjO1xuICAgICAgfVxuXG4gICAgICBpZiAoaW5wdXRzVW51c2VkW2tleV0gPT09IHVuZGVmaW5lZCkge1xuICAgICAgICBpbnB1dHNVbnVzZWRba2V5XSA9IHRydWU7XG4gICAgICB9XG4gICAgICBpZiAob25seUhpZGRlbklucHV0c1trZXldID09PSB1bmRlZmluZWQpIHtcbiAgICAgICAgb25seUhpZGRlbklucHV0c1trZXldID0gdHJ1ZTtcbiAgICAgIH1cblxuICAgICAgY29uc3QgaXNVc2VkID1cbiAgICAgICAgRE9NLnByaXZhdGUoaW5wdXQsIFBIWF9IQVNfRk9DVVNFRCkgfHxcbiAgICAgICAgRE9NLnByaXZhdGUoaW5wdXQsIFBIWF9IQVNfU1VCTUlUVEVEKTtcbiAgICAgIGNvbnN0IGlzSGlkZGVuID0gaW5wdXQudHlwZSA9PT0gXCJoaWRkZW5cIjtcbiAgICAgIGlucHV0c1VudXNlZFtrZXldID0gaW5wdXRzVW51c2VkW2tleV0gJiYgIWlzVXNlZDtcbiAgICAgIG9ubHlIaWRkZW5JbnB1dHNba2V5XSA9IG9ubHlIaWRkZW5JbnB1dHNba2V5XSAmJiBpc0hpZGRlbjtcblxuICAgICAgcmV0dXJuIGFjYztcbiAgICB9LFxuICAgIHsgaW5wdXRzVW51c2VkOiB7fSwgb25seUhpZGRlbklucHV0czoge30gfSxcbiAgKTtcblxuICBmb3IgKGNvbnN0IFtrZXksIHZhbF0gb2YgZm9ybURhdGEuZW50cmllcygpKSB7XG4gICAgaWYgKG9ubHlOYW1lcy5sZW5ndGggPT09IDAgfHwgb25seU5hbWVzLmluZGV4T2Yoa2V5KSA+PSAwKSB7XG4gICAgICBjb25zdCBpc1VudXNlZCA9IGlucHV0c1VudXNlZFtrZXldO1xuICAgICAgY29uc3QgaGlkZGVuID0gb25seUhpZGRlbklucHV0c1trZXldO1xuICAgICAgaWYgKGlzVW51c2VkICYmICEoc3VibWl0dGVyICYmIHN1Ym1pdHRlci5uYW1lID09IGtleSkgJiYgIWhpZGRlbikge1xuICAgICAgICBwYXJhbXMuYXBwZW5kKHByZXBlbmRGb3JtRGF0YUtleShrZXksIFwiX3VudXNlZF9cIiksIFwiXCIpO1xuICAgICAgfVxuICAgICAgaWYgKHR5cGVvZiB2YWwgPT09IFwic3RyaW5nXCIpIHtcbiAgICAgICAgcGFyYW1zLmFwcGVuZChrZXksIHZhbCk7XG4gICAgICB9XG4gICAgfVxuICB9XG5cbiAgLy8gcmVtb3ZlIHRoZSBpbmplY3RlZCBlbGVtZW50IGFnYWluXG4gIC8vIChpdCB3b3VsZCBiZSByZW1vdmVkIGJ5IHRoZSBuZXh0IGRvbSBwYXRjaCBhbnl3YXksIGJ1dCB0aGlzIGlzIGNsZWFuZXIpXG4gIGlmIChzdWJtaXR0ZXIgJiYgaW5qZWN0ZWRFbGVtZW50KSB7XG4gICAgc3VibWl0dGVyLnBhcmVudEVsZW1lbnQucmVtb3ZlQ2hpbGQoaW5qZWN0ZWRFbGVtZW50KTtcbiAgfVxuXG4gIHJldHVybiBwYXJhbXMudG9TdHJpbmcoKTtcbn07XG5cbmV4cG9ydCBkZWZhdWx0IGNsYXNzIFZpZXcge1xuICBzdGF0aWMgY2xvc2VzdFZpZXcoZWwpIHtcbiAgICBjb25zdCBsaXZlVmlld0VsID0gZWwuY2xvc2VzdChQSFhfVklFV19TRUxFQ1RPUik7XG4gICAgcmV0dXJuIGxpdmVWaWV3RWwgPyBET00ucHJpdmF0ZShsaXZlVmlld0VsLCBcInZpZXdcIikgOiBudWxsO1xuICB9XG5cbiAgY29uc3RydWN0b3IoZWwsIGxpdmVTb2NrZXQsIHBhcmVudFZpZXcsIGZsYXNoLCBsaXZlUmVmZXJlcikge1xuICAgIHRoaXMuaXNEZWFkID0gZmFsc2U7XG4gICAgdGhpcy5saXZlU29ja2V0ID0gbGl2ZVNvY2tldDtcbiAgICB0aGlzLmZsYXNoID0gZmxhc2g7XG4gICAgdGhpcy5wYXJlbnQgPSBwYXJlbnRWaWV3O1xuICAgIHRoaXMucm9vdCA9IHBhcmVudFZpZXcgPyBwYXJlbnRWaWV3LnJvb3QgOiB0aGlzO1xuICAgIHRoaXMuZWwgPSBlbDtcbiAgICAvLyBzZWUgaHR0cHM6Ly9naXRodWIuY29tL3Bob2VuaXhmcmFtZXdvcmsvcGhvZW5peF9saXZlX3ZpZXcvcHVsbC8zNzIxXG4gICAgLy8gY2hlY2sgaWYgdGhlIGVsZW1lbnQgaXMgYWxyZWFkeSBib3VuZCB0byBhIHZpZXdcbiAgICBjb25zdCBib3VuZFZpZXcgPSBET00ucHJpdmF0ZSh0aGlzLmVsLCBcInZpZXdcIik7XG4gICAgaWYgKGJvdW5kVmlldyAhPT0gdW5kZWZpbmVkICYmIGJvdW5kVmlldy5pc0RlYWQgIT09IHRydWUpIHtcbiAgICAgIGxvZ0Vycm9yKFxuICAgICAgICBgVGhlIERPTSBlbGVtZW50IGZvciB0aGlzIHZpZXcgaGFzIGFscmVhZHkgYmVlbiBib3VuZCB0byBhIHZpZXcuXG5cbiAgICAgICAgQW4gZWxlbWVudCBjYW4gb25seSBldmVyIGJlIGFzc29jaWF0ZWQgd2l0aCBhIHNpbmdsZSB2aWV3IVxuICAgICAgICBQbGVhc2UgZW5zdXJlIHRoYXQgeW91IGFyZSBub3QgdHJ5aW5nIHRvIGluaXRpYWxpemUgbXVsdGlwbGUgTGl2ZVNvY2tldHMgb24gdGhlIHNhbWUgcGFnZS5cbiAgICAgICAgVGhpcyBjb3VsZCBoYXBwZW4gaWYgeW91J3JlIGFjY2lkZW50YWxseSB0cnlpbmcgdG8gcmVuZGVyIHlvdXIgcm9vdCBsYXlvdXQgbW9yZSB0aGFuIG9uY2UuXG4gICAgICAgIEVuc3VyZSB0aGF0IHRoZSB0ZW1wbGF0ZSBzZXQgb24gdGhlIExpdmVWaWV3IGlzIGRpZmZlcmVudCB0aGFuIHRoZSByb290IGxheW91dC5cbiAgICAgIGAsXG4gICAgICAgIHsgdmlldzogYm91bmRWaWV3IH0sXG4gICAgICApO1xuICAgICAgdGhyb3cgbmV3IEVycm9yKFwiQ2Fubm90IGJpbmQgbXVsdGlwbGUgdmlld3MgdG8gdGhlIHNhbWUgRE9NIGVsZW1lbnQuXCIpO1xuICAgIH1cbiAgICAvLyBiaW5kIHRoZSB2aWV3IHRvIHRoZSBlbGVtZW50XG4gICAgRE9NLnB1dFByaXZhdGUodGhpcy5lbCwgXCJ2aWV3XCIsIHRoaXMpO1xuICAgIHRoaXMuaWQgPSB0aGlzLmVsLmlkO1xuICAgIHRoaXMucmVmID0gMDtcbiAgICB0aGlzLmxhc3RBY2tSZWYgPSBudWxsO1xuICAgIHRoaXMuY2hpbGRKb2lucyA9IDA7XG4gICAgLyoqXG4gICAgICogQHR5cGUge1JldHVyblR5cGU8dHlwZW9mIHNldFRpbWVvdXQ+IHwgbnVsbH1cbiAgICAgKi9cbiAgICB0aGlzLmxvYWRlclRpbWVyID0gbnVsbDtcbiAgICAvKipcbiAgICAgKiBAdHlwZSB7UmV0dXJuVHlwZTx0eXBlb2Ygc2V0VGltZW91dD4gfCBudWxsfVxuICAgICAqL1xuICAgIHRoaXMuZGlzY29ubmVjdGVkVGltZXIgPSBudWxsO1xuICAgIHRoaXMucGVuZGluZ0RpZmZzID0gW107XG4gICAgdGhpcy5wZW5kaW5nRm9ybXMgPSBuZXcgU2V0KCk7XG4gICAgdGhpcy5yZWRpcmVjdCA9IGZhbHNlO1xuICAgIHRoaXMuaHJlZiA9IG51bGw7XG4gICAgdGhpcy5qb2luQ291bnQgPSB0aGlzLnBhcmVudCA/IHRoaXMucGFyZW50LmpvaW5Db3VudCAtIDEgOiAwO1xuICAgIHRoaXMuam9pbkF0dGVtcHRzID0gMDtcbiAgICB0aGlzLmpvaW5QZW5kaW5nID0gdHJ1ZTtcbiAgICB0aGlzLmRlc3Ryb3llZCA9IGZhbHNlO1xuICAgIHRoaXMuam9pbkNhbGxiYWNrID0gZnVuY3Rpb24gKG9uRG9uZSkge1xuICAgICAgb25Eb25lICYmIG9uRG9uZSgpO1xuICAgIH07XG4gICAgdGhpcy5zdG9wQ2FsbGJhY2sgPSBmdW5jdGlvbiAoKSB7fTtcbiAgICAvLyB1c3VhbGx5LCBvbmx5IHRoZSByb290IExpdmVWaWV3IHN0b3JlcyBwZW5kaW5nXG4gICAgLy8gam9pbiBvcGVyYXRpb25zIGZvciBhbGwgY2hpbGRyZW4gKGFuZCBpdHNlbGYpLFxuICAgIC8vIGJ1dCBpbiBjYXNlIG9mIHJlam9pbnMgKGpvaW5Db3VudCA+IDEpIGVhY2ggY2hpbGRcbiAgICAvLyBzdG9yZXMgaXRzIG93biBldmVudHMgaW5zdGVhZFxuICAgIHRoaXMucGVuZGluZ0pvaW5PcHMgPSBbXTtcbiAgICB0aGlzLnZpZXdIb29rcyA9IHt9O1xuICAgIHRoaXMuZm9ybVN1Ym1pdHMgPSBbXTtcbiAgICB0aGlzLmNoaWxkcmVuID0gdGhpcy5wYXJlbnQgPyBudWxsIDoge307XG4gICAgdGhpcy5yb290LmNoaWxkcmVuW3RoaXMuaWRdID0ge307XG4gICAgdGhpcy5mb3Jtc0ZvclJlY292ZXJ5ID0ge307XG4gICAgdGhpcy5jaGFubmVsID0gdGhpcy5saXZlU29ja2V0LmNoYW5uZWwoYGx2OiR7dGhpcy5pZH1gLCAoKSA9PiB7XG4gICAgICBjb25zdCB1cmwgPSB0aGlzLmhyZWYgJiYgdGhpcy5leHBhbmRVUkwodGhpcy5ocmVmKTtcbiAgICAgIHJldHVybiB7XG4gICAgICAgIHJlZGlyZWN0OiB0aGlzLnJlZGlyZWN0ID8gdXJsIDogdW5kZWZpbmVkLFxuICAgICAgICB1cmw6IHRoaXMucmVkaXJlY3QgPyB1bmRlZmluZWQgOiB1cmwgfHwgdW5kZWZpbmVkLFxuICAgICAgICBwYXJhbXM6IHRoaXMuY29ubmVjdFBhcmFtcyhsaXZlUmVmZXJlciksXG4gICAgICAgIHNlc3Npb246IHRoaXMuZ2V0U2Vzc2lvbigpLFxuICAgICAgICBzdGF0aWM6IHRoaXMuZ2V0U3RhdGljKCksXG4gICAgICAgIGZsYXNoOiB0aGlzLmZsYXNoLFxuICAgICAgICBzdGlja3k6IHRoaXMuZWwuaGFzQXR0cmlidXRlKFBIWF9TVElDS1kpLFxuICAgICAgfTtcbiAgICB9KTtcbiAgICB0aGlzLnBvcnRhbEVsZW1lbnRJZHMgPSBuZXcgU2V0KCk7XG4gIH1cblxuICBzZXRIcmVmKGhyZWYpIHtcbiAgICB0aGlzLmhyZWYgPSBocmVmO1xuICB9XG5cbiAgc2V0UmVkaXJlY3QoaHJlZikge1xuICAgIHRoaXMucmVkaXJlY3QgPSB0cnVlO1xuICAgIHRoaXMuaHJlZiA9IGhyZWY7XG4gIH1cblxuICBpc01haW4oKSB7XG4gICAgcmV0dXJuIHRoaXMuZWwuaGFzQXR0cmlidXRlKFBIWF9NQUlOKTtcbiAgfVxuXG4gIGNvbm5lY3RQYXJhbXMobGl2ZVJlZmVyZXIpIHtcbiAgICBjb25zdCBwYXJhbXMgPSB0aGlzLmxpdmVTb2NrZXQucGFyYW1zKHRoaXMuZWwpO1xuICAgIGNvbnN0IG1hbmlmZXN0ID0gRE9NLmFsbChkb2N1bWVudCwgYFske3RoaXMuYmluZGluZyhQSFhfVFJBQ0tfU1RBVElDKX1dYClcbiAgICAgIC5tYXAoKG5vZGUpID0+IG5vZGUuc3JjIHx8IG5vZGUuaHJlZilcbiAgICAgIC5maWx0ZXIoKHVybCkgPT4gdHlwZW9mIHVybCA9PT0gXCJzdHJpbmdcIik7XG5cbiAgICBpZiAobWFuaWZlc3QubGVuZ3RoID4gMCkge1xuICAgICAgcGFyYW1zW1wiX3RyYWNrX3N0YXRpY1wiXSA9IG1hbmlmZXN0O1xuICAgIH1cbiAgICBwYXJhbXNbXCJfbW91bnRzXCJdID0gdGhpcy5qb2luQ291bnQ7XG4gICAgcGFyYW1zW1wiX21vdW50X2F0dGVtcHRzXCJdID0gdGhpcy5qb2luQXR0ZW1wdHM7XG4gICAgcGFyYW1zW1wiX2xpdmVfcmVmZXJlclwiXSA9IGxpdmVSZWZlcmVyO1xuICAgIHRoaXMuam9pbkF0dGVtcHRzKys7XG5cbiAgICByZXR1cm4gcGFyYW1zO1xuICB9XG5cbiAgaXNDb25uZWN0ZWQoKSB7XG4gICAgcmV0dXJuIHRoaXMuY2hhbm5lbC5jYW5QdXNoKCk7XG4gIH1cblxuICBnZXRTZXNzaW9uKCkge1xuICAgIHJldHVybiB0aGlzLmVsLmdldEF0dHJpYnV0ZShQSFhfU0VTU0lPTik7XG4gIH1cblxuICBnZXRTdGF0aWMoKSB7XG4gICAgY29uc3QgdmFsID0gdGhpcy5lbC5nZXRBdHRyaWJ1dGUoUEhYX1NUQVRJQyk7XG4gICAgcmV0dXJuIHZhbCA9PT0gXCJcIiA/IG51bGwgOiB2YWw7XG4gIH1cblxuICBkZXN0cm95KGNhbGxiYWNrID0gZnVuY3Rpb24gKCkge30pIHtcbiAgICB0aGlzLmRlc3Ryb3lBbGxDaGlsZHJlbigpO1xuICAgIHRoaXMuZGVzdHJveVBvcnRhbEVsZW1lbnRzKCk7XG4gICAgdGhpcy5kZXN0cm95ZWQgPSB0cnVlO1xuICAgIERPTS5kZWxldGVQcml2YXRlKHRoaXMuZWwsIFwidmlld1wiKTtcbiAgICBkZWxldGUgdGhpcy5yb290LmNoaWxkcmVuW3RoaXMuaWRdO1xuICAgIGlmICh0aGlzLnBhcmVudCkge1xuICAgICAgZGVsZXRlIHRoaXMucm9vdC5jaGlsZHJlblt0aGlzLnBhcmVudC5pZF1bdGhpcy5pZF07XG4gICAgfVxuICAgIGNsZWFyVGltZW91dCh0aGlzLmxvYWRlclRpbWVyKTtcbiAgICBjb25zdCBvbkZpbmlzaGVkID0gKCkgPT4ge1xuICAgICAgY2FsbGJhY2soKTtcbiAgICAgIGZvciAoY29uc3QgaWQgaW4gdGhpcy52aWV3SG9va3MpIHtcbiAgICAgICAgdGhpcy5kZXN0cm95SG9vayh0aGlzLnZpZXdIb29rc1tpZF0pO1xuICAgICAgfVxuICAgIH07XG5cbiAgICBET00ubWFya1BoeENoaWxkRGVzdHJveWVkKHRoaXMuZWwpO1xuXG4gICAgdGhpcy5sb2coXCJkZXN0cm95ZWRcIiwgKCkgPT4gW1widGhlIGNoaWxkIGhhcyBiZWVuIHJlbW92ZWQgZnJvbSB0aGUgcGFyZW50XCJdKTtcbiAgICB0aGlzLmNoYW5uZWxcbiAgICAgIC5sZWF2ZSgpXG4gICAgICAucmVjZWl2ZShcIm9rXCIsIG9uRmluaXNoZWQpXG4gICAgICAucmVjZWl2ZShcImVycm9yXCIsIG9uRmluaXNoZWQpXG4gICAgICAucmVjZWl2ZShcInRpbWVvdXRcIiwgb25GaW5pc2hlZCk7XG4gIH1cblxuICBzZXRDb250YWluZXJDbGFzc2VzKC4uLmNsYXNzZXMpIHtcbiAgICB0aGlzLmVsLmNsYXNzTGlzdC5yZW1vdmUoXG4gICAgICBQSFhfQ09OTkVDVEVEX0NMQVNTLFxuICAgICAgUEhYX0xPQURJTkdfQ0xBU1MsXG4gICAgICBQSFhfRVJST1JfQ0xBU1MsXG4gICAgICBQSFhfQ0xJRU5UX0VSUk9SX0NMQVNTLFxuICAgICAgUEhYX1NFUlZFUl9FUlJPUl9DTEFTUyxcbiAgICApO1xuICAgIHRoaXMuZWwuY2xhc3NMaXN0LmFkZCguLi5jbGFzc2VzKTtcbiAgfVxuXG4gIHNob3dMb2FkZXIodGltZW91dCkge1xuICAgIGNsZWFyVGltZW91dCh0aGlzLmxvYWRlclRpbWVyKTtcbiAgICBpZiAodGltZW91dCkge1xuICAgICAgdGhpcy5sb2FkZXJUaW1lciA9IHNldFRpbWVvdXQoKCkgPT4gdGhpcy5zaG93TG9hZGVyKCksIHRpbWVvdXQpO1xuICAgIH0gZWxzZSB7XG4gICAgICBmb3IgKGNvbnN0IGlkIGluIHRoaXMudmlld0hvb2tzKSB7XG4gICAgICAgIHRoaXMudmlld0hvb2tzW2lkXS5fX2Rpc2Nvbm5lY3RlZCgpO1xuICAgICAgfVxuICAgICAgdGhpcy5zZXRDb250YWluZXJDbGFzc2VzKFBIWF9MT0FESU5HX0NMQVNTKTtcbiAgICB9XG4gIH1cblxuICBleGVjQWxsKGJpbmRpbmcpIHtcbiAgICBET00uYWxsKHRoaXMuZWwsIGBbJHtiaW5kaW5nfV1gLCAoZWwpID0+XG4gICAgICB0aGlzLmxpdmVTb2NrZXQuZXhlY0pTKGVsLCBlbC5nZXRBdHRyaWJ1dGUoYmluZGluZykpLFxuICAgICk7XG4gIH1cblxuICBoaWRlTG9hZGVyKCkge1xuICAgIGNsZWFyVGltZW91dCh0aGlzLmxvYWRlclRpbWVyKTtcbiAgICBjbGVhclRpbWVvdXQodGhpcy5kaXNjb25uZWN0ZWRUaW1lcik7XG4gICAgdGhpcy5zZXRDb250YWluZXJDbGFzc2VzKFBIWF9DT05ORUNURURfQ0xBU1MpO1xuICAgIHRoaXMuZXhlY0FsbCh0aGlzLmJpbmRpbmcoXCJjb25uZWN0ZWRcIikpO1xuICB9XG5cbiAgdHJpZ2dlclJlY29ubmVjdGVkKCkge1xuICAgIGZvciAoY29uc3QgaWQgaW4gdGhpcy52aWV3SG9va3MpIHtcbiAgICAgIHRoaXMudmlld0hvb2tzW2lkXS5fX3JlY29ubmVjdGVkKCk7XG4gICAgfVxuICB9XG5cbiAgbG9nKGtpbmQsIG1zZ0NhbGxiYWNrKSB7XG4gICAgdGhpcy5saXZlU29ja2V0LmxvZyh0aGlzLCBraW5kLCBtc2dDYWxsYmFjayk7XG4gIH1cblxuICB0cmFuc2l0aW9uKHRpbWUsIG9uU3RhcnQsIG9uRG9uZSA9IGZ1bmN0aW9uICgpIHt9KSB7XG4gICAgdGhpcy5saXZlU29ja2V0LnRyYW5zaXRpb24odGltZSwgb25TdGFydCwgb25Eb25lKTtcbiAgfVxuXG4gIC8vIGNhbGxzIHRoZSBjYWxsYmFjayB3aXRoIHRoZSB2aWV3IGFuZCB0YXJnZXQgZWxlbWVudCBmb3IgdGhlIGdpdmVuIHBoeFRhcmdldFxuICAvLyB0YXJnZXRzIGNhbiBiZTpcbiAgLy8gICogYW4gZWxlbWVudCBpdHNlbGYsIHRoZW4gaXQgaXMgc2ltcGx5IHBhc3NlZCB0byBsaXZlU29ja2V0Lm93bmVyO1xuICAvLyAgKiBhIENJRCAoQ29tcG9uZW50IElEKSwgdGhlbiB3ZSBmaXJzdCBzZWFyY2ggdGhlIGNvbXBvbmVudCdzIGVsZW1lbnQgaW4gdGhlIERPTVxuICAvLyAgKiBhIHNlbGVjdG9yLCB0aGVuIHdlIHNlYXJjaCB0aGUgc2VsZWN0b3IgaW4gdGhlIERPTSBhbmQgY2FsbCB0aGUgY2FsbGJhY2tcbiAgLy8gICAgZm9yIGVhY2ggZWxlbWVudCBmb3VuZCB3aXRoIHRoZSBjb3JyZXNwb25kaW5nIG93bmVyIHZpZXdcbiAgd2l0aGluVGFyZ2V0cyhwaHhUYXJnZXQsIGNhbGxiYWNrLCBkb20gPSBkb2N1bWVudCkge1xuICAgIC8vIGluIHRoZSBmb3JtIHJlY292ZXJ5IGNhc2Ugd2Ugc2VhcmNoIGluIGEgdGVtcGxhdGUgZnJhZ21lbnQgaW5zdGVhZCBvZlxuICAgIC8vIHRoZSByZWFsIGRvbSwgdGhlcmVmb3JlIHdlIG9wdGlvbmFsbHkgcGFzcyBkb20gYW5kIHZpZXdFbFxuXG4gICAgaWYgKHBoeFRhcmdldCBpbnN0YW5jZW9mIEhUTUxFbGVtZW50IHx8IHBoeFRhcmdldCBpbnN0YW5jZW9mIFNWR0VsZW1lbnQpIHtcbiAgICAgIHJldHVybiB0aGlzLmxpdmVTb2NrZXQub3duZXIocGh4VGFyZ2V0LCAodmlldykgPT5cbiAgICAgICAgY2FsbGJhY2sodmlldywgcGh4VGFyZ2V0KSxcbiAgICAgICk7XG4gICAgfVxuXG4gICAgaWYgKGlzQ2lkKHBoeFRhcmdldCkpIHtcbiAgICAgIGNvbnN0IHRhcmdldHMgPSBET00uZmluZENvbXBvbmVudE5vZGVMaXN0KHRoaXMuaWQsIHBoeFRhcmdldCwgZG9tKTtcbiAgICAgIGlmICh0YXJnZXRzLmxlbmd0aCA9PT0gMCkge1xuICAgICAgICBsb2dFcnJvcihgbm8gY29tcG9uZW50IGZvdW5kIG1hdGNoaW5nIHBoeC10YXJnZXQgb2YgJHtwaHhUYXJnZXR9YCk7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBjYWxsYmFjayh0aGlzLCBwYXJzZUludChwaHhUYXJnZXQpKTtcbiAgICAgIH1cbiAgICB9IGVsc2Uge1xuICAgICAgY29uc3QgdGFyZ2V0cyA9IEFycmF5LmZyb20oZG9tLnF1ZXJ5U2VsZWN0b3JBbGwocGh4VGFyZ2V0KSk7XG4gICAgICBpZiAodGFyZ2V0cy5sZW5ndGggPT09IDApIHtcbiAgICAgICAgbG9nRXJyb3IoXG4gICAgICAgICAgYG5vdGhpbmcgZm91bmQgbWF0Y2hpbmcgdGhlIHBoeC10YXJnZXQgc2VsZWN0b3IgXCIke3BoeFRhcmdldH1cImAsXG4gICAgICAgICk7XG4gICAgICB9XG4gICAgICB0YXJnZXRzLmZvckVhY2goKHRhcmdldCkgPT5cbiAgICAgICAgdGhpcy5saXZlU29ja2V0Lm93bmVyKHRhcmdldCwgKHZpZXcpID0+IGNhbGxiYWNrKHZpZXcsIHRhcmdldCkpLFxuICAgICAgKTtcbiAgICB9XG4gIH1cblxuICBhcHBseURpZmYodHlwZSwgcmF3RGlmZiwgY2FsbGJhY2spIHtcbiAgICB0aGlzLmxvZyh0eXBlLCAoKSA9PiBbXCJcIiwgY2xvbmUocmF3RGlmZildKTtcbiAgICBjb25zdCB7IGRpZmYsIHJlcGx5LCBldmVudHMsIHRpdGxlIH0gPSBSZW5kZXJlZC5leHRyYWN0KHJhd0RpZmYpO1xuICAgIGNhbGxiYWNrKHsgZGlmZiwgcmVwbHksIGV2ZW50cyB9KTtcbiAgICBpZiAodHlwZW9mIHRpdGxlID09PSBcInN0cmluZ1wiIHx8ICh0eXBlID09IFwibW91bnRcIiAmJiB0aGlzLmlzTWFpbigpKSkge1xuICAgICAgd2luZG93LnJlcXVlc3RBbmltYXRpb25GcmFtZSgoKSA9PiBET00ucHV0VGl0bGUodGl0bGUpKTtcbiAgICB9XG4gIH1cblxuICBvbkpvaW4ocmVzcCkge1xuICAgIGNvbnN0IHsgcmVuZGVyZWQsIGNvbnRhaW5lciwgbGl2ZXZpZXdfdmVyc2lvbiwgcGlkIH0gPSByZXNwO1xuICAgIGlmIChjb250YWluZXIpIHtcbiAgICAgIGNvbnN0IFt0YWcsIGF0dHJzXSA9IGNvbnRhaW5lcjtcbiAgICAgIHRoaXMuZWwgPSBET00ucmVwbGFjZVJvb3RDb250YWluZXIodGhpcy5lbCwgdGFnLCBhdHRycyk7XG4gICAgfVxuICAgIHRoaXMuY2hpbGRKb2lucyA9IDA7XG4gICAgdGhpcy5qb2luUGVuZGluZyA9IHRydWU7XG4gICAgdGhpcy5mbGFzaCA9IG51bGw7XG4gICAgaWYgKHRoaXMucm9vdCA9PT0gdGhpcykge1xuICAgICAgdGhpcy5mb3Jtc0ZvclJlY292ZXJ5ID0gdGhpcy5nZXRGb3Jtc0ZvclJlY292ZXJ5KCk7XG4gICAgfVxuICAgIGlmICh0aGlzLmlzTWFpbigpICYmIHdpbmRvdy5oaXN0b3J5LnN0YXRlID09PSBudWxsKSB7XG4gICAgICAvLyBzZXQgaW5pdGlhbCBoaXN0b3J5IGVudHJ5IGlmIHRoaXMgaXMgdGhlIGZpcnN0IHBhZ2UgbG9hZCAobm8gaGlzdG9yeSlcbiAgICAgIEJyb3dzZXIucHVzaFN0YXRlKFwicmVwbGFjZVwiLCB7XG4gICAgICAgIHR5cGU6IFwicGF0Y2hcIixcbiAgICAgICAgaWQ6IHRoaXMuaWQsXG4gICAgICAgIHBvc2l0aW9uOiB0aGlzLmxpdmVTb2NrZXQuY3VycmVudEhpc3RvcnlQb3NpdGlvbixcbiAgICAgIH0pO1xuICAgIH1cblxuICAgIGlmIChsaXZldmlld192ZXJzaW9uICE9PSB0aGlzLmxpdmVTb2NrZXQudmVyc2lvbigpKSB7XG4gICAgICBjb25zb2xlLmVycm9yKFxuICAgICAgICBgTGl2ZVZpZXcgYXNzZXQgdmVyc2lvbiBtaXNtYXRjaC4gSmF2YVNjcmlwdCB2ZXJzaW9uICR7dGhpcy5saXZlU29ja2V0LnZlcnNpb24oKX0gdnMuIHNlcnZlciAke2xpdmV2aWV3X3ZlcnNpb259LiBUbyBhdm9pZCBpc3N1ZXMsIHBsZWFzZSBlbnN1cmUgdGhhdCB5b3VyIGFzc2V0cyB1c2UgdGhlIHNhbWUgdmVyc2lvbiBhcyB0aGUgc2VydmVyLmAsXG4gICAgICApO1xuICAgIH1cblxuICAgIC8vIFRoZSBwaWQgaXMgb25seSBzZW50IGlmXG4gICAgLy9cbiAgICAvLyAgICBjb25maWcgOnBob2VuaXhfbGl2ZV92aWV3LCA6ZGVidWdfYXR0cmlidXRlc1xuICAgIC8vXG4gICAgLy8gaWYgc2V0IHRvIHRydWUuIEl0IGlzIHRvIGhlbHAgZGVidWdnaW5nIGluIGRldmVsb3BtZW50LlxuICAgIGlmIChwaWQpIHtcbiAgICAgIHRoaXMuZWwuc2V0QXR0cmlidXRlKFBIWF9MVl9QSUQsIHBpZCk7XG4gICAgfVxuXG4gICAgQnJvd3Nlci5kcm9wTG9jYWwoXG4gICAgICB0aGlzLmxpdmVTb2NrZXQubG9jYWxTdG9yYWdlLFxuICAgICAgd2luZG93LmxvY2F0aW9uLnBhdGhuYW1lLFxuICAgICAgQ09OU0VDVVRJVkVfUkVMT0FEUyxcbiAgICApO1xuICAgIHRoaXMuYXBwbHlEaWZmKFwibW91bnRcIiwgcmVuZGVyZWQsICh7IGRpZmYsIGV2ZW50cyB9KSA9PiB7XG4gICAgICB0aGlzLnJlbmRlcmVkID0gbmV3IFJlbmRlcmVkKHRoaXMuaWQsIGRpZmYpO1xuICAgICAgY29uc3QgW2h0bWwsIHN0cmVhbXNdID0gdGhpcy5yZW5kZXJDb250YWluZXIobnVsbCwgXCJqb2luXCIpO1xuICAgICAgdGhpcy5kcm9wUGVuZGluZ1JlZnMoKTtcbiAgICAgIHRoaXMuam9pbkNvdW50Kys7XG4gICAgICB0aGlzLmpvaW5BdHRlbXB0cyA9IDA7XG5cbiAgICAgIHRoaXMubWF5YmVSZWNvdmVyRm9ybXMoaHRtbCwgKCkgPT4ge1xuICAgICAgICB0aGlzLm9uSm9pbkNvbXBsZXRlKHJlc3AsIGh0bWwsIHN0cmVhbXMsIGV2ZW50cyk7XG4gICAgICB9KTtcbiAgICB9KTtcbiAgfVxuXG4gIGRyb3BQZW5kaW5nUmVmcygpIHtcbiAgICBET00uYWxsKGRvY3VtZW50LCBgWyR7UEhYX1JFRl9TUkN9PVwiJHt0aGlzLnJlZlNyYygpfVwiXWAsIChlbCkgPT4ge1xuICAgICAgZWwucmVtb3ZlQXR0cmlidXRlKFBIWF9SRUZfTE9BRElORyk7XG4gICAgICBlbC5yZW1vdmVBdHRyaWJ1dGUoUEhYX1JFRl9TUkMpO1xuICAgICAgZWwucmVtb3ZlQXR0cmlidXRlKFBIWF9SRUZfTE9DSyk7XG4gICAgfSk7XG4gIH1cblxuICBvbkpvaW5Db21wbGV0ZSh7IGxpdmVfcGF0Y2ggfSwgaHRtbCwgc3RyZWFtcywgZXZlbnRzKSB7XG4gICAgLy8gSW4gb3JkZXIgdG8gcHJvdmlkZSBhIGJldHRlciBleHBlcmllbmNlLCB3ZSB3YW50IHRvIGpvaW5cbiAgICAvLyBhbGwgTGl2ZVZpZXdzIGZpcnN0IGFuZCBvbmx5IHRoZW4gYXBwbHkgdGhlaXIgcGF0Y2hlcy5cbiAgICBpZiAodGhpcy5qb2luQ291bnQgPiAxIHx8ICh0aGlzLnBhcmVudCAmJiAhdGhpcy5wYXJlbnQuaXNKb2luUGVuZGluZygpKSkge1xuICAgICAgcmV0dXJuIHRoaXMuYXBwbHlKb2luUGF0Y2gobGl2ZV9wYXRjaCwgaHRtbCwgc3RyZWFtcywgZXZlbnRzKTtcbiAgICB9XG5cbiAgICAvLyBPbmUgZG93bnNpZGUgb2YgdGhpcyBhcHByb2FjaCBpcyB0aGF0IHdlIG5lZWQgdG8gZmluZCBwaHhDaGlsZHJlblxuICAgIC8vIGluIHRoZSBodG1sIGZyYWdtZW50LCBpbnN0ZWFkIG9mIGRpcmVjdGx5IG9uIHRoZSBET00uIFRoZSBmcmFnbWVudFxuICAgIC8vIGFsc28gZG9lcyBub3QgaW5jbHVkZSBQSFhfU1RBVElDLCBzbyB3ZSBuZWVkIHRvIGNvcHkgaXQgb3ZlciBmcm9tXG4gICAgLy8gdGhlIERPTS5cbiAgICBjb25zdCBuZXdDaGlsZHJlbiA9IERPTS5maW5kUGh4Q2hpbGRyZW5JbkZyYWdtZW50KGh0bWwsIHRoaXMuaWQpLmZpbHRlcihcbiAgICAgICh0b0VsKSA9PiB7XG4gICAgICAgIGNvbnN0IGZyb21FbCA9IHRvRWwuaWQgJiYgdGhpcy5lbC5xdWVyeVNlbGVjdG9yKGBbaWQ9XCIke3RvRWwuaWR9XCJdYCk7XG4gICAgICAgIGNvbnN0IHBoeFN0YXRpYyA9IGZyb21FbCAmJiBmcm9tRWwuZ2V0QXR0cmlidXRlKFBIWF9TVEFUSUMpO1xuICAgICAgICBpZiAocGh4U3RhdGljKSB7XG4gICAgICAgICAgdG9FbC5zZXRBdHRyaWJ1dGUoUEhYX1NUQVRJQywgcGh4U3RhdGljKTtcbiAgICAgICAgfVxuICAgICAgICAvLyBzZXQgUEhYX1JPT1RfSUQgdG8gcHJldmVudCBldmVudHMgZnJvbSBiZWluZyBkaXNwYXRjaGVkIHRvIHRoZSByb290IHZpZXdcbiAgICAgICAgLy8gd2hpbGUgdGhlIGNoaWxkIGpvaW4gaXMgc3RpbGwgcGVuZGluZ1xuICAgICAgICBpZiAoZnJvbUVsKSB7XG4gICAgICAgICAgZnJvbUVsLnNldEF0dHJpYnV0ZShQSFhfUk9PVF9JRCwgdGhpcy5yb290LmlkKTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gdGhpcy5qb2luQ2hpbGQodG9FbCk7XG4gICAgICB9LFxuICAgICk7XG5cbiAgICBpZiAobmV3Q2hpbGRyZW4ubGVuZ3RoID09PSAwKSB7XG4gICAgICBpZiAodGhpcy5wYXJlbnQpIHtcbiAgICAgICAgdGhpcy5yb290LnBlbmRpbmdKb2luT3BzLnB1c2goW1xuICAgICAgICAgIHRoaXMsXG4gICAgICAgICAgKCkgPT4gdGhpcy5hcHBseUpvaW5QYXRjaChsaXZlX3BhdGNoLCBodG1sLCBzdHJlYW1zLCBldmVudHMpLFxuICAgICAgICBdKTtcbiAgICAgICAgdGhpcy5wYXJlbnQuYWNrSm9pbih0aGlzKTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHRoaXMub25BbGxDaGlsZEpvaW5zQ29tcGxldGUoKTtcbiAgICAgICAgdGhpcy5hcHBseUpvaW5QYXRjaChsaXZlX3BhdGNoLCBodG1sLCBzdHJlYW1zLCBldmVudHMpO1xuICAgICAgfVxuICAgIH0gZWxzZSB7XG4gICAgICB0aGlzLnJvb3QucGVuZGluZ0pvaW5PcHMucHVzaChbXG4gICAgICAgIHRoaXMsXG4gICAgICAgICgpID0+IHRoaXMuYXBwbHlKb2luUGF0Y2gobGl2ZV9wYXRjaCwgaHRtbCwgc3RyZWFtcywgZXZlbnRzKSxcbiAgICAgIF0pO1xuICAgIH1cbiAgfVxuXG4gIGF0dGFjaFRydWVEb2NFbCgpIHtcbiAgICB0aGlzLmVsID0gRE9NLmJ5SWQodGhpcy5pZCk7XG4gICAgdGhpcy5lbC5zZXRBdHRyaWJ1dGUoUEhYX1JPT1RfSUQsIHRoaXMucm9vdC5pZCk7XG4gIH1cblxuICAvLyB0aGlzIGlzIGludm9rZWQgZm9yIGRlYWQgYW5kIGxpdmUgdmlld3MsIHNvIHdlIG11c3QgZmlsdGVyIGJ5XG4gIC8vIGJ5IG93bmVyIHRvIGVuc3VyZSB3ZSBhcmVuJ3QgZHVwbGljYXRpbmcgaG9va3MgYWNyb3NzIGRpc2Nvbm5lY3RcbiAgLy8gYW5kIGNvbm5lY3RlZCBzdGF0ZXMuIFRoaXMgYWxzbyBoYW5kbGVzIGNhc2VzIHdoZXJlIGhvb2tzIGV4aXN0XG4gIC8vIGluIGEgcm9vdCBsYXlvdXQgd2l0aCBhIExWIGluIHRoZSBib2R5XG4gIGV4ZWNOZXdNb3VudGVkKHBhcmVudCA9IGRvY3VtZW50KSB7XG4gICAgbGV0IHBoeFZpZXdwb3J0VG9wID0gdGhpcy5iaW5kaW5nKFBIWF9WSUVXUE9SVF9UT1ApO1xuICAgIGxldCBwaHhWaWV3cG9ydEJvdHRvbSA9IHRoaXMuYmluZGluZyhQSFhfVklFV1BPUlRfQk9UVE9NKTtcbiAgICB0aGlzLmFsbChcbiAgICAgIHBhcmVudCxcbiAgICAgIGBbJHtwaHhWaWV3cG9ydFRvcH1dLCBbJHtwaHhWaWV3cG9ydEJvdHRvbX1dYCxcbiAgICAgIChob29rRWwpID0+IHtcbiAgICAgICAgRE9NLm1haW50YWluUHJpdmF0ZUhvb2tzKFxuICAgICAgICAgIGhvb2tFbCxcbiAgICAgICAgICBob29rRWwsXG4gICAgICAgICAgcGh4Vmlld3BvcnRUb3AsXG4gICAgICAgICAgcGh4Vmlld3BvcnRCb3R0b20sXG4gICAgICAgICk7XG4gICAgICAgIHRoaXMubWF5YmVBZGROZXdIb29rKGhvb2tFbCk7XG4gICAgICB9LFxuICAgICk7XG4gICAgdGhpcy5hbGwoXG4gICAgICBwYXJlbnQsXG4gICAgICBgWyR7dGhpcy5iaW5kaW5nKFBIWF9IT09LKX1dLCBbZGF0YS1waHgtJHtQSFhfSE9PS31dYCxcbiAgICAgIChob29rRWwpID0+IHtcbiAgICAgICAgdGhpcy5tYXliZUFkZE5ld0hvb2soaG9va0VsKTtcbiAgICAgIH0sXG4gICAgKTtcbiAgICB0aGlzLmFsbChwYXJlbnQsIGBbJHt0aGlzLmJpbmRpbmcoUEhYX01PVU5URUQpfV1gLCAoZWwpID0+IHtcbiAgICAgIHRoaXMubWF5YmVNb3VudGVkKGVsKTtcbiAgICB9KTtcbiAgfVxuXG4gIGFsbChwYXJlbnQsIHNlbGVjdG9yLCBjYWxsYmFjaykge1xuICAgIERPTS5hbGwocGFyZW50LCBzZWxlY3RvciwgKGVsKSA9PiB7XG4gICAgICBpZiAodGhpcy5vd25zRWxlbWVudChlbCkpIHtcbiAgICAgICAgY2FsbGJhY2soZWwpO1xuICAgICAgfVxuICAgIH0pO1xuICB9XG5cbiAgYXBwbHlKb2luUGF0Y2gobGl2ZV9wYXRjaCwgaHRtbCwgc3RyZWFtcywgZXZlbnRzKSB7XG4gICAgLy8gaW4gY2FzZSBvZiByZWpvaW5zLCB3ZSBuZWVkIHRvIG1hbnVhbGx5IHBlcmZvcm0gYWxsXG4gICAgLy8gcGVuZGluZyBvcHNcbiAgICBpZiAodGhpcy5qb2luQ291bnQgPiAxKSB7XG4gICAgICBpZiAodGhpcy5wZW5kaW5nSm9pbk9wcy5sZW5ndGgpIHtcbiAgICAgICAgdGhpcy5wZW5kaW5nSm9pbk9wcy5mb3JFYWNoKChjYikgPT4gdHlwZW9mIGNiID09PSBcImZ1bmN0aW9uXCIgJiYgY2IoKSk7XG4gICAgICAgIHRoaXMucGVuZGluZ0pvaW5PcHMgPSBbXTtcbiAgICAgIH1cbiAgICB9XG4gICAgdGhpcy5hdHRhY2hUcnVlRG9jRWwoKTtcbiAgICBjb25zdCBwYXRjaCA9IG5ldyBET01QYXRjaCh0aGlzLCB0aGlzLmVsLCB0aGlzLmlkLCBodG1sLCBzdHJlYW1zLCBudWxsKTtcbiAgICBwYXRjaC5tYXJrUHJ1bmFibGVDb250ZW50Rm9yUmVtb3ZhbCgpO1xuICAgIHRoaXMucGVyZm9ybVBhdGNoKHBhdGNoLCBmYWxzZSwgdHJ1ZSk7XG4gICAgdGhpcy5qb2luTmV3Q2hpbGRyZW4oKTtcbiAgICB0aGlzLmV4ZWNOZXdNb3VudGVkKCk7XG5cbiAgICB0aGlzLmpvaW5QZW5kaW5nID0gZmFsc2U7XG4gICAgdGhpcy5saXZlU29ja2V0LmRpc3BhdGNoRXZlbnRzKGV2ZW50cyk7XG4gICAgdGhpcy5hcHBseVBlbmRpbmdVcGRhdGVzKCk7XG5cbiAgICBpZiAobGl2ZV9wYXRjaCkge1xuICAgICAgY29uc3QgeyBraW5kLCB0byB9ID0gbGl2ZV9wYXRjaDtcbiAgICAgIHRoaXMubGl2ZVNvY2tldC5oaXN0b3J5UGF0Y2godG8sIGtpbmQpO1xuICAgIH1cbiAgICB0aGlzLmhpZGVMb2FkZXIoKTtcbiAgICBpZiAodGhpcy5qb2luQ291bnQgPiAxKSB7XG4gICAgICB0aGlzLnRyaWdnZXJSZWNvbm5lY3RlZCgpO1xuICAgIH1cbiAgICB0aGlzLnN0b3BDYWxsYmFjaygpO1xuICB9XG5cbiAgdHJpZ2dlckJlZm9yZVVwZGF0ZUhvb2soZnJvbUVsLCB0b0VsKSB7XG4gICAgdGhpcy5saXZlU29ja2V0LnRyaWdnZXJET00oXCJvbkJlZm9yZUVsVXBkYXRlZFwiLCBbZnJvbUVsLCB0b0VsXSk7XG4gICAgY29uc3QgaG9vayA9IHRoaXMuZ2V0SG9vayhmcm9tRWwpO1xuICAgIGNvbnN0IGlzSWdub3JlZCA9IGhvb2sgJiYgRE9NLmlzSWdub3JlZChmcm9tRWwsIHRoaXMuYmluZGluZyhQSFhfVVBEQVRFKSk7XG4gICAgaWYgKFxuICAgICAgaG9vayAmJlxuICAgICAgIWZyb21FbC5pc0VxdWFsTm9kZSh0b0VsKSAmJlxuICAgICAgIShpc0lnbm9yZWQgJiYgaXNFcXVhbE9iaihmcm9tRWwuZGF0YXNldCwgdG9FbC5kYXRhc2V0KSlcbiAgICApIHtcbiAgICAgIGhvb2suX19iZWZvcmVVcGRhdGUoKTtcbiAgICAgIHJldHVybiBob29rO1xuICAgIH1cbiAgfVxuXG4gIG1heWJlTW91bnRlZChlbCkge1xuICAgIGNvbnN0IHBoeE1vdW50ZWQgPSBlbC5nZXRBdHRyaWJ1dGUodGhpcy5iaW5kaW5nKFBIWF9NT1VOVEVEKSk7XG4gICAgY29uc3QgaGFzQmVlbkludm9rZWQgPSBwaHhNb3VudGVkICYmIERPTS5wcml2YXRlKGVsLCBcIm1vdW50ZWRcIik7XG4gICAgaWYgKHBoeE1vdW50ZWQgJiYgIWhhc0JlZW5JbnZva2VkKSB7XG4gICAgICB0aGlzLmxpdmVTb2NrZXQuZXhlY0pTKGVsLCBwaHhNb3VudGVkKTtcbiAgICAgIERPTS5wdXRQcml2YXRlKGVsLCBcIm1vdW50ZWRcIiwgdHJ1ZSk7XG4gICAgfVxuICB9XG5cbiAgbWF5YmVBZGROZXdIb29rKGVsKSB7XG4gICAgY29uc3QgbmV3SG9vayA9IHRoaXMuYWRkSG9vayhlbCk7XG4gICAgaWYgKG5ld0hvb2spIHtcbiAgICAgIG5ld0hvb2suX19tb3VudGVkKCk7XG4gICAgfVxuICB9XG5cbiAgcGVyZm9ybVBhdGNoKHBhdGNoLCBwcnVuZUNpZHMsIGlzSm9pblBhdGNoID0gZmFsc2UpIHtcbiAgICBjb25zdCByZW1vdmVkRWxzID0gW107XG4gICAgbGV0IHBoeENoaWxkcmVuQWRkZWQgPSBmYWxzZTtcbiAgICBjb25zdCB1cGRhdGVkSG9va0lkcyA9IG5ldyBTZXQoKTtcblxuICAgIHRoaXMubGl2ZVNvY2tldC50cmlnZ2VyRE9NKFwib25QYXRjaFN0YXJ0XCIsIFtwYXRjaC50YXJnZXRDb250YWluZXJdKTtcblxuICAgIHBhdGNoLmFmdGVyKFwiYWRkZWRcIiwgKGVsKSA9PiB7XG4gICAgICB0aGlzLmxpdmVTb2NrZXQudHJpZ2dlckRPTShcIm9uTm9kZUFkZGVkXCIsIFtlbF0pO1xuICAgICAgY29uc3QgcGh4Vmlld3BvcnRUb3AgPSB0aGlzLmJpbmRpbmcoUEhYX1ZJRVdQT1JUX1RPUCk7XG4gICAgICBjb25zdCBwaHhWaWV3cG9ydEJvdHRvbSA9IHRoaXMuYmluZGluZyhQSFhfVklFV1BPUlRfQk9UVE9NKTtcbiAgICAgIERPTS5tYWludGFpblByaXZhdGVIb29rcyhlbCwgZWwsIHBoeFZpZXdwb3J0VG9wLCBwaHhWaWV3cG9ydEJvdHRvbSk7XG4gICAgICB0aGlzLm1heWJlQWRkTmV3SG9vayhlbCk7XG4gICAgICBpZiAoZWwuZ2V0QXR0cmlidXRlKSB7XG4gICAgICAgIHRoaXMubWF5YmVNb3VudGVkKGVsKTtcbiAgICAgIH1cbiAgICB9KTtcblxuICAgIHBhdGNoLmFmdGVyKFwicGh4Q2hpbGRBZGRlZFwiLCAoZWwpID0+IHtcbiAgICAgIGlmIChET00uaXNQaHhTdGlja3koZWwpKSB7XG4gICAgICAgIHRoaXMubGl2ZVNvY2tldC5qb2luUm9vdFZpZXdzKCk7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBwaHhDaGlsZHJlbkFkZGVkID0gdHJ1ZTtcbiAgICAgIH1cbiAgICB9KTtcblxuICAgIHBhdGNoLmJlZm9yZShcInVwZGF0ZWRcIiwgKGZyb21FbCwgdG9FbCkgPT4ge1xuICAgICAgY29uc3QgaG9vayA9IHRoaXMudHJpZ2dlckJlZm9yZVVwZGF0ZUhvb2soZnJvbUVsLCB0b0VsKTtcbiAgICAgIGlmIChob29rKSB7XG4gICAgICAgIHVwZGF0ZWRIb29rSWRzLmFkZChmcm9tRWwuaWQpO1xuICAgICAgfVxuICAgICAgLy8gdHJpZ2dlciBKUyBzcGVjaWZpYyB1cGRhdGUgbG9naWMgKGZvciBleGFtcGxlIGZvciBKUy5pZ25vcmVfYXR0cmlidXRlcylcbiAgICAgIEpTLm9uQmVmb3JlRWxVcGRhdGVkKGZyb21FbCwgdG9FbCk7XG4gICAgfSk7XG5cbiAgICBwYXRjaC5hZnRlcihcInVwZGF0ZWRcIiwgKGVsKSA9PiB7XG4gICAgICBpZiAodXBkYXRlZEhvb2tJZHMuaGFzKGVsLmlkKSkge1xuICAgICAgICB0aGlzLmdldEhvb2soZWwpLl9fdXBkYXRlZCgpO1xuICAgICAgfVxuICAgIH0pO1xuXG4gICAgcGF0Y2guYWZ0ZXIoXCJkaXNjYXJkZWRcIiwgKGVsKSA9PiB7XG4gICAgICBpZiAoZWwubm9kZVR5cGUgPT09IE5vZGUuRUxFTUVOVF9OT0RFKSB7XG4gICAgICAgIHJlbW92ZWRFbHMucHVzaChlbCk7XG4gICAgICB9XG4gICAgfSk7XG5cbiAgICBwYXRjaC5hZnRlcihcInRyYW5zaXRpb25zRGlzY2FyZGVkXCIsIChlbHMpID0+XG4gICAgICB0aGlzLmFmdGVyRWxlbWVudHNSZW1vdmVkKGVscywgcHJ1bmVDaWRzKSxcbiAgICApO1xuICAgIHBhdGNoLnBlcmZvcm0oaXNKb2luUGF0Y2gpO1xuICAgIHRoaXMuYWZ0ZXJFbGVtZW50c1JlbW92ZWQocmVtb3ZlZEVscywgcHJ1bmVDaWRzKTtcblxuICAgIHRoaXMubGl2ZVNvY2tldC50cmlnZ2VyRE9NKFwib25QYXRjaEVuZFwiLCBbcGF0Y2gudGFyZ2V0Q29udGFpbmVyXSk7XG4gICAgcmV0dXJuIHBoeENoaWxkcmVuQWRkZWQ7XG4gIH1cblxuICBhZnRlckVsZW1lbnRzUmVtb3ZlZChlbGVtZW50cywgcHJ1bmVDaWRzKSB7XG4gICAgY29uc3QgZGVzdHJveWVkQ0lEcyA9IFtdO1xuICAgIGVsZW1lbnRzLmZvckVhY2goKHBhcmVudCkgPT4ge1xuICAgICAgY29uc3QgY29tcG9uZW50cyA9IERPTS5hbGwoXG4gICAgICAgIHBhcmVudCxcbiAgICAgICAgYFske1BIWF9WSUVXX1JFRn09XCIke3RoaXMuaWR9XCJdWyR7UEhYX0NPTVBPTkVOVH1dYCxcbiAgICAgICk7XG4gICAgICBjb25zdCBob29rcyA9IERPTS5hbGwoXG4gICAgICAgIHBhcmVudCxcbiAgICAgICAgYFske3RoaXMuYmluZGluZyhQSFhfSE9PSyl9XSwgW2RhdGEtcGh4LWhvb2tdYCxcbiAgICAgICk7XG4gICAgICBjb21wb25lbnRzLmNvbmNhdChwYXJlbnQpLmZvckVhY2goKGVsKSA9PiB7XG4gICAgICAgIGNvbnN0IGNpZCA9IHRoaXMuY29tcG9uZW50SUQoZWwpO1xuICAgICAgICBpZiAoXG4gICAgICAgICAgaXNDaWQoY2lkKSAmJlxuICAgICAgICAgIGRlc3Ryb3llZENJRHMuaW5kZXhPZihjaWQpID09PSAtMSAmJlxuICAgICAgICAgIGVsLmdldEF0dHJpYnV0ZShQSFhfVklFV19SRUYpID09PSB0aGlzLmlkXG4gICAgICAgICkge1xuICAgICAgICAgIGRlc3Ryb3llZENJRHMucHVzaChjaWQpO1xuICAgICAgICB9XG4gICAgICB9KTtcbiAgICAgIGhvb2tzLmNvbmNhdChwYXJlbnQpLmZvckVhY2goKGhvb2tFbCkgPT4ge1xuICAgICAgICBjb25zdCBob29rID0gdGhpcy5nZXRIb29rKGhvb2tFbCk7XG4gICAgICAgIGhvb2sgJiYgdGhpcy5kZXN0cm95SG9vayhob29rKTtcbiAgICAgIH0pO1xuICAgIH0pO1xuICAgIC8vIFdlIHNob3VsZCBub3QgcHJ1bmVDaWRzIG9uIGpvaW5zLiBPdGhlcndpc2UsIGluIGNhc2Ugb2ZcbiAgICAvLyByZWpvaW5zLCB3ZSBtYXkgbm90aWZ5IGNpZHMgdGhhdCBubyBsb25nZXIgYmVsb25nIHRvIHRoZVxuICAgIC8vIGN1cnJlbnQgTGl2ZVZpZXcgdG8gYmUgcmVtb3ZlZC5cbiAgICBpZiAocHJ1bmVDaWRzKSB7XG4gICAgICB0aGlzLm1heWJlUHVzaENvbXBvbmVudHNEZXN0cm95ZWQoZGVzdHJveWVkQ0lEcyk7XG4gICAgfVxuICB9XG5cbiAgam9pbk5ld0NoaWxkcmVuKCkge1xuICAgIERPTS5maW5kUGh4Q2hpbGRyZW4oZG9jdW1lbnQsIHRoaXMuaWQpLmZvckVhY2goKGVsKSA9PiB0aGlzLmpvaW5DaGlsZChlbCkpO1xuICB9XG5cbiAgbWF5YmVSZWNvdmVyRm9ybXMoaHRtbCwgY2FsbGJhY2spIHtcbiAgICBjb25zdCBwaHhDaGFuZ2UgPSB0aGlzLmJpbmRpbmcoXCJjaGFuZ2VcIik7XG4gICAgY29uc3Qgb2xkRm9ybXMgPSB0aGlzLnJvb3QuZm9ybXNGb3JSZWNvdmVyeTtcbiAgICAvLyBTbyB3aHkgZG8gd2UgY3JlYXRlIGEgdGVtcGxhdGUgZWxlbWVudCBoZXJlP1xuICAgIC8vIE9uZSB3YXkgdG8gcmVjb3ZlciBmb3JtcyB3b3VsZCBiZSB0byBpbW1lZGlhdGVseSBhcHBseSB0aGUgbW91bnRcbiAgICAvLyBwYXRjaCBhbmQgdGhlbiBhZnRlcndhcmRzIHJlY292ZXIgdGhlIGZvcm1zLiBIb3dldmVyLCB0aGlzIHdvdWxkXG4gICAgLy8gY2F1c2UgYSBmbGlja2VyLCBiZWNhdXNlIHRoZSBtb3VudCBwYXRjaCB3b3VsZCByZW1vdmUgdGhlIGZvcm0gY29udGVudFxuICAgIC8vIHVudGlsIGl0IGlzIHJlc3RvcmVkLiBUaGVyZWZvcmUgTFYgZGVjaWRlZCB0byBkbyBmb3JtIHJlY292ZXJ5IHdpdGggdGhlXG4gICAgLy8gcmF3IEhUTUwgYmVmb3JlIGl0IGlzIGFwcGxpZWQgYW5kIGRlbGF5IHRoZSBtb3VudCBwYXRjaCB1bnRpbCB0aGUgZm9ybVxuICAgIC8vIHJlY292ZXJ5IGV2ZW50cyBhcmUgZG9uZS5cbiAgICBjb25zdCB0ZW1wbGF0ZSA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoXCJ0ZW1wbGF0ZVwiKTtcbiAgICB0ZW1wbGF0ZS5pbm5lckhUTUwgPSBodG1sO1xuXG4gICAgLy8gd2Ugc3BlY2lhbCBjYXNlIDwucG9ydGFsPiBoZXJlIGFuZCB0ZWxlcG9ydCBpdCBpbnRvIG91ciB0ZW1wb3JhcnkgRE9NIGZvciByZWNvdmVyeVxuICAgIC8vIGFzIHdlJ2Qgb3RoZXJ3aXNlIG5vdCBmaW5kIHRlbGVwb3J0ZWQgZm9ybXNcbiAgICBET00uYWxsKHRlbXBsYXRlLmNvbnRlbnQsIGBbJHtQSFhfUE9SVEFMfV1gKS5mb3JFYWNoKChwb3J0YWxUZW1wbGF0ZSkgPT4ge1xuICAgICAgdGVtcGxhdGUuY29udGVudC5maXJzdEVsZW1lbnRDaGlsZC5hcHBlbmRDaGlsZChcbiAgICAgICAgcG9ydGFsVGVtcGxhdGUuY29udGVudC5maXJzdEVsZW1lbnRDaGlsZCxcbiAgICAgICk7XG4gICAgfSk7XG5cbiAgICAvLyBiZWNhdXNlIHdlIHdvcmsgd2l0aCBhIHRlbXBsYXRlIGVsZW1lbnQsIHdlIG11c3QgbWFudWFsbHkgY29weSB0aGUgYXR0cmlidXRlc1xuICAgIC8vIG90aGVyd2lzZSB0aGUgb3duZXIgLyB0YXJnZXQgaGVscGVycyBkb24ndCB3b3JrIHByb3Blcmx5XG4gICAgY29uc3Qgcm9vdEVsID0gdGVtcGxhdGUuY29udGVudC5maXJzdEVsZW1lbnRDaGlsZDtcbiAgICByb290RWwuaWQgPSB0aGlzLmlkO1xuICAgIHJvb3RFbC5zZXRBdHRyaWJ1dGUoUEhYX1JPT1RfSUQsIHRoaXMucm9vdC5pZCk7XG4gICAgcm9vdEVsLnNldEF0dHJpYnV0ZShQSFhfU0VTU0lPTiwgdGhpcy5nZXRTZXNzaW9uKCkpO1xuICAgIHJvb3RFbC5zZXRBdHRyaWJ1dGUoUEhYX1NUQVRJQywgdGhpcy5nZXRTdGF0aWMoKSk7XG4gICAgcm9vdEVsLnNldEF0dHJpYnV0ZShQSFhfUEFSRU5UX0lELCB0aGlzLnBhcmVudCA/IHRoaXMucGFyZW50LmlkIDogbnVsbCk7XG5cbiAgICAvLyB3ZSBnbyBvdmVyIGFsbCBmb3JtIGVsZW1lbnRzIGluIHRoZSBuZXcgSFRNTCBmb3IgdGhlIExWXG4gICAgLy8gYW5kIGxvb2sgZm9yIG9sZCBmb3JtcyBpbiB0aGUgYGZvcm1zRm9yUmVjb3ZlcnlgIG9iamVjdDtcbiAgICAvLyB0aGUgZm9ybXNGb3JSZWNvdmVyeSBjYW4gYWxzbyBjb250YWluIGZvcm1zIGZyb20gY2hpbGQgdmlld3NcbiAgICBjb25zdCBmb3Jtc1RvUmVjb3ZlciA9XG4gICAgICAvLyB3ZSBnbyBvdmVyIGFsbCBmb3JtcyBpbiB0aGUgbmV3IERPTTsgYmVjYXVzZSB0aGlzIGlzIG9ubHkgdGhlIEhUTUwgZm9yIHRoZSBjdXJyZW50XG4gICAgICAvLyB2aWV3LCB3ZSBjYW4gYmUgc3VyZSB0aGF0IGFsbCBmb3JtcyBhcmUgb3duZWQgYnkgdGhpcyB2aWV3OlxuICAgICAgRE9NLmFsbCh0ZW1wbGF0ZS5jb250ZW50LCBcImZvcm1cIilcbiAgICAgICAgLy8gb25seSByZWNvdmVyIGZvcm1zIHRoYXQgaGF2ZSBhbiBpZCBhbmQgYXJlIGluIHRoZSBvbGQgRE9NXG4gICAgICAgIC5maWx0ZXIoKG5ld0Zvcm0pID0+IG5ld0Zvcm0uaWQgJiYgb2xkRm9ybXNbbmV3Rm9ybS5pZF0pXG4gICAgICAgIC8vIGFiYW5kb24gZm9ybXMgd2UgYWxyZWFkeSB0cmllZCB0byByZWNvdmVyIHRvIHByZXZlbnQgbG9vcGluZyBhIGZhaWxlZCBzdGF0ZVxuICAgICAgICAuZmlsdGVyKChuZXdGb3JtKSA9PiAhdGhpcy5wZW5kaW5nRm9ybXMuaGFzKG5ld0Zvcm0uaWQpKVxuICAgICAgICAvLyBvbmx5IHJlY292ZXIgaWYgdGhlIGZvcm0gaGFzIHRoZSBzYW1lIHBoeC1jaGFuZ2UgdmFsdWVcbiAgICAgICAgLmZpbHRlcihcbiAgICAgICAgICAobmV3Rm9ybSkgPT5cbiAgICAgICAgICAgIG9sZEZvcm1zW25ld0Zvcm0uaWRdLmdldEF0dHJpYnV0ZShwaHhDaGFuZ2UpID09PVxuICAgICAgICAgICAgbmV3Rm9ybS5nZXRBdHRyaWJ1dGUocGh4Q2hhbmdlKSxcbiAgICAgICAgKVxuICAgICAgICAubWFwKChuZXdGb3JtKSA9PiB7XG4gICAgICAgICAgcmV0dXJuIFtvbGRGb3Jtc1tuZXdGb3JtLmlkXSwgbmV3Rm9ybV07XG4gICAgICAgIH0pO1xuXG4gICAgaWYgKGZvcm1zVG9SZWNvdmVyLmxlbmd0aCA9PT0gMCkge1xuICAgICAgcmV0dXJuIGNhbGxiYWNrKCk7XG4gICAgfVxuXG4gICAgZm9ybXNUb1JlY292ZXIuZm9yRWFjaCgoW29sZEZvcm0sIG5ld0Zvcm1dLCBpKSA9PiB7XG4gICAgICB0aGlzLnBlbmRpbmdGb3Jtcy5hZGQobmV3Rm9ybS5pZCk7XG4gICAgICAvLyBpdCBpcyBpbXBvcnRhbnQgdG8gdXNlIHRoZSBmaXJzdEVsZW1lbnRDaGlsZCBvZiB0aGUgdGVtcGxhdGUgY29udGVudFxuICAgICAgLy8gYmVjYXVzZSB3aGVuIHRyYXZlcnNpbmcgYSBkb2N1bWVudEZyYWdtZW50IHVzaW5nIHBhcmVudE5vZGUsIHdlIHdvbid0IGV2ZXIgYXJyaXZlIGF0XG4gICAgICAvLyB0aGUgZnJhZ21lbnQ7IGFzIHRoZSB0ZW1wbGF0ZSBpcyBhbHdheXMgYSBMaXZlVmlldywgd2UgY2FuIGJlIHN1cmUgdGhhdCB0aGVyZSBpcyBvbmx5XG4gICAgICAvLyBvbmUgY2hpbGQgb24gdGhlIHJvb3QgbGV2ZWxcbiAgICAgIHRoaXMucHVzaEZvcm1SZWNvdmVyeShcbiAgICAgICAgb2xkRm9ybSxcbiAgICAgICAgbmV3Rm9ybSxcbiAgICAgICAgdGVtcGxhdGUuY29udGVudC5maXJzdEVsZW1lbnRDaGlsZCxcbiAgICAgICAgKCkgPT4ge1xuICAgICAgICAgIHRoaXMucGVuZGluZ0Zvcm1zLmRlbGV0ZShuZXdGb3JtLmlkKTtcbiAgICAgICAgICAvLyB3ZSBvbmx5IGNhbGwgdGhlIGNhbGxiYWNrIG9uY2UgYWxsIGZvcm1zIGhhdmUgYmVlbiByZWNvdmVyZWRcbiAgICAgICAgICBpZiAoaSA9PT0gZm9ybXNUb1JlY292ZXIubGVuZ3RoIC0gMSkge1xuICAgICAgICAgICAgY2FsbGJhY2soKTtcbiAgICAgICAgICB9XG4gICAgICAgIH0sXG4gICAgICApO1xuICAgIH0pO1xuICB9XG5cbiAgZ2V0Q2hpbGRCeUlkKGlkKSB7XG4gICAgcmV0dXJuIHRoaXMucm9vdC5jaGlsZHJlblt0aGlzLmlkXVtpZF07XG4gIH1cblxuICBnZXREZXNjZW5kZW50QnlFbChlbCkge1xuICAgIGlmIChlbC5pZCA9PT0gdGhpcy5pZCkge1xuICAgICAgcmV0dXJuIHRoaXM7XG4gICAgfSBlbHNlIHtcbiAgICAgIHJldHVybiB0aGlzLmNoaWxkcmVuW2VsLmdldEF0dHJpYnV0ZShQSFhfUEFSRU5UX0lEKV0/LltlbC5pZF07XG4gICAgfVxuICB9XG5cbiAgZGVzdHJveURlc2NlbmRlbnQoaWQpIHtcbiAgICBmb3IgKGNvbnN0IHBhcmVudElkIGluIHRoaXMucm9vdC5jaGlsZHJlbikge1xuICAgICAgZm9yIChjb25zdCBjaGlsZElkIGluIHRoaXMucm9vdC5jaGlsZHJlbltwYXJlbnRJZF0pIHtcbiAgICAgICAgaWYgKGNoaWxkSWQgPT09IGlkKSB7XG4gICAgICAgICAgcmV0dXJuIHRoaXMucm9vdC5jaGlsZHJlbltwYXJlbnRJZF1bY2hpbGRJZF0uZGVzdHJveSgpO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfVxuICB9XG5cbiAgam9pbkNoaWxkKGVsKSB7XG4gICAgY29uc3QgY2hpbGQgPSB0aGlzLmdldENoaWxkQnlJZChlbC5pZCk7XG4gICAgaWYgKCFjaGlsZCkge1xuICAgICAgY29uc3QgdmlldyA9IG5ldyBWaWV3KGVsLCB0aGlzLmxpdmVTb2NrZXQsIHRoaXMpO1xuICAgICAgdGhpcy5yb290LmNoaWxkcmVuW3RoaXMuaWRdW3ZpZXcuaWRdID0gdmlldztcbiAgICAgIHZpZXcuam9pbigpO1xuICAgICAgdGhpcy5jaGlsZEpvaW5zKys7XG4gICAgICByZXR1cm4gdHJ1ZTtcbiAgICB9XG4gIH1cblxuICBpc0pvaW5QZW5kaW5nKCkge1xuICAgIHJldHVybiB0aGlzLmpvaW5QZW5kaW5nO1xuICB9XG5cbiAgYWNrSm9pbihfY2hpbGQpIHtcbiAgICB0aGlzLmNoaWxkSm9pbnMtLTtcblxuICAgIGlmICh0aGlzLmNoaWxkSm9pbnMgPT09IDApIHtcbiAgICAgIGlmICh0aGlzLnBhcmVudCkge1xuICAgICAgICB0aGlzLnBhcmVudC5hY2tKb2luKHRoaXMpO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgdGhpcy5vbkFsbENoaWxkSm9pbnNDb21wbGV0ZSgpO1xuICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIG9uQWxsQ2hpbGRKb2luc0NvbXBsZXRlKCkge1xuICAgIC8vIHdlIGNhbiBjbGVhciBwZW5kaW5nIGZvcm0gcmVjb3ZlcmllcyBub3cgdGhhdCB3ZSd2ZSBqb2luZWQuXG4gICAgLy8gVGhleSBlaXRoZXIgYWxsIHJlc29sdmVkIG9yIHdlcmUgYWJhbmRvbmVkXG4gICAgdGhpcy5wZW5kaW5nRm9ybXMuY2xlYXIoKTtcbiAgICAvLyB3ZSBjYW4gYWxzbyBjbGVhciB0aGUgZm9ybXNGb3JSZWNvdmVyeSBvYmplY3QgdG8gbm90IGtlZXAgb2xkIGZvcm0gZWxlbWVudHMgYXJvdW5kXG4gICAgdGhpcy5mb3Jtc0ZvclJlY292ZXJ5ID0ge307XG4gICAgdGhpcy5qb2luQ2FsbGJhY2soKCkgPT4ge1xuICAgICAgdGhpcy5wZW5kaW5nSm9pbk9wcy5mb3JFYWNoKChbdmlldywgb3BdKSA9PiB7XG4gICAgICAgIGlmICghdmlldy5pc0Rlc3Ryb3llZCgpKSB7XG4gICAgICAgICAgb3AoKTtcbiAgICAgICAgfVxuICAgICAgfSk7XG4gICAgICB0aGlzLnBlbmRpbmdKb2luT3BzID0gW107XG4gICAgfSk7XG4gIH1cblxuICB1cGRhdGUoZGlmZiwgZXZlbnRzLCBpc1BlbmRpbmcgPSBmYWxzZSkge1xuICAgIGlmIChcbiAgICAgIHRoaXMuaXNKb2luUGVuZGluZygpIHx8XG4gICAgICAodGhpcy5saXZlU29ja2V0Lmhhc1BlbmRpbmdMaW5rKCkgJiYgdGhpcy5yb290LmlzTWFpbigpKVxuICAgICkge1xuICAgICAgLy8gZG9uJ3QgbXV0YXRlIGlmIHRoaXMgaXMgYWxyZWFkeSBhIHBlbmRpbmcgZGlmZlxuICAgICAgaWYgKCFpc1BlbmRpbmcpIHtcbiAgICAgICAgdGhpcy5wZW5kaW5nRGlmZnMucHVzaCh7IGRpZmYsIGV2ZW50cyB9KTtcbiAgICAgIH1cbiAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9XG5cbiAgICB0aGlzLnJlbmRlcmVkLm1lcmdlRGlmZihkaWZmKTtcbiAgICBsZXQgcGh4Q2hpbGRyZW5BZGRlZCA9IGZhbHNlO1xuXG4gICAgLy8gV2hlbiB0aGUgZGlmZiBvbmx5IGNvbnRhaW5zIGNvbXBvbmVudCBkaWZmcywgdGhlbiB3YWxrIGNvbXBvbmVudHNcbiAgICAvLyBhbmQgcGF0Y2ggb25seSB0aGUgcGFyZW50IGNvbXBvbmVudCBjb250YWluZXJzIGZvdW5kIGluIHRoZSBkaWZmLlxuICAgIC8vIE90aGVyd2lzZSwgcGF0Y2ggZW50aXJlIExWIGNvbnRhaW5lci5cbiAgICBpZiAodGhpcy5yZW5kZXJlZC5pc0NvbXBvbmVudE9ubHlEaWZmKGRpZmYpKSB7XG4gICAgICB0aGlzLmxpdmVTb2NrZXQudGltZShcImNvbXBvbmVudCBwYXRjaCBjb21wbGV0ZVwiLCAoKSA9PiB7XG4gICAgICAgIGNvbnN0IHBhcmVudENpZHMgPSBET00uZmluZEV4aXN0aW5nUGFyZW50Q0lEcyhcbiAgICAgICAgICB0aGlzLmlkLFxuICAgICAgICAgIHRoaXMucmVuZGVyZWQuY29tcG9uZW50Q0lEcyhkaWZmKSxcbiAgICAgICAgKTtcbiAgICAgICAgcGFyZW50Q2lkcy5mb3JFYWNoKChwYXJlbnRDSUQpID0+IHtcbiAgICAgICAgICBpZiAoXG4gICAgICAgICAgICB0aGlzLmNvbXBvbmVudFBhdGNoKFxuICAgICAgICAgICAgICB0aGlzLnJlbmRlcmVkLmdldENvbXBvbmVudChkaWZmLCBwYXJlbnRDSUQpLFxuICAgICAgICAgICAgICBwYXJlbnRDSUQsXG4gICAgICAgICAgICApXG4gICAgICAgICAgKSB7XG4gICAgICAgICAgICBwaHhDaGlsZHJlbkFkZGVkID0gdHJ1ZTtcbiAgICAgICAgICB9XG4gICAgICAgIH0pO1xuICAgICAgfSk7XG4gICAgfSBlbHNlIGlmICghaXNFbXB0eShkaWZmKSkge1xuICAgICAgdGhpcy5saXZlU29ja2V0LnRpbWUoXCJmdWxsIHBhdGNoIGNvbXBsZXRlXCIsICgpID0+IHtcbiAgICAgICAgY29uc3QgW2h0bWwsIHN0cmVhbXNdID0gdGhpcy5yZW5kZXJDb250YWluZXIoZGlmZiwgXCJ1cGRhdGVcIik7XG4gICAgICAgIGNvbnN0IHBhdGNoID0gbmV3IERPTVBhdGNoKHRoaXMsIHRoaXMuZWwsIHRoaXMuaWQsIGh0bWwsIHN0cmVhbXMsIG51bGwpO1xuICAgICAgICBwaHhDaGlsZHJlbkFkZGVkID0gdGhpcy5wZXJmb3JtUGF0Y2gocGF0Y2gsIHRydWUpO1xuICAgICAgfSk7XG4gICAgfVxuXG4gICAgdGhpcy5saXZlU29ja2V0LmRpc3BhdGNoRXZlbnRzKGV2ZW50cyk7XG4gICAgaWYgKHBoeENoaWxkcmVuQWRkZWQpIHtcbiAgICAgIHRoaXMuam9pbk5ld0NoaWxkcmVuKCk7XG4gICAgfVxuXG4gICAgcmV0dXJuIHRydWU7XG4gIH1cblxuICByZW5kZXJDb250YWluZXIoZGlmZiwga2luZCkge1xuICAgIHJldHVybiB0aGlzLmxpdmVTb2NrZXQudGltZShgdG9TdHJpbmcgZGlmZiAoJHtraW5kfSlgLCAoKSA9PiB7XG4gICAgICBjb25zdCB0YWcgPSB0aGlzLmVsLnRhZ05hbWU7XG4gICAgICAvLyBEb24ndCBza2lwIGFueSBjb21wb25lbnQgaW4gdGhlIGRpZmYgbm9yIGFueSBtYXJrZWQgYXMgcHJ1bmVkXG4gICAgICAvLyAoYXMgdGhleSBtYXkgaGF2ZSBiZWVuIGFkZGVkIGJhY2spXG4gICAgICBjb25zdCBjaWRzID0gZGlmZiA/IHRoaXMucmVuZGVyZWQuY29tcG9uZW50Q0lEcyhkaWZmKSA6IG51bGw7XG4gICAgICBjb25zdCB7IGJ1ZmZlcjogaHRtbCwgc3RyZWFtcyB9ID0gdGhpcy5yZW5kZXJlZC50b1N0cmluZyhjaWRzKTtcbiAgICAgIHJldHVybiBbYDwke3RhZ30+JHtodG1sfTwvJHt0YWd9PmAsIHN0cmVhbXNdO1xuICAgIH0pO1xuICB9XG5cbiAgY29tcG9uZW50UGF0Y2goZGlmZiwgY2lkKSB7XG4gICAgaWYgKGlzRW1wdHkoZGlmZikpIHJldHVybiBmYWxzZTtcbiAgICBjb25zdCB7IGJ1ZmZlcjogaHRtbCwgc3RyZWFtcyB9ID0gdGhpcy5yZW5kZXJlZC5jb21wb25lbnRUb1N0cmluZyhjaWQpO1xuICAgIGNvbnN0IHBhdGNoID0gbmV3IERPTVBhdGNoKHRoaXMsIHRoaXMuZWwsIHRoaXMuaWQsIGh0bWwsIHN0cmVhbXMsIGNpZCk7XG4gICAgY29uc3QgY2hpbGRyZW5BZGRlZCA9IHRoaXMucGVyZm9ybVBhdGNoKHBhdGNoLCB0cnVlKTtcbiAgICByZXR1cm4gY2hpbGRyZW5BZGRlZDtcbiAgfVxuXG4gIGdldEhvb2soZWwpIHtcbiAgICByZXR1cm4gdGhpcy52aWV3SG9va3NbVmlld0hvb2suZWxlbWVudElEKGVsKV07XG4gIH1cblxuICBhZGRIb29rKGVsKSB7XG4gICAgY29uc3QgaG9va0VsSWQgPSBWaWV3SG9vay5lbGVtZW50SUQoZWwpO1xuXG4gICAgLy8gb25seSBldmVyIHRyeSB0byBhZGQgaG9va3MgdG8gZWxlbWVudHMgb3duZWQgYnkgdGhpcyB2aWV3XG4gICAgaWYgKGVsLmdldEF0dHJpYnV0ZSAmJiAhdGhpcy5vd25zRWxlbWVudChlbCkpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICBpZiAoaG9va0VsSWQgJiYgIXRoaXMudmlld0hvb2tzW2hvb2tFbElkXSkge1xuICAgICAgLy8gaG9vayBjcmVhdGVkLCBidXQgbm90IGF0dGFjaGVkIChjcmVhdGVIb29rIGZvciB3ZWIgY29tcG9uZW50KVxuICAgICAgY29uc3QgaG9vayA9XG4gICAgICAgIERPTS5nZXRDdXN0b21FbEhvb2soZWwpIHx8XG4gICAgICAgIGxvZ0Vycm9yKGBubyBob29rIGZvdW5kIGZvciBjdXN0b20gZWxlbWVudDogJHtlbC5pZH1gKTtcbiAgICAgIHRoaXMudmlld0hvb2tzW2hvb2tFbElkXSA9IGhvb2s7XG4gICAgICBob29rLl9fYXR0YWNoVmlldyh0aGlzKTtcbiAgICAgIHJldHVybiBob29rO1xuICAgIH0gZWxzZSBpZiAoaG9va0VsSWQgfHwgIWVsLmdldEF0dHJpYnV0ZSkge1xuICAgICAgLy8gbm8gaG9vayBmb3VuZFxuICAgICAgcmV0dXJuO1xuICAgIH0gZWxzZSB7XG4gICAgICAvLyBuZXcgaG9vayBmb3VuZCB3aXRoIHBoeC1ob29rIGF0dHJpYnV0ZVxuICAgICAgY29uc3QgaG9va05hbWUgPVxuICAgICAgICBlbC5nZXRBdHRyaWJ1dGUoYGRhdGEtcGh4LSR7UEhYX0hPT0t9YCkgfHxcbiAgICAgICAgZWwuZ2V0QXR0cmlidXRlKHRoaXMuYmluZGluZyhQSFhfSE9PSykpO1xuXG4gICAgICBpZiAoIWhvb2tOYW1lKSB7XG4gICAgICAgIHJldHVybjtcbiAgICAgIH1cblxuICAgICAgY29uc3QgaG9va0RlZmluaXRpb24gPSB0aGlzLmxpdmVTb2NrZXQuZ2V0SG9va0RlZmluaXRpb24oaG9va05hbWUpO1xuXG4gICAgICBpZiAoaG9va0RlZmluaXRpb24pIHtcbiAgICAgICAgaWYgKCFlbC5pZCkge1xuICAgICAgICAgIGxvZ0Vycm9yKFxuICAgICAgICAgICAgYG5vIERPTSBJRCBmb3IgaG9vayBcIiR7aG9va05hbWV9XCIuIEhvb2tzIHJlcXVpcmUgYSB1bmlxdWUgSUQgb24gZWFjaCBlbGVtZW50LmAsXG4gICAgICAgICAgICBlbCxcbiAgICAgICAgICApO1xuICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuXG4gICAgICAgIGxldCBob29rSW5zdGFuY2U7XG4gICAgICAgIHRyeSB7XG4gICAgICAgICAgaWYgKFxuICAgICAgICAgICAgdHlwZW9mIGhvb2tEZWZpbml0aW9uID09PSBcImZ1bmN0aW9uXCIgJiZcbiAgICAgICAgICAgIGhvb2tEZWZpbml0aW9uLnByb3RvdHlwZSBpbnN0YW5jZW9mIFZpZXdIb29rXG4gICAgICAgICAgKSB7XG4gICAgICAgICAgICAvLyBJdCdzIGEgY2xhc3MgY29uc3RydWN0b3IgKHN1YmNsYXNzIG9mIFZpZXdIb29rKVxuICAgICAgICAgICAgaG9va0luc3RhbmNlID0gbmV3IGhvb2tEZWZpbml0aW9uKHRoaXMsIGVsKTsgLy8gYHRoaXNgIGlzIHRoZSBWaWV3IGluc3RhbmNlXG4gICAgICAgICAgfSBlbHNlIGlmIChcbiAgICAgICAgICAgIHR5cGVvZiBob29rRGVmaW5pdGlvbiA9PT0gXCJvYmplY3RcIiAmJlxuICAgICAgICAgICAgaG9va0RlZmluaXRpb24gIT09IG51bGxcbiAgICAgICAgICApIHtcbiAgICAgICAgICAgIC8vIEl0J3MgYW4gb2JqZWN0IGxpdGVyYWwsIHBhc3MgaXQgdG8gdGhlIFZpZXdIb29rIGNvbnN0cnVjdG9yIGZvciB3cmFwcGluZ1xuICAgICAgICAgICAgaG9va0luc3RhbmNlID0gbmV3IFZpZXdIb29rKHRoaXMsIGVsLCBob29rRGVmaW5pdGlvbik7XG4gICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIGxvZ0Vycm9yKFxuICAgICAgICAgICAgICBgSW52YWxpZCBob29rIGRlZmluaXRpb24gZm9yIFwiJHtob29rTmFtZX1cIi4gRXhwZWN0ZWQgYSBjbGFzcyBleHRlbmRpbmcgVmlld0hvb2sgb3IgYW4gb2JqZWN0IGRlZmluaXRpb24uYCxcbiAgICAgICAgICAgICAgZWwsXG4gICAgICAgICAgICApO1xuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICAgIH1cbiAgICAgICAgfSBjYXRjaCAoZSkge1xuICAgICAgICAgIGNvbnN0IGVycm9yTWVzc2FnZSA9IGUgaW5zdGFuY2VvZiBFcnJvciA/IGUubWVzc2FnZSA6IFN0cmluZyhlKTtcbiAgICAgICAgICBsb2dFcnJvcihgRmFpbGVkIHRvIGNyZWF0ZSBob29rIFwiJHtob29rTmFtZX1cIjogJHtlcnJvck1lc3NhZ2V9YCwgZWwpO1xuICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuXG4gICAgICAgIHRoaXMudmlld0hvb2tzW1ZpZXdIb29rLmVsZW1lbnRJRChob29rSW5zdGFuY2UuZWwpXSA9IGhvb2tJbnN0YW5jZTtcbiAgICAgICAgcmV0dXJuIGhvb2tJbnN0YW5jZTtcbiAgICAgIH0gZWxzZSBpZiAoaG9va05hbWUgIT09IG51bGwpIHtcbiAgICAgICAgbG9nRXJyb3IoYHVua25vd24gaG9vayBmb3VuZCBmb3IgXCIke2hvb2tOYW1lfVwiYCwgZWwpO1xuICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIGRlc3Ryb3lIb29rKGhvb2spIHtcbiAgICAvLyBfX2Rlc3Ryb3llZCBjbGVhcnMgdGhlIGVsZW1lbnRJRCBmcm9tIHRoZSBob29rLCB0aGVyZWZvcmVcbiAgICAvLyB3ZSBuZWVkIHRvIGdldCBpdCBiZWZvcmUgY2FsbGluZyBfX2Rlc3Ryb3llZFxuICAgIGNvbnN0IGhvb2tJZCA9IFZpZXdIb29rLmVsZW1lbnRJRChob29rLmVsKTtcbiAgICBob29rLl9fZGVzdHJveWVkKCk7XG4gICAgaG9vay5fX2NsZWFudXBfXygpO1xuICAgIGRlbGV0ZSB0aGlzLnZpZXdIb29rc1tob29rSWRdO1xuICB9XG5cbiAgYXBwbHlQZW5kaW5nVXBkYXRlcygpIHtcbiAgICAvLyBUbyBwcmV2ZW50IHJhY2UgY29uZGl0aW9ucyB3aGVyZSB3ZSBtaWdodCBzdGlsbCBiZSBwZW5kaW5nIGEgbmV3XG4gICAgLy8gbmF2aWdhdGlvbiBvciB0aGUgam9pbiBpcyBzdGlsbCBwZW5kaW5nLCBgdGhpcy51cGRhdGVgIHJldHVybnMgZmFsc2VcbiAgICAvLyBpZiB0aGUgZGlmZiB3YXMgbm90IGFwcGxpZWQuXG4gICAgdGhpcy5wZW5kaW5nRGlmZnMgPSB0aGlzLnBlbmRpbmdEaWZmcy5maWx0ZXIoXG4gICAgICAoeyBkaWZmLCBldmVudHMgfSkgPT4gIXRoaXMudXBkYXRlKGRpZmYsIGV2ZW50cywgdHJ1ZSksXG4gICAgKTtcbiAgICB0aGlzLmVhY2hDaGlsZCgoY2hpbGQpID0+IGNoaWxkLmFwcGx5UGVuZGluZ1VwZGF0ZXMoKSk7XG4gIH1cblxuICBlYWNoQ2hpbGQoY2FsbGJhY2spIHtcbiAgICBjb25zdCBjaGlsZHJlbiA9IHRoaXMucm9vdC5jaGlsZHJlblt0aGlzLmlkXSB8fCB7fTtcbiAgICBmb3IgKGNvbnN0IGlkIGluIGNoaWxkcmVuKSB7XG4gICAgICBjYWxsYmFjayh0aGlzLmdldENoaWxkQnlJZChpZCkpO1xuICAgIH1cbiAgfVxuXG4gIG9uQ2hhbm5lbChldmVudCwgY2IpIHtcbiAgICB0aGlzLmxpdmVTb2NrZXQub25DaGFubmVsKHRoaXMuY2hhbm5lbCwgZXZlbnQsIChyZXNwKSA9PiB7XG4gICAgICBpZiAodGhpcy5pc0pvaW5QZW5kaW5nKCkpIHtcbiAgICAgICAgLy8gaW4gY2FzZSB0aGlzIGlzIGEgcmVqb2luIChqb2luQ291bnQgPiAxKSB3ZSBzdG9yZSBvdXIgb3duIGpvaW4gb3BzXG4gICAgICAgIGlmICh0aGlzLmpvaW5Db3VudCA+IDEpIHtcbiAgICAgICAgICB0aGlzLnBlbmRpbmdKb2luT3BzLnB1c2goKCkgPT4gY2IocmVzcCkpO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIHRoaXMucm9vdC5wZW5kaW5nSm9pbk9wcy5wdXNoKFt0aGlzLCAoKSA9PiBjYihyZXNwKV0pO1xuICAgICAgICB9XG4gICAgICB9IGVsc2Uge1xuICAgICAgICB0aGlzLmxpdmVTb2NrZXQucmVxdWVzdERPTVVwZGF0ZSgoKSA9PiBjYihyZXNwKSk7XG4gICAgICB9XG4gICAgfSk7XG4gIH1cblxuICBiaW5kQ2hhbm5lbCgpIHtcbiAgICAvLyBUaGUgZGlmZiBldmVudCBzaG91bGQgYmUgaGFuZGxlZCBieSB0aGUgcmVndWxhciB1cGRhdGUgb3BlcmF0aW9ucy5cbiAgICAvLyBBbGwgb3RoZXIgb3BlcmF0aW9ucyBhcmUgcXVldWVkIHRvIGJlIGFwcGxpZWQgb25seSBhZnRlciBqb2luLlxuICAgIHRoaXMubGl2ZVNvY2tldC5vbkNoYW5uZWwodGhpcy5jaGFubmVsLCBcImRpZmZcIiwgKHJhd0RpZmYpID0+IHtcbiAgICAgIHRoaXMubGl2ZVNvY2tldC5yZXF1ZXN0RE9NVXBkYXRlKCgpID0+IHtcbiAgICAgICAgdGhpcy5hcHBseURpZmYoXCJ1cGRhdGVcIiwgcmF3RGlmZiwgKHsgZGlmZiwgZXZlbnRzIH0pID0+XG4gICAgICAgICAgdGhpcy51cGRhdGUoZGlmZiwgZXZlbnRzKSxcbiAgICAgICAgKTtcbiAgICAgIH0pO1xuICAgIH0pO1xuICAgIHRoaXMub25DaGFubmVsKFwicmVkaXJlY3RcIiwgKHsgdG8sIGZsYXNoIH0pID0+XG4gICAgICB0aGlzLm9uUmVkaXJlY3QoeyB0bywgZmxhc2ggfSksXG4gICAgKTtcbiAgICB0aGlzLm9uQ2hhbm5lbChcImxpdmVfcGF0Y2hcIiwgKHJlZGlyKSA9PiB0aGlzLm9uTGl2ZVBhdGNoKHJlZGlyKSk7XG4gICAgdGhpcy5vbkNoYW5uZWwoXCJsaXZlX3JlZGlyZWN0XCIsIChyZWRpcikgPT4gdGhpcy5vbkxpdmVSZWRpcmVjdChyZWRpcikpO1xuICAgIHRoaXMuY2hhbm5lbC5vbkVycm9yKChyZWFzb24pID0+IHRoaXMub25FcnJvcihyZWFzb24pKTtcbiAgICB0aGlzLmNoYW5uZWwub25DbG9zZSgocmVhc29uKSA9PiB0aGlzLm9uQ2xvc2UocmVhc29uKSk7XG4gIH1cblxuICBkZXN0cm95QWxsQ2hpbGRyZW4oKSB7XG4gICAgdGhpcy5lYWNoQ2hpbGQoKGNoaWxkKSA9PiBjaGlsZC5kZXN0cm95KCkpO1xuICB9XG5cbiAgb25MaXZlUmVkaXJlY3QocmVkaXIpIHtcbiAgICBjb25zdCB7IHRvLCBraW5kLCBmbGFzaCB9ID0gcmVkaXI7XG4gICAgY29uc3QgdXJsID0gdGhpcy5leHBhbmRVUkwodG8pO1xuICAgIGNvbnN0IGUgPSBuZXcgQ3VzdG9tRXZlbnQoXCJwaHg6c2VydmVyLW5hdmlnYXRlXCIsIHtcbiAgICAgIGRldGFpbDogeyB0bywga2luZCwgZmxhc2ggfSxcbiAgICB9KTtcbiAgICB0aGlzLmxpdmVTb2NrZXQuaGlzdG9yeVJlZGlyZWN0KGUsIHVybCwga2luZCwgZmxhc2gpO1xuICB9XG5cbiAgb25MaXZlUGF0Y2gocmVkaXIpIHtcbiAgICBjb25zdCB7IHRvLCBraW5kIH0gPSByZWRpcjtcbiAgICB0aGlzLmhyZWYgPSB0aGlzLmV4cGFuZFVSTCh0byk7XG4gICAgdGhpcy5saXZlU29ja2V0Lmhpc3RvcnlQYXRjaCh0bywga2luZCk7XG4gIH1cblxuICBleHBhbmRVUkwodG8pIHtcbiAgICByZXR1cm4gdG8uc3RhcnRzV2l0aChcIi9cIilcbiAgICAgID8gYCR7d2luZG93LmxvY2F0aW9uLnByb3RvY29sfS8vJHt3aW5kb3cubG9jYXRpb24uaG9zdH0ke3RvfWBcbiAgICAgIDogdG87XG4gIH1cblxuICAvKipcbiAgICogQHBhcmFtIHt7dG86IHN0cmluZywgZmxhc2g/OiBzdHJpbmcsIHJlbG9hZFRva2VuPzogc3RyaW5nfX0gcmVkaXJlY3RcbiAgICovXG4gIG9uUmVkaXJlY3QoeyB0bywgZmxhc2gsIHJlbG9hZFRva2VuIH0pIHtcbiAgICB0aGlzLmxpdmVTb2NrZXQucmVkaXJlY3QodG8sIGZsYXNoLCByZWxvYWRUb2tlbik7XG4gIH1cblxuICBpc0Rlc3Ryb3llZCgpIHtcbiAgICByZXR1cm4gdGhpcy5kZXN0cm95ZWQ7XG4gIH1cblxuICBqb2luRGVhZCgpIHtcbiAgICB0aGlzLmlzRGVhZCA9IHRydWU7XG4gIH1cblxuICBqb2luUHVzaCgpIHtcbiAgICB0aGlzLmpvaW5QdXNoID0gdGhpcy5qb2luUHVzaCB8fCB0aGlzLmNoYW5uZWwuam9pbigpO1xuICAgIHJldHVybiB0aGlzLmpvaW5QdXNoO1xuICB9XG5cbiAgam9pbihjYWxsYmFjaykge1xuICAgIHRoaXMuc2hvd0xvYWRlcih0aGlzLmxpdmVTb2NrZXQubG9hZGVyVGltZW91dCk7XG4gICAgdGhpcy5iaW5kQ2hhbm5lbCgpO1xuICAgIGlmICh0aGlzLmlzTWFpbigpKSB7XG4gICAgICB0aGlzLnN0b3BDYWxsYmFjayA9IHRoaXMubGl2ZVNvY2tldC53aXRoUGFnZUxvYWRpbmcoe1xuICAgICAgICB0bzogdGhpcy5ocmVmLFxuICAgICAgICBraW5kOiBcImluaXRpYWxcIixcbiAgICAgIH0pO1xuICAgIH1cbiAgICB0aGlzLmpvaW5DYWxsYmFjayA9IChvbkRvbmUpID0+IHtcbiAgICAgIG9uRG9uZSA9IG9uRG9uZSB8fCBmdW5jdGlvbiAoKSB7fTtcbiAgICAgIGNhbGxiYWNrID8gY2FsbGJhY2sodGhpcy5qb2luQ291bnQsIG9uRG9uZSkgOiBvbkRvbmUoKTtcbiAgICB9O1xuXG4gICAgdGhpcy53cmFwUHVzaCgoKSA9PiB0aGlzLmNoYW5uZWwuam9pbigpLCB7XG4gICAgICBvazogKHJlc3ApID0+IHRoaXMubGl2ZVNvY2tldC5yZXF1ZXN0RE9NVXBkYXRlKCgpID0+IHRoaXMub25Kb2luKHJlc3ApKSxcbiAgICAgIGVycm9yOiAoZXJyb3IpID0+IHRoaXMub25Kb2luRXJyb3IoZXJyb3IpLFxuICAgICAgdGltZW91dDogKCkgPT4gdGhpcy5vbkpvaW5FcnJvcih7IHJlYXNvbjogXCJ0aW1lb3V0XCIgfSksXG4gICAgfSk7XG4gIH1cblxuICBvbkpvaW5FcnJvcihyZXNwKSB7XG4gICAgaWYgKHJlc3AucmVhc29uID09PSBcInJlbG9hZFwiKSB7XG4gICAgICB0aGlzLmxvZyhcImVycm9yXCIsICgpID0+IFtcbiAgICAgICAgYGZhaWxlZCBtb3VudCB3aXRoICR7cmVzcC5zdGF0dXN9LiBGYWxsaW5nIGJhY2sgdG8gcGFnZSByZWxvYWRgLFxuICAgICAgICByZXNwLFxuICAgICAgXSk7XG4gICAgICB0aGlzLm9uUmVkaXJlY3QoeyB0bzogdGhpcy5yb290LmhyZWYsIHJlbG9hZFRva2VuOiByZXNwLnRva2VuIH0pO1xuICAgICAgcmV0dXJuO1xuICAgIH0gZWxzZSBpZiAocmVzcC5yZWFzb24gPT09IFwidW5hdXRob3JpemVkXCIgfHwgcmVzcC5yZWFzb24gPT09IFwic3RhbGVcIikge1xuICAgICAgdGhpcy5sb2coXCJlcnJvclwiLCAoKSA9PiBbXG4gICAgICAgIFwidW5hdXRob3JpemVkIGxpdmVfcmVkaXJlY3QuIEZhbGxpbmcgYmFjayB0byBwYWdlIHJlcXVlc3RcIixcbiAgICAgICAgcmVzcCxcbiAgICAgIF0pO1xuICAgICAgdGhpcy5vblJlZGlyZWN0KHsgdG86IHRoaXMucm9vdC5ocmVmLCBmbGFzaDogdGhpcy5mbGFzaCB9KTtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgaWYgKHJlc3AucmVkaXJlY3QgfHwgcmVzcC5saXZlX3JlZGlyZWN0KSB7XG4gICAgICB0aGlzLmpvaW5QZW5kaW5nID0gZmFsc2U7XG4gICAgICB0aGlzLmNoYW5uZWwubGVhdmUoKTtcbiAgICB9XG4gICAgaWYgKHJlc3AucmVkaXJlY3QpIHtcbiAgICAgIHJldHVybiB0aGlzLm9uUmVkaXJlY3QocmVzcC5yZWRpcmVjdCk7XG4gICAgfVxuICAgIGlmIChyZXNwLmxpdmVfcmVkaXJlY3QpIHtcbiAgICAgIHJldHVybiB0aGlzLm9uTGl2ZVJlZGlyZWN0KHJlc3AubGl2ZV9yZWRpcmVjdCk7XG4gICAgfVxuICAgIHRoaXMubG9nKFwiZXJyb3JcIiwgKCkgPT4gW1widW5hYmxlIHRvIGpvaW5cIiwgcmVzcF0pO1xuICAgIGlmICh0aGlzLmlzTWFpbigpKSB7XG4gICAgICB0aGlzLmRpc3BsYXlFcnJvcihcbiAgICAgICAgW1BIWF9MT0FESU5HX0NMQVNTLCBQSFhfRVJST1JfQ0xBU1MsIFBIWF9TRVJWRVJfRVJST1JfQ0xBU1NdLFxuICAgICAgICB7IHVuc3RydWN0dXJlZEVycm9yOiByZXNwLCBlcnJvcktpbmQ6IFwic2VydmVyXCIgfSxcbiAgICAgICk7XG4gICAgICBpZiAodGhpcy5saXZlU29ja2V0LmlzQ29ubmVjdGVkKCkpIHtcbiAgICAgICAgdGhpcy5saXZlU29ja2V0LnJlbG9hZFdpdGhKaXR0ZXIodGhpcyk7XG4gICAgICB9XG4gICAgfSBlbHNlIHtcbiAgICAgIGlmICh0aGlzLmpvaW5BdHRlbXB0cyA+PSBNQVhfQ0hJTERfSk9JTl9BVFRFTVBUUykge1xuICAgICAgICAvLyBwdXQgdGhlIHJvb3QgcmV2aWV3IGludG8gcGVybWFuZW50IGVycm9yIHN0YXRlLCBidXQgZG9uJ3QgZGVzdHJveSBpdCBhcyBpdCBjYW4gcmVtYWluIGFjdGl2ZVxuICAgICAgICB0aGlzLnJvb3QuZGlzcGxheUVycm9yKFxuICAgICAgICAgIFtQSFhfTE9BRElOR19DTEFTUywgUEhYX0VSUk9SX0NMQVNTLCBQSFhfU0VSVkVSX0VSUk9SX0NMQVNTXSxcbiAgICAgICAgICB7IHVuc3RydWN0dXJlZEVycm9yOiByZXNwLCBlcnJvcktpbmQ6IFwic2VydmVyXCIgfSxcbiAgICAgICAgKTtcbiAgICAgICAgdGhpcy5sb2coXCJlcnJvclwiLCAoKSA9PiBbXG4gICAgICAgICAgYGdpdmluZyB1cCB0cnlpbmcgdG8gbW91bnQgYWZ0ZXIgJHtNQVhfQ0hJTERfSk9JTl9BVFRFTVBUU30gdHJpZXNgLFxuICAgICAgICAgIHJlc3AsXG4gICAgICAgIF0pO1xuICAgICAgICB0aGlzLmRlc3Ryb3koKTtcbiAgICAgIH1cbiAgICAgIGNvbnN0IHRydWVDaGlsZEVsID0gRE9NLmJ5SWQodGhpcy5lbC5pZCk7XG4gICAgICBpZiAodHJ1ZUNoaWxkRWwpIHtcbiAgICAgICAgRE9NLm1lcmdlQXR0cnModHJ1ZUNoaWxkRWwsIHRoaXMuZWwpO1xuICAgICAgICB0aGlzLmRpc3BsYXlFcnJvcihcbiAgICAgICAgICBbUEhYX0xPQURJTkdfQ0xBU1MsIFBIWF9FUlJPUl9DTEFTUywgUEhYX1NFUlZFUl9FUlJPUl9DTEFTU10sXG4gICAgICAgICAgeyB1bnN0cnVjdHVyZWRFcnJvcjogcmVzcCwgZXJyb3JLaW5kOiBcInNlcnZlclwiIH0sXG4gICAgICAgICk7XG4gICAgICAgIHRoaXMuZWwgPSB0cnVlQ2hpbGRFbDtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHRoaXMuZGVzdHJveSgpO1xuICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIG9uQ2xvc2UocmVhc29uKSB7XG4gICAgaWYgKHRoaXMuaXNEZXN0cm95ZWQoKSkge1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICBpZiAoXG4gICAgICB0aGlzLmlzTWFpbigpICYmXG4gICAgICB0aGlzLmxpdmVTb2NrZXQuaGFzUGVuZGluZ0xpbmsoKSAmJlxuICAgICAgcmVhc29uICE9PSBcImxlYXZlXCJcbiAgICApIHtcbiAgICAgIHJldHVybiB0aGlzLmxpdmVTb2NrZXQucmVsb2FkV2l0aEppdHRlcih0aGlzKTtcbiAgICB9XG4gICAgdGhpcy5kZXN0cm95QWxsQ2hpbGRyZW4oKTtcbiAgICB0aGlzLmxpdmVTb2NrZXQuZHJvcEFjdGl2ZUVsZW1lbnQodGhpcyk7XG4gICAgaWYgKHRoaXMubGl2ZVNvY2tldC5pc1VubG9hZGVkKCkpIHtcbiAgICAgIHRoaXMuc2hvd0xvYWRlcihCRUZPUkVfVU5MT0FEX0xPQURFUl9USU1FT1VUKTtcbiAgICB9XG4gIH1cblxuICBvbkVycm9yKHJlYXNvbikge1xuICAgIHRoaXMub25DbG9zZShyZWFzb24pO1xuICAgIGlmICh0aGlzLmxpdmVTb2NrZXQuaXNDb25uZWN0ZWQoKSkge1xuICAgICAgdGhpcy5sb2coXCJlcnJvclwiLCAoKSA9PiBbXCJ2aWV3IGNyYXNoZWRcIiwgcmVhc29uXSk7XG4gICAgfVxuICAgIGlmICghdGhpcy5saXZlU29ja2V0LmlzVW5sb2FkZWQoKSkge1xuICAgICAgaWYgKHRoaXMubGl2ZVNvY2tldC5pc0Nvbm5lY3RlZCgpKSB7XG4gICAgICAgIHRoaXMuZGlzcGxheUVycm9yKFxuICAgICAgICAgIFtQSFhfTE9BRElOR19DTEFTUywgUEhYX0VSUk9SX0NMQVNTLCBQSFhfU0VSVkVSX0VSUk9SX0NMQVNTXSxcbiAgICAgICAgICB7IHVuc3RydWN0dXJlZEVycm9yOiByZWFzb24sIGVycm9yS2luZDogXCJzZXJ2ZXJcIiB9LFxuICAgICAgICApO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgdGhpcy5kaXNwbGF5RXJyb3IoXG4gICAgICAgICAgW1BIWF9MT0FESU5HX0NMQVNTLCBQSFhfRVJST1JfQ0xBU1MsIFBIWF9DTElFTlRfRVJST1JfQ0xBU1NdLFxuICAgICAgICAgIHsgdW5zdHJ1Y3R1cmVkRXJyb3I6IHJlYXNvbiwgZXJyb3JLaW5kOiBcImNsaWVudFwiIH0sXG4gICAgICAgICk7XG4gICAgICB9XG4gICAgfVxuICB9XG5cbiAgZGlzcGxheUVycm9yKGNsYXNzZXMsIGRldGFpbHMgPSB7fSkge1xuICAgIGlmICh0aGlzLmlzTWFpbigpKSB7XG4gICAgICBET00uZGlzcGF0Y2hFdmVudCh3aW5kb3csIFwicGh4OnBhZ2UtbG9hZGluZy1zdGFydFwiLCB7XG4gICAgICAgIGRldGFpbDogeyB0bzogdGhpcy5ocmVmLCBraW5kOiBcImVycm9yXCIsIC4uLmRldGFpbHMgfSxcbiAgICAgIH0pO1xuICAgIH1cbiAgICB0aGlzLnNob3dMb2FkZXIoKTtcbiAgICB0aGlzLnNldENvbnRhaW5lckNsYXNzZXMoLi4uY2xhc3Nlcyk7XG4gICAgdGhpcy5kZWxheWVkRGlzY29ubmVjdGVkKCk7XG4gIH1cblxuICBkZWxheWVkRGlzY29ubmVjdGVkKCkge1xuICAgIHRoaXMuZGlzY29ubmVjdGVkVGltZXIgPSBzZXRUaW1lb3V0KCgpID0+IHtcbiAgICAgIHRoaXMuZXhlY0FsbCh0aGlzLmJpbmRpbmcoXCJkaXNjb25uZWN0ZWRcIikpO1xuICAgIH0sIHRoaXMubGl2ZVNvY2tldC5kaXNjb25uZWN0ZWRUaW1lb3V0KTtcbiAgfVxuXG4gIHdyYXBQdXNoKGNhbGxlclB1c2gsIHJlY2VpdmVzKSB7XG4gICAgY29uc3QgbGF0ZW5jeSA9IHRoaXMubGl2ZVNvY2tldC5nZXRMYXRlbmN5U2ltKCk7XG4gICAgY29uc3Qgd2l0aExhdGVuY3kgPSBsYXRlbmN5XG4gICAgICA/IChjYikgPT4gc2V0VGltZW91dCgoKSA9PiAhdGhpcy5pc0Rlc3Ryb3llZCgpICYmIGNiKCksIGxhdGVuY3kpXG4gICAgICA6IChjYikgPT4gIXRoaXMuaXNEZXN0cm95ZWQoKSAmJiBjYigpO1xuXG4gICAgd2l0aExhdGVuY3koKCkgPT4ge1xuICAgICAgY2FsbGVyUHVzaCgpXG4gICAgICAgIC5yZWNlaXZlKFwib2tcIiwgKHJlc3ApID0+XG4gICAgICAgICAgd2l0aExhdGVuY3koKCkgPT4gcmVjZWl2ZXMub2sgJiYgcmVjZWl2ZXMub2socmVzcCkpLFxuICAgICAgICApXG4gICAgICAgIC5yZWNlaXZlKFwiZXJyb3JcIiwgKHJlYXNvbikgPT5cbiAgICAgICAgICB3aXRoTGF0ZW5jeSgoKSA9PiByZWNlaXZlcy5lcnJvciAmJiByZWNlaXZlcy5lcnJvcihyZWFzb24pKSxcbiAgICAgICAgKVxuICAgICAgICAucmVjZWl2ZShcInRpbWVvdXRcIiwgKCkgPT5cbiAgICAgICAgICB3aXRoTGF0ZW5jeSgoKSA9PiByZWNlaXZlcy50aW1lb3V0ICYmIHJlY2VpdmVzLnRpbWVvdXQoKSksXG4gICAgICAgICk7XG4gICAgfSk7XG4gIH1cblxuICBwdXNoV2l0aFJlcGx5KHJlZkdlbmVyYXRvciwgZXZlbnQsIHBheWxvYWQpIHtcbiAgICBpZiAoIXRoaXMuaXNDb25uZWN0ZWQoKSkge1xuICAgICAgcmV0dXJuIFByb21pc2UucmVqZWN0KG5ldyBFcnJvcihcIm5vIGNvbm5lY3Rpb25cIikpO1xuICAgIH1cblxuICAgIGNvbnN0IFtyZWYsIFtlbF0sIG9wdHNdID0gcmVmR2VuZXJhdG9yXG4gICAgICA/IHJlZkdlbmVyYXRvcih7IHBheWxvYWQgfSlcbiAgICAgIDogW251bGwsIFtdLCB7fV07XG4gICAgY29uc3Qgb2xkSm9pbkNvdW50ID0gdGhpcy5qb2luQ291bnQ7XG4gICAgbGV0IG9uTG9hZGluZ0RvbmUgPSBmdW5jdGlvbiAoKSB7fTtcbiAgICBpZiAob3B0cy5wYWdlX2xvYWRpbmcpIHtcbiAgICAgIG9uTG9hZGluZ0RvbmUgPSB0aGlzLmxpdmVTb2NrZXQud2l0aFBhZ2VMb2FkaW5nKHtcbiAgICAgICAga2luZDogXCJlbGVtZW50XCIsXG4gICAgICAgIHRhcmdldDogZWwsXG4gICAgICB9KTtcbiAgICB9XG5cbiAgICBpZiAodHlwZW9mIHBheWxvYWQuY2lkICE9PSBcIm51bWJlclwiKSB7XG4gICAgICBkZWxldGUgcGF5bG9hZC5jaWQ7XG4gICAgfVxuXG4gICAgcmV0dXJuIG5ldyBQcm9taXNlKChyZXNvbHZlLCByZWplY3QpID0+IHtcbiAgICAgIHRoaXMud3JhcFB1c2goKCkgPT4gdGhpcy5jaGFubmVsLnB1c2goZXZlbnQsIHBheWxvYWQsIFBVU0hfVElNRU9VVCksIHtcbiAgICAgICAgb2s6IChyZXNwKSA9PiB7XG4gICAgICAgICAgaWYgKHJlZiAhPT0gbnVsbCkge1xuICAgICAgICAgICAgdGhpcy5sYXN0QWNrUmVmID0gcmVmO1xuICAgICAgICAgIH1cbiAgICAgICAgICBjb25zdCBmaW5pc2ggPSAoaG9va1JlcGx5KSA9PiB7XG4gICAgICAgICAgICBpZiAocmVzcC5yZWRpcmVjdCkge1xuICAgICAgICAgICAgICB0aGlzLm9uUmVkaXJlY3QocmVzcC5yZWRpcmVjdCk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBpZiAocmVzcC5saXZlX3BhdGNoKSB7XG4gICAgICAgICAgICAgIHRoaXMub25MaXZlUGF0Y2gocmVzcC5saXZlX3BhdGNoKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGlmIChyZXNwLmxpdmVfcmVkaXJlY3QpIHtcbiAgICAgICAgICAgICAgdGhpcy5vbkxpdmVSZWRpcmVjdChyZXNwLmxpdmVfcmVkaXJlY3QpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgb25Mb2FkaW5nRG9uZSgpO1xuICAgICAgICAgICAgcmVzb2x2ZSh7IHJlc3A6IHJlc3AsIHJlcGx5OiBob29rUmVwbHksIHJlZiB9KTtcbiAgICAgICAgICB9O1xuICAgICAgICAgIGlmIChyZXNwLmRpZmYpIHtcbiAgICAgICAgICAgIHRoaXMubGl2ZVNvY2tldC5yZXF1ZXN0RE9NVXBkYXRlKCgpID0+IHtcbiAgICAgICAgICAgICAgdGhpcy5hcHBseURpZmYoXCJ1cGRhdGVcIiwgcmVzcC5kaWZmLCAoeyBkaWZmLCByZXBseSwgZXZlbnRzIH0pID0+IHtcbiAgICAgICAgICAgICAgICBpZiAocmVmICE9PSBudWxsKSB7XG4gICAgICAgICAgICAgICAgICB0aGlzLnVuZG9SZWZzKHJlZiwgcGF5bG9hZC5ldmVudCk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIHRoaXMudXBkYXRlKGRpZmYsIGV2ZW50cyk7XG4gICAgICAgICAgICAgICAgZmluaXNoKHJlcGx5KTtcbiAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICB9KTtcbiAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgaWYgKHJlZiAhPT0gbnVsbCkge1xuICAgICAgICAgICAgICB0aGlzLnVuZG9SZWZzKHJlZiwgcGF5bG9hZC5ldmVudCk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBmaW5pc2gobnVsbCk7XG4gICAgICAgICAgfVxuICAgICAgICB9LFxuICAgICAgICBlcnJvcjogKHJlYXNvbikgPT5cbiAgICAgICAgICByZWplY3QobmV3IEVycm9yKGBmYWlsZWQgd2l0aCByZWFzb246ICR7SlNPTi5zdHJpbmdpZnkocmVhc29uKX1gKSksXG4gICAgICAgIHRpbWVvdXQ6ICgpID0+IHtcbiAgICAgICAgICByZWplY3QobmV3IEVycm9yKFwidGltZW91dFwiKSk7XG4gICAgICAgICAgaWYgKHRoaXMuam9pbkNvdW50ID09PSBvbGRKb2luQ291bnQpIHtcbiAgICAgICAgICAgIHRoaXMubGl2ZVNvY2tldC5yZWxvYWRXaXRoSml0dGVyKHRoaXMsICgpID0+IHtcbiAgICAgICAgICAgICAgdGhpcy5sb2coXCJ0aW1lb3V0XCIsICgpID0+IFtcbiAgICAgICAgICAgICAgICBcInJlY2VpdmVkIHRpbWVvdXQgd2hpbGUgY29tbXVuaWNhdGluZyB3aXRoIHNlcnZlci4gRmFsbGluZyBiYWNrIHRvIGhhcmQgcmVmcmVzaCBmb3IgcmVjb3ZlcnlcIixcbiAgICAgICAgICAgICAgXSk7XG4gICAgICAgICAgICB9KTtcbiAgICAgICAgICB9XG4gICAgICAgIH0sXG4gICAgICB9KTtcbiAgICB9KTtcbiAgfVxuXG4gIHVuZG9SZWZzKHJlZiwgcGh4RXZlbnQsIG9ubHlFbHMpIHtcbiAgICBpZiAoIXRoaXMuaXNDb25uZWN0ZWQoKSkge1xuICAgICAgcmV0dXJuO1xuICAgIH0gLy8gZXhpdCBpZiBleHRlcm5hbCBmb3JtIHRyaWdnZXJlZFxuICAgIGNvbnN0IHNlbGVjdG9yID0gYFske1BIWF9SRUZfU1JDfT1cIiR7dGhpcy5yZWZTcmMoKX1cIl1gO1xuXG4gICAgaWYgKG9ubHlFbHMpIHtcbiAgICAgIG9ubHlFbHMgPSBuZXcgU2V0KG9ubHlFbHMpO1xuICAgICAgRE9NLmFsbChkb2N1bWVudCwgc2VsZWN0b3IsIChwYXJlbnQpID0+IHtcbiAgICAgICAgaWYgKG9ubHlFbHMgJiYgIW9ubHlFbHMuaGFzKHBhcmVudCkpIHtcbiAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cbiAgICAgICAgLy8gdW5kbyBhbnkgY2hpbGQgcmVmcyB3aXRoaW4gcGFyZW50IGZpcnN0XG4gICAgICAgIERPTS5hbGwocGFyZW50LCBzZWxlY3RvciwgKGNoaWxkKSA9PlxuICAgICAgICAgIHRoaXMudW5kb0VsUmVmKGNoaWxkLCByZWYsIHBoeEV2ZW50KSxcbiAgICAgICAgKTtcbiAgICAgICAgdGhpcy51bmRvRWxSZWYocGFyZW50LCByZWYsIHBoeEV2ZW50KTtcbiAgICAgIH0pO1xuICAgIH0gZWxzZSB7XG4gICAgICBET00uYWxsKGRvY3VtZW50LCBzZWxlY3RvciwgKGVsKSA9PiB0aGlzLnVuZG9FbFJlZihlbCwgcmVmLCBwaHhFdmVudCkpO1xuICAgIH1cbiAgfVxuXG4gIHVuZG9FbFJlZihlbCwgcmVmLCBwaHhFdmVudCkge1xuICAgIGNvbnN0IGVsUmVmID0gbmV3IEVsZW1lbnRSZWYoZWwpO1xuXG4gICAgZWxSZWYubWF5YmVVbmRvKHJlZiwgcGh4RXZlbnQsIChjbG9uZWRUcmVlKSA9PiB7XG4gICAgICAvLyB3ZSBuZWVkIHRvIHBlcmZvcm0gYSBmdWxsIHBhdGNoIG9uIHVubG9ja2VkIGVsZW1lbnRzXG4gICAgICAvLyB0byBwZXJmb3JtIGFsbCB0aGUgbmVjZXNzYXJ5IGxvZ2ljIChsaWtlIGNhbGxpbmcgdXBkYXRlZCBmb3IgaG9va3MsIGV0Yy4pXG4gICAgICBjb25zdCBwYXRjaCA9IG5ldyBET01QYXRjaCh0aGlzLCBlbCwgdGhpcy5pZCwgY2xvbmVkVHJlZSwgW10sIG51bGwsIHtcbiAgICAgICAgdW5kb1JlZjogcmVmLFxuICAgICAgfSk7XG4gICAgICBjb25zdCBwaHhDaGlsZHJlbkFkZGVkID0gdGhpcy5wZXJmb3JtUGF0Y2gocGF0Y2gsIHRydWUpO1xuICAgICAgRE9NLmFsbChlbCwgYFske1BIWF9SRUZfU1JDfT1cIiR7dGhpcy5yZWZTcmMoKX1cIl1gLCAoY2hpbGQpID0+XG4gICAgICAgIHRoaXMudW5kb0VsUmVmKGNoaWxkLCByZWYsIHBoeEV2ZW50KSxcbiAgICAgICk7XG4gICAgICBpZiAocGh4Q2hpbGRyZW5BZGRlZCkge1xuICAgICAgICB0aGlzLmpvaW5OZXdDaGlsZHJlbigpO1xuICAgICAgfVxuICAgIH0pO1xuICB9XG5cbiAgcmVmU3JjKCkge1xuICAgIHJldHVybiB0aGlzLmVsLmlkO1xuICB9XG5cbiAgcHV0UmVmKGVsZW1lbnRzLCBwaHhFdmVudCwgZXZlbnRUeXBlLCBvcHRzID0ge30pIHtcbiAgICBjb25zdCBuZXdSZWYgPSB0aGlzLnJlZisrO1xuICAgIGNvbnN0IGRpc2FibGVXaXRoID0gdGhpcy5iaW5kaW5nKFBIWF9ESVNBQkxFX1dJVEgpO1xuICAgIGlmIChvcHRzLmxvYWRpbmcpIHtcbiAgICAgIGNvbnN0IGxvYWRpbmdFbHMgPSBET00uYWxsKGRvY3VtZW50LCBvcHRzLmxvYWRpbmcpLm1hcCgoZWwpID0+IHtcbiAgICAgICAgcmV0dXJuIHsgZWwsIGxvY2s6IHRydWUsIGxvYWRpbmc6IHRydWUgfTtcbiAgICAgIH0pO1xuICAgICAgZWxlbWVudHMgPSBlbGVtZW50cy5jb25jYXQobG9hZGluZ0Vscyk7XG4gICAgfVxuXG4gICAgZm9yIChjb25zdCB7IGVsLCBsb2NrLCBsb2FkaW5nIH0gb2YgZWxlbWVudHMpIHtcbiAgICAgIGlmICghbG9jayAmJiAhbG9hZGluZykge1xuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoXCJwdXRSZWYgcmVxdWlyZXMgbG9jayBvciBsb2FkaW5nXCIpO1xuICAgICAgfVxuICAgICAgZWwuc2V0QXR0cmlidXRlKFBIWF9SRUZfU1JDLCB0aGlzLnJlZlNyYygpKTtcbiAgICAgIGlmIChsb2FkaW5nKSB7XG4gICAgICAgIGVsLnNldEF0dHJpYnV0ZShQSFhfUkVGX0xPQURJTkcsIG5ld1JlZik7XG4gICAgICB9XG4gICAgICBpZiAobG9jaykge1xuICAgICAgICBlbC5zZXRBdHRyaWJ1dGUoUEhYX1JFRl9MT0NLLCBuZXdSZWYpO1xuICAgICAgfVxuXG4gICAgICBpZiAoXG4gICAgICAgICFsb2FkaW5nIHx8XG4gICAgICAgIChvcHRzLnN1Ym1pdHRlciAmJiAhKGVsID09PSBvcHRzLnN1Ym1pdHRlciB8fCBlbCA9PT0gb3B0cy5mb3JtKSlcbiAgICAgICkge1xuICAgICAgICBjb250aW51ZTtcbiAgICAgIH1cblxuICAgICAgY29uc3QgbG9ja0NvbXBsZXRlUHJvbWlzZSA9IG5ldyBQcm9taXNlKChyZXNvbHZlKSA9PiB7XG4gICAgICAgIGVsLmFkZEV2ZW50TGlzdGVuZXIoYHBoeDp1bmRvLWxvY2s6JHtuZXdSZWZ9YCwgKCkgPT4gcmVzb2x2ZShkZXRhaWwpLCB7XG4gICAgICAgICAgb25jZTogdHJ1ZSxcbiAgICAgICAgfSk7XG4gICAgICB9KTtcblxuICAgICAgY29uc3QgbG9hZGluZ0NvbXBsZXRlUHJvbWlzZSA9IG5ldyBQcm9taXNlKChyZXNvbHZlKSA9PiB7XG4gICAgICAgIGVsLmFkZEV2ZW50TGlzdGVuZXIoXG4gICAgICAgICAgYHBoeDp1bmRvLWxvYWRpbmc6JHtuZXdSZWZ9YCxcbiAgICAgICAgICAoKSA9PiByZXNvbHZlKGRldGFpbCksXG4gICAgICAgICAgeyBvbmNlOiB0cnVlIH0sXG4gICAgICAgICk7XG4gICAgICB9KTtcblxuICAgICAgZWwuY2xhc3NMaXN0LmFkZChgcGh4LSR7ZXZlbnRUeXBlfS1sb2FkaW5nYCk7XG4gICAgICBjb25zdCBkaXNhYmxlVGV4dCA9IGVsLmdldEF0dHJpYnV0ZShkaXNhYmxlV2l0aCk7XG4gICAgICBpZiAoZGlzYWJsZVRleHQgIT09IG51bGwpIHtcbiAgICAgICAgaWYgKCFlbC5nZXRBdHRyaWJ1dGUoUEhYX0RJU0FCTEVfV0lUSF9SRVNUT1JFKSkge1xuICAgICAgICAgIGVsLnNldEF0dHJpYnV0ZShQSFhfRElTQUJMRV9XSVRIX1JFU1RPUkUsIGVsLmlubmVyVGV4dCk7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKGRpc2FibGVUZXh0ICE9PSBcIlwiKSB7XG4gICAgICAgICAgZWwuaW5uZXJUZXh0ID0gZGlzYWJsZVRleHQ7XG4gICAgICAgIH1cbiAgICAgICAgLy8gUEhYX0RJU0FCTEVEIGNvdWxkIGhhdmUgYWxyZWFkeSBiZWVuIHNldCBpbiBkaXNhYmxlRm9ybVxuICAgICAgICBlbC5zZXRBdHRyaWJ1dGUoXG4gICAgICAgICAgUEhYX0RJU0FCTEVELFxuICAgICAgICAgIGVsLmdldEF0dHJpYnV0ZShQSFhfRElTQUJMRUQpIHx8IGVsLmRpc2FibGVkLFxuICAgICAgICApO1xuICAgICAgICBlbC5zZXRBdHRyaWJ1dGUoXCJkaXNhYmxlZFwiLCBcIlwiKTtcbiAgICAgIH1cblxuICAgICAgY29uc3QgZGV0YWlsID0ge1xuICAgICAgICBldmVudDogcGh4RXZlbnQsXG4gICAgICAgIGV2ZW50VHlwZTogZXZlbnRUeXBlLFxuICAgICAgICByZWY6IG5ld1JlZixcbiAgICAgICAgaXNMb2FkaW5nOiBsb2FkaW5nLFxuICAgICAgICBpc0xvY2tlZDogbG9jayxcbiAgICAgICAgbG9ja0VsZW1lbnRzOiBlbGVtZW50cy5maWx0ZXIoKHsgbG9jayB9KSA9PiBsb2NrKS5tYXAoKHsgZWwgfSkgPT4gZWwpLFxuICAgICAgICBsb2FkaW5nRWxlbWVudHM6IGVsZW1lbnRzXG4gICAgICAgICAgLmZpbHRlcigoeyBsb2FkaW5nIH0pID0+IGxvYWRpbmcpXG4gICAgICAgICAgLm1hcCgoeyBlbCB9KSA9PiBlbCksXG4gICAgICAgIHVubG9jazogKGVscykgPT4ge1xuICAgICAgICAgIGVscyA9IEFycmF5LmlzQXJyYXkoZWxzKSA/IGVscyA6IFtlbHNdO1xuICAgICAgICAgIHRoaXMudW5kb1JlZnMobmV3UmVmLCBwaHhFdmVudCwgZWxzKTtcbiAgICAgICAgfSxcbiAgICAgICAgbG9ja0NvbXBsZXRlOiBsb2NrQ29tcGxldGVQcm9taXNlLFxuICAgICAgICBsb2FkaW5nQ29tcGxldGU6IGxvYWRpbmdDb21wbGV0ZVByb21pc2UsXG4gICAgICAgIGxvY2s6IChsb2NrRWwpID0+IHtcbiAgICAgICAgICByZXR1cm4gbmV3IFByb21pc2UoKHJlc29sdmUpID0+IHtcbiAgICAgICAgICAgIGlmICh0aGlzLmlzQWNrZWQobmV3UmVmKSkge1xuICAgICAgICAgICAgICByZXR1cm4gcmVzb2x2ZShkZXRhaWwpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgbG9ja0VsLnNldEF0dHJpYnV0ZShQSFhfUkVGX0xPQ0ssIG5ld1JlZik7XG4gICAgICAgICAgICBsb2NrRWwuc2V0QXR0cmlidXRlKFBIWF9SRUZfU1JDLCB0aGlzLnJlZlNyYygpKTtcbiAgICAgICAgICAgIGxvY2tFbC5hZGRFdmVudExpc3RlbmVyKFxuICAgICAgICAgICAgICBgcGh4OmxvY2stc3RvcDoke25ld1JlZn1gLFxuICAgICAgICAgICAgICAoKSA9PiByZXNvbHZlKGRldGFpbCksXG4gICAgICAgICAgICAgIHsgb25jZTogdHJ1ZSB9LFxuICAgICAgICAgICAgKTtcbiAgICAgICAgICB9KTtcbiAgICAgICAgfSxcbiAgICAgIH07XG4gICAgICBpZiAob3B0cy5wYXlsb2FkKSB7XG4gICAgICAgIGRldGFpbFtcInBheWxvYWRcIl0gPSBvcHRzLnBheWxvYWQ7XG4gICAgICB9XG4gICAgICBpZiAob3B0cy50YXJnZXQpIHtcbiAgICAgICAgZGV0YWlsW1widGFyZ2V0XCJdID0gb3B0cy50YXJnZXQ7XG4gICAgICB9XG4gICAgICBpZiAob3B0cy5vcmlnaW5hbEV2ZW50KSB7XG4gICAgICAgIGRldGFpbFtcIm9yaWdpbmFsRXZlbnRcIl0gPSBvcHRzLm9yaWdpbmFsRXZlbnQ7XG4gICAgICB9XG4gICAgICBlbC5kaXNwYXRjaEV2ZW50KFxuICAgICAgICBuZXcgQ3VzdG9tRXZlbnQoXCJwaHg6cHVzaFwiLCB7XG4gICAgICAgICAgZGV0YWlsOiBkZXRhaWwsXG4gICAgICAgICAgYnViYmxlczogdHJ1ZSxcbiAgICAgICAgICBjYW5jZWxhYmxlOiBmYWxzZSxcbiAgICAgICAgfSksXG4gICAgICApO1xuICAgICAgaWYgKHBoeEV2ZW50KSB7XG4gICAgICAgIGVsLmRpc3BhdGNoRXZlbnQoXG4gICAgICAgICAgbmV3IEN1c3RvbUV2ZW50KGBwaHg6cHVzaDoke3BoeEV2ZW50fWAsIHtcbiAgICAgICAgICAgIGRldGFpbDogZGV0YWlsLFxuICAgICAgICAgICAgYnViYmxlczogdHJ1ZSxcbiAgICAgICAgICAgIGNhbmNlbGFibGU6IGZhbHNlLFxuICAgICAgICAgIH0pLFxuICAgICAgICApO1xuICAgICAgfVxuICAgIH1cbiAgICByZXR1cm4gW25ld1JlZiwgZWxlbWVudHMubWFwKCh7IGVsIH0pID0+IGVsKSwgb3B0c107XG4gIH1cblxuICBpc0Fja2VkKHJlZikge1xuICAgIHJldHVybiB0aGlzLmxhc3RBY2tSZWYgIT09IG51bGwgJiYgdGhpcy5sYXN0QWNrUmVmID49IHJlZjtcbiAgfVxuXG4gIGNvbXBvbmVudElEKGVsKSB7XG4gICAgY29uc3QgY2lkID0gZWwuZ2V0QXR0cmlidXRlICYmIGVsLmdldEF0dHJpYnV0ZShQSFhfQ09NUE9ORU5UKTtcbiAgICByZXR1cm4gY2lkID8gcGFyc2VJbnQoY2lkKSA6IG51bGw7XG4gIH1cblxuICB0YXJnZXRDb21wb25lbnRJRCh0YXJnZXQsIHRhcmdldEN0eCwgb3B0cyA9IHt9KSB7XG4gICAgaWYgKGlzQ2lkKHRhcmdldEN0eCkpIHtcbiAgICAgIHJldHVybiB0YXJnZXRDdHg7XG4gICAgfVxuXG4gICAgY29uc3QgY2lkT3JTZWxlY3RvciA9XG4gICAgICBvcHRzLnRhcmdldCB8fCB0YXJnZXQuZ2V0QXR0cmlidXRlKHRoaXMuYmluZGluZyhcInRhcmdldFwiKSk7XG4gICAgaWYgKGlzQ2lkKGNpZE9yU2VsZWN0b3IpKSB7XG4gICAgICByZXR1cm4gcGFyc2VJbnQoY2lkT3JTZWxlY3Rvcik7XG4gICAgfSBlbHNlIGlmICh0YXJnZXRDdHggJiYgKGNpZE9yU2VsZWN0b3IgIT09IG51bGwgfHwgb3B0cy50YXJnZXQpKSB7XG4gICAgICByZXR1cm4gdGhpcy5jbG9zZXN0Q29tcG9uZW50SUQodGFyZ2V0Q3R4KTtcbiAgICB9IGVsc2Uge1xuICAgICAgcmV0dXJuIG51bGw7XG4gICAgfVxuICB9XG5cbiAgY2xvc2VzdENvbXBvbmVudElEKHRhcmdldEN0eCkge1xuICAgIGlmIChpc0NpZCh0YXJnZXRDdHgpKSB7XG4gICAgICByZXR1cm4gdGFyZ2V0Q3R4O1xuICAgIH0gZWxzZSBpZiAodGFyZ2V0Q3R4KSB7XG4gICAgICByZXR1cm4gbWF5YmUoXG4gICAgICAgIHRhcmdldEN0eC5jbG9zZXN0KGBbJHtQSFhfQ09NUE9ORU5UfV1gKSxcbiAgICAgICAgKGVsKSA9PiB0aGlzLm93bnNFbGVtZW50KGVsKSAmJiB0aGlzLmNvbXBvbmVudElEKGVsKSxcbiAgICAgICk7XG4gICAgfSBlbHNlIHtcbiAgICAgIHJldHVybiBudWxsO1xuICAgIH1cbiAgfVxuXG4gIHB1c2hIb29rRXZlbnQoZWwsIHRhcmdldEN0eCwgZXZlbnQsIHBheWxvYWQpIHtcbiAgICBpZiAoIXRoaXMuaXNDb25uZWN0ZWQoKSkge1xuICAgICAgdGhpcy5sb2coXCJob29rXCIsICgpID0+IFtcbiAgICAgICAgXCJ1bmFibGUgdG8gcHVzaCBob29rIGV2ZW50LiBMaXZlVmlldyBub3QgY29ubmVjdGVkXCIsXG4gICAgICAgIGV2ZW50LFxuICAgICAgICBwYXlsb2FkLFxuICAgICAgXSk7XG4gICAgICByZXR1cm4gUHJvbWlzZS5yZWplY3QoXG4gICAgICAgIG5ldyBFcnJvcihcInVuYWJsZSB0byBwdXNoIGhvb2sgZXZlbnQuIExpdmVWaWV3IG5vdCBjb25uZWN0ZWRcIiksXG4gICAgICApO1xuICAgIH1cblxuICAgIGNvbnN0IHJlZkdlbmVyYXRvciA9ICgpID0+XG4gICAgICB0aGlzLnB1dFJlZihbeyBlbCwgbG9hZGluZzogdHJ1ZSwgbG9jazogdHJ1ZSB9XSwgZXZlbnQsIFwiaG9va1wiLCB7XG4gICAgICAgIHBheWxvYWQsXG4gICAgICAgIHRhcmdldDogdGFyZ2V0Q3R4LFxuICAgICAgfSk7XG5cbiAgICByZXR1cm4gdGhpcy5wdXNoV2l0aFJlcGx5KHJlZkdlbmVyYXRvciwgXCJldmVudFwiLCB7XG4gICAgICB0eXBlOiBcImhvb2tcIixcbiAgICAgIGV2ZW50OiBldmVudCxcbiAgICAgIHZhbHVlOiBwYXlsb2FkLFxuICAgICAgY2lkOiB0aGlzLmNsb3Nlc3RDb21wb25lbnRJRCh0YXJnZXRDdHgpLFxuICAgIH0pLnRoZW4oKHsgcmVzcDogX3Jlc3AsIHJlcGx5LCByZWYgfSkgPT4gKHsgcmVwbHksIHJlZiB9KSk7XG4gIH1cblxuICBleHRyYWN0TWV0YShlbCwgbWV0YSwgdmFsdWUpIHtcbiAgICBjb25zdCBwcmVmaXggPSB0aGlzLmJpbmRpbmcoXCJ2YWx1ZS1cIik7XG4gICAgZm9yIChsZXQgaSA9IDA7IGkgPCBlbC5hdHRyaWJ1dGVzLmxlbmd0aDsgaSsrKSB7XG4gICAgICBpZiAoIW1ldGEpIHtcbiAgICAgICAgbWV0YSA9IHt9O1xuICAgICAgfVxuICAgICAgY29uc3QgbmFtZSA9IGVsLmF0dHJpYnV0ZXNbaV0ubmFtZTtcbiAgICAgIGlmIChuYW1lLnN0YXJ0c1dpdGgocHJlZml4KSkge1xuICAgICAgICBtZXRhW25hbWUucmVwbGFjZShwcmVmaXgsIFwiXCIpXSA9IGVsLmdldEF0dHJpYnV0ZShuYW1lKTtcbiAgICAgIH1cbiAgICB9XG4gICAgaWYgKGVsLnZhbHVlICE9PSB1bmRlZmluZWQgJiYgIShlbCBpbnN0YW5jZW9mIEhUTUxGb3JtRWxlbWVudCkpIHtcbiAgICAgIGlmICghbWV0YSkge1xuICAgICAgICBtZXRhID0ge307XG4gICAgICB9XG4gICAgICBtZXRhLnZhbHVlID0gZWwudmFsdWU7XG5cbiAgICAgIGlmIChcbiAgICAgICAgZWwudGFnTmFtZSA9PT0gXCJJTlBVVFwiICYmXG4gICAgICAgIENIRUNLQUJMRV9JTlBVVFMuaW5kZXhPZihlbC50eXBlKSA+PSAwICYmXG4gICAgICAgICFlbC5jaGVja2VkXG4gICAgICApIHtcbiAgICAgICAgZGVsZXRlIG1ldGEudmFsdWU7XG4gICAgICB9XG4gICAgfVxuICAgIGlmICh2YWx1ZSkge1xuICAgICAgaWYgKCFtZXRhKSB7XG4gICAgICAgIG1ldGEgPSB7fTtcbiAgICAgIH1cbiAgICAgIGZvciAoY29uc3Qga2V5IGluIHZhbHVlKSB7XG4gICAgICAgIG1ldGFba2V5XSA9IHZhbHVlW2tleV07XG4gICAgICB9XG4gICAgfVxuICAgIHJldHVybiBtZXRhO1xuICB9XG5cbiAgcHVzaEV2ZW50KHR5cGUsIGVsLCB0YXJnZXRDdHgsIHBoeEV2ZW50LCBtZXRhLCBvcHRzID0ge30sIG9uUmVwbHkpIHtcbiAgICB0aGlzLnB1c2hXaXRoUmVwbHkoXG4gICAgICAobWF5YmVQYXlsb2FkKSA9PlxuICAgICAgICB0aGlzLnB1dFJlZihbeyBlbCwgbG9hZGluZzogdHJ1ZSwgbG9jazogdHJ1ZSB9XSwgcGh4RXZlbnQsIHR5cGUsIHtcbiAgICAgICAgICAuLi5vcHRzLFxuICAgICAgICAgIHBheWxvYWQ6IG1heWJlUGF5bG9hZD8ucGF5bG9hZCxcbiAgICAgICAgfSksXG4gICAgICBcImV2ZW50XCIsXG4gICAgICB7XG4gICAgICAgIHR5cGU6IHR5cGUsXG4gICAgICAgIGV2ZW50OiBwaHhFdmVudCxcbiAgICAgICAgdmFsdWU6IHRoaXMuZXh0cmFjdE1ldGEoZWwsIG1ldGEsIG9wdHMudmFsdWUpLFxuICAgICAgICBjaWQ6IHRoaXMudGFyZ2V0Q29tcG9uZW50SUQoZWwsIHRhcmdldEN0eCwgb3B0cyksXG4gICAgICB9LFxuICAgIClcbiAgICAgIC50aGVuKCh7IHJlcGx5IH0pID0+IG9uUmVwbHkgJiYgb25SZXBseShyZXBseSkpXG4gICAgICAuY2F0Y2goKGVycm9yKSA9PiBsb2dFcnJvcihcIkZhaWxlZCB0byBwdXNoIGV2ZW50XCIsIGVycm9yKSk7XG4gIH1cblxuICBwdXNoRmlsZVByb2dyZXNzKGZpbGVFbCwgZW50cnlSZWYsIHByb2dyZXNzLCBvblJlcGx5ID0gZnVuY3Rpb24gKCkge30pIHtcbiAgICB0aGlzLmxpdmVTb2NrZXQud2l0aGluT3duZXJzKGZpbGVFbC5mb3JtLCAodmlldywgdGFyZ2V0Q3R4KSA9PiB7XG4gICAgICB2aWV3XG4gICAgICAgIC5wdXNoV2l0aFJlcGx5KG51bGwsIFwicHJvZ3Jlc3NcIiwge1xuICAgICAgICAgIGV2ZW50OiBmaWxlRWwuZ2V0QXR0cmlidXRlKHZpZXcuYmluZGluZyhQSFhfUFJPR1JFU1MpKSxcbiAgICAgICAgICByZWY6IGZpbGVFbC5nZXRBdHRyaWJ1dGUoUEhYX1VQTE9BRF9SRUYpLFxuICAgICAgICAgIGVudHJ5X3JlZjogZW50cnlSZWYsXG4gICAgICAgICAgcHJvZ3Jlc3M6IHByb2dyZXNzLFxuICAgICAgICAgIGNpZDogdmlldy50YXJnZXRDb21wb25lbnRJRChmaWxlRWwuZm9ybSwgdGFyZ2V0Q3R4KSxcbiAgICAgICAgfSlcbiAgICAgICAgLnRoZW4oKCkgPT4gb25SZXBseSgpKVxuICAgICAgICAuY2F0Y2goKGVycm9yKSA9PiBsb2dFcnJvcihcIkZhaWxlZCB0byBwdXNoIGZpbGUgcHJvZ3Jlc3NcIiwgZXJyb3IpKTtcbiAgICB9KTtcbiAgfVxuXG4gIHB1c2hJbnB1dChpbnB1dEVsLCB0YXJnZXRDdHgsIGZvcmNlQ2lkLCBwaHhFdmVudCwgb3B0cywgY2FsbGJhY2spIHtcbiAgICBpZiAoIWlucHV0RWwuZm9ybSkge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKFwiZm9ybSBldmVudHMgcmVxdWlyZSB0aGUgaW5wdXQgdG8gYmUgaW5zaWRlIGEgZm9ybVwiKTtcbiAgICB9XG5cbiAgICBsZXQgdXBsb2FkcztcbiAgICBjb25zdCBjaWQgPSBpc0NpZChmb3JjZUNpZClcbiAgICAgID8gZm9yY2VDaWRcbiAgICAgIDogdGhpcy50YXJnZXRDb21wb25lbnRJRChpbnB1dEVsLmZvcm0sIHRhcmdldEN0eCwgb3B0cyk7XG4gICAgY29uc3QgcmVmR2VuZXJhdG9yID0gKG1heWJlUGF5bG9hZCkgPT4ge1xuICAgICAgcmV0dXJuIHRoaXMucHV0UmVmKFxuICAgICAgICBbXG4gICAgICAgICAgeyBlbDogaW5wdXRFbCwgbG9hZGluZzogdHJ1ZSwgbG9jazogdHJ1ZSB9LFxuICAgICAgICAgIHsgZWw6IGlucHV0RWwuZm9ybSwgbG9hZGluZzogdHJ1ZSwgbG9jazogdHJ1ZSB9LFxuICAgICAgICBdLFxuICAgICAgICBwaHhFdmVudCxcbiAgICAgICAgXCJjaGFuZ2VcIixcbiAgICAgICAgeyAuLi5vcHRzLCBwYXlsb2FkOiBtYXliZVBheWxvYWQ/LnBheWxvYWQgfSxcbiAgICAgICk7XG4gICAgfTtcbiAgICBsZXQgZm9ybURhdGE7XG4gICAgY29uc3QgbWV0YSA9IHRoaXMuZXh0cmFjdE1ldGEoaW5wdXRFbC5mb3JtLCB7fSwgb3B0cy52YWx1ZSk7XG4gICAgY29uc3Qgc2VyaWFsaXplT3B0cyA9IHt9O1xuICAgIGlmIChpbnB1dEVsIGluc3RhbmNlb2YgSFRNTEJ1dHRvbkVsZW1lbnQpIHtcbiAgICAgIHNlcmlhbGl6ZU9wdHMuc3VibWl0dGVyID0gaW5wdXRFbDtcbiAgICB9XG4gICAgaWYgKGlucHV0RWwuZ2V0QXR0cmlidXRlKHRoaXMuYmluZGluZyhcImNoYW5nZVwiKSkpIHtcbiAgICAgIGZvcm1EYXRhID0gc2VyaWFsaXplRm9ybShpbnB1dEVsLmZvcm0sIHNlcmlhbGl6ZU9wdHMsIFtpbnB1dEVsLm5hbWVdKTtcbiAgICB9IGVsc2Uge1xuICAgICAgZm9ybURhdGEgPSBzZXJpYWxpemVGb3JtKGlucHV0RWwuZm9ybSwgc2VyaWFsaXplT3B0cyk7XG4gICAgfVxuICAgIGlmIChcbiAgICAgIERPTS5pc1VwbG9hZElucHV0KGlucHV0RWwpICYmXG4gICAgICBpbnB1dEVsLmZpbGVzICYmXG4gICAgICBpbnB1dEVsLmZpbGVzLmxlbmd0aCA+IDBcbiAgICApIHtcbiAgICAgIExpdmVVcGxvYWRlci50cmFja0ZpbGVzKGlucHV0RWwsIEFycmF5LmZyb20oaW5wdXRFbC5maWxlcykpO1xuICAgIH1cbiAgICB1cGxvYWRzID0gTGl2ZVVwbG9hZGVyLnNlcmlhbGl6ZVVwbG9hZHMoaW5wdXRFbCk7XG5cbiAgICBjb25zdCBldmVudCA9IHtcbiAgICAgIHR5cGU6IFwiZm9ybVwiLFxuICAgICAgZXZlbnQ6IHBoeEV2ZW50LFxuICAgICAgdmFsdWU6IGZvcm1EYXRhLFxuICAgICAgbWV0YToge1xuICAgICAgICAvLyBubyB0YXJnZXQgd2FzIGltcGxpY2l0bHkgc2VudCBhcyBcInVuZGVmaW5lZFwiIGluIExWIDw9IDEuMC41LCB0aGVyZWZvcmVcbiAgICAgICAgLy8gd2UgaGF2ZSB0byBrZWVwIGl0LiBJbiAxLjAuNiB3ZSBzd2l0Y2hlZCBmcm9tIHBhc3NpbmcgbWV0YSBhcyBVUkwgZW5jb2RlZCBkYXRhXG4gICAgICAgIC8vIHRvIHBhc3NpbmcgaXQgZGlyZWN0bHkgaW4gdGhlIGV2ZW50LCBidXQgdGhlIEpTT04gZW5jb2RlIHdvdWxkIGRyb3Aga2V5cyB3aXRoXG4gICAgICAgIC8vIHVuZGVmaW5lZCB2YWx1ZXMuXG4gICAgICAgIF90YXJnZXQ6IG9wdHMuX3RhcmdldCB8fCBcInVuZGVmaW5lZFwiLFxuICAgICAgICAuLi5tZXRhLFxuICAgICAgfSxcbiAgICAgIHVwbG9hZHM6IHVwbG9hZHMsXG4gICAgICBjaWQ6IGNpZCxcbiAgICB9O1xuICAgIHRoaXMucHVzaFdpdGhSZXBseShyZWZHZW5lcmF0b3IsIFwiZXZlbnRcIiwgZXZlbnQpXG4gICAgICAudGhlbigoeyByZXNwIH0pID0+IHtcbiAgICAgICAgaWYgKERPTS5pc1VwbG9hZElucHV0KGlucHV0RWwpICYmIERPTS5pc0F1dG9VcGxvYWQoaW5wdXRFbCkpIHtcbiAgICAgICAgICAvLyB0aGUgZWxlbWVudCBjb3VsZCBiZSBpbnNpZGUgYSBsb2NrZWQgcGFyZW50IGZvciBvdGhlciB1bnJlbGF0ZWQgY2hhbmdlcztcbiAgICAgICAgICAvLyB3ZSBjYW4gb25seSBzdGFydCB1cGxvYWRzIHdoZW4gdGhlIHRyZWUgaXMgdW5sb2NrZWQgYW5kIHRoZVxuICAgICAgICAgIC8vIG5lY2Vzc2FyeSBkYXRhIGF0dHJpYnV0ZXMgYXJlIHNldCBpbiB0aGUgcmVhbCBET01cbiAgICAgICAgICBFbGVtZW50UmVmLm9uVW5sb2NrKGlucHV0RWwsICgpID0+IHtcbiAgICAgICAgICAgIGlmIChMaXZlVXBsb2FkZXIuZmlsZXNBd2FpdGluZ1ByZWZsaWdodChpbnB1dEVsKS5sZW5ndGggPiAwKSB7XG4gICAgICAgICAgICAgIGNvbnN0IFtyZWYsIF9lbHNdID0gcmVmR2VuZXJhdG9yKCk7XG4gICAgICAgICAgICAgIHRoaXMudW5kb1JlZnMocmVmLCBwaHhFdmVudCwgW2lucHV0RWwuZm9ybV0pO1xuICAgICAgICAgICAgICB0aGlzLnVwbG9hZEZpbGVzKFxuICAgICAgICAgICAgICAgIGlucHV0RWwuZm9ybSxcbiAgICAgICAgICAgICAgICBwaHhFdmVudCxcbiAgICAgICAgICAgICAgICB0YXJnZXRDdHgsXG4gICAgICAgICAgICAgICAgcmVmLFxuICAgICAgICAgICAgICAgIGNpZCxcbiAgICAgICAgICAgICAgICAoX3VwbG9hZHMpID0+IHtcbiAgICAgICAgICAgICAgICAgIGNhbGxiYWNrICYmIGNhbGxiYWNrKHJlc3ApO1xuICAgICAgICAgICAgICAgICAgdGhpcy50cmlnZ2VyQXdhaXRpbmdTdWJtaXQoaW5wdXRFbC5mb3JtLCBwaHhFdmVudCk7XG4gICAgICAgICAgICAgICAgICB0aGlzLnVuZG9SZWZzKHJlZiwgcGh4RXZlbnQpO1xuICAgICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAgICk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgfSk7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgY2FsbGJhY2sgJiYgY2FsbGJhY2socmVzcCk7XG4gICAgICAgIH1cbiAgICAgIH0pXG4gICAgICAuY2F0Y2goKGVycm9yKSA9PiBsb2dFcnJvcihcIkZhaWxlZCB0byBwdXNoIGlucHV0IGV2ZW50XCIsIGVycm9yKSk7XG4gIH1cblxuICB0cmlnZ2VyQXdhaXRpbmdTdWJtaXQoZm9ybUVsLCBwaHhFdmVudCkge1xuICAgIGNvbnN0IGF3YWl0aW5nU3VibWl0ID0gdGhpcy5nZXRTY2hlZHVsZWRTdWJtaXQoZm9ybUVsKTtcbiAgICBpZiAoYXdhaXRpbmdTdWJtaXQpIHtcbiAgICAgIGNvbnN0IFtfZWwsIF9yZWYsIF9vcHRzLCBjYWxsYmFja10gPSBhd2FpdGluZ1N1Ym1pdDtcbiAgICAgIHRoaXMuY2FuY2VsU3VibWl0KGZvcm1FbCwgcGh4RXZlbnQpO1xuICAgICAgY2FsbGJhY2soKTtcbiAgICB9XG4gIH1cblxuICBnZXRTY2hlZHVsZWRTdWJtaXQoZm9ybUVsKSB7XG4gICAgcmV0dXJuIHRoaXMuZm9ybVN1Ym1pdHMuZmluZCgoW2VsLCBfcmVmLCBfb3B0cywgX2NhbGxiYWNrXSkgPT5cbiAgICAgIGVsLmlzU2FtZU5vZGUoZm9ybUVsKSxcbiAgICApO1xuICB9XG5cbiAgc2NoZWR1bGVTdWJtaXQoZm9ybUVsLCByZWYsIG9wdHMsIGNhbGxiYWNrKSB7XG4gICAgaWYgKHRoaXMuZ2V0U2NoZWR1bGVkU3VibWl0KGZvcm1FbCkpIHtcbiAgICAgIHJldHVybiB0cnVlO1xuICAgIH1cbiAgICB0aGlzLmZvcm1TdWJtaXRzLnB1c2goW2Zvcm1FbCwgcmVmLCBvcHRzLCBjYWxsYmFja10pO1xuICB9XG5cbiAgY2FuY2VsU3VibWl0KGZvcm1FbCwgcGh4RXZlbnQpIHtcbiAgICB0aGlzLmZvcm1TdWJtaXRzID0gdGhpcy5mb3JtU3VibWl0cy5maWx0ZXIoXG4gICAgICAoW2VsLCByZWYsIF9vcHRzLCBfY2FsbGJhY2tdKSA9PiB7XG4gICAgICAgIGlmIChlbC5pc1NhbWVOb2RlKGZvcm1FbCkpIHtcbiAgICAgICAgICB0aGlzLnVuZG9SZWZzKHJlZiwgcGh4RXZlbnQpO1xuICAgICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICAgICAgfVxuICAgICAgfSxcbiAgICApO1xuICB9XG5cbiAgZGlzYWJsZUZvcm0oZm9ybUVsLCBwaHhFdmVudCwgb3B0cyA9IHt9KSB7XG4gICAgY29uc3QgZmlsdGVySWdub3JlZCA9IChlbCkgPT4ge1xuICAgICAgY29uc3QgdXNlcklnbm9yZWQgPSBjbG9zZXN0UGh4QmluZGluZyhcbiAgICAgICAgZWwsXG4gICAgICAgIGAke3RoaXMuYmluZGluZyhQSFhfVVBEQVRFKX09aWdub3JlYCxcbiAgICAgICAgZWwuZm9ybSxcbiAgICAgICk7XG4gICAgICByZXR1cm4gIShcbiAgICAgICAgdXNlcklnbm9yZWQgfHwgY2xvc2VzdFBoeEJpbmRpbmcoZWwsIFwiZGF0YS1waHgtdXBkYXRlPWlnbm9yZVwiLCBlbC5mb3JtKVxuICAgICAgKTtcbiAgICB9O1xuICAgIGNvbnN0IGZpbHRlckRpc2FibGVzID0gKGVsKSA9PiB7XG4gICAgICByZXR1cm4gZWwuaGFzQXR0cmlidXRlKHRoaXMuYmluZGluZyhQSFhfRElTQUJMRV9XSVRIKSk7XG4gICAgfTtcbiAgICBjb25zdCBmaWx0ZXJCdXR0b24gPSAoZWwpID0+IGVsLnRhZ05hbWUgPT0gXCJCVVRUT05cIjtcblxuICAgIGNvbnN0IGZpbHRlcklucHV0ID0gKGVsKSA9PlxuICAgICAgW1wiSU5QVVRcIiwgXCJURVhUQVJFQVwiLCBcIlNFTEVDVFwiXS5pbmNsdWRlcyhlbC50YWdOYW1lKTtcblxuICAgIGNvbnN0IGZvcm1FbGVtZW50cyA9IEFycmF5LmZyb20oZm9ybUVsLmVsZW1lbnRzKTtcbiAgICBjb25zdCBkaXNhYmxlcyA9IGZvcm1FbGVtZW50cy5maWx0ZXIoZmlsdGVyRGlzYWJsZXMpO1xuICAgIGNvbnN0IGJ1dHRvbnMgPSBmb3JtRWxlbWVudHMuZmlsdGVyKGZpbHRlckJ1dHRvbikuZmlsdGVyKGZpbHRlcklnbm9yZWQpO1xuICAgIGNvbnN0IGlucHV0cyA9IGZvcm1FbGVtZW50cy5maWx0ZXIoZmlsdGVySW5wdXQpLmZpbHRlcihmaWx0ZXJJZ25vcmVkKTtcblxuICAgIGJ1dHRvbnMuZm9yRWFjaCgoYnV0dG9uKSA9PiB7XG4gICAgICBidXR0b24uc2V0QXR0cmlidXRlKFBIWF9ESVNBQkxFRCwgYnV0dG9uLmRpc2FibGVkKTtcbiAgICAgIGJ1dHRvbi5kaXNhYmxlZCA9IHRydWU7XG4gICAgfSk7XG4gICAgaW5wdXRzLmZvckVhY2goKGlucHV0KSA9PiB7XG4gICAgICBpbnB1dC5zZXRBdHRyaWJ1dGUoUEhYX1JFQURPTkxZLCBpbnB1dC5yZWFkT25seSk7XG4gICAgICBpbnB1dC5yZWFkT25seSA9IHRydWU7XG4gICAgICBpZiAoaW5wdXQuZmlsZXMpIHtcbiAgICAgICAgaW5wdXQuc2V0QXR0cmlidXRlKFBIWF9ESVNBQkxFRCwgaW5wdXQuZGlzYWJsZWQpO1xuICAgICAgICBpbnB1dC5kaXNhYmxlZCA9IHRydWU7XG4gICAgICB9XG4gICAgfSk7XG4gICAgY29uc3QgZm9ybUVscyA9IGRpc2FibGVzXG4gICAgICAuY29uY2F0KGJ1dHRvbnMpXG4gICAgICAuY29uY2F0KGlucHV0cylcbiAgICAgIC5tYXAoKGVsKSA9PiB7XG4gICAgICAgIHJldHVybiB7IGVsLCBsb2FkaW5nOiB0cnVlLCBsb2NrOiB0cnVlIH07XG4gICAgICB9KTtcblxuICAgIC8vIHdlIHJldmVyc2UgdGhlIG9yZGVyIHNvIGZvcm0gY2hpbGRyZW4gYXJlIGFscmVhZHkgbG9ja2VkIGJ5IHRoZSB0aW1lXG4gICAgLy8gdGhlIGZvcm0gaXMgbG9ja2VkXG4gICAgY29uc3QgZWxzID0gW3sgZWw6IGZvcm1FbCwgbG9hZGluZzogdHJ1ZSwgbG9jazogZmFsc2UgfV1cbiAgICAgIC5jb25jYXQoZm9ybUVscylcbiAgICAgIC5yZXZlcnNlKCk7XG4gICAgcmV0dXJuIHRoaXMucHV0UmVmKGVscywgcGh4RXZlbnQsIFwic3VibWl0XCIsIG9wdHMpO1xuICB9XG5cbiAgcHVzaEZvcm1TdWJtaXQoZm9ybUVsLCB0YXJnZXRDdHgsIHBoeEV2ZW50LCBzdWJtaXR0ZXIsIG9wdHMsIG9uUmVwbHkpIHtcbiAgICBjb25zdCByZWZHZW5lcmF0b3IgPSAobWF5YmVQYXlsb2FkKSA9PlxuICAgICAgdGhpcy5kaXNhYmxlRm9ybShmb3JtRWwsIHBoeEV2ZW50LCB7XG4gICAgICAgIC4uLm9wdHMsXG4gICAgICAgIGZvcm06IGZvcm1FbCxcbiAgICAgICAgcGF5bG9hZDogbWF5YmVQYXlsb2FkPy5wYXlsb2FkLFxuICAgICAgICBzdWJtaXR0ZXI6IHN1Ym1pdHRlcixcbiAgICAgIH0pO1xuICAgIC8vIHN0b3JlIHRoZSBzdWJtaXR0ZXIgaW4gdGhlIGZvcm0gZWxlbWVudCBpbiBvcmRlciB0byB0cmlnZ2VyIGl0XG4gICAgLy8gZm9yIHBoeC10cmlnZ2VyLWFjdGlvblxuICAgIERPTS5wdXRQcml2YXRlKGZvcm1FbCwgXCJzdWJtaXR0ZXJcIiwgc3VibWl0dGVyKTtcbiAgICBjb25zdCBjaWQgPSB0aGlzLnRhcmdldENvbXBvbmVudElEKGZvcm1FbCwgdGFyZ2V0Q3R4KTtcbiAgICBpZiAoTGl2ZVVwbG9hZGVyLmhhc1VwbG9hZHNJblByb2dyZXNzKGZvcm1FbCkpIHtcbiAgICAgIGNvbnN0IFtyZWYsIF9lbHNdID0gcmVmR2VuZXJhdG9yKCk7XG4gICAgICBjb25zdCBwdXNoID0gKCkgPT5cbiAgICAgICAgdGhpcy5wdXNoRm9ybVN1Ym1pdChcbiAgICAgICAgICBmb3JtRWwsXG4gICAgICAgICAgdGFyZ2V0Q3R4LFxuICAgICAgICAgIHBoeEV2ZW50LFxuICAgICAgICAgIHN1Ym1pdHRlcixcbiAgICAgICAgICBvcHRzLFxuICAgICAgICAgIG9uUmVwbHksXG4gICAgICAgICk7XG4gICAgICByZXR1cm4gdGhpcy5zY2hlZHVsZVN1Ym1pdChmb3JtRWwsIHJlZiwgb3B0cywgcHVzaCk7XG4gICAgfSBlbHNlIGlmIChMaXZlVXBsb2FkZXIuaW5wdXRzQXdhaXRpbmdQcmVmbGlnaHQoZm9ybUVsKS5sZW5ndGggPiAwKSB7XG4gICAgICBjb25zdCBbcmVmLCBlbHNdID0gcmVmR2VuZXJhdG9yKCk7XG4gICAgICBjb25zdCBwcm94eVJlZkdlbiA9ICgpID0+IFtyZWYsIGVscywgb3B0c107XG4gICAgICB0aGlzLnVwbG9hZEZpbGVzKGZvcm1FbCwgcGh4RXZlbnQsIHRhcmdldEN0eCwgcmVmLCBjaWQsIChfdXBsb2FkcykgPT4ge1xuICAgICAgICAvLyBpZiB3ZSBzdGlsbCBoYXZpbmcgcGVuZGluZyBwcmVmbGlnaHRzIGl0IG1lYW5zIHdlIGhhdmUgaW52YWxpZCBlbnRyaWVzXG4gICAgICAgIC8vIGFuZCB0aGUgcGh4LXN1Ym1pdCBjYW5ub3QgYmUgY29tcGxldGVkXG4gICAgICAgIGlmIChMaXZlVXBsb2FkZXIuaW5wdXRzQXdhaXRpbmdQcmVmbGlnaHQoZm9ybUVsKS5sZW5ndGggPiAwKSB7XG4gICAgICAgICAgcmV0dXJuIHRoaXMudW5kb1JlZnMocmVmLCBwaHhFdmVudCk7XG4gICAgICAgIH1cbiAgICAgICAgY29uc3QgbWV0YSA9IHRoaXMuZXh0cmFjdE1ldGEoZm9ybUVsLCB7fSwgb3B0cy52YWx1ZSk7XG4gICAgICAgIGNvbnN0IGZvcm1EYXRhID0gc2VyaWFsaXplRm9ybShmb3JtRWwsIHsgc3VibWl0dGVyIH0pO1xuICAgICAgICB0aGlzLnB1c2hXaXRoUmVwbHkocHJveHlSZWZHZW4sIFwiZXZlbnRcIiwge1xuICAgICAgICAgIHR5cGU6IFwiZm9ybVwiLFxuICAgICAgICAgIGV2ZW50OiBwaHhFdmVudCxcbiAgICAgICAgICB2YWx1ZTogZm9ybURhdGEsXG4gICAgICAgICAgbWV0YTogbWV0YSxcbiAgICAgICAgICBjaWQ6IGNpZCxcbiAgICAgICAgfSlcbiAgICAgICAgICAudGhlbigoeyByZXNwIH0pID0+IG9uUmVwbHkocmVzcCkpXG4gICAgICAgICAgLmNhdGNoKChlcnJvcikgPT4gbG9nRXJyb3IoXCJGYWlsZWQgdG8gcHVzaCBmb3JtIHN1Ym1pdFwiLCBlcnJvcikpO1xuICAgICAgfSk7XG4gICAgfSBlbHNlIGlmIChcbiAgICAgICEoXG4gICAgICAgIGZvcm1FbC5oYXNBdHRyaWJ1dGUoUEhYX1JFRl9TUkMpICYmXG4gICAgICAgIGZvcm1FbC5jbGFzc0xpc3QuY29udGFpbnMoXCJwaHgtc3VibWl0LWxvYWRpbmdcIilcbiAgICAgIClcbiAgICApIHtcbiAgICAgIGNvbnN0IG1ldGEgPSB0aGlzLmV4dHJhY3RNZXRhKGZvcm1FbCwge30sIG9wdHMudmFsdWUpO1xuICAgICAgY29uc3QgZm9ybURhdGEgPSBzZXJpYWxpemVGb3JtKGZvcm1FbCwgeyBzdWJtaXR0ZXIgfSk7XG4gICAgICB0aGlzLnB1c2hXaXRoUmVwbHkocmVmR2VuZXJhdG9yLCBcImV2ZW50XCIsIHtcbiAgICAgICAgdHlwZTogXCJmb3JtXCIsXG4gICAgICAgIGV2ZW50OiBwaHhFdmVudCxcbiAgICAgICAgdmFsdWU6IGZvcm1EYXRhLFxuICAgICAgICBtZXRhOiBtZXRhLFxuICAgICAgICBjaWQ6IGNpZCxcbiAgICAgIH0pXG4gICAgICAgIC50aGVuKCh7IHJlc3AgfSkgPT4gb25SZXBseShyZXNwKSlcbiAgICAgICAgLmNhdGNoKChlcnJvcikgPT4gbG9nRXJyb3IoXCJGYWlsZWQgdG8gcHVzaCBmb3JtIHN1Ym1pdFwiLCBlcnJvcikpO1xuICAgIH1cbiAgfVxuXG4gIHVwbG9hZEZpbGVzKGZvcm1FbCwgcGh4RXZlbnQsIHRhcmdldEN0eCwgcmVmLCBjaWQsIG9uQ29tcGxldGUpIHtcbiAgICBjb25zdCBqb2luQ291bnRBdFVwbG9hZCA9IHRoaXMuam9pbkNvdW50O1xuICAgIGNvbnN0IGlucHV0RWxzID0gTGl2ZVVwbG9hZGVyLmFjdGl2ZUZpbGVJbnB1dHMoZm9ybUVsKTtcbiAgICBsZXQgbnVtRmlsZUlucHV0c0luUHJvZ3Jlc3MgPSBpbnB1dEVscy5sZW5ndGg7XG5cbiAgICAvLyBnZXQgZWFjaCBmaWxlIGlucHV0XG4gICAgaW5wdXRFbHMuZm9yRWFjaCgoaW5wdXRFbCkgPT4ge1xuICAgICAgY29uc3QgdXBsb2FkZXIgPSBuZXcgTGl2ZVVwbG9hZGVyKGlucHV0RWwsIHRoaXMsICgpID0+IHtcbiAgICAgICAgbnVtRmlsZUlucHV0c0luUHJvZ3Jlc3MtLTtcbiAgICAgICAgaWYgKG51bUZpbGVJbnB1dHNJblByb2dyZXNzID09PSAwKSB7XG4gICAgICAgICAgb25Db21wbGV0ZSgpO1xuICAgICAgICB9XG4gICAgICB9KTtcblxuICAgICAgY29uc3QgZW50cmllcyA9IHVwbG9hZGVyXG4gICAgICAgIC5lbnRyaWVzKClcbiAgICAgICAgLm1hcCgoZW50cnkpID0+IGVudHJ5LnRvUHJlZmxpZ2h0UGF5bG9hZCgpKTtcblxuICAgICAgaWYgKGVudHJpZXMubGVuZ3RoID09PSAwKSB7XG4gICAgICAgIG51bUZpbGVJbnB1dHNJblByb2dyZXNzLS07XG4gICAgICAgIHJldHVybjtcbiAgICAgIH1cblxuICAgICAgY29uc3QgcGF5bG9hZCA9IHtcbiAgICAgICAgcmVmOiBpbnB1dEVsLmdldEF0dHJpYnV0ZShQSFhfVVBMT0FEX1JFRiksXG4gICAgICAgIGVudHJpZXM6IGVudHJpZXMsXG4gICAgICAgIGNpZDogdGhpcy50YXJnZXRDb21wb25lbnRJRChpbnB1dEVsLmZvcm0sIHRhcmdldEN0eCksXG4gICAgICB9O1xuXG4gICAgICB0aGlzLmxvZyhcInVwbG9hZFwiLCAoKSA9PiBbXCJzZW5kaW5nIHByZWZsaWdodCByZXF1ZXN0XCIsIHBheWxvYWRdKTtcblxuICAgICAgdGhpcy5wdXNoV2l0aFJlcGx5KG51bGwsIFwiYWxsb3dfdXBsb2FkXCIsIHBheWxvYWQpXG4gICAgICAgIC50aGVuKCh7IHJlc3AgfSkgPT4ge1xuICAgICAgICAgIHRoaXMubG9nKFwidXBsb2FkXCIsICgpID0+IFtcImdvdCBwcmVmbGlnaHQgcmVzcG9uc2VcIiwgcmVzcF0pO1xuICAgICAgICAgIC8vIHRoZSBwcmVmbGlnaHQgd2lsbCByZWplY3QgZW50cmllcyBiZXlvbmQgdGhlIG1heCBlbnRyaWVzXG4gICAgICAgICAgLy8gc28gd2UgZXJyb3IgYW5kIGNhbmNlbCBlbnRyaWVzIG9uIHRoZSBjbGllbnQgdGhhdCBhcmUgbWlzc2luZyBmcm9tIHRoZSByZXNwb25zZVxuICAgICAgICAgIHVwbG9hZGVyLmVudHJpZXMoKS5mb3JFYWNoKChlbnRyeSkgPT4ge1xuICAgICAgICAgICAgaWYgKHJlc3AuZW50cmllcyAmJiAhcmVzcC5lbnRyaWVzW2VudHJ5LnJlZl0pIHtcbiAgICAgICAgICAgICAgdGhpcy5oYW5kbGVGYWlsZWRFbnRyeVByZWZsaWdodChcbiAgICAgICAgICAgICAgICBlbnRyeS5yZWYsXG4gICAgICAgICAgICAgICAgXCJmYWlsZWQgcHJlZmxpZ2h0XCIsXG4gICAgICAgICAgICAgICAgdXBsb2FkZXIsXG4gICAgICAgICAgICAgICk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgfSk7XG4gICAgICAgICAgLy8gZm9yIGF1dG8gdXBsb2Fkcywgd2UgbWF5IGhhdmUgYW4gZW1wdHkgZW50cmllcyByZXNwb25zZSBmcm9tIHRoZSBzZXJ2ZXJcbiAgICAgICAgICAvLyBmb3IgZm9ybSBzdWJtaXRzIHRoYXQgY29udGFpbiBpbnZhbGlkIGVudHJpZXNcbiAgICAgICAgICBpZiAocmVzcC5lcnJvciB8fCBPYmplY3Qua2V5cyhyZXNwLmVudHJpZXMpLmxlbmd0aCA9PT0gMCkge1xuICAgICAgICAgICAgdGhpcy51bmRvUmVmcyhyZWYsIHBoeEV2ZW50KTtcbiAgICAgICAgICAgIGNvbnN0IGVycm9ycyA9IHJlc3AuZXJyb3IgfHwgW107XG4gICAgICAgICAgICBlcnJvcnMubWFwKChbZW50cnlfcmVmLCByZWFzb25dKSA9PiB7XG4gICAgICAgICAgICAgIHRoaXMuaGFuZGxlRmFpbGVkRW50cnlQcmVmbGlnaHQoZW50cnlfcmVmLCByZWFzb24sIHVwbG9hZGVyKTtcbiAgICAgICAgICAgIH0pO1xuICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICBjb25zdCBvbkVycm9yID0gKGNhbGxiYWNrKSA9PiB7XG4gICAgICAgICAgICAgIHRoaXMuY2hhbm5lbC5vbkVycm9yKCgpID0+IHtcbiAgICAgICAgICAgICAgICBpZiAodGhpcy5qb2luQ291bnQgPT09IGpvaW5Db3VudEF0VXBsb2FkKSB7XG4gICAgICAgICAgICAgICAgICBjYWxsYmFjaygpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICB9O1xuICAgICAgICAgICAgdXBsb2FkZXIuaW5pdEFkYXB0ZXJVcGxvYWQocmVzcCwgb25FcnJvciwgdGhpcy5saXZlU29ja2V0KTtcbiAgICAgICAgICB9XG4gICAgICAgIH0pXG4gICAgICAgIC5jYXRjaCgoZXJyb3IpID0+IGxvZ0Vycm9yKFwiRmFpbGVkIHRvIHB1c2ggdXBsb2FkXCIsIGVycm9yKSk7XG4gICAgfSk7XG4gIH1cblxuICBoYW5kbGVGYWlsZWRFbnRyeVByZWZsaWdodCh1cGxvYWRSZWYsIHJlYXNvbiwgdXBsb2FkZXIpIHtcbiAgICBpZiAodXBsb2FkZXIuaXNBdXRvVXBsb2FkKCkpIHtcbiAgICAgIC8vIHVwbG9hZFJlZiBtYXkgYmUgdG9wIGxldmVsIHVwbG9hZCBjb25maWcgcmVmIG9yIGVudHJ5IHJlZlxuICAgICAgY29uc3QgZW50cnkgPSB1cGxvYWRlclxuICAgICAgICAuZW50cmllcygpXG4gICAgICAgIC5maW5kKChlbnRyeSkgPT4gZW50cnkucmVmID09PSB1cGxvYWRSZWYudG9TdHJpbmcoKSk7XG4gICAgICBpZiAoZW50cnkpIHtcbiAgICAgICAgZW50cnkuY2FuY2VsKCk7XG4gICAgICB9XG4gICAgfSBlbHNlIHtcbiAgICAgIHVwbG9hZGVyLmVudHJpZXMoKS5tYXAoKGVudHJ5KSA9PiBlbnRyeS5jYW5jZWwoKSk7XG4gICAgfVxuICAgIHRoaXMubG9nKFwidXBsb2FkXCIsICgpID0+IFtgZXJyb3IgZm9yIGVudHJ5ICR7dXBsb2FkUmVmfWAsIHJlYXNvbl0pO1xuICB9XG5cbiAgZGlzcGF0Y2hVcGxvYWRzKHRhcmdldEN0eCwgbmFtZSwgZmlsZXNPckJsb2JzKSB7XG4gICAgY29uc3QgdGFyZ2V0RWxlbWVudCA9IHRoaXMudGFyZ2V0Q3R4RWxlbWVudCh0YXJnZXRDdHgpIHx8IHRoaXMuZWw7XG4gICAgY29uc3QgaW5wdXRzID0gRE9NLmZpbmRVcGxvYWRJbnB1dHModGFyZ2V0RWxlbWVudCkuZmlsdGVyKFxuICAgICAgKGVsKSA9PiBlbC5uYW1lID09PSBuYW1lLFxuICAgICk7XG4gICAgaWYgKGlucHV0cy5sZW5ndGggPT09IDApIHtcbiAgICAgIGxvZ0Vycm9yKGBubyBsaXZlIGZpbGUgaW5wdXRzIGZvdW5kIG1hdGNoaW5nIHRoZSBuYW1lIFwiJHtuYW1lfVwiYCk7XG4gICAgfSBlbHNlIGlmIChpbnB1dHMubGVuZ3RoID4gMSkge1xuICAgICAgbG9nRXJyb3IoYGR1cGxpY2F0ZSBsaXZlIGZpbGUgaW5wdXRzIGZvdW5kIG1hdGNoaW5nIHRoZSBuYW1lIFwiJHtuYW1lfVwiYCk7XG4gICAgfSBlbHNlIHtcbiAgICAgIERPTS5kaXNwYXRjaEV2ZW50KGlucHV0c1swXSwgUEhYX1RSQUNLX1VQTE9BRFMsIHtcbiAgICAgICAgZGV0YWlsOiB7IGZpbGVzOiBmaWxlc09yQmxvYnMgfSxcbiAgICAgIH0pO1xuICAgIH1cbiAgfVxuXG4gIHRhcmdldEN0eEVsZW1lbnQodGFyZ2V0Q3R4KSB7XG4gICAgaWYgKGlzQ2lkKHRhcmdldEN0eCkpIHtcbiAgICAgIGNvbnN0IFt0YXJnZXRdID0gRE9NLmZpbmRDb21wb25lbnROb2RlTGlzdCh0aGlzLmlkLCB0YXJnZXRDdHgpO1xuICAgICAgcmV0dXJuIHRhcmdldDtcbiAgICB9IGVsc2UgaWYgKHRhcmdldEN0eCkge1xuICAgICAgcmV0dXJuIHRhcmdldEN0eDtcbiAgICB9IGVsc2Uge1xuICAgICAgcmV0dXJuIG51bGw7XG4gICAgfVxuICB9XG5cbiAgcHVzaEZvcm1SZWNvdmVyeShvbGRGb3JtLCBuZXdGb3JtLCB0ZW1wbGF0ZURvbSwgY2FsbGJhY2spIHtcbiAgICAvLyB3ZSBhcmUgb25seSByZWNvdmVyaW5nIGZvcm1zIGluc2lkZSB0aGUgY3VycmVudCB2aWV3LCB0aGVyZWZvcmUgaXQgaXMgc2FmZSB0b1xuICAgIC8vIHNraXAgd2l0aGluT3duZXJzIGhlcmUgYW5kIGFsd2F5cyB1c2UgdGhpcyB3aGVuIHJlZmVycmluZyB0byB0aGUgdmlld1xuICAgIGNvbnN0IHBoeENoYW5nZSA9IHRoaXMuYmluZGluZyhcImNoYW5nZVwiKTtcbiAgICBjb25zdCBwaHhUYXJnZXQgPSBuZXdGb3JtLmdldEF0dHJpYnV0ZSh0aGlzLmJpbmRpbmcoXCJ0YXJnZXRcIikpIHx8IG5ld0Zvcm07XG4gICAgY29uc3QgcGh4RXZlbnQgPVxuICAgICAgbmV3Rm9ybS5nZXRBdHRyaWJ1dGUodGhpcy5iaW5kaW5nKFBIWF9BVVRPX1JFQ09WRVIpKSB8fFxuICAgICAgbmV3Rm9ybS5nZXRBdHRyaWJ1dGUodGhpcy5iaW5kaW5nKFwiY2hhbmdlXCIpKTtcbiAgICBjb25zdCBpbnB1dHMgPSBBcnJheS5mcm9tKG9sZEZvcm0uZWxlbWVudHMpLmZpbHRlcihcbiAgICAgIChlbCkgPT4gRE9NLmlzRm9ybUlucHV0KGVsKSAmJiBlbC5uYW1lICYmICFlbC5oYXNBdHRyaWJ1dGUocGh4Q2hhbmdlKSxcbiAgICApO1xuICAgIGlmIChpbnB1dHMubGVuZ3RoID09PSAwKSB7XG4gICAgICBjYWxsYmFjaygpO1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIC8vIHdlIG11c3QgY2xlYXIgdHJhY2tlZCB1cGxvYWRzIGJlZm9yZSByZWNvdmVyeSBhcyB0aGV5IG5vIGxvbmdlciBoYXZlIHZhbGlkIHJlZnNcbiAgICBpbnB1dHMuZm9yRWFjaChcbiAgICAgIChpbnB1dCkgPT5cbiAgICAgICAgaW5wdXQuaGFzQXR0cmlidXRlKFBIWF9VUExPQURfUkVGKSAmJiBMaXZlVXBsb2FkZXIuY2xlYXJGaWxlcyhpbnB1dCksXG4gICAgKTtcbiAgICAvLyBwdXNoSW5wdXQgYXNzdW1lcyB0aGF0IHRoZXJlIGlzIGEgc291cmNlIGVsZW1lbnQgdGhhdCBpbml0aWF0ZWQgdGhlIGNoYW5nZTtcbiAgICAvLyBiZWNhdXNlIHRoaXMgaXMgbm90IHRoZSBjYXNlIHdoZW4gd2UgcmVjb3ZlciBmb3Jtcywgd2UgcHJvdmlkZSB0aGUgZmlyc3QgaW5wdXQgd2UgZmluZFxuICAgIGNvbnN0IGlucHV0ID0gaW5wdXRzLmZpbmQoKGVsKSA9PiBlbC50eXBlICE9PSBcImhpZGRlblwiKSB8fCBpbnB1dHNbMF07XG5cbiAgICAvLyBpbiB0aGUgY2FzZSB0aGF0IHRoZXJlIGFyZSBtdWx0aXBsZSB0YXJnZXRzLCB3ZSBjb3VudCB0aGUgbnVtYmVyIG9mIHBlbmRpbmcgcmVjb3ZlcnkgZXZlbnRzXG4gICAgLy8gYW5kIG9ubHkgY2FsbCB0aGUgY2FsbGJhY2sgb25jZSBhbGwgZXZlbnRzIGhhdmUgYmVlbiBwcm9jZXNzZWRcbiAgICBsZXQgcGVuZGluZyA9IDA7XG4gICAgLy8gd2l0aGluVGFyZ2V0cyhwaHhUYXJnZXQsIGNhbGxiYWNrLCBkb20sIHZpZXdFbClcbiAgICB0aGlzLndpdGhpblRhcmdldHMoXG4gICAgICBwaHhUYXJnZXQsXG4gICAgICAodGFyZ2V0VmlldywgdGFyZ2V0Q3R4KSA9PiB7XG4gICAgICAgIGNvbnN0IGNpZCA9IHRoaXMudGFyZ2V0Q29tcG9uZW50SUQobmV3Rm9ybSwgdGFyZ2V0Q3R4KTtcbiAgICAgICAgcGVuZGluZysrO1xuICAgICAgICBsZXQgZSA9IG5ldyBDdXN0b21FdmVudChcInBoeDpmb3JtLXJlY292ZXJ5XCIsIHtcbiAgICAgICAgICBkZXRhaWw6IHsgc291cmNlRWxlbWVudDogb2xkRm9ybSB9LFxuICAgICAgICB9KTtcbiAgICAgICAgSlMuZXhlYyhlLCBcImNoYW5nZVwiLCBwaHhFdmVudCwgdGhpcywgaW5wdXQsIFtcbiAgICAgICAgICBcInB1c2hcIixcbiAgICAgICAgICB7XG4gICAgICAgICAgICBfdGFyZ2V0OiBpbnB1dC5uYW1lLFxuICAgICAgICAgICAgdGFyZ2V0VmlldyxcbiAgICAgICAgICAgIHRhcmdldEN0eCxcbiAgICAgICAgICAgIG5ld0NpZDogY2lkLFxuICAgICAgICAgICAgY2FsbGJhY2s6ICgpID0+IHtcbiAgICAgICAgICAgICAgcGVuZGluZy0tO1xuICAgICAgICAgICAgICBpZiAocGVuZGluZyA9PT0gMCkge1xuICAgICAgICAgICAgICAgIGNhbGxiYWNrKCk7XG4gICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgfSxcbiAgICAgICAgXSk7XG4gICAgICB9LFxuICAgICAgdGVtcGxhdGVEb20sXG4gICAgKTtcbiAgfVxuXG4gIHB1c2hMaW5rUGF0Y2goZSwgaHJlZiwgdGFyZ2V0RWwsIGNhbGxiYWNrKSB7XG4gICAgY29uc3QgbGlua1JlZiA9IHRoaXMubGl2ZVNvY2tldC5zZXRQZW5kaW5nTGluayhocmVmKTtcbiAgICAvLyBvbmx5IGFkZCBsb2FkaW5nIHN0YXRlcyBpZiBldmVudCBpcyB0cnVzdGVkIChpdCB3YXMgdHJpZ2dlcmVkIGJ5IHVzZXIsIHN1Y2ggYXMgY2xpY2spIGFuZFxuICAgIC8vIGl0J3Mgbm90IGEgZm9yd2FyZC9iYWNrIG5hdmlnYXRpb24gZnJvbSBwb3BzdGF0ZVxuICAgIGNvbnN0IGxvYWRpbmcgPSBlLmlzVHJ1c3RlZCAmJiBlLnR5cGUgIT09IFwicG9wc3RhdGVcIjtcbiAgICBjb25zdCByZWZHZW4gPSB0YXJnZXRFbFxuICAgICAgPyAoKSA9PlxuICAgICAgICAgIHRoaXMucHV0UmVmKFxuICAgICAgICAgICAgW3sgZWw6IHRhcmdldEVsLCBsb2FkaW5nOiBsb2FkaW5nLCBsb2NrOiB0cnVlIH1dLFxuICAgICAgICAgICAgbnVsbCxcbiAgICAgICAgICAgIFwiY2xpY2tcIixcbiAgICAgICAgICApXG4gICAgICA6IG51bGw7XG4gICAgY29uc3QgZmFsbGJhY2sgPSAoKSA9PiB0aGlzLmxpdmVTb2NrZXQucmVkaXJlY3Qod2luZG93LmxvY2F0aW9uLmhyZWYpO1xuICAgIGNvbnN0IHVybCA9IGhyZWYuc3RhcnRzV2l0aChcIi9cIilcbiAgICAgID8gYCR7bG9jYXRpb24ucHJvdG9jb2x9Ly8ke2xvY2F0aW9uLmhvc3R9JHtocmVmfWBcbiAgICAgIDogaHJlZjtcblxuICAgIHRoaXMucHVzaFdpdGhSZXBseShyZWZHZW4sIFwibGl2ZV9wYXRjaFwiLCB7IHVybCB9KS50aGVuKFxuICAgICAgKHsgcmVzcCB9KSA9PiB7XG4gICAgICAgIHRoaXMubGl2ZVNvY2tldC5yZXF1ZXN0RE9NVXBkYXRlKCgpID0+IHtcbiAgICAgICAgICBpZiAocmVzcC5saW5rX3JlZGlyZWN0KSB7XG4gICAgICAgICAgICB0aGlzLmxpdmVTb2NrZXQucmVwbGFjZU1haW4oaHJlZiwgbnVsbCwgY2FsbGJhY2ssIGxpbmtSZWYpO1xuICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICBpZiAodGhpcy5saXZlU29ja2V0LmNvbW1pdFBlbmRpbmdMaW5rKGxpbmtSZWYpKSB7XG4gICAgICAgICAgICAgIHRoaXMuaHJlZiA9IGhyZWY7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICB0aGlzLmFwcGx5UGVuZGluZ1VwZGF0ZXMoKTtcbiAgICAgICAgICAgIGNhbGxiYWNrICYmIGNhbGxiYWNrKGxpbmtSZWYpO1xuICAgICAgICAgIH1cbiAgICAgICAgfSk7XG4gICAgICB9LFxuICAgICAgKHsgZXJyb3I6IF9lcnJvciwgdGltZW91dDogX3RpbWVvdXQgfSkgPT4gZmFsbGJhY2soKSxcbiAgICApO1xuICB9XG5cbiAgZ2V0Rm9ybXNGb3JSZWNvdmVyeSgpIHtcbiAgICAvLyBGb3JtIHJlY292ZXJ5IGlzIGNvbXBsZXggaW4gTGl2ZVZpZXc6XG4gICAgLy8gV2Ugd2FudCB0byBzdXBwb3J0IG5lc3RlZCBMaXZlVmlld3MgYW5kIGFsc28gcHJvdmlkZSBhIGdvb2QgdXNlciBleHBlcmllbmNlLlxuICAgIC8vIFRoZXJlZm9yZSwgd2hlbiB0aGUgY2hhbm5lbCByZWpvaW5zLCB3ZSBjb3B5IGFsbCBmb3JtcyB0aGF0IGFyZSBlbGlnaWJsZSBmb3JcbiAgICAvLyByZWNvdmVyeSB0byBiZSBhYmxlIHRvIGFjY2VzcyB0aGVtIGxhdGVyLlxuICAgIC8vIFdoeSBkbyB3ZSBuZWVkIHRvIGNvcHkgdGhlbT8gQmVjYXVzZSB3aGVuIHRoZSBtYWluIExpdmVWaWV3IGpvaW5zLCBhbnkgZm9ybXNcbiAgICAvLyBpbiBuZXN0ZWQgTGl2ZVZpZXdzIHdvdWxkIGJlIGxvc3QuXG4gICAgLy9cbiAgICAvLyBXZSBzaG91bGQgcmV3b3JrIHRoaXMgaW4gdGhlIGZ1dHVyZSB0byBzZXJpYWxpemUgdGhlIGZvcm0gcGF5bG9hZCBoZXJlXG4gICAgLy8gaW5zdGVhZCBvZiBjbG9uaW5nIHRoZSBET00gbm9kZXMsIGJ1dCBtYWtpbmcgdGhpcyB3b3JrIGNvcnJlY3RseSBpcyB0ZWRpb3VzLFxuICAgIC8vIGFzIHNlbmRpbmcgdGhlIGNvcnJlY3QgZm9ybSBwYXlsb2FkIHJlbGllcyBvbiBKUy5wdXNoIHRvIGV4dHJhY3QgdmFsdWVzXG4gICAgLy8gZnJvbSBKUyBjb21tYW5kcyAocGh4LWNoYW5nZT17SlMucHVzaChcImV2ZW50XCIsIHZhbHVlOiAuLi4sIHRhcmdldDogLi4uKX0pLFxuICAgIC8vIGFzIHdlbGwgYXMgdmlldy5wdXNoSW5wdXQsIHdoaWNoIGV4cGVjdHMgRE9NIGVsZW1lbnRzLlxuXG4gICAgaWYgKHRoaXMuam9pbkNvdW50ID09PSAwKSB7XG4gICAgICByZXR1cm4ge307XG4gICAgfVxuXG4gICAgY29uc3QgcGh4Q2hhbmdlID0gdGhpcy5iaW5kaW5nKFwiY2hhbmdlXCIpO1xuXG4gICAgcmV0dXJuIERPTS5hbGwoXG4gICAgICBkb2N1bWVudCxcbiAgICAgIGAjJHtDU1MuZXNjYXBlKHRoaXMuaWQpfSBmb3JtWyR7cGh4Q2hhbmdlfV0sIFske1BIWF9URUxFUE9SVEVEX1JFRn09XCIke0NTUy5lc2NhcGUodGhpcy5pZCl9XCJdIGZvcm1bJHtwaHhDaGFuZ2V9XWAsXG4gICAgKVxuICAgICAgLmZpbHRlcigoZm9ybSkgPT4gZm9ybS5pZClcbiAgICAgIC5maWx0ZXIoKGZvcm0pID0+IGZvcm0uZWxlbWVudHMubGVuZ3RoID4gMClcbiAgICAgIC5maWx0ZXIoXG4gICAgICAgIChmb3JtKSA9PlxuICAgICAgICAgIGZvcm0uZ2V0QXR0cmlidXRlKHRoaXMuYmluZGluZyhQSFhfQVVUT19SRUNPVkVSKSkgIT09IFwiaWdub3JlXCIsXG4gICAgICApXG4gICAgICAubWFwKChmb3JtKSA9PiB7XG4gICAgICAgIC8vIFdlIG5lZWQgdG8gY2xvbmUgdGhlIHdob2xlIGZvcm0sIGFzIHJlbHlpbmcgb24gZm9ybS5lbGVtZW50cyBjYW4gbGVhZCB0b1xuICAgICAgICAvLyBzaXR1YXRpb25zIHdoZXJlIHdlIGhhdmVcbiAgICAgICAgLy9cbiAgICAgICAgLy8gICA8Zm9ybT48ZmllbGRzZXQgZGlzYWJsZWQ+PGlucHV0IG5hbWU9XCJmb29cIiB2YWx1ZT1cImJhclwiPjwvZmllbGRzZXQ+PC9mb3JtPlxuICAgICAgICAvL1xuICAgICAgICAvLyBhbmQgZm9ybS5lbGVtZW50cyByZXR1cm5zIGJvdGggdGhlIGZpZWxkc2V0IGFuZCB0aGUgaW5wdXQgc2VwYXJhdGVseS5cbiAgICAgICAgLy8gQmVjYXVzZSB0aGUgZmllbGRzZXQgaXMgZGlzYWJsZWQsIHRoZSBpbnB1dCBzaG91bGQgTk9UIGJlIHNlbnQgdGhvdWdoLlxuICAgICAgICAvLyBXZSBjYW4gb25seSByZWxpYWJseSBzZXJpYWxpemUgdGhlIGZvcm0gYnkgY2xvbmluZyBpdCBmdWxseS5cbiAgICAgICAgY29uc3QgY2xvbmVkRm9ybSA9IGZvcm0uY2xvbmVOb2RlKHRydWUpO1xuICAgICAgICAvLyB3ZSBjYWxsIG1vcnBoZG9tIHRvIGNvcHkgYW55IHNwZWNpYWwgc3RhdGVcbiAgICAgICAgLy8gbGlrZSB0aGUgc2VsZWN0ZWQgb3B0aW9uIG9mIGEgPHNlbGVjdD4gZWxlbWVudDtcbiAgICAgICAgLy8gYW55IGFsc28gY29weSBvdmVyIHByaXZhdGVzICh3aGljaCBjb250YWluIGluZm9ybWF0aW9uIGFib3V0IHRvdWNoZWQgZmllbGRzKVxuICAgICAgICBtb3JwaGRvbShjbG9uZWRGb3JtLCBmb3JtLCB7XG4gICAgICAgICAgb25CZWZvcmVFbFVwZGF0ZWQ6IChmcm9tRWwsIHRvRWwpID0+IHtcbiAgICAgICAgICAgIERPTS5jb3B5UHJpdmF0ZXMoZnJvbUVsLCB0b0VsKTtcbiAgICAgICAgICAgIHJldHVybiB0cnVlO1xuICAgICAgICAgIH0sXG4gICAgICAgIH0pO1xuICAgICAgICAvLyBuZXh0IHVwLCB3ZSBhbHNvIG5lZWQgdG8gY2xvbmUgYW55IGVsZW1lbnRzIHdpdGggZm9ybT1cImlkXCIgcGFyYW1ldGVyXG4gICAgICAgIGNvbnN0IGV4dGVybmFsRWxlbWVudHMgPSBkb2N1bWVudC5xdWVyeVNlbGVjdG9yQWxsKFxuICAgICAgICAgIGBbZm9ybT1cIiR7Zm9ybS5pZH1cIl1gLFxuICAgICAgICApO1xuICAgICAgICBBcnJheS5mcm9tKGV4dGVybmFsRWxlbWVudHMpLmZvckVhY2goKGVsKSA9PiB7XG4gICAgICAgICAgaWYgKGZvcm0uY29udGFpbnMoZWwpKSB7XG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgICAgfVxuICAgICAgICAgIGNvbnN0IGNsb25lZEVsID0gZWwuY2xvbmVOb2RlKHRydWUpO1xuICAgICAgICAgIG1vcnBoZG9tKGNsb25lZEVsLCBlbCk7XG4gICAgICAgICAgRE9NLmNvcHlQcml2YXRlcyhjbG9uZWRFbCwgZWwpO1xuICAgICAgICAgIGNsb25lZEZvcm0uYXBwZW5kQ2hpbGQoY2xvbmVkRWwpO1xuICAgICAgICB9KTtcbiAgICAgICAgcmV0dXJuIGNsb25lZEZvcm07XG4gICAgICB9KVxuICAgICAgLnJlZHVjZSgoYWNjLCBmb3JtKSA9PiB7XG4gICAgICAgIGFjY1tmb3JtLmlkXSA9IGZvcm07XG4gICAgICAgIHJldHVybiBhY2M7XG4gICAgICB9LCB7fSk7XG4gIH1cblxuICBtYXliZVB1c2hDb21wb25lbnRzRGVzdHJveWVkKGRlc3Ryb3llZENJRHMpIHtcbiAgICBsZXQgd2lsbERlc3Ryb3lDSURzID0gZGVzdHJveWVkQ0lEcy5maWx0ZXIoKGNpZCkgPT4ge1xuICAgICAgcmV0dXJuIERPTS5maW5kQ29tcG9uZW50Tm9kZUxpc3QodGhpcy5pZCwgY2lkKS5sZW5ndGggPT09IDA7XG4gICAgfSk7XG5cbiAgICBjb25zdCBvbkVycm9yID0gKGVycm9yKSA9PiB7XG4gICAgICBpZiAoIXRoaXMuaXNEZXN0cm95ZWQoKSkge1xuICAgICAgICBsb2dFcnJvcihcIkZhaWxlZCB0byBwdXNoIGNvbXBvbmVudHMgZGVzdHJveWVkXCIsIGVycm9yKTtcbiAgICAgIH1cbiAgICB9O1xuXG4gICAgaWYgKHdpbGxEZXN0cm95Q0lEcy5sZW5ndGggPiAwKSB7XG4gICAgICAvLyB3ZSBtdXN0IHJlc2V0IHRoZSByZW5kZXIgY2hhbmdlIHRyYWNraW5nIGZvciBjaWRzIHRoYXRcbiAgICAgIC8vIGNvdWxkIGJlIGFkZGVkIGJhY2sgZnJvbSB0aGUgc2VydmVyIHNvIHdlIGRvbid0IHNraXAgdGhlbVxuICAgICAgd2lsbERlc3Ryb3lDSURzLmZvckVhY2goKGNpZCkgPT4gdGhpcy5yZW5kZXJlZC5yZXNldFJlbmRlcihjaWQpKTtcblxuICAgICAgdGhpcy5wdXNoV2l0aFJlcGx5KG51bGwsIFwiY2lkc193aWxsX2Rlc3Ryb3lcIiwgeyBjaWRzOiB3aWxsRGVzdHJveUNJRHMgfSlcbiAgICAgICAgLnRoZW4oKCkgPT4ge1xuICAgICAgICAgIC8vIHdlIG11c3Qgd2FpdCBmb3IgcGVuZGluZyB0cmFuc2l0aW9ucyB0byBjb21wbGV0ZSBiZWZvcmUgZGV0ZXJtaW5pbmdcbiAgICAgICAgICAvLyBpZiB0aGUgY2lkcyB3ZXJlIGFkZGVkIGJhY2sgdG8gdGhlIERPTSBpbiB0aGUgbWVhbnRpbWUgKCMzMTM5KVxuICAgICAgICAgIHRoaXMubGl2ZVNvY2tldC5yZXF1ZXN0RE9NVXBkYXRlKCgpID0+IHtcbiAgICAgICAgICAgIC8vIFNlZSBpZiBhbnkgb2YgdGhlIGNpZHMgd2Ugd2FudGVkIHRvIGRlc3Ryb3kgd2VyZSBhZGRlZCBiYWNrLFxuICAgICAgICAgICAgLy8gaWYgdGhleSB3ZXJlIGFkZGVkIGJhY2ssIHdlIGRvbid0IGFjdHVhbGx5IGRlc3Ryb3kgdGhlbS5cbiAgICAgICAgICAgIGxldCBjb21wbGV0ZWx5RGVzdHJveUNJRHMgPSB3aWxsRGVzdHJveUNJRHMuZmlsdGVyKChjaWQpID0+IHtcbiAgICAgICAgICAgICAgcmV0dXJuIERPTS5maW5kQ29tcG9uZW50Tm9kZUxpc3QodGhpcy5pZCwgY2lkKS5sZW5ndGggPT09IDA7XG4gICAgICAgICAgICB9KTtcblxuICAgICAgICAgICAgaWYgKGNvbXBsZXRlbHlEZXN0cm95Q0lEcy5sZW5ndGggPiAwKSB7XG4gICAgICAgICAgICAgIHRoaXMucHVzaFdpdGhSZXBseShudWxsLCBcImNpZHNfZGVzdHJveWVkXCIsIHtcbiAgICAgICAgICAgICAgICBjaWRzOiBjb21wbGV0ZWx5RGVzdHJveUNJRHMsXG4gICAgICAgICAgICAgIH0pXG4gICAgICAgICAgICAgICAgLnRoZW4oKHsgcmVzcCB9KSA9PiB7XG4gICAgICAgICAgICAgICAgICB0aGlzLnJlbmRlcmVkLnBydW5lQ0lEcyhyZXNwLmNpZHMpO1xuICAgICAgICAgICAgICAgIH0pXG4gICAgICAgICAgICAgICAgLmNhdGNoKG9uRXJyb3IpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgIH0pO1xuICAgICAgICB9KVxuICAgICAgICAuY2F0Y2gob25FcnJvcik7XG4gICAgfVxuICB9XG5cbiAgb3duc0VsZW1lbnQoZWwpIHtcbiAgICBsZXQgcGFyZW50Vmlld0VsID0gRE9NLmNsb3Nlc3RWaWV3RWwoZWwpO1xuICAgIHJldHVybiAoXG4gICAgICBlbC5nZXRBdHRyaWJ1dGUoUEhYX1BBUkVOVF9JRCkgPT09IHRoaXMuaWQgfHxcbiAgICAgIChwYXJlbnRWaWV3RWwgJiYgcGFyZW50Vmlld0VsLmlkID09PSB0aGlzLmlkKSB8fFxuICAgICAgKCFwYXJlbnRWaWV3RWwgJiYgdGhpcy5pc0RlYWQpXG4gICAgKTtcbiAgfVxuXG4gIHN1Ym1pdEZvcm0oZm9ybSwgdGFyZ2V0Q3R4LCBwaHhFdmVudCwgc3VibWl0dGVyLCBvcHRzID0ge30pIHtcbiAgICBET00ucHV0UHJpdmF0ZShmb3JtLCBQSFhfSEFTX1NVQk1JVFRFRCwgdHJ1ZSk7XG4gICAgY29uc3QgaW5wdXRzID0gQXJyYXkuZnJvbShmb3JtLmVsZW1lbnRzKTtcbiAgICBpbnB1dHMuZm9yRWFjaCgoaW5wdXQpID0+IERPTS5wdXRQcml2YXRlKGlucHV0LCBQSFhfSEFTX1NVQk1JVFRFRCwgdHJ1ZSkpO1xuICAgIHRoaXMubGl2ZVNvY2tldC5ibHVyQWN0aXZlRWxlbWVudCh0aGlzKTtcbiAgICB0aGlzLnB1c2hGb3JtU3VibWl0KGZvcm0sIHRhcmdldEN0eCwgcGh4RXZlbnQsIHN1Ym1pdHRlciwgb3B0cywgKCkgPT4ge1xuICAgICAgdGhpcy5saXZlU29ja2V0LnJlc3RvcmVQcmV2aW91c2x5QWN0aXZlRm9jdXMoKTtcbiAgICB9KTtcbiAgfVxuXG4gIGJpbmRpbmcoa2luZCkge1xuICAgIHJldHVybiB0aGlzLmxpdmVTb2NrZXQuYmluZGluZyhraW5kKTtcbiAgfVxuXG4gIC8vIHBoeC1wb3J0YWxcbiAgcHVzaFBvcnRhbEVsZW1lbnRJZChpZCkge1xuICAgIHRoaXMucG9ydGFsRWxlbWVudElkcy5hZGQoaWQpO1xuICB9XG5cbiAgZHJvcFBvcnRhbEVsZW1lbnRJZChpZCkge1xuICAgIHRoaXMucG9ydGFsRWxlbWVudElkcy5kZWxldGUoaWQpO1xuICB9XG5cbiAgZGVzdHJveVBvcnRhbEVsZW1lbnRzKCkge1xuICAgIHRoaXMucG9ydGFsRWxlbWVudElkcy5mb3JFYWNoKChpZCkgPT4ge1xuICAgICAgY29uc3QgZWwgPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZChpZCk7XG4gICAgICBpZiAoZWwpIHtcbiAgICAgICAgZWwucmVtb3ZlKCk7XG4gICAgICB9XG4gICAgfSk7XG4gIH1cbn1cbiIsICJpbXBvcnQge1xuICBCSU5ESU5HX1BSRUZJWCxcbiAgQ09OU0VDVVRJVkVfUkVMT0FEUyxcbiAgREVGQVVMVFMsXG4gIEZBSUxTQUZFX0pJVFRFUixcbiAgTE9BREVSX1RJTUVPVVQsXG4gIERJU0NPTk5FQ1RFRF9USU1FT1VULFxuICBNQVhfUkVMT0FEUyxcbiAgUEhYX0RFQk9VTkNFLFxuICBQSFhfRFJPUF9UQVJHRVQsXG4gIFBIWF9IQVNfRk9DVVNFRCxcbiAgUEhYX0tFWSxcbiAgUEhYX0xJTktfU1RBVEUsXG4gIFBIWF9MSVZFX0xJTkssXG4gIFBIWF9MVl9ERUJVRyxcbiAgUEhYX0xWX0xBVEVOQ1lfU0lNLFxuICBQSFhfTFZfUFJPRklMRSxcbiAgUEhYX0xWX0hJU1RPUllfUE9TSVRJT04sXG4gIFBIWF9NQUlOLFxuICBQSFhfUEFSRU5UX0lELFxuICBQSFhfVklFV19TRUxFQ1RPUixcbiAgUEhYX1JPT1RfSUQsXG4gIFBIWF9USFJPVFRMRSxcbiAgUEhYX1RSQUNLX1VQTE9BRFMsXG4gIFBIWF9TRVNTSU9OLFxuICBSRUxPQURfSklUVEVSX01JTixcbiAgUkVMT0FEX0pJVFRFUl9NQVgsXG4gIFBIWF9SRUZfU1JDLFxuICBQSFhfUkVMT0FEX1NUQVRVUyxcbiAgUEhYX1JVTlRJTUVfSE9PSyxcbn0gZnJvbSBcIi4vY29uc3RhbnRzXCI7XG5cbmltcG9ydCB7XG4gIGNsb25lLFxuICBjbG9zZXN0UGh4QmluZGluZyxcbiAgY2xvc3VyZSxcbiAgZGVidWcsXG4gIG1heWJlLFxuICBsb2dFcnJvcixcbn0gZnJvbSBcIi4vdXRpbHNcIjtcblxuaW1wb3J0IEJyb3dzZXIgZnJvbSBcIi4vYnJvd3NlclwiO1xuaW1wb3J0IERPTSBmcm9tIFwiLi9kb21cIjtcbmltcG9ydCBIb29rcyBmcm9tIFwiLi9ob29rc1wiO1xuaW1wb3J0IExpdmVVcGxvYWRlciBmcm9tIFwiLi9saXZlX3VwbG9hZGVyXCI7XG5pbXBvcnQgVmlldyBmcm9tIFwiLi92aWV3XCI7XG5pbXBvcnQgSlMgZnJvbSBcIi4vanNcIjtcbmltcG9ydCBqc0NvbW1hbmRzIGZyb20gXCIuL2pzX2NvbW1hbmRzXCI7XG5cbmV4cG9ydCBjb25zdCBpc1VzZWRJbnB1dCA9IChlbCkgPT4gRE9NLmlzVXNlZElucHV0KGVsKTtcblxuZXhwb3J0IGRlZmF1bHQgY2xhc3MgTGl2ZVNvY2tldCB7XG4gIGNvbnN0cnVjdG9yKHVybCwgcGh4U29ja2V0LCBvcHRzID0ge30pIHtcbiAgICB0aGlzLnVubG9hZGVkID0gZmFsc2U7XG4gICAgaWYgKCFwaHhTb2NrZXQgfHwgcGh4U29ja2V0LmNvbnN0cnVjdG9yLm5hbWUgPT09IFwiT2JqZWN0XCIpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcihgXG4gICAgICBhIHBob2VuaXggU29ja2V0IG11c3QgYmUgcHJvdmlkZWQgYXMgdGhlIHNlY29uZCBhcmd1bWVudCB0byB0aGUgTGl2ZVNvY2tldCBjb25zdHJ1Y3Rvci4gRm9yIGV4YW1wbGU6XG5cbiAgICAgICAgICBpbXBvcnQge1NvY2tldH0gZnJvbSBcInBob2VuaXhcIlxuICAgICAgICAgIGltcG9ydCB7TGl2ZVNvY2tldH0gZnJvbSBcInBob2VuaXhfbGl2ZV92aWV3XCJcbiAgICAgICAgICBsZXQgbGl2ZVNvY2tldCA9IG5ldyBMaXZlU29ja2V0KFwiL2xpdmVcIiwgU29ja2V0LCB7Li4ufSlcbiAgICAgIGApO1xuICAgIH1cbiAgICB0aGlzLnNvY2tldCA9IG5ldyBwaHhTb2NrZXQodXJsLCBvcHRzKTtcbiAgICB0aGlzLmJpbmRpbmdQcmVmaXggPSBvcHRzLmJpbmRpbmdQcmVmaXggfHwgQklORElOR19QUkVGSVg7XG4gICAgdGhpcy5vcHRzID0gb3B0cztcbiAgICB0aGlzLnBhcmFtcyA9IGNsb3N1cmUob3B0cy5wYXJhbXMgfHwge30pO1xuICAgIHRoaXMudmlld0xvZ2dlciA9IG9wdHMudmlld0xvZ2dlcjtcbiAgICB0aGlzLm1ldGFkYXRhQ2FsbGJhY2tzID0gb3B0cy5tZXRhZGF0YSB8fCB7fTtcbiAgICB0aGlzLmRlZmF1bHRzID0gT2JqZWN0LmFzc2lnbihjbG9uZShERUZBVUxUUyksIG9wdHMuZGVmYXVsdHMgfHwge30pO1xuICAgIHRoaXMucHJldkFjdGl2ZSA9IG51bGw7XG4gICAgdGhpcy5zaWxlbmNlZCA9IGZhbHNlO1xuICAgIHRoaXMubWFpbiA9IG51bGw7XG4gICAgdGhpcy5vdXRnb2luZ01haW5FbCA9IG51bGw7XG4gICAgdGhpcy5jbGlja1N0YXJ0ZWRBdFRhcmdldCA9IG51bGw7XG4gICAgdGhpcy5saW5rUmVmID0gMTtcbiAgICB0aGlzLnJvb3RzID0ge307XG4gICAgdGhpcy5ocmVmID0gd2luZG93LmxvY2F0aW9uLmhyZWY7XG4gICAgdGhpcy5wZW5kaW5nTGluayA9IG51bGw7XG4gICAgdGhpcy5jdXJyZW50TG9jYXRpb24gPSBjbG9uZSh3aW5kb3cubG9jYXRpb24pO1xuICAgIHRoaXMuaG9va3MgPSBvcHRzLmhvb2tzIHx8IHt9O1xuICAgIHRoaXMudXBsb2FkZXJzID0gb3B0cy51cGxvYWRlcnMgfHwge307XG4gICAgdGhpcy5sb2FkZXJUaW1lb3V0ID0gb3B0cy5sb2FkZXJUaW1lb3V0IHx8IExPQURFUl9USU1FT1VUO1xuICAgIHRoaXMuZGlzY29ubmVjdGVkVGltZW91dCA9IG9wdHMuZGlzY29ubmVjdGVkVGltZW91dCB8fCBESVNDT05ORUNURURfVElNRU9VVDtcbiAgICAvKipcbiAgICAgKiBAdHlwZSB7UmV0dXJuVHlwZTx0eXBlb2Ygc2V0VGltZW91dD4gfCBudWxsfVxuICAgICAqL1xuICAgIHRoaXMucmVsb2FkV2l0aEppdHRlclRpbWVyID0gbnVsbDtcbiAgICB0aGlzLm1heFJlbG9hZHMgPSBvcHRzLm1heFJlbG9hZHMgfHwgTUFYX1JFTE9BRFM7XG4gICAgdGhpcy5yZWxvYWRKaXR0ZXJNaW4gPSBvcHRzLnJlbG9hZEppdHRlck1pbiB8fCBSRUxPQURfSklUVEVSX01JTjtcbiAgICB0aGlzLnJlbG9hZEppdHRlck1heCA9IG9wdHMucmVsb2FkSml0dGVyTWF4IHx8IFJFTE9BRF9KSVRURVJfTUFYO1xuICAgIHRoaXMuZmFpbHNhZmVKaXR0ZXIgPSBvcHRzLmZhaWxzYWZlSml0dGVyIHx8IEZBSUxTQUZFX0pJVFRFUjtcbiAgICB0aGlzLmxvY2FsU3RvcmFnZSA9IG9wdHMubG9jYWxTdG9yYWdlIHx8IHdpbmRvdy5sb2NhbFN0b3JhZ2U7XG4gICAgdGhpcy5zZXNzaW9uU3RvcmFnZSA9IG9wdHMuc2Vzc2lvblN0b3JhZ2UgfHwgd2luZG93LnNlc3Npb25TdG9yYWdlO1xuICAgIHRoaXMuYm91bmRUb3BMZXZlbEV2ZW50cyA9IGZhbHNlO1xuICAgIHRoaXMuYm91bmRFdmVudE5hbWVzID0gbmV3IFNldCgpO1xuICAgIHRoaXMuYmxvY2tQaHhDaGFuZ2VXaGlsZUNvbXBvc2luZyA9XG4gICAgICBvcHRzLmJsb2NrUGh4Q2hhbmdlV2hpbGVDb21wb3NpbmcgfHwgZmFsc2U7XG4gICAgdGhpcy5zZXJ2ZXJDbG9zZVJlZiA9IG51bGw7XG4gICAgdGhpcy5kb21DYWxsYmFja3MgPSBPYmplY3QuYXNzaWduKFxuICAgICAge1xuICAgICAgICBqc1F1ZXJ5U2VsZWN0b3JBbGw6IG51bGwsXG4gICAgICAgIG9uUGF0Y2hTdGFydDogY2xvc3VyZSgpLFxuICAgICAgICBvblBhdGNoRW5kOiBjbG9zdXJlKCksXG4gICAgICAgIG9uTm9kZUFkZGVkOiBjbG9zdXJlKCksXG4gICAgICAgIG9uQmVmb3JlRWxVcGRhdGVkOiBjbG9zdXJlKCksXG4gICAgICB9LFxuICAgICAgb3B0cy5kb20gfHwge30sXG4gICAgKTtcbiAgICB0aGlzLnRyYW5zaXRpb25zID0gbmV3IFRyYW5zaXRpb25TZXQoKTtcbiAgICB0aGlzLmN1cnJlbnRIaXN0b3J5UG9zaXRpb24gPVxuICAgICAgcGFyc2VJbnQodGhpcy5zZXNzaW9uU3RvcmFnZS5nZXRJdGVtKFBIWF9MVl9ISVNUT1JZX1BPU0lUSU9OKSkgfHwgMDtcbiAgICB3aW5kb3cuYWRkRXZlbnRMaXN0ZW5lcihcInBhZ2VoaWRlXCIsIChfZSkgPT4ge1xuICAgICAgdGhpcy51bmxvYWRlZCA9IHRydWU7XG4gICAgfSk7XG4gICAgdGhpcy5zb2NrZXQub25PcGVuKCgpID0+IHtcbiAgICAgIGlmICh0aGlzLmlzVW5sb2FkZWQoKSkge1xuICAgICAgICAvLyByZWxvYWQgcGFnZSBpZiBiZWluZyByZXN0b3JlZCBmcm9tIGJhY2svZm9yd2FyZCBjYWNoZSBhbmQgYnJvd3NlciBkb2VzIG5vdCBlbWl0IFwicGFnZXNob3dcIlxuICAgICAgICB3aW5kb3cubG9jYXRpb24ucmVsb2FkKCk7XG4gICAgICB9XG4gICAgfSk7XG4gIH1cblxuICAvLyBwdWJsaWNcblxuICB2ZXJzaW9uKCkge1xuICAgIHJldHVybiBMVl9WU047XG4gIH1cblxuICBpc1Byb2ZpbGVFbmFibGVkKCkge1xuICAgIHJldHVybiB0aGlzLnNlc3Npb25TdG9yYWdlLmdldEl0ZW0oUEhYX0xWX1BST0ZJTEUpID09PSBcInRydWVcIjtcbiAgfVxuXG4gIGlzRGVidWdFbmFibGVkKCkge1xuICAgIHJldHVybiB0aGlzLnNlc3Npb25TdG9yYWdlLmdldEl0ZW0oUEhYX0xWX0RFQlVHKSA9PT0gXCJ0cnVlXCI7XG4gIH1cblxuICBpc0RlYnVnRGlzYWJsZWQoKSB7XG4gICAgcmV0dXJuIHRoaXMuc2Vzc2lvblN0b3JhZ2UuZ2V0SXRlbShQSFhfTFZfREVCVUcpID09PSBcImZhbHNlXCI7XG4gIH1cblxuICBlbmFibGVEZWJ1ZygpIHtcbiAgICB0aGlzLnNlc3Npb25TdG9yYWdlLnNldEl0ZW0oUEhYX0xWX0RFQlVHLCBcInRydWVcIik7XG4gIH1cblxuICBlbmFibGVQcm9maWxpbmcoKSB7XG4gICAgdGhpcy5zZXNzaW9uU3RvcmFnZS5zZXRJdGVtKFBIWF9MVl9QUk9GSUxFLCBcInRydWVcIik7XG4gIH1cblxuICBkaXNhYmxlRGVidWcoKSB7XG4gICAgdGhpcy5zZXNzaW9uU3RvcmFnZS5zZXRJdGVtKFBIWF9MVl9ERUJVRywgXCJmYWxzZVwiKTtcbiAgfVxuXG4gIGRpc2FibGVQcm9maWxpbmcoKSB7XG4gICAgdGhpcy5zZXNzaW9uU3RvcmFnZS5yZW1vdmVJdGVtKFBIWF9MVl9QUk9GSUxFKTtcbiAgfVxuXG4gIGVuYWJsZUxhdGVuY3lTaW0odXBwZXJCb3VuZE1zKSB7XG4gICAgdGhpcy5lbmFibGVEZWJ1ZygpO1xuICAgIGNvbnNvbGUubG9nKFxuICAgICAgXCJsYXRlbmN5IHNpbXVsYXRvciBlbmFibGVkIGZvciB0aGUgZHVyYXRpb24gb2YgdGhpcyBicm93c2VyIHNlc3Npb24uIENhbGwgZGlzYWJsZUxhdGVuY3lTaW0oKSB0byBkaXNhYmxlXCIsXG4gICAgKTtcbiAgICB0aGlzLnNlc3Npb25TdG9yYWdlLnNldEl0ZW0oUEhYX0xWX0xBVEVOQ1lfU0lNLCB1cHBlckJvdW5kTXMpO1xuICB9XG5cbiAgZGlzYWJsZUxhdGVuY3lTaW0oKSB7XG4gICAgdGhpcy5zZXNzaW9uU3RvcmFnZS5yZW1vdmVJdGVtKFBIWF9MVl9MQVRFTkNZX1NJTSk7XG4gIH1cblxuICBnZXRMYXRlbmN5U2ltKCkge1xuICAgIGNvbnN0IHN0ciA9IHRoaXMuc2Vzc2lvblN0b3JhZ2UuZ2V0SXRlbShQSFhfTFZfTEFURU5DWV9TSU0pO1xuICAgIHJldHVybiBzdHIgPyBwYXJzZUludChzdHIpIDogbnVsbDtcbiAgfVxuXG4gIGdldFNvY2tldCgpIHtcbiAgICByZXR1cm4gdGhpcy5zb2NrZXQ7XG4gIH1cblxuICBjb25uZWN0KCkge1xuICAgIC8vIGVuYWJsZSBkZWJ1ZyBieSBkZWZhdWx0IGlmIG9uIGxvY2FsaG9zdCBhbmQgbm90IGV4cGxpY2l0bHkgZGlzYWJsZWRcbiAgICBpZiAod2luZG93LmxvY2F0aW9uLmhvc3RuYW1lID09PSBcImxvY2FsaG9zdFwiICYmICF0aGlzLmlzRGVidWdEaXNhYmxlZCgpKSB7XG4gICAgICB0aGlzLmVuYWJsZURlYnVnKCk7XG4gICAgfVxuICAgIGNvbnN0IGRvQ29ubmVjdCA9ICgpID0+IHtcbiAgICAgIHRoaXMucmVzZXRSZWxvYWRTdGF0dXMoKTtcbiAgICAgIGlmICh0aGlzLmpvaW5Sb290Vmlld3MoKSkge1xuICAgICAgICB0aGlzLmJpbmRUb3BMZXZlbEV2ZW50cygpO1xuICAgICAgICB0aGlzLnNvY2tldC5jb25uZWN0KCk7XG4gICAgICB9IGVsc2UgaWYgKHRoaXMubWFpbikge1xuICAgICAgICB0aGlzLnNvY2tldC5jb25uZWN0KCk7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICB0aGlzLmJpbmRUb3BMZXZlbEV2ZW50cyh7IGRlYWQ6IHRydWUgfSk7XG4gICAgICB9XG4gICAgICB0aGlzLmpvaW5EZWFkVmlldygpO1xuICAgIH07XG4gICAgaWYgKFxuICAgICAgW1wiY29tcGxldGVcIiwgXCJsb2FkZWRcIiwgXCJpbnRlcmFjdGl2ZVwiXS5pbmRleE9mKGRvY3VtZW50LnJlYWR5U3RhdGUpID49IDBcbiAgICApIHtcbiAgICAgIGRvQ29ubmVjdCgpO1xuICAgIH0gZWxzZSB7XG4gICAgICBkb2N1bWVudC5hZGRFdmVudExpc3RlbmVyKFwiRE9NQ29udGVudExvYWRlZFwiLCAoKSA9PiBkb0Nvbm5lY3QoKSk7XG4gICAgfVxuICB9XG5cbiAgZGlzY29ubmVjdChjYWxsYmFjaykge1xuICAgIGNsZWFyVGltZW91dCh0aGlzLnJlbG9hZFdpdGhKaXR0ZXJUaW1lcik7XG4gICAgLy8gcmVtb3ZlIHRoZSBzb2NrZXQgY2xvc2UgbGlzdGVuZXIgdG8gYXZvaWQgdHJ5aW5nIHRvIGhhbmRsZVxuICAgIC8vIGEgc2VydmVyIGNsb3NlIGV2ZW50IHdoZW4gaXQgaXMgYWN0dWFsbHkgY2F1c2VkIGJ5IHVzIGRpc2Nvbm5lY3RpbmdcbiAgICBpZiAodGhpcy5zZXJ2ZXJDbG9zZVJlZikge1xuICAgICAgdGhpcy5zb2NrZXQub2ZmKHRoaXMuc2VydmVyQ2xvc2VSZWYpO1xuICAgICAgdGhpcy5zZXJ2ZXJDbG9zZVJlZiA9IG51bGw7XG4gICAgfVxuICAgIHRoaXMuc29ja2V0LmRpc2Nvbm5lY3QoY2FsbGJhY2spO1xuICB9XG5cbiAgcmVwbGFjZVRyYW5zcG9ydCh0cmFuc3BvcnQpIHtcbiAgICBjbGVhclRpbWVvdXQodGhpcy5yZWxvYWRXaXRoSml0dGVyVGltZXIpO1xuICAgIHRoaXMuc29ja2V0LnJlcGxhY2VUcmFuc3BvcnQodHJhbnNwb3J0KTtcbiAgICB0aGlzLmNvbm5lY3QoKTtcbiAgfVxuXG4gIGV4ZWNKUyhlbCwgZW5jb2RlZEpTLCBldmVudFR5cGUgPSBudWxsKSB7XG4gICAgY29uc3QgZSA9IG5ldyBDdXN0b21FdmVudChcInBoeDpleGVjXCIsIHsgZGV0YWlsOiB7IHNvdXJjZUVsZW1lbnQ6IGVsIH0gfSk7XG4gICAgdGhpcy5vd25lcihlbCwgKHZpZXcpID0+IEpTLmV4ZWMoZSwgZXZlbnRUeXBlLCBlbmNvZGVkSlMsIHZpZXcsIGVsKSk7XG4gIH1cblxuICAvKipcbiAgICogUmV0dXJucyBhbiBvYmplY3Qgd2l0aCBtZXRob2RzIHRvIG1hbmlwbHVhdGUgdGhlIERPTSBhbmQgZXhlY3V0ZSBKYXZhU2NyaXB0LlxuICAgKiBUaGUgYXBwbGllZCBjaGFuZ2VzIGludGVncmF0ZSB3aXRoIHNlcnZlciBET00gcGF0Y2hpbmcuXG4gICAqXG4gICAqIEByZXR1cm5zIHtpbXBvcnQoXCIuL2pzX2NvbW1hbmRzXCIpLkxpdmVTb2NrZXRKU0NvbW1hbmRzfVxuICAgKi9cbiAganMoKSB7XG4gICAgcmV0dXJuIGpzQ29tbWFuZHModGhpcywgXCJqc1wiKTtcbiAgfVxuXG4gIC8vIHByaXZhdGVcblxuICB1bmxvYWQoKSB7XG4gICAgaWYgKHRoaXMudW5sb2FkZWQpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgaWYgKHRoaXMubWFpbiAmJiB0aGlzLmlzQ29ubmVjdGVkKCkpIHtcbiAgICAgIHRoaXMubG9nKHRoaXMubWFpbiwgXCJzb2NrZXRcIiwgKCkgPT4gW1wiZGlzY29ubmVjdCBmb3IgcGFnZSBuYXZcIl0pO1xuICAgIH1cbiAgICB0aGlzLnVubG9hZGVkID0gdHJ1ZTtcbiAgICB0aGlzLmRlc3Ryb3lBbGxWaWV3cygpO1xuICAgIHRoaXMuZGlzY29ubmVjdCgpO1xuICB9XG5cbiAgdHJpZ2dlckRPTShraW5kLCBhcmdzKSB7XG4gICAgdGhpcy5kb21DYWxsYmFja3Nba2luZF0oLi4uYXJncyk7XG4gIH1cblxuICB0aW1lKG5hbWUsIGZ1bmMpIHtcbiAgICBpZiAoIXRoaXMuaXNQcm9maWxlRW5hYmxlZCgpIHx8ICFjb25zb2xlLnRpbWUpIHtcbiAgICAgIHJldHVybiBmdW5jKCk7XG4gICAgfVxuICAgIGNvbnNvbGUudGltZShuYW1lKTtcbiAgICBjb25zdCByZXN1bHQgPSBmdW5jKCk7XG4gICAgY29uc29sZS50aW1lRW5kKG5hbWUpO1xuICAgIHJldHVybiByZXN1bHQ7XG4gIH1cblxuICBsb2codmlldywga2luZCwgbXNnQ2FsbGJhY2spIHtcbiAgICBpZiAodGhpcy52aWV3TG9nZ2VyKSB7XG4gICAgICBjb25zdCBbbXNnLCBvYmpdID0gbXNnQ2FsbGJhY2soKTtcbiAgICAgIHRoaXMudmlld0xvZ2dlcih2aWV3LCBraW5kLCBtc2csIG9iaik7XG4gICAgfSBlbHNlIGlmICh0aGlzLmlzRGVidWdFbmFibGVkKCkpIHtcbiAgICAgIGNvbnN0IFttc2csIG9ial0gPSBtc2dDYWxsYmFjaygpO1xuICAgICAgZGVidWcodmlldywga2luZCwgbXNnLCBvYmopO1xuICAgIH1cbiAgfVxuXG4gIHJlcXVlc3RET01VcGRhdGUoY2FsbGJhY2spIHtcbiAgICB0aGlzLnRyYW5zaXRpb25zLmFmdGVyKGNhbGxiYWNrKTtcbiAgfVxuXG4gIGFzeW5jVHJhbnNpdGlvbihwcm9taXNlKSB7XG4gICAgdGhpcy50cmFuc2l0aW9ucy5hZGRBc3luY1RyYW5zaXRpb24ocHJvbWlzZSk7XG4gIH1cblxuICB0cmFuc2l0aW9uKHRpbWUsIG9uU3RhcnQsIG9uRG9uZSA9IGZ1bmN0aW9uICgpIHt9KSB7XG4gICAgdGhpcy50cmFuc2l0aW9ucy5hZGRUcmFuc2l0aW9uKHRpbWUsIG9uU3RhcnQsIG9uRG9uZSk7XG4gIH1cblxuICBvbkNoYW5uZWwoY2hhbm5lbCwgZXZlbnQsIGNiKSB7XG4gICAgY2hhbm5lbC5vbihldmVudCwgKGRhdGEpID0+IHtcbiAgICAgIGNvbnN0IGxhdGVuY3kgPSB0aGlzLmdldExhdGVuY3lTaW0oKTtcbiAgICAgIGlmICghbGF0ZW5jeSkge1xuICAgICAgICBjYihkYXRhKTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHNldFRpbWVvdXQoKCkgPT4gY2IoZGF0YSksIGxhdGVuY3kpO1xuICAgICAgfVxuICAgIH0pO1xuICB9XG5cbiAgcmVsb2FkV2l0aEppdHRlcih2aWV3LCBsb2cpIHtcbiAgICBjbGVhclRpbWVvdXQodGhpcy5yZWxvYWRXaXRoSml0dGVyVGltZXIpO1xuICAgIHRoaXMuZGlzY29ubmVjdCgpO1xuICAgIGNvbnN0IG1pbk1zID0gdGhpcy5yZWxvYWRKaXR0ZXJNaW47XG4gICAgY29uc3QgbWF4TXMgPSB0aGlzLnJlbG9hZEppdHRlck1heDtcbiAgICBsZXQgYWZ0ZXJNcyA9IE1hdGguZmxvb3IoTWF0aC5yYW5kb20oKSAqIChtYXhNcyAtIG1pbk1zICsgMSkpICsgbWluTXM7XG4gICAgY29uc3QgdHJpZXMgPSBCcm93c2VyLnVwZGF0ZUxvY2FsKFxuICAgICAgdGhpcy5sb2NhbFN0b3JhZ2UsXG4gICAgICB3aW5kb3cubG9jYXRpb24ucGF0aG5hbWUsXG4gICAgICBDT05TRUNVVElWRV9SRUxPQURTLFxuICAgICAgMCxcbiAgICAgIChjb3VudCkgPT4gY291bnQgKyAxLFxuICAgICk7XG4gICAgaWYgKHRyaWVzID49IHRoaXMubWF4UmVsb2Fkcykge1xuICAgICAgYWZ0ZXJNcyA9IHRoaXMuZmFpbHNhZmVKaXR0ZXI7XG4gICAgfVxuICAgIHRoaXMucmVsb2FkV2l0aEppdHRlclRpbWVyID0gc2V0VGltZW91dCgoKSA9PiB7XG4gICAgICAvLyBpZiB2aWV3IGhhcyByZWNvdmVyZWQsIHN1Y2ggYXMgdHJhbnNwb3J0IHJlcGxhY2VkLCB0aGVuIGNhbmNlbFxuICAgICAgaWYgKHZpZXcuaXNEZXN0cm95ZWQoKSB8fCB2aWV3LmlzQ29ubmVjdGVkKCkpIHtcbiAgICAgICAgcmV0dXJuO1xuICAgICAgfVxuICAgICAgdmlldy5kZXN0cm95KCk7XG4gICAgICBsb2dcbiAgICAgICAgPyBsb2coKVxuICAgICAgICA6IHRoaXMubG9nKHZpZXcsIFwiam9pblwiLCAoKSA9PiBbXG4gICAgICAgICAgICBgZW5jb3VudGVyZWQgJHt0cmllc30gY29uc2VjdXRpdmUgcmVsb2Fkc2AsXG4gICAgICAgICAgXSk7XG4gICAgICBpZiAodHJpZXMgPj0gdGhpcy5tYXhSZWxvYWRzKSB7XG4gICAgICAgIHRoaXMubG9nKHZpZXcsIFwiam9pblwiLCAoKSA9PiBbXG4gICAgICAgICAgYGV4Y2VlZGVkICR7dGhpcy5tYXhSZWxvYWRzfSBjb25zZWN1dGl2ZSByZWxvYWRzLiBFbnRlcmluZyBmYWlsc2FmZSBtb2RlYCxcbiAgICAgICAgXSk7XG4gICAgICB9XG4gICAgICBpZiAodGhpcy5oYXNQZW5kaW5nTGluaygpKSB7XG4gICAgICAgIHdpbmRvdy5sb2NhdGlvbiA9IHRoaXMucGVuZGluZ0xpbms7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICB3aW5kb3cubG9jYXRpb24ucmVsb2FkKCk7XG4gICAgICB9XG4gICAgfSwgYWZ0ZXJNcyk7XG4gIH1cblxuICBnZXRIb29rRGVmaW5pdGlvbihuYW1lKSB7XG4gICAgaWYgKCFuYW1lKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIHJldHVybiAoXG4gICAgICB0aGlzLm1heWJlSW50ZXJuYWxIb29rKG5hbWUpIHx8XG4gICAgICB0aGlzLmhvb2tzW25hbWVdIHx8XG4gICAgICB0aGlzLm1heWJlUnVudGltZUhvb2sobmFtZSlcbiAgICApO1xuICB9XG5cbiAgbWF5YmVJbnRlcm5hbEhvb2sobmFtZSkge1xuICAgIHJldHVybiBuYW1lICYmIG5hbWUuc3RhcnRzV2l0aChcIlBob2VuaXguXCIpICYmIEhvb2tzW25hbWUuc3BsaXQoXCIuXCIpWzFdXTtcbiAgfVxuXG4gIG1heWJlUnVudGltZUhvb2sobmFtZSkge1xuICAgIGNvbnN0IHJ1bnRpbWVIb29rID0gZG9jdW1lbnQucXVlcnlTZWxlY3RvcihcbiAgICAgIGBzY3JpcHRbJHtQSFhfUlVOVElNRV9IT09LfT1cIiR7Q1NTLmVzY2FwZShuYW1lKX1cIl1gLFxuICAgICk7XG4gICAgaWYgKCFydW50aW1lSG9vaykge1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICBsZXQgY2FsbGJhY2tzID0gd2luZG93W2BwaHhfaG9va18ke25hbWV9YF07XG4gICAgaWYgKCFjYWxsYmFja3MgfHwgdHlwZW9mIGNhbGxiYWNrcyAhPT0gXCJmdW5jdGlvblwiKSB7XG4gICAgICBsb2dFcnJvcihcImEgcnVudGltZSBob29rIG11c3QgYmUgYSBmdW5jdGlvblwiLCBydW50aW1lSG9vayk7XG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIGNvbnN0IGhvb2tEZWZpbml0b24gPSBjYWxsYmFja3MoKTtcbiAgICBpZiAoXG4gICAgICBob29rRGVmaW5pdG9uICYmXG4gICAgICAodHlwZW9mIGhvb2tEZWZpbml0b24gPT09IFwib2JqZWN0XCIgfHwgdHlwZW9mIGhvb2tEZWZpbml0b24gPT09IFwiZnVuY3Rpb25cIilcbiAgICApIHtcbiAgICAgIHJldHVybiBob29rRGVmaW5pdG9uO1xuICAgIH1cbiAgICBsb2dFcnJvcihcbiAgICAgIFwicnVudGltZSBob29rIG11c3QgcmV0dXJuIGFuIG9iamVjdCB3aXRoIGhvb2sgY2FsbGJhY2tzIG9yIGFuIGluc3RhbmNlIG9mIFZpZXdIb29rXCIsXG4gICAgICBydW50aW1lSG9vayxcbiAgICApO1xuICB9XG5cbiAgaXNVbmxvYWRlZCgpIHtcbiAgICByZXR1cm4gdGhpcy51bmxvYWRlZDtcbiAgfVxuXG4gIGlzQ29ubmVjdGVkKCkge1xuICAgIHJldHVybiB0aGlzLnNvY2tldC5pc0Nvbm5lY3RlZCgpO1xuICB9XG5cbiAgZ2V0QmluZGluZ1ByZWZpeCgpIHtcbiAgICByZXR1cm4gdGhpcy5iaW5kaW5nUHJlZml4O1xuICB9XG5cbiAgYmluZGluZyhraW5kKSB7XG4gICAgcmV0dXJuIGAke3RoaXMuZ2V0QmluZGluZ1ByZWZpeCgpfSR7a2luZH1gO1xuICB9XG5cbiAgY2hhbm5lbCh0b3BpYywgcGFyYW1zKSB7XG4gICAgcmV0dXJuIHRoaXMuc29ja2V0LmNoYW5uZWwodG9waWMsIHBhcmFtcyk7XG4gIH1cblxuICBqb2luRGVhZFZpZXcoKSB7XG4gICAgY29uc3QgYm9keSA9IGRvY3VtZW50LmJvZHk7XG4gICAgaWYgKFxuICAgICAgYm9keSAmJlxuICAgICAgIXRoaXMuaXNQaHhWaWV3KGJvZHkpICYmXG4gICAgICAhdGhpcy5pc1BoeFZpZXcoZG9jdW1lbnQuZmlyc3RFbGVtZW50Q2hpbGQpXG4gICAgKSB7XG4gICAgICBjb25zdCB2aWV3ID0gdGhpcy5uZXdSb290Vmlldyhib2R5KTtcbiAgICAgIHZpZXcuc2V0SHJlZih0aGlzLmdldEhyZWYoKSk7XG4gICAgICB2aWV3LmpvaW5EZWFkKCk7XG4gICAgICBpZiAoIXRoaXMubWFpbikge1xuICAgICAgICB0aGlzLm1haW4gPSB2aWV3O1xuICAgICAgfVxuICAgICAgd2luZG93LnJlcXVlc3RBbmltYXRpb25GcmFtZSgoKSA9PiB7XG4gICAgICAgIHZpZXcuZXhlY05ld01vdW50ZWQoKTtcbiAgICAgICAgLy8gcmVzdG9yZSBzY3JvbGwgcG9zaXRpb24gd2hlbiBuYXZpZ2F0aW5nIGZyb20gYW4gZXh0ZXJuYWwgLyBub24tbGl2ZSBwYWdlXG4gICAgICAgIHRoaXMubWF5YmVTY3JvbGwoaGlzdG9yeS5zdGF0ZT8uc2Nyb2xsKTtcbiAgICAgIH0pO1xuICAgIH1cbiAgfVxuXG4gIGpvaW5Sb290Vmlld3MoKSB7XG4gICAgbGV0IHJvb3RzRm91bmQgPSBmYWxzZTtcbiAgICBET00uYWxsKFxuICAgICAgZG9jdW1lbnQsXG4gICAgICBgJHtQSFhfVklFV19TRUxFQ1RPUn06bm90KFske1BIWF9QQVJFTlRfSUR9XSlgLFxuICAgICAgKHJvb3RFbCkgPT4ge1xuICAgICAgICBpZiAoIXRoaXMuZ2V0Um9vdEJ5SWQocm9vdEVsLmlkKSkge1xuICAgICAgICAgIGNvbnN0IHZpZXcgPSB0aGlzLm5ld1Jvb3RWaWV3KHJvb3RFbCk7XG4gICAgICAgICAgLy8gc3RpY2tpZXMgY2Fubm90IGJlIG1vdW50ZWQgYXQgdGhlIHJvdXRlciBhbmQgdGhlcmVmb3JlIHNob3VsZCBub3RcbiAgICAgICAgICAvLyBnZXQgYSBocmVmIHNldCBvbiB0aGVtXG4gICAgICAgICAgaWYgKCFET00uaXNQaHhTdGlja3kocm9vdEVsKSkge1xuICAgICAgICAgICAgdmlldy5zZXRIcmVmKHRoaXMuZ2V0SHJlZigpKTtcbiAgICAgICAgICB9XG4gICAgICAgICAgdmlldy5qb2luKCk7XG4gICAgICAgICAgaWYgKHJvb3RFbC5oYXNBdHRyaWJ1dGUoUEhYX01BSU4pKSB7XG4gICAgICAgICAgICB0aGlzLm1haW4gPSB2aWV3O1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICByb290c0ZvdW5kID0gdHJ1ZTtcbiAgICAgIH0sXG4gICAgKTtcbiAgICByZXR1cm4gcm9vdHNGb3VuZDtcbiAgfVxuXG4gIHJlZGlyZWN0KHRvLCBmbGFzaCwgcmVsb2FkVG9rZW4pIHtcbiAgICBpZiAocmVsb2FkVG9rZW4pIHtcbiAgICAgIEJyb3dzZXIuc2V0Q29va2llKFBIWF9SRUxPQURfU1RBVFVTLCByZWxvYWRUb2tlbiwgNjApO1xuICAgIH1cbiAgICB0aGlzLnVubG9hZCgpO1xuICAgIEJyb3dzZXIucmVkaXJlY3QodG8sIGZsYXNoKTtcbiAgfVxuXG4gIHJlcGxhY2VNYWluKFxuICAgIGhyZWYsXG4gICAgZmxhc2gsXG4gICAgY2FsbGJhY2sgPSBudWxsLFxuICAgIGxpbmtSZWYgPSB0aGlzLnNldFBlbmRpbmdMaW5rKGhyZWYpLFxuICApIHtcbiAgICBjb25zdCBsaXZlUmVmZXJlciA9IHRoaXMuY3VycmVudExvY2F0aW9uLmhyZWY7XG4gICAgdGhpcy5vdXRnb2luZ01haW5FbCA9IHRoaXMub3V0Z29pbmdNYWluRWwgfHwgdGhpcy5tYWluLmVsO1xuXG4gICAgY29uc3Qgc3RpY2tpZXMgPSBET00uZmluZFBoeFN0aWNreShkb2N1bWVudCkgfHwgW107XG4gICAgY29uc3QgcmVtb3ZlRWxzID0gRE9NLmFsbChcbiAgICAgIHRoaXMub3V0Z29pbmdNYWluRWwsXG4gICAgICBgWyR7dGhpcy5iaW5kaW5nKFwicmVtb3ZlXCIpfV1gLFxuICAgICkuZmlsdGVyKChlbCkgPT4gIURPTS5pc0NoaWxkT2ZBbnkoZWwsIHN0aWNraWVzKSk7XG5cbiAgICBjb25zdCBuZXdNYWluRWwgPSBET00uY2xvbmVOb2RlKHRoaXMub3V0Z29pbmdNYWluRWwsIFwiXCIpO1xuICAgIHRoaXMubWFpbi5zaG93TG9hZGVyKHRoaXMubG9hZGVyVGltZW91dCk7XG4gICAgdGhpcy5tYWluLmRlc3Ryb3koKTtcblxuICAgIHRoaXMubWFpbiA9IHRoaXMubmV3Um9vdFZpZXcobmV3TWFpbkVsLCBmbGFzaCwgbGl2ZVJlZmVyZXIpO1xuICAgIHRoaXMubWFpbi5zZXRSZWRpcmVjdChocmVmKTtcbiAgICB0aGlzLnRyYW5zaXRpb25SZW1vdmVzKHJlbW92ZUVscyk7XG4gICAgdGhpcy5tYWluLmpvaW4oKGpvaW5Db3VudCwgb25Eb25lKSA9PiB7XG4gICAgICBpZiAoam9pbkNvdW50ID09PSAxICYmIHRoaXMuY29tbWl0UGVuZGluZ0xpbmsobGlua1JlZikpIHtcbiAgICAgICAgdGhpcy5yZXF1ZXN0RE9NVXBkYXRlKCgpID0+IHtcbiAgICAgICAgICAvLyByZW1vdmUgcGh4LXJlbW92ZSBlbHMgcmlnaHQgYmVmb3JlIHdlIHJlcGxhY2UgdGhlIG1haW4gZWxlbWVudFxuICAgICAgICAgIHJlbW92ZUVscy5mb3JFYWNoKChlbCkgPT4gZWwucmVtb3ZlKCkpO1xuICAgICAgICAgIHN0aWNraWVzLmZvckVhY2goKGVsKSA9PiBuZXdNYWluRWwuYXBwZW5kQ2hpbGQoZWwpKTtcbiAgICAgICAgICB0aGlzLm91dGdvaW5nTWFpbkVsLnJlcGxhY2VXaXRoKG5ld01haW5FbCk7XG4gICAgICAgICAgdGhpcy5vdXRnb2luZ01haW5FbCA9IG51bGw7XG4gICAgICAgICAgY2FsbGJhY2sgJiYgY2FsbGJhY2sobGlua1JlZik7XG4gICAgICAgICAgb25Eb25lKCk7XG4gICAgICAgIH0pO1xuICAgICAgfVxuICAgIH0pO1xuICB9XG5cbiAgdHJhbnNpdGlvblJlbW92ZXMoZWxlbWVudHMsIGNhbGxiYWNrKSB7XG4gICAgY29uc3QgcmVtb3ZlQXR0ciA9IHRoaXMuYmluZGluZyhcInJlbW92ZVwiKTtcbiAgICBjb25zdCBzaWxlbmNlRXZlbnRzID0gKGUpID0+IHtcbiAgICAgIGUucHJldmVudERlZmF1bHQoKTtcbiAgICAgIGUuc3RvcEltbWVkaWF0ZVByb3BhZ2F0aW9uKCk7XG4gICAgfTtcbiAgICBlbGVtZW50cy5mb3JFYWNoKChlbCkgPT4ge1xuICAgICAgLy8gcHJldmVudCBhbGwgbGlzdGVuZXJzIHdlIGNhcmUgYWJvdXQgZnJvbSBidWJibGluZyB0byB3aW5kb3dcbiAgICAgIC8vIHNpbmNlIHdlIGFyZSByZW1vdmluZyB0aGUgZWxlbWVudFxuICAgICAgZm9yIChjb25zdCBldmVudCBvZiB0aGlzLmJvdW5kRXZlbnROYW1lcykge1xuICAgICAgICBlbC5hZGRFdmVudExpc3RlbmVyKGV2ZW50LCBzaWxlbmNlRXZlbnRzLCB0cnVlKTtcbiAgICAgIH1cbiAgICAgIHRoaXMuZXhlY0pTKGVsLCBlbC5nZXRBdHRyaWJ1dGUocmVtb3ZlQXR0ciksIFwicmVtb3ZlXCIpO1xuICAgIH0pO1xuICAgIC8vIHJlbW92ZSB0aGUgc2lsZW5jZWQgbGlzdGVuZXJzIHdoZW4gdHJhbnNpdGlvbnMgYXJlIGRvbmUgaW5jYXNlIHRoZSBlbGVtZW50IGlzIHJlLXVzZWRcbiAgICAvLyBhbmQgY2FsbCBjYWxsZXIncyBjYWxsYmFjayBhcyBzb29uIGFzIHdlIGFyZSBkb25lIHdpdGggdHJhbnNpdGlvbnNcbiAgICB0aGlzLnJlcXVlc3RET01VcGRhdGUoKCkgPT4ge1xuICAgICAgZWxlbWVudHMuZm9yRWFjaCgoZWwpID0+IHtcbiAgICAgICAgZm9yIChjb25zdCBldmVudCBvZiB0aGlzLmJvdW5kRXZlbnROYW1lcykge1xuICAgICAgICAgIGVsLnJlbW92ZUV2ZW50TGlzdGVuZXIoZXZlbnQsIHNpbGVuY2VFdmVudHMsIHRydWUpO1xuICAgICAgICB9XG4gICAgICB9KTtcbiAgICAgIGNhbGxiYWNrICYmIGNhbGxiYWNrKCk7XG4gICAgfSk7XG4gIH1cblxuICBpc1BoeFZpZXcoZWwpIHtcbiAgICByZXR1cm4gZWwuZ2V0QXR0cmlidXRlICYmIGVsLmdldEF0dHJpYnV0ZShQSFhfU0VTU0lPTikgIT09IG51bGw7XG4gIH1cblxuICBuZXdSb290VmlldyhlbCwgZmxhc2gsIGxpdmVSZWZlcmVyKSB7XG4gICAgY29uc3QgdmlldyA9IG5ldyBWaWV3KGVsLCB0aGlzLCBudWxsLCBmbGFzaCwgbGl2ZVJlZmVyZXIpO1xuICAgIHRoaXMucm9vdHNbdmlldy5pZF0gPSB2aWV3O1xuICAgIHJldHVybiB2aWV3O1xuICB9XG5cbiAgb3duZXIoY2hpbGRFbCwgY2FsbGJhY2spIHtcbiAgICBsZXQgdmlldztcbiAgICBjb25zdCB2aWV3RWwgPSBET00uY2xvc2VzdFZpZXdFbChjaGlsZEVsKTtcbiAgICBpZiAodmlld0VsKSB7XG4gICAgICAvLyBpdCBjYW4gaGFwcGVuIHRoYXQgd2UgZmluZCBhIHZpZXcgdGhhdCBpcyBhbHJlYWR5IGRlc3Ryb3llZDtcbiAgICAgIC8vIGluIHRoYXQgY2FzZSB3ZSBETyBOT1Qgd2FudCB0byBmYWxsYmFjayB0byB0aGUgbWFpbiBlbGVtZW50XG4gICAgICB2aWV3ID0gdGhpcy5nZXRWaWV3QnlFbCh2aWV3RWwpO1xuICAgIH0gZWxzZSB7XG4gICAgICB2aWV3ID0gdGhpcy5tYWluO1xuICAgIH1cbiAgICByZXR1cm4gdmlldyAmJiBjYWxsYmFjayA/IGNhbGxiYWNrKHZpZXcpIDogdmlldztcbiAgfVxuXG4gIHdpdGhpbk93bmVycyhjaGlsZEVsLCBjYWxsYmFjaykge1xuICAgIHRoaXMub3duZXIoY2hpbGRFbCwgKHZpZXcpID0+IGNhbGxiYWNrKHZpZXcsIGNoaWxkRWwpKTtcbiAgfVxuXG4gIGdldFZpZXdCeUVsKGVsKSB7XG4gICAgY29uc3Qgcm9vdElkID0gZWwuZ2V0QXR0cmlidXRlKFBIWF9ST09UX0lEKTtcbiAgICByZXR1cm4gbWF5YmUodGhpcy5nZXRSb290QnlJZChyb290SWQpLCAocm9vdCkgPT5cbiAgICAgIHJvb3QuZ2V0RGVzY2VuZGVudEJ5RWwoZWwpLFxuICAgICk7XG4gIH1cblxuICBnZXRSb290QnlJZChpZCkge1xuICAgIHJldHVybiB0aGlzLnJvb3RzW2lkXTtcbiAgfVxuXG4gIGRlc3Ryb3lBbGxWaWV3cygpIHtcbiAgICBmb3IgKGNvbnN0IGlkIGluIHRoaXMucm9vdHMpIHtcbiAgICAgIHRoaXMucm9vdHNbaWRdLmRlc3Ryb3koKTtcbiAgICAgIGRlbGV0ZSB0aGlzLnJvb3RzW2lkXTtcbiAgICB9XG4gICAgdGhpcy5tYWluID0gbnVsbDtcbiAgfVxuXG4gIGRlc3Ryb3lWaWV3QnlFbChlbCkge1xuICAgIGNvbnN0IHJvb3QgPSB0aGlzLmdldFJvb3RCeUlkKGVsLmdldEF0dHJpYnV0ZShQSFhfUk9PVF9JRCkpO1xuICAgIGlmIChyb290ICYmIHJvb3QuaWQgPT09IGVsLmlkKSB7XG4gICAgICByb290LmRlc3Ryb3koKTtcbiAgICAgIGRlbGV0ZSB0aGlzLnJvb3RzW3Jvb3QuaWRdO1xuICAgIH0gZWxzZSBpZiAocm9vdCkge1xuICAgICAgcm9vdC5kZXN0cm95RGVzY2VuZGVudChlbC5pZCk7XG4gICAgfVxuICB9XG5cbiAgZ2V0QWN0aXZlRWxlbWVudCgpIHtcbiAgICByZXR1cm4gZG9jdW1lbnQuYWN0aXZlRWxlbWVudDtcbiAgfVxuXG4gIGRyb3BBY3RpdmVFbGVtZW50KHZpZXcpIHtcbiAgICBpZiAodGhpcy5wcmV2QWN0aXZlICYmIHZpZXcub3duc0VsZW1lbnQodGhpcy5wcmV2QWN0aXZlKSkge1xuICAgICAgdGhpcy5wcmV2QWN0aXZlID0gbnVsbDtcbiAgICB9XG4gIH1cblxuICByZXN0b3JlUHJldmlvdXNseUFjdGl2ZUZvY3VzKCkge1xuICAgIGlmIChcbiAgICAgIHRoaXMucHJldkFjdGl2ZSAmJlxuICAgICAgdGhpcy5wcmV2QWN0aXZlICE9PSBkb2N1bWVudC5ib2R5ICYmXG4gICAgICB0aGlzLnByZXZBY3RpdmUgaW5zdGFuY2VvZiBIVE1MRWxlbWVudFxuICAgICkge1xuICAgICAgdGhpcy5wcmV2QWN0aXZlLmZvY3VzKCk7XG4gICAgfVxuICB9XG5cbiAgYmx1ckFjdGl2ZUVsZW1lbnQoKSB7XG4gICAgdGhpcy5wcmV2QWN0aXZlID0gdGhpcy5nZXRBY3RpdmVFbGVtZW50KCk7XG4gICAgaWYgKFxuICAgICAgdGhpcy5wcmV2QWN0aXZlICE9PSBkb2N1bWVudC5ib2R5ICYmXG4gICAgICB0aGlzLnByZXZBY3RpdmUgaW5zdGFuY2VvZiBIVE1MRWxlbWVudFxuICAgICkge1xuICAgICAgdGhpcy5wcmV2QWN0aXZlLmJsdXIoKTtcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogQHBhcmFtIHt7ZGVhZD86IGJvb2xlYW59fSBbb3B0aW9ucz17fV1cbiAgICovXG4gIGJpbmRUb3BMZXZlbEV2ZW50cyh7IGRlYWQgfSA9IHt9KSB7XG4gICAgaWYgKHRoaXMuYm91bmRUb3BMZXZlbEV2ZW50cykge1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIHRoaXMuYm91bmRUb3BMZXZlbEV2ZW50cyA9IHRydWU7XG4gICAgLy8gZW50ZXIgZmFpbHNhZmUgcmVsb2FkIGlmIHNlcnZlciBoYXMgZ29uZSBhd2F5IGludGVudGlvbmFsbHksIHN1Y2ggYXMgXCJkaXNjb25uZWN0XCIgYnJvYWRjYXN0XG4gICAgdGhpcy5zZXJ2ZXJDbG9zZVJlZiA9IHRoaXMuc29ja2V0Lm9uQ2xvc2UoKGV2ZW50KSA9PiB7XG4gICAgICAvLyBmYWlsc2FmZSByZWxvYWQgaWYgbm9ybWFsIGNsb3N1cmUgYW5kIHdlIHN0aWxsIGhhdmUgYSBtYWluIExWXG4gICAgICBpZiAoZXZlbnQgJiYgZXZlbnQuY29kZSA9PT0gMTAwMCAmJiB0aGlzLm1haW4pIHtcbiAgICAgICAgcmV0dXJuIHRoaXMucmVsb2FkV2l0aEppdHRlcih0aGlzLm1haW4pO1xuICAgICAgfVxuICAgIH0pO1xuICAgIGRvY3VtZW50LmJvZHkuYWRkRXZlbnRMaXN0ZW5lcihcImNsaWNrXCIsIGZ1bmN0aW9uICgpIHt9KTsgLy8gZW5zdXJlIGFsbCBjbGljayBldmVudHMgYnViYmxlIGZvciBtb2JpbGUgU2FmYXJpXG4gICAgd2luZG93LmFkZEV2ZW50TGlzdGVuZXIoXG4gICAgICBcInBhZ2VzaG93XCIsXG4gICAgICAoZSkgPT4ge1xuICAgICAgICBpZiAoZS5wZXJzaXN0ZWQpIHtcbiAgICAgICAgICAvLyByZWxvYWQgcGFnZSBpZiBiZWluZyByZXN0b3JlZCBmcm9tIGJhY2svZm9yd2FyZCBjYWNoZVxuICAgICAgICAgIHRoaXMuZ2V0U29ja2V0KCkuZGlzY29ubmVjdCgpO1xuICAgICAgICAgIHRoaXMud2l0aFBhZ2VMb2FkaW5nKHsgdG86IHdpbmRvdy5sb2NhdGlvbi5ocmVmLCBraW5kOiBcInJlZGlyZWN0XCIgfSk7XG4gICAgICAgICAgd2luZG93LmxvY2F0aW9uLnJlbG9hZCgpO1xuICAgICAgICB9XG4gICAgICB9LFxuICAgICAgdHJ1ZSxcbiAgICApO1xuICAgIGlmICghZGVhZCkge1xuICAgICAgdGhpcy5iaW5kTmF2KCk7XG4gICAgfVxuICAgIHRoaXMuYmluZENsaWNrcygpO1xuICAgIGlmICghZGVhZCkge1xuICAgICAgdGhpcy5iaW5kRm9ybXMoKTtcbiAgICB9XG4gICAgdGhpcy5iaW5kKFxuICAgICAgeyBrZXl1cDogXCJrZXl1cFwiLCBrZXlkb3duOiBcImtleWRvd25cIiB9LFxuICAgICAgKGUsIHR5cGUsIHZpZXcsIHRhcmdldEVsLCBwaHhFdmVudCwgX3BoeFRhcmdldCkgPT4ge1xuICAgICAgICBjb25zdCBtYXRjaEtleSA9IHRhcmdldEVsLmdldEF0dHJpYnV0ZSh0aGlzLmJpbmRpbmcoUEhYX0tFWSkpO1xuICAgICAgICBjb25zdCBwcmVzc2VkS2V5ID0gZS5rZXkgJiYgZS5rZXkudG9Mb3dlckNhc2UoKTsgLy8gY2hyb21lIGNsaWNrZWQgYXV0b2NvbXBsZXRlcyBzZW5kIGEga2V5ZG93biB3aXRob3V0IGtleVxuICAgICAgICBpZiAobWF0Y2hLZXkgJiYgbWF0Y2hLZXkudG9Mb3dlckNhc2UoKSAhPT0gcHJlc3NlZEtleSkge1xuICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuXG4gICAgICAgIGNvbnN0IGRhdGEgPSB7IGtleTogZS5rZXksIC4uLnRoaXMuZXZlbnRNZXRhKHR5cGUsIGUsIHRhcmdldEVsKSB9O1xuICAgICAgICBKUy5leGVjKGUsIHR5cGUsIHBoeEV2ZW50LCB2aWV3LCB0YXJnZXRFbCwgW1wicHVzaFwiLCB7IGRhdGEgfV0pO1xuICAgICAgfSxcbiAgICApO1xuICAgIHRoaXMuYmluZChcbiAgICAgIHsgYmx1cjogXCJmb2N1c291dFwiLCBmb2N1czogXCJmb2N1c2luXCIgfSxcbiAgICAgIChlLCB0eXBlLCB2aWV3LCB0YXJnZXRFbCwgcGh4RXZlbnQsIHBoeFRhcmdldCkgPT4ge1xuICAgICAgICBpZiAoIXBoeFRhcmdldCkge1xuICAgICAgICAgIGNvbnN0IGRhdGEgPSB7IGtleTogZS5rZXksIC4uLnRoaXMuZXZlbnRNZXRhKHR5cGUsIGUsIHRhcmdldEVsKSB9O1xuICAgICAgICAgIEpTLmV4ZWMoZSwgdHlwZSwgcGh4RXZlbnQsIHZpZXcsIHRhcmdldEVsLCBbXCJwdXNoXCIsIHsgZGF0YSB9XSk7XG4gICAgICAgIH1cbiAgICAgIH0sXG4gICAgKTtcbiAgICB0aGlzLmJpbmQoXG4gICAgICB7IGJsdXI6IFwiYmx1clwiLCBmb2N1czogXCJmb2N1c1wiIH0sXG4gICAgICAoZSwgdHlwZSwgdmlldywgdGFyZ2V0RWwsIHBoeEV2ZW50LCBwaHhUYXJnZXQpID0+IHtcbiAgICAgICAgLy8gYmx1ciBhbmQgZm9jdXMgYXJlIHRyaWdnZXJlZCBvbiBkb2N1bWVudCBhbmQgd2luZG93LiBEaXNjYXJkIG9uZSB0byBhdm9pZCBkdXBzXG4gICAgICAgIGlmIChwaHhUYXJnZXQgPT09IFwid2luZG93XCIpIHtcbiAgICAgICAgICBjb25zdCBkYXRhID0gdGhpcy5ldmVudE1ldGEodHlwZSwgZSwgdGFyZ2V0RWwpO1xuICAgICAgICAgIEpTLmV4ZWMoZSwgdHlwZSwgcGh4RXZlbnQsIHZpZXcsIHRhcmdldEVsLCBbXCJwdXNoXCIsIHsgZGF0YSB9XSk7XG4gICAgICAgIH1cbiAgICAgIH0sXG4gICAgKTtcbiAgICB0aGlzLm9uKFwiZHJhZ292ZXJcIiwgKGUpID0+IGUucHJldmVudERlZmF1bHQoKSk7XG4gICAgdGhpcy5vbihcImRyb3BcIiwgKGUpID0+IHtcbiAgICAgIGUucHJldmVudERlZmF1bHQoKTtcbiAgICAgIGNvbnN0IGRyb3BUYXJnZXRJZCA9IG1heWJlKFxuICAgICAgICBjbG9zZXN0UGh4QmluZGluZyhlLnRhcmdldCwgdGhpcy5iaW5kaW5nKFBIWF9EUk9QX1RBUkdFVCkpLFxuICAgICAgICAodHJ1ZVRhcmdldCkgPT4ge1xuICAgICAgICAgIHJldHVybiB0cnVlVGFyZ2V0LmdldEF0dHJpYnV0ZSh0aGlzLmJpbmRpbmcoUEhYX0RST1BfVEFSR0VUKSk7XG4gICAgICAgIH0sXG4gICAgICApO1xuICAgICAgY29uc3QgZHJvcFRhcmdldCA9IGRyb3BUYXJnZXRJZCAmJiBkb2N1bWVudC5nZXRFbGVtZW50QnlJZChkcm9wVGFyZ2V0SWQpO1xuICAgICAgY29uc3QgZmlsZXMgPSBBcnJheS5mcm9tKGUuZGF0YVRyYW5zZmVyLmZpbGVzIHx8IFtdKTtcbiAgICAgIGlmIChcbiAgICAgICAgIWRyb3BUYXJnZXQgfHxcbiAgICAgICAgIShkcm9wVGFyZ2V0IGluc3RhbmNlb2YgSFRNTElucHV0RWxlbWVudCkgfHxcbiAgICAgICAgZHJvcFRhcmdldC5kaXNhYmxlZCB8fFxuICAgICAgICBmaWxlcy5sZW5ndGggPT09IDAgfHxcbiAgICAgICAgIShkcm9wVGFyZ2V0LmZpbGVzIGluc3RhbmNlb2YgRmlsZUxpc3QpXG4gICAgICApIHtcbiAgICAgICAgcmV0dXJuO1xuICAgICAgfVxuXG4gICAgICBMaXZlVXBsb2FkZXIudHJhY2tGaWxlcyhkcm9wVGFyZ2V0LCBmaWxlcywgZS5kYXRhVHJhbnNmZXIpO1xuICAgICAgZHJvcFRhcmdldC5kaXNwYXRjaEV2ZW50KG5ldyBFdmVudChcImlucHV0XCIsIHsgYnViYmxlczogdHJ1ZSB9KSk7XG4gICAgfSk7XG4gICAgdGhpcy5vbihQSFhfVFJBQ0tfVVBMT0FEUywgKGUpID0+IHtcbiAgICAgIGNvbnN0IHVwbG9hZFRhcmdldCA9IGUudGFyZ2V0O1xuICAgICAgaWYgKCFET00uaXNVcGxvYWRJbnB1dCh1cGxvYWRUYXJnZXQpKSB7XG4gICAgICAgIHJldHVybjtcbiAgICAgIH1cbiAgICAgIGNvbnN0IGZpbGVzID0gQXJyYXkuZnJvbShlLmRldGFpbC5maWxlcyB8fCBbXSkuZmlsdGVyKFxuICAgICAgICAoZikgPT4gZiBpbnN0YW5jZW9mIEZpbGUgfHwgZiBpbnN0YW5jZW9mIEJsb2IsXG4gICAgICApO1xuICAgICAgTGl2ZVVwbG9hZGVyLnRyYWNrRmlsZXModXBsb2FkVGFyZ2V0LCBmaWxlcyk7XG4gICAgICB1cGxvYWRUYXJnZXQuZGlzcGF0Y2hFdmVudChuZXcgRXZlbnQoXCJpbnB1dFwiLCB7IGJ1YmJsZXM6IHRydWUgfSkpO1xuICAgIH0pO1xuICB9XG5cbiAgZXZlbnRNZXRhKGV2ZW50TmFtZSwgZSwgdGFyZ2V0RWwpIHtcbiAgICBjb25zdCBjYWxsYmFjayA9IHRoaXMubWV0YWRhdGFDYWxsYmFja3NbZXZlbnROYW1lXTtcbiAgICByZXR1cm4gY2FsbGJhY2sgPyBjYWxsYmFjayhlLCB0YXJnZXRFbCkgOiB7fTtcbiAgfVxuXG4gIHNldFBlbmRpbmdMaW5rKGhyZWYpIHtcbiAgICB0aGlzLmxpbmtSZWYrKztcbiAgICB0aGlzLnBlbmRpbmdMaW5rID0gaHJlZjtcbiAgICB0aGlzLnJlc2V0UmVsb2FkU3RhdHVzKCk7XG4gICAgcmV0dXJuIHRoaXMubGlua1JlZjtcbiAgfVxuXG4gIC8vIGFueXRpbWUgd2UgYXJlIG5hdmlnYXRpbmcgb3IgY29ubmVjdGluZywgZHJvcCByZWxvYWQgY29va2llIGluIGNhc2VcbiAgLy8gd2UgaXNzdWUgdGhlIGNvb2tpZSBidXQgdGhlIG5leHQgcmVxdWVzdCB3YXMgaW50ZXJydXB0ZWQgYW5kIHRoZSBzZXJ2ZXIgbmV2ZXIgZHJvcHBlZCBpdFxuICByZXNldFJlbG9hZFN0YXR1cygpIHtcbiAgICBCcm93c2VyLmRlbGV0ZUNvb2tpZShQSFhfUkVMT0FEX1NUQVRVUyk7XG4gIH1cblxuICBjb21taXRQZW5kaW5nTGluayhsaW5rUmVmKSB7XG4gICAgaWYgKHRoaXMubGlua1JlZiAhPT0gbGlua1JlZikge1xuICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH0gZWxzZSB7XG4gICAgICB0aGlzLmhyZWYgPSB0aGlzLnBlbmRpbmdMaW5rO1xuICAgICAgdGhpcy5wZW5kaW5nTGluayA9IG51bGw7XG4gICAgICByZXR1cm4gdHJ1ZTtcbiAgICB9XG4gIH1cblxuICBnZXRIcmVmKCkge1xuICAgIHJldHVybiB0aGlzLmhyZWY7XG4gIH1cblxuICBoYXNQZW5kaW5nTGluaygpIHtcbiAgICByZXR1cm4gISF0aGlzLnBlbmRpbmdMaW5rO1xuICB9XG5cbiAgYmluZChldmVudHMsIGNhbGxiYWNrKSB7XG4gICAgZm9yIChjb25zdCBldmVudCBpbiBldmVudHMpIHtcbiAgICAgIGNvbnN0IGJyb3dzZXJFdmVudE5hbWUgPSBldmVudHNbZXZlbnRdO1xuXG4gICAgICB0aGlzLm9uKGJyb3dzZXJFdmVudE5hbWUsIChlKSA9PiB7XG4gICAgICAgIGNvbnN0IGJpbmRpbmcgPSB0aGlzLmJpbmRpbmcoZXZlbnQpO1xuICAgICAgICBjb25zdCB3aW5kb3dCaW5kaW5nID0gdGhpcy5iaW5kaW5nKGB3aW5kb3ctJHtldmVudH1gKTtcbiAgICAgICAgY29uc3QgdGFyZ2V0UGh4RXZlbnQgPVxuICAgICAgICAgIGUudGFyZ2V0LmdldEF0dHJpYnV0ZSAmJiBlLnRhcmdldC5nZXRBdHRyaWJ1dGUoYmluZGluZyk7XG4gICAgICAgIGlmICh0YXJnZXRQaHhFdmVudCkge1xuICAgICAgICAgIHRoaXMuZGVib3VuY2UoZS50YXJnZXQsIGUsIGJyb3dzZXJFdmVudE5hbWUsICgpID0+IHtcbiAgICAgICAgICAgIHRoaXMud2l0aGluT3duZXJzKGUudGFyZ2V0LCAodmlldykgPT4ge1xuICAgICAgICAgICAgICBjYWxsYmFjayhlLCBldmVudCwgdmlldywgZS50YXJnZXQsIHRhcmdldFBoeEV2ZW50LCBudWxsKTtcbiAgICAgICAgICAgIH0pO1xuICAgICAgICAgIH0pO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIERPTS5hbGwoZG9jdW1lbnQsIGBbJHt3aW5kb3dCaW5kaW5nfV1gLCAoZWwpID0+IHtcbiAgICAgICAgICAgIGNvbnN0IHBoeEV2ZW50ID0gZWwuZ2V0QXR0cmlidXRlKHdpbmRvd0JpbmRpbmcpO1xuICAgICAgICAgICAgdGhpcy5kZWJvdW5jZShlbCwgZSwgYnJvd3NlckV2ZW50TmFtZSwgKCkgPT4ge1xuICAgICAgICAgICAgICB0aGlzLndpdGhpbk93bmVycyhlbCwgKHZpZXcpID0+IHtcbiAgICAgICAgICAgICAgICBjYWxsYmFjayhlLCBldmVudCwgdmlldywgZWwsIHBoeEV2ZW50LCBcIndpbmRvd1wiKTtcbiAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICB9KTtcbiAgICAgICAgICB9KTtcbiAgICAgICAgfVxuICAgICAgfSk7XG4gICAgfVxuICB9XG5cbiAgYmluZENsaWNrcygpIHtcbiAgICB0aGlzLm9uKFwibW91c2Vkb3duXCIsIChlKSA9PiAodGhpcy5jbGlja1N0YXJ0ZWRBdFRhcmdldCA9IGUudGFyZ2V0KSk7XG4gICAgdGhpcy5iaW5kQ2xpY2soXCJjbGlja1wiLCBcImNsaWNrXCIpO1xuICB9XG5cbiAgYmluZENsaWNrKGV2ZW50TmFtZSwgYmluZGluZ05hbWUpIHtcbiAgICBjb25zdCBjbGljayA9IHRoaXMuYmluZGluZyhiaW5kaW5nTmFtZSk7XG4gICAgd2luZG93LmFkZEV2ZW50TGlzdGVuZXIoXG4gICAgICBldmVudE5hbWUsXG4gICAgICAoZSkgPT4ge1xuICAgICAgICBsZXQgdGFyZ2V0ID0gbnVsbDtcbiAgICAgICAgLy8gYSBzeW50aGV0aWMgY2xpY2sgZXZlbnQgKGRldGFpbCAwKSB3aWxsIG5vdCBoYXZlIGNhdXNlZCBhIG1vdXNlZG93biBldmVudCxcbiAgICAgICAgLy8gdGhlcmVmb3JlIHRoZSBjbGlja1N0YXJ0ZWRBdFRhcmdldCBpcyBzdGFsZVxuICAgICAgICBpZiAoZS5kZXRhaWwgPT09IDApIHRoaXMuY2xpY2tTdGFydGVkQXRUYXJnZXQgPSBlLnRhcmdldDtcbiAgICAgICAgY29uc3QgY2xpY2tTdGFydGVkQXRUYXJnZXQgPSB0aGlzLmNsaWNrU3RhcnRlZEF0VGFyZ2V0IHx8IGUudGFyZ2V0O1xuICAgICAgICAvLyB3aGVuIHNlYXJjaGluZyB0aGUgdGFyZ2V0IGZvciB0aGUgY2xpY2sgZXZlbnQsIHdlIGFsd2F5cyB3YW50IHRvXG4gICAgICAgIC8vIHVzZSB0aGUgYWN0dWFsIGV2ZW50IHRhcmdldCwgc2VlICMzMzcyXG4gICAgICAgIHRhcmdldCA9IGNsb3Nlc3RQaHhCaW5kaW5nKGUudGFyZ2V0LCBjbGljayk7XG4gICAgICAgIHRoaXMuZGlzcGF0Y2hDbGlja0F3YXkoZSwgY2xpY2tTdGFydGVkQXRUYXJnZXQpO1xuICAgICAgICB0aGlzLmNsaWNrU3RhcnRlZEF0VGFyZ2V0ID0gbnVsbDtcbiAgICAgICAgY29uc3QgcGh4RXZlbnQgPSB0YXJnZXQgJiYgdGFyZ2V0LmdldEF0dHJpYnV0ZShjbGljayk7XG4gICAgICAgIGlmICghcGh4RXZlbnQpIHtcbiAgICAgICAgICBpZiAoRE9NLmlzTmV3UGFnZUNsaWNrKGUsIHdpbmRvdy5sb2NhdGlvbikpIHtcbiAgICAgICAgICAgIHRoaXMudW5sb2FkKCk7XG4gICAgICAgICAgfVxuICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuXG4gICAgICAgIGlmICh0YXJnZXQuZ2V0QXR0cmlidXRlKFwiaHJlZlwiKSA9PT0gXCIjXCIpIHtcbiAgICAgICAgICBlLnByZXZlbnREZWZhdWx0KCk7XG4gICAgICAgIH1cblxuICAgICAgICAvLyBub29wIGlmIHdlIGFyZSBpbiB0aGUgbWlkZGxlIG9mIGF3YWl0aW5nIGFuIGFjayBmb3IgdGhpcyBlbCBhbHJlYWR5XG4gICAgICAgIGlmICh0YXJnZXQuaGFzQXR0cmlidXRlKFBIWF9SRUZfU1JDKSkge1xuICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuXG4gICAgICAgIHRoaXMuZGVib3VuY2UodGFyZ2V0LCBlLCBcImNsaWNrXCIsICgpID0+IHtcbiAgICAgICAgICB0aGlzLndpdGhpbk93bmVycyh0YXJnZXQsICh2aWV3KSA9PiB7XG4gICAgICAgICAgICBKUy5leGVjKGUsIFwiY2xpY2tcIiwgcGh4RXZlbnQsIHZpZXcsIHRhcmdldCwgW1xuICAgICAgICAgICAgICBcInB1c2hcIixcbiAgICAgICAgICAgICAgeyBkYXRhOiB0aGlzLmV2ZW50TWV0YShcImNsaWNrXCIsIGUsIHRhcmdldCkgfSxcbiAgICAgICAgICAgIF0pO1xuICAgICAgICAgIH0pO1xuICAgICAgICB9KTtcbiAgICAgIH0sXG4gICAgICBmYWxzZSxcbiAgICApO1xuICB9XG5cbiAgZGlzcGF0Y2hDbGlja0F3YXkoZSwgY2xpY2tTdGFydGVkQXQpIHtcbiAgICBjb25zdCBwaHhDbGlja0F3YXkgPSB0aGlzLmJpbmRpbmcoXCJjbGljay1hd2F5XCIpO1xuICAgIERPTS5hbGwoZG9jdW1lbnQsIGBbJHtwaHhDbGlja0F3YXl9XWAsIChlbCkgPT4ge1xuICAgICAgaWYgKCEoZWwuaXNTYW1lTm9kZShjbGlja1N0YXJ0ZWRBdCkgfHwgZWwuY29udGFpbnMoY2xpY2tTdGFydGVkQXQpKSkge1xuICAgICAgICB0aGlzLndpdGhpbk93bmVycyhlbCwgKHZpZXcpID0+IHtcbiAgICAgICAgICBjb25zdCBwaHhFdmVudCA9IGVsLmdldEF0dHJpYnV0ZShwaHhDbGlja0F3YXkpO1xuICAgICAgICAgIGlmIChKUy5pc1Zpc2libGUoZWwpICYmIEpTLmlzSW5WaWV3cG9ydChlbCkpIHtcbiAgICAgICAgICAgIEpTLmV4ZWMoZSwgXCJjbGlja1wiLCBwaHhFdmVudCwgdmlldywgZWwsIFtcbiAgICAgICAgICAgICAgXCJwdXNoXCIsXG4gICAgICAgICAgICAgIHsgZGF0YTogdGhpcy5ldmVudE1ldGEoXCJjbGlja1wiLCBlLCBlLnRhcmdldCkgfSxcbiAgICAgICAgICAgIF0pO1xuICAgICAgICAgIH1cbiAgICAgICAgfSk7XG4gICAgICB9XG4gICAgfSk7XG4gIH1cblxuICBiaW5kTmF2KCkge1xuICAgIGlmICghQnJvd3Nlci5jYW5QdXNoU3RhdGUoKSkge1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICBpZiAoaGlzdG9yeS5zY3JvbGxSZXN0b3JhdGlvbikge1xuICAgICAgaGlzdG9yeS5zY3JvbGxSZXN0b3JhdGlvbiA9IFwibWFudWFsXCI7XG4gICAgfVxuICAgIGxldCBzY3JvbGxUaW1lciA9IG51bGw7XG4gICAgd2luZG93LmFkZEV2ZW50TGlzdGVuZXIoXCJzY3JvbGxcIiwgKF9lKSA9PiB7XG4gICAgICBjbGVhclRpbWVvdXQoc2Nyb2xsVGltZXIpO1xuICAgICAgc2Nyb2xsVGltZXIgPSBzZXRUaW1lb3V0KCgpID0+IHtcbiAgICAgICAgQnJvd3Nlci51cGRhdGVDdXJyZW50U3RhdGUoKHN0YXRlKSA9PlxuICAgICAgICAgIE9iamVjdC5hc3NpZ24oc3RhdGUsIHsgc2Nyb2xsOiB3aW5kb3cuc2Nyb2xsWSB9KSxcbiAgICAgICAgKTtcbiAgICAgIH0sIDEwMCk7XG4gICAgfSk7XG4gICAgd2luZG93LmFkZEV2ZW50TGlzdGVuZXIoXG4gICAgICBcInBvcHN0YXRlXCIsXG4gICAgICAoZXZlbnQpID0+IHtcbiAgICAgICAgaWYgKCF0aGlzLnJlZ2lzdGVyTmV3TG9jYXRpb24od2luZG93LmxvY2F0aW9uKSkge1xuICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuICAgICAgICBjb25zdCB7IHR5cGUsIGJhY2tUeXBlLCBpZCwgc2Nyb2xsLCBwb3NpdGlvbiB9ID0gZXZlbnQuc3RhdGUgfHwge307XG4gICAgICAgIGNvbnN0IGhyZWYgPSB3aW5kb3cubG9jYXRpb24uaHJlZjtcblxuICAgICAgICAvLyBDb21wYXJlIHBvc2l0aW9ucyB0byBkZXRlcm1pbmUgZGlyZWN0aW9uXG4gICAgICAgIGNvbnN0IGlzRm9yd2FyZCA9IHBvc2l0aW9uID4gdGhpcy5jdXJyZW50SGlzdG9yeVBvc2l0aW9uO1xuICAgICAgICBjb25zdCBuYXZUeXBlID0gaXNGb3J3YXJkID8gdHlwZSA6IGJhY2tUeXBlIHx8IHR5cGU7XG5cbiAgICAgICAgLy8gVXBkYXRlIGN1cnJlbnQgcG9zaXRpb25cbiAgICAgICAgdGhpcy5jdXJyZW50SGlzdG9yeVBvc2l0aW9uID0gcG9zaXRpb24gfHwgMDtcbiAgICAgICAgdGhpcy5zZXNzaW9uU3RvcmFnZS5zZXRJdGVtKFxuICAgICAgICAgIFBIWF9MVl9ISVNUT1JZX1BPU0lUSU9OLFxuICAgICAgICAgIHRoaXMuY3VycmVudEhpc3RvcnlQb3NpdGlvbi50b1N0cmluZygpLFxuICAgICAgICApO1xuXG4gICAgICAgIERPTS5kaXNwYXRjaEV2ZW50KHdpbmRvdywgXCJwaHg6bmF2aWdhdGVcIiwge1xuICAgICAgICAgIGRldGFpbDoge1xuICAgICAgICAgICAgaHJlZixcbiAgICAgICAgICAgIHBhdGNoOiBuYXZUeXBlID09PSBcInBhdGNoXCIsXG4gICAgICAgICAgICBwb3A6IHRydWUsXG4gICAgICAgICAgICBkaXJlY3Rpb246IGlzRm9yd2FyZCA/IFwiZm9yd2FyZFwiIDogXCJiYWNrd2FyZFwiLFxuICAgICAgICAgIH0sXG4gICAgICAgIH0pO1xuICAgICAgICB0aGlzLnJlcXVlc3RET01VcGRhdGUoKCkgPT4ge1xuICAgICAgICAgIGNvbnN0IGNhbGxiYWNrID0gKCkgPT4ge1xuICAgICAgICAgICAgdGhpcy5tYXliZVNjcm9sbChzY3JvbGwpO1xuICAgICAgICAgIH07XG4gICAgICAgICAgaWYgKFxuICAgICAgICAgICAgdGhpcy5tYWluLmlzQ29ubmVjdGVkKCkgJiZcbiAgICAgICAgICAgIG5hdlR5cGUgPT09IFwicGF0Y2hcIiAmJlxuICAgICAgICAgICAgaWQgPT09IHRoaXMubWFpbi5pZFxuICAgICAgICAgICkge1xuICAgICAgICAgICAgdGhpcy5tYWluLnB1c2hMaW5rUGF0Y2goZXZlbnQsIGhyZWYsIG51bGwsIGNhbGxiYWNrKTtcbiAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgdGhpcy5yZXBsYWNlTWFpbihocmVmLCBudWxsLCBjYWxsYmFjayk7XG4gICAgICAgICAgfVxuICAgICAgICB9KTtcbiAgICAgIH0sXG4gICAgICBmYWxzZSxcbiAgICApO1xuICAgIHdpbmRvdy5hZGRFdmVudExpc3RlbmVyKFxuICAgICAgXCJjbGlja1wiLFxuICAgICAgKGUpID0+IHtcbiAgICAgICAgY29uc3QgdGFyZ2V0ID0gY2xvc2VzdFBoeEJpbmRpbmcoZS50YXJnZXQsIFBIWF9MSVZFX0xJTkspO1xuICAgICAgICBjb25zdCB0eXBlID0gdGFyZ2V0ICYmIHRhcmdldC5nZXRBdHRyaWJ1dGUoUEhYX0xJVkVfTElOSyk7XG4gICAgICAgIGlmICghdHlwZSB8fCAhdGhpcy5pc0Nvbm5lY3RlZCgpIHx8ICF0aGlzLm1haW4gfHwgRE9NLndhbnRzTmV3VGFiKGUpKSB7XG4gICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG5cbiAgICAgICAgLy8gV2hlbiB3cmFwcGluZyBhbiBTVkcgZWxlbWVudCBpbiBhbiBhbmNob3IgdGFnLCB0aGUgaHJlZiBjYW4gYmUgYW4gU1ZHQW5pbWF0ZWRTdHJpbmdcbiAgICAgICAgY29uc3QgaHJlZiA9XG4gICAgICAgICAgdGFyZ2V0LmhyZWYgaW5zdGFuY2VvZiBTVkdBbmltYXRlZFN0cmluZ1xuICAgICAgICAgICAgPyB0YXJnZXQuaHJlZi5iYXNlVmFsXG4gICAgICAgICAgICA6IHRhcmdldC5ocmVmO1xuXG4gICAgICAgIGNvbnN0IGxpbmtTdGF0ZSA9IHRhcmdldC5nZXRBdHRyaWJ1dGUoUEhYX0xJTktfU1RBVEUpO1xuICAgICAgICBlLnByZXZlbnREZWZhdWx0KCk7XG4gICAgICAgIGUuc3RvcEltbWVkaWF0ZVByb3BhZ2F0aW9uKCk7IC8vIGRvIG5vdCBidWJibGUgY2xpY2sgdG8gcmVndWxhciBwaHgtY2xpY2sgYmluZGluZ3NcbiAgICAgICAgaWYgKHRoaXMucGVuZGluZ0xpbmsgPT09IGhyZWYpIHtcbiAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cblxuICAgICAgICB0aGlzLnJlcXVlc3RET01VcGRhdGUoKCkgPT4ge1xuICAgICAgICAgIGlmICh0eXBlID09PSBcInBhdGNoXCIpIHtcbiAgICAgICAgICAgIHRoaXMucHVzaEhpc3RvcnlQYXRjaChlLCBocmVmLCBsaW5rU3RhdGUsIHRhcmdldCk7XG4gICAgICAgICAgfSBlbHNlIGlmICh0eXBlID09PSBcInJlZGlyZWN0XCIpIHtcbiAgICAgICAgICAgIHRoaXMuaGlzdG9yeVJlZGlyZWN0KGUsIGhyZWYsIGxpbmtTdGF0ZSwgbnVsbCwgdGFyZ2V0KTtcbiAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKFxuICAgICAgICAgICAgICBgZXhwZWN0ZWQgJHtQSFhfTElWRV9MSU5LfSB0byBiZSBcInBhdGNoXCIgb3IgXCJyZWRpcmVjdFwiLCBnb3Q6ICR7dHlwZX1gLFxuICAgICAgICAgICAgKTtcbiAgICAgICAgICB9XG4gICAgICAgICAgY29uc3QgcGh4Q2xpY2sgPSB0YXJnZXQuZ2V0QXR0cmlidXRlKHRoaXMuYmluZGluZyhcImNsaWNrXCIpKTtcbiAgICAgICAgICBpZiAocGh4Q2xpY2spIHtcbiAgICAgICAgICAgIHRoaXMucmVxdWVzdERPTVVwZGF0ZSgoKSA9PiB0aGlzLmV4ZWNKUyh0YXJnZXQsIHBoeENsaWNrLCBcImNsaWNrXCIpKTtcbiAgICAgICAgICB9XG4gICAgICAgIH0pO1xuICAgICAgfSxcbiAgICAgIGZhbHNlLFxuICAgICk7XG4gIH1cblxuICBtYXliZVNjcm9sbChzY3JvbGwpIHtcbiAgICBpZiAodHlwZW9mIHNjcm9sbCA9PT0gXCJudW1iZXJcIikge1xuICAgICAgcmVxdWVzdEFuaW1hdGlvbkZyYW1lKCgpID0+IHtcbiAgICAgICAgd2luZG93LnNjcm9sbFRvKDAsIHNjcm9sbCk7XG4gICAgICB9KTsgLy8gdGhlIGJvZHkgbmVlZHMgdG8gcmVuZGVyIGJlZm9yZSB3ZSBzY3JvbGwuXG4gICAgfVxuICB9XG5cbiAgZGlzcGF0Y2hFdmVudChldmVudCwgcGF5bG9hZCA9IHt9KSB7XG4gICAgRE9NLmRpc3BhdGNoRXZlbnQod2luZG93LCBgcGh4OiR7ZXZlbnR9YCwgeyBkZXRhaWw6IHBheWxvYWQgfSk7XG4gIH1cblxuICBkaXNwYXRjaEV2ZW50cyhldmVudHMpIHtcbiAgICBldmVudHMuZm9yRWFjaCgoW2V2ZW50LCBwYXlsb2FkXSkgPT4gdGhpcy5kaXNwYXRjaEV2ZW50KGV2ZW50LCBwYXlsb2FkKSk7XG4gIH1cblxuICB3aXRoUGFnZUxvYWRpbmcoaW5mbywgY2FsbGJhY2spIHtcbiAgICBET00uZGlzcGF0Y2hFdmVudCh3aW5kb3csIFwicGh4OnBhZ2UtbG9hZGluZy1zdGFydFwiLCB7IGRldGFpbDogaW5mbyB9KTtcbiAgICBjb25zdCBkb25lID0gKCkgPT5cbiAgICAgIERPTS5kaXNwYXRjaEV2ZW50KHdpbmRvdywgXCJwaHg6cGFnZS1sb2FkaW5nLXN0b3BcIiwgeyBkZXRhaWw6IGluZm8gfSk7XG4gICAgcmV0dXJuIGNhbGxiYWNrID8gY2FsbGJhY2soZG9uZSkgOiBkb25lO1xuICB9XG5cbiAgcHVzaEhpc3RvcnlQYXRjaChlLCBocmVmLCBsaW5rU3RhdGUsIHRhcmdldEVsKSB7XG4gICAgaWYgKCF0aGlzLmlzQ29ubmVjdGVkKCkgfHwgIXRoaXMubWFpbi5pc01haW4oKSkge1xuICAgICAgcmV0dXJuIEJyb3dzZXIucmVkaXJlY3QoaHJlZik7XG4gICAgfVxuXG4gICAgdGhpcy53aXRoUGFnZUxvYWRpbmcoeyB0bzogaHJlZiwga2luZDogXCJwYXRjaFwiIH0sIChkb25lKSA9PiB7XG4gICAgICB0aGlzLm1haW4ucHVzaExpbmtQYXRjaChlLCBocmVmLCB0YXJnZXRFbCwgKGxpbmtSZWYpID0+IHtcbiAgICAgICAgdGhpcy5oaXN0b3J5UGF0Y2goaHJlZiwgbGlua1N0YXRlLCBsaW5rUmVmKTtcbiAgICAgICAgZG9uZSgpO1xuICAgICAgfSk7XG4gICAgfSk7XG4gIH1cblxuICBoaXN0b3J5UGF0Y2goaHJlZiwgbGlua1N0YXRlLCBsaW5rUmVmID0gdGhpcy5zZXRQZW5kaW5nTGluayhocmVmKSkge1xuICAgIGlmICghdGhpcy5jb21taXRQZW5kaW5nTGluayhsaW5rUmVmKSkge1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIC8vIEluY3JlbWVudCBwb3NpdGlvbiBmb3IgbmV3IHN0YXRlXG4gICAgdGhpcy5jdXJyZW50SGlzdG9yeVBvc2l0aW9uKys7XG4gICAgdGhpcy5zZXNzaW9uU3RvcmFnZS5zZXRJdGVtKFxuICAgICAgUEhYX0xWX0hJU1RPUllfUE9TSVRJT04sXG4gICAgICB0aGlzLmN1cnJlbnRIaXN0b3J5UG9zaXRpb24udG9TdHJpbmcoKSxcbiAgICApO1xuXG4gICAgLy8gc3RvcmUgdGhlIHR5cGUgZm9yIGJhY2sgbmF2aWdhdGlvblxuICAgIEJyb3dzZXIudXBkYXRlQ3VycmVudFN0YXRlKChzdGF0ZSkgPT4gKHsgLi4uc3RhdGUsIGJhY2tUeXBlOiBcInBhdGNoXCIgfSkpO1xuXG4gICAgQnJvd3Nlci5wdXNoU3RhdGUoXG4gICAgICBsaW5rU3RhdGUsXG4gICAgICB7XG4gICAgICAgIHR5cGU6IFwicGF0Y2hcIixcbiAgICAgICAgaWQ6IHRoaXMubWFpbi5pZCxcbiAgICAgICAgcG9zaXRpb246IHRoaXMuY3VycmVudEhpc3RvcnlQb3NpdGlvbixcbiAgICAgIH0sXG4gICAgICBocmVmLFxuICAgICk7XG5cbiAgICBET00uZGlzcGF0Y2hFdmVudCh3aW5kb3csIFwicGh4Om5hdmlnYXRlXCIsIHtcbiAgICAgIGRldGFpbDogeyBwYXRjaDogdHJ1ZSwgaHJlZiwgcG9wOiBmYWxzZSwgZGlyZWN0aW9uOiBcImZvcndhcmRcIiB9LFxuICAgIH0pO1xuICAgIHRoaXMucmVnaXN0ZXJOZXdMb2NhdGlvbih3aW5kb3cubG9jYXRpb24pO1xuICB9XG5cbiAgaGlzdG9yeVJlZGlyZWN0KGUsIGhyZWYsIGxpbmtTdGF0ZSwgZmxhc2gsIHRhcmdldEVsKSB7XG4gICAgY29uc3QgY2xpY2tMb2FkaW5nID0gdGFyZ2V0RWwgJiYgZS5pc1RydXN0ZWQgJiYgZS50eXBlICE9PSBcInBvcHN0YXRlXCI7XG4gICAgaWYgKGNsaWNrTG9hZGluZykge1xuICAgICAgdGFyZ2V0RWwuY2xhc3NMaXN0LmFkZChcInBoeC1jbGljay1sb2FkaW5nXCIpO1xuICAgIH1cbiAgICBpZiAoIXRoaXMuaXNDb25uZWN0ZWQoKSB8fCAhdGhpcy5tYWluLmlzTWFpbigpKSB7XG4gICAgICByZXR1cm4gQnJvd3Nlci5yZWRpcmVjdChocmVmLCBmbGFzaCk7XG4gICAgfVxuXG4gICAgLy8gY29udmVydCB0byBmdWxsIGhyZWYgaWYgb25seSBwYXRoIHByZWZpeFxuICAgIGlmICgvXlxcLyR8XlxcL1teXFwvXSsuKiQvLnRlc3QoaHJlZikpIHtcbiAgICAgIGNvbnN0IHsgcHJvdG9jb2wsIGhvc3QgfSA9IHdpbmRvdy5sb2NhdGlvbjtcbiAgICAgIGhyZWYgPSBgJHtwcm90b2NvbH0vLyR7aG9zdH0ke2hyZWZ9YDtcbiAgICB9XG4gICAgY29uc3Qgc2Nyb2xsID0gd2luZG93LnNjcm9sbFk7XG4gICAgdGhpcy53aXRoUGFnZUxvYWRpbmcoeyB0bzogaHJlZiwga2luZDogXCJyZWRpcmVjdFwiIH0sIChkb25lKSA9PiB7XG4gICAgICB0aGlzLnJlcGxhY2VNYWluKGhyZWYsIGZsYXNoLCAobGlua1JlZikgPT4ge1xuICAgICAgICBpZiAobGlua1JlZiA9PT0gdGhpcy5saW5rUmVmKSB7XG4gICAgICAgICAgLy8gSW5jcmVtZW50IHBvc2l0aW9uIGZvciBuZXcgc3RhdGVcbiAgICAgICAgICB0aGlzLmN1cnJlbnRIaXN0b3J5UG9zaXRpb24rKztcbiAgICAgICAgICB0aGlzLnNlc3Npb25TdG9yYWdlLnNldEl0ZW0oXG4gICAgICAgICAgICBQSFhfTFZfSElTVE9SWV9QT1NJVElPTixcbiAgICAgICAgICAgIHRoaXMuY3VycmVudEhpc3RvcnlQb3NpdGlvbi50b1N0cmluZygpLFxuICAgICAgICAgICk7XG5cbiAgICAgICAgICAvLyBzdG9yZSB0aGUgdHlwZSBmb3IgYmFjayBuYXZpZ2F0aW9uXG4gICAgICAgICAgQnJvd3Nlci51cGRhdGVDdXJyZW50U3RhdGUoKHN0YXRlKSA9PiAoe1xuICAgICAgICAgICAgLi4uc3RhdGUsXG4gICAgICAgICAgICBiYWNrVHlwZTogXCJyZWRpcmVjdFwiLFxuICAgICAgICAgIH0pKTtcblxuICAgICAgICAgIEJyb3dzZXIucHVzaFN0YXRlKFxuICAgICAgICAgICAgbGlua1N0YXRlLFxuICAgICAgICAgICAge1xuICAgICAgICAgICAgICB0eXBlOiBcInJlZGlyZWN0XCIsXG4gICAgICAgICAgICAgIGlkOiB0aGlzLm1haW4uaWQsXG4gICAgICAgICAgICAgIHNjcm9sbDogc2Nyb2xsLFxuICAgICAgICAgICAgICBwb3NpdGlvbjogdGhpcy5jdXJyZW50SGlzdG9yeVBvc2l0aW9uLFxuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIGhyZWYsXG4gICAgICAgICAgKTtcblxuICAgICAgICAgIERPTS5kaXNwYXRjaEV2ZW50KHdpbmRvdywgXCJwaHg6bmF2aWdhdGVcIiwge1xuICAgICAgICAgICAgZGV0YWlsOiB7IGhyZWYsIHBhdGNoOiBmYWxzZSwgcG9wOiBmYWxzZSwgZGlyZWN0aW9uOiBcImZvcndhcmRcIiB9LFxuICAgICAgICAgIH0pO1xuICAgICAgICAgIHRoaXMucmVnaXN0ZXJOZXdMb2NhdGlvbih3aW5kb3cubG9jYXRpb24pO1xuICAgICAgICB9XG4gICAgICAgIC8vIGV4cGxpY2l0bHkgdW5kbyBjbGljay1sb2FkaW5nIGNsYXNzXG4gICAgICAgIC8vIChpbiBjYXNlIGl0IG9yaWdpbmF0ZWQgaW4gYSBzdGlja3kgbGl2ZSB2aWV3LCBvdGhlcndpc2UgaXQgd291bGQgYmUgcmVtb3ZlZCBhbnl3YXkpXG4gICAgICAgIGlmIChjbGlja0xvYWRpbmcpIHtcbiAgICAgICAgICB0YXJnZXRFbC5jbGFzc0xpc3QucmVtb3ZlKFwicGh4LWNsaWNrLWxvYWRpbmdcIik7XG4gICAgICAgIH1cbiAgICAgICAgZG9uZSgpO1xuICAgICAgfSk7XG4gICAgfSk7XG4gIH1cblxuICByZWdpc3Rlck5ld0xvY2F0aW9uKG5ld0xvY2F0aW9uKSB7XG4gICAgY29uc3QgeyBwYXRobmFtZSwgc2VhcmNoIH0gPSB0aGlzLmN1cnJlbnRMb2NhdGlvbjtcbiAgICBpZiAocGF0aG5hbWUgKyBzZWFyY2ggPT09IG5ld0xvY2F0aW9uLnBhdGhuYW1lICsgbmV3TG9jYXRpb24uc2VhcmNoKSB7XG4gICAgICByZXR1cm4gZmFsc2U7XG4gICAgfSBlbHNlIHtcbiAgICAgIHRoaXMuY3VycmVudExvY2F0aW9uID0gY2xvbmUobmV3TG9jYXRpb24pO1xuICAgICAgcmV0dXJuIHRydWU7XG4gICAgfVxuICB9XG5cbiAgYmluZEZvcm1zKCkge1xuICAgIGxldCBpdGVyYXRpb25zID0gMDtcbiAgICBsZXQgZXh0ZXJuYWxGb3JtU3VibWl0dGVkID0gZmFsc2U7XG5cbiAgICAvLyBkaXNhYmxlIGZvcm1zIG9uIHN1Ym1pdCB0aGF0IHRyYWNrIHBoeC1jaGFuZ2UgYnV0IHBlcmZvcm0gZXh0ZXJuYWwgc3VibWl0XG4gICAgdGhpcy5vbihcInN1Ym1pdFwiLCAoZSkgPT4ge1xuICAgICAgY29uc3QgcGh4U3VibWl0ID0gZS50YXJnZXQuZ2V0QXR0cmlidXRlKHRoaXMuYmluZGluZyhcInN1Ym1pdFwiKSk7XG4gICAgICBjb25zdCBwaHhDaGFuZ2UgPSBlLnRhcmdldC5nZXRBdHRyaWJ1dGUodGhpcy5iaW5kaW5nKFwiY2hhbmdlXCIpKTtcbiAgICAgIGlmICghZXh0ZXJuYWxGb3JtU3VibWl0dGVkICYmIHBoeENoYW5nZSAmJiAhcGh4U3VibWl0KSB7XG4gICAgICAgIGV4dGVybmFsRm9ybVN1Ym1pdHRlZCA9IHRydWU7XG4gICAgICAgIGUucHJldmVudERlZmF1bHQoKTtcbiAgICAgICAgdGhpcy53aXRoaW5Pd25lcnMoZS50YXJnZXQsICh2aWV3KSA9PiB7XG4gICAgICAgICAgdmlldy5kaXNhYmxlRm9ybShlLnRhcmdldCk7XG4gICAgICAgICAgLy8gc2FmYXJpIG5lZWRzIG5leHQgdGlja1xuICAgICAgICAgIHdpbmRvdy5yZXF1ZXN0QW5pbWF0aW9uRnJhbWUoKCkgPT4ge1xuICAgICAgICAgICAgaWYgKERPTS5pc1VubG9hZGFibGVGb3JtU3VibWl0KGUpKSB7XG4gICAgICAgICAgICAgIHRoaXMudW5sb2FkKCk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBlLnRhcmdldC5zdWJtaXQoKTtcbiAgICAgICAgICB9KTtcbiAgICAgICAgfSk7XG4gICAgICB9XG4gICAgfSk7XG5cbiAgICB0aGlzLm9uKFwic3VibWl0XCIsIChlKSA9PiB7XG4gICAgICBjb25zdCBwaHhFdmVudCA9IGUudGFyZ2V0LmdldEF0dHJpYnV0ZSh0aGlzLmJpbmRpbmcoXCJzdWJtaXRcIikpO1xuICAgICAgaWYgKCFwaHhFdmVudCkge1xuICAgICAgICBpZiAoRE9NLmlzVW5sb2FkYWJsZUZvcm1TdWJtaXQoZSkpIHtcbiAgICAgICAgICB0aGlzLnVubG9hZCgpO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybjtcbiAgICAgIH1cbiAgICAgIGUucHJldmVudERlZmF1bHQoKTtcbiAgICAgIGUudGFyZ2V0LmRpc2FibGVkID0gdHJ1ZTtcbiAgICAgIHRoaXMud2l0aGluT3duZXJzKGUudGFyZ2V0LCAodmlldykgPT4ge1xuICAgICAgICBKUy5leGVjKGUsIFwic3VibWl0XCIsIHBoeEV2ZW50LCB2aWV3LCBlLnRhcmdldCwgW1xuICAgICAgICAgIFwicHVzaFwiLFxuICAgICAgICAgIHsgc3VibWl0dGVyOiBlLnN1Ym1pdHRlciB9LFxuICAgICAgICBdKTtcbiAgICAgIH0pO1xuICAgIH0pO1xuXG4gICAgZm9yIChjb25zdCB0eXBlIG9mIFtcImNoYW5nZVwiLCBcImlucHV0XCJdKSB7XG4gICAgICB0aGlzLm9uKHR5cGUsIChlKSA9PiB7XG4gICAgICAgIGlmIChcbiAgICAgICAgICBlIGluc3RhbmNlb2YgQ3VzdG9tRXZlbnQgJiZcbiAgICAgICAgICAoZS50YXJnZXQgaW5zdGFuY2VvZiBIVE1MSW5wdXRFbGVtZW50IHx8XG4gICAgICAgICAgICBlLnRhcmdldCBpbnN0YW5jZW9mIEhUTUxTZWxlY3RFbGVtZW50IHx8XG4gICAgICAgICAgICBlLnRhcmdldCBpbnN0YW5jZW9mIEhUTUxUZXh0QXJlYUVsZW1lbnQpICYmXG4gICAgICAgICAgZS50YXJnZXQuZm9ybSA9PT0gdW5kZWZpbmVkXG4gICAgICAgICkge1xuICAgICAgICAgIC8vIHRocm93IG9uIGludmFsaWQgSlMuZGlzcGF0Y2ggdGFyZ2V0IGFuZCBub29wIGlmIEN1c3RvbUV2ZW50IHRyaWdnZXJlZCBvdXRzaWRlIEpTLmRpc3BhdGNoXG4gICAgICAgICAgaWYgKGUuZGV0YWlsICYmIGUuZGV0YWlsLmRpc3BhdGNoZXIpIHtcbiAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcihcbiAgICAgICAgICAgICAgYGRpc3BhdGNoaW5nIGEgY3VzdG9tICR7dHlwZX0gZXZlbnQgaXMgb25seSBzdXBwb3J0ZWQgb24gaW5wdXQgZWxlbWVudHMgaW5zaWRlIGEgZm9ybWAsXG4gICAgICAgICAgICApO1xuICAgICAgICAgIH1cbiAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cbiAgICAgICAgY29uc3QgcGh4Q2hhbmdlID0gdGhpcy5iaW5kaW5nKFwiY2hhbmdlXCIpO1xuICAgICAgICBjb25zdCBpbnB1dCA9IGUudGFyZ2V0O1xuICAgICAgICBpZiAodGhpcy5ibG9ja1BoeENoYW5nZVdoaWxlQ29tcG9zaW5nICYmIGUuaXNDb21wb3NpbmcpIHtcbiAgICAgICAgICBjb25zdCBrZXkgPSBgY29tcG9zaXRpb24tbGlzdGVuZXItJHt0eXBlfWA7XG4gICAgICAgICAgaWYgKCFET00ucHJpdmF0ZShpbnB1dCwga2V5KSkge1xuICAgICAgICAgICAgRE9NLnB1dFByaXZhdGUoaW5wdXQsIGtleSwgdHJ1ZSk7XG4gICAgICAgICAgICBpbnB1dC5hZGRFdmVudExpc3RlbmVyKFxuICAgICAgICAgICAgICBcImNvbXBvc2l0aW9uZW5kXCIsXG4gICAgICAgICAgICAgICgpID0+IHtcbiAgICAgICAgICAgICAgICAvLyB0cmlnZ2VyIGEgbmV3IGlucHV0L2NoYW5nZSBldmVudFxuICAgICAgICAgICAgICAgIGlucHV0LmRpc3BhdGNoRXZlbnQobmV3IEV2ZW50KHR5cGUsIHsgYnViYmxlczogdHJ1ZSB9KSk7XG4gICAgICAgICAgICAgICAgRE9NLmRlbGV0ZVByaXZhdGUoaW5wdXQsIGtleSk7XG4gICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAgIHsgb25jZTogdHJ1ZSB9LFxuICAgICAgICAgICAgKTtcbiAgICAgICAgICB9XG4gICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG4gICAgICAgIGNvbnN0IGlucHV0RXZlbnQgPSBpbnB1dC5nZXRBdHRyaWJ1dGUocGh4Q2hhbmdlKTtcbiAgICAgICAgY29uc3QgZm9ybUV2ZW50ID0gaW5wdXQuZm9ybSAmJiBpbnB1dC5mb3JtLmdldEF0dHJpYnV0ZShwaHhDaGFuZ2UpO1xuICAgICAgICBjb25zdCBwaHhFdmVudCA9IGlucHV0RXZlbnQgfHwgZm9ybUV2ZW50O1xuICAgICAgICBpZiAoIXBoeEV2ZW50KSB7XG4gICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG4gICAgICAgIGlmIChcbiAgICAgICAgICBpbnB1dC50eXBlID09PSBcIm51bWJlclwiICYmXG4gICAgICAgICAgaW5wdXQudmFsaWRpdHkgJiZcbiAgICAgICAgICBpbnB1dC52YWxpZGl0eS5iYWRJbnB1dFxuICAgICAgICApIHtcbiAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cblxuICAgICAgICBjb25zdCBkaXNwYXRjaGVyID0gaW5wdXRFdmVudCA/IGlucHV0IDogaW5wdXQuZm9ybTtcbiAgICAgICAgY29uc3QgY3VycmVudEl0ZXJhdGlvbnMgPSBpdGVyYXRpb25zO1xuICAgICAgICBpdGVyYXRpb25zKys7XG4gICAgICAgIGNvbnN0IHsgYXQ6IGF0LCB0eXBlOiBsYXN0VHlwZSB9ID1cbiAgICAgICAgICBET00ucHJpdmF0ZShpbnB1dCwgXCJwcmV2LWl0ZXJhdGlvblwiKSB8fCB7fTtcbiAgICAgICAgLy8gQnJvd3NlcnMgc2hvdWxkIGFsd2F5cyBmaXJlIGF0IGxlYXN0IG9uZSBcImlucHV0XCIgZXZlbnQgYmVmb3JlIGV2ZXJ5IFwiY2hhbmdlXCJcbiAgICAgICAgLy8gSWdub3JlIFwiY2hhbmdlXCIgZXZlbnRzLCB1bmxlc3MgdGhlcmUgd2FzIG5vIHByaW9yIFwiaW5wdXRcIiBldmVudC5cbiAgICAgICAgLy8gVGhpcyBjb3VsZCBoYXBwZW4gaWYgdXNlciBjb2RlIHRyaWdnZXJzIGEgXCJjaGFuZ2VcIiBldmVudCwgb3IgaWYgdGhlIGJyb3dzZXIgaXMgbm9uLWNvbmZvcm1pbmcuXG4gICAgICAgIGlmIChcbiAgICAgICAgICBhdCA9PT0gY3VycmVudEl0ZXJhdGlvbnMgLSAxICYmXG4gICAgICAgICAgdHlwZSA9PT0gXCJjaGFuZ2VcIiAmJlxuICAgICAgICAgIGxhc3RUeXBlID09PSBcImlucHV0XCJcbiAgICAgICAgKSB7XG4gICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG5cbiAgICAgICAgRE9NLnB1dFByaXZhdGUoaW5wdXQsIFwicHJldi1pdGVyYXRpb25cIiwge1xuICAgICAgICAgIGF0OiBjdXJyZW50SXRlcmF0aW9ucyxcbiAgICAgICAgICB0eXBlOiB0eXBlLFxuICAgICAgICB9KTtcblxuICAgICAgICB0aGlzLmRlYm91bmNlKGlucHV0LCBlLCB0eXBlLCAoKSA9PiB7XG4gICAgICAgICAgdGhpcy53aXRoaW5Pd25lcnMoZGlzcGF0Y2hlciwgKHZpZXcpID0+IHtcbiAgICAgICAgICAgIERPTS5wdXRQcml2YXRlKGlucHV0LCBQSFhfSEFTX0ZPQ1VTRUQsIHRydWUpO1xuICAgICAgICAgICAgSlMuZXhlYyhlLCBcImNoYW5nZVwiLCBwaHhFdmVudCwgdmlldywgaW5wdXQsIFtcbiAgICAgICAgICAgICAgXCJwdXNoXCIsXG4gICAgICAgICAgICAgIHsgX3RhcmdldDogZS50YXJnZXQubmFtZSwgZGlzcGF0Y2hlcjogZGlzcGF0Y2hlciB9LFxuICAgICAgICAgICAgXSk7XG4gICAgICAgICAgfSk7XG4gICAgICAgIH0pO1xuICAgICAgfSk7XG4gICAgfVxuICAgIHRoaXMub24oXCJyZXNldFwiLCAoZSkgPT4ge1xuICAgICAgY29uc3QgZm9ybSA9IGUudGFyZ2V0O1xuICAgICAgRE9NLnJlc2V0Rm9ybShmb3JtKTtcbiAgICAgIGNvbnN0IGlucHV0ID0gQXJyYXkuZnJvbShmb3JtLmVsZW1lbnRzKS5maW5kKChlbCkgPT4gZWwudHlwZSA9PT0gXCJyZXNldFwiKTtcbiAgICAgIGlmIChpbnB1dCkge1xuICAgICAgICAvLyB3YWl0IHVudGlsIG5leHQgdGljayB0byBnZXQgdXBkYXRlZCBpbnB1dCB2YWx1ZVxuICAgICAgICB3aW5kb3cucmVxdWVzdEFuaW1hdGlvbkZyYW1lKCgpID0+IHtcbiAgICAgICAgICBpbnB1dC5kaXNwYXRjaEV2ZW50KFxuICAgICAgICAgICAgbmV3IEV2ZW50KFwiaW5wdXRcIiwgeyBidWJibGVzOiB0cnVlLCBjYW5jZWxhYmxlOiBmYWxzZSB9KSxcbiAgICAgICAgICApO1xuICAgICAgICB9KTtcbiAgICAgIH1cbiAgICB9KTtcbiAgfVxuXG4gIGRlYm91bmNlKGVsLCBldmVudCwgZXZlbnRUeXBlLCBjYWxsYmFjaykge1xuICAgIGlmIChldmVudFR5cGUgPT09IFwiYmx1clwiIHx8IGV2ZW50VHlwZSA9PT0gXCJmb2N1c291dFwiKSB7XG4gICAgICByZXR1cm4gY2FsbGJhY2soKTtcbiAgICB9XG5cbiAgICBjb25zdCBwaHhEZWJvdW5jZSA9IHRoaXMuYmluZGluZyhQSFhfREVCT1VOQ0UpO1xuICAgIGNvbnN0IHBoeFRocm90dGxlID0gdGhpcy5iaW5kaW5nKFBIWF9USFJPVFRMRSk7XG4gICAgY29uc3QgZGVmYXVsdERlYm91bmNlID0gdGhpcy5kZWZhdWx0cy5kZWJvdW5jZS50b1N0cmluZygpO1xuICAgIGNvbnN0IGRlZmF1bHRUaHJvdHRsZSA9IHRoaXMuZGVmYXVsdHMudGhyb3R0bGUudG9TdHJpbmcoKTtcblxuICAgIHRoaXMud2l0aGluT3duZXJzKGVsLCAodmlldykgPT4ge1xuICAgICAgY29uc3QgYXN5bmNGaWx0ZXIgPSAoKSA9PlxuICAgICAgICAhdmlldy5pc0Rlc3Ryb3llZCgpICYmIGRvY3VtZW50LmJvZHkuY29udGFpbnMoZWwpO1xuICAgICAgRE9NLmRlYm91bmNlKFxuICAgICAgICBlbCxcbiAgICAgICAgZXZlbnQsXG4gICAgICAgIHBoeERlYm91bmNlLFxuICAgICAgICBkZWZhdWx0RGVib3VuY2UsXG4gICAgICAgIHBoeFRocm90dGxlLFxuICAgICAgICBkZWZhdWx0VGhyb3R0bGUsXG4gICAgICAgIGFzeW5jRmlsdGVyLFxuICAgICAgICAoKSA9PiB7XG4gICAgICAgICAgY2FsbGJhY2soKTtcbiAgICAgICAgfSxcbiAgICAgICk7XG4gICAgfSk7XG4gIH1cblxuICBzaWxlbmNlRXZlbnRzKGNhbGxiYWNrKSB7XG4gICAgdGhpcy5zaWxlbmNlZCA9IHRydWU7XG4gICAgY2FsbGJhY2soKTtcbiAgICB0aGlzLnNpbGVuY2VkID0gZmFsc2U7XG4gIH1cblxuICBvbihldmVudCwgY2FsbGJhY2spIHtcbiAgICB0aGlzLmJvdW5kRXZlbnROYW1lcy5hZGQoZXZlbnQpO1xuICAgIHdpbmRvdy5hZGRFdmVudExpc3RlbmVyKGV2ZW50LCAoZSkgPT4ge1xuICAgICAgaWYgKCF0aGlzLnNpbGVuY2VkKSB7XG4gICAgICAgIGNhbGxiYWNrKGUpO1xuICAgICAgfVxuICAgIH0pO1xuICB9XG5cbiAganNRdWVyeVNlbGVjdG9yQWxsKHNvdXJjZUVsLCBxdWVyeSwgZGVmYXVsdFF1ZXJ5KSB7XG4gICAgY29uc3QgYWxsID0gdGhpcy5kb21DYWxsYmFja3MuanNRdWVyeVNlbGVjdG9yQWxsO1xuICAgIHJldHVybiBhbGwgPyBhbGwoc291cmNlRWwsIHF1ZXJ5LCBkZWZhdWx0UXVlcnkpIDogZGVmYXVsdFF1ZXJ5KCk7XG4gIH1cbn1cblxuY2xhc3MgVHJhbnNpdGlvblNldCB7XG4gIGNvbnN0cnVjdG9yKCkge1xuICAgIHRoaXMudHJhbnNpdGlvbnMgPSBuZXcgU2V0KCk7XG4gICAgdGhpcy5wcm9taXNlcyA9IG5ldyBTZXQoKTtcbiAgICB0aGlzLnBlbmRpbmdPcHMgPSBbXTtcbiAgfVxuXG4gIHJlc2V0KCkge1xuICAgIHRoaXMudHJhbnNpdGlvbnMuZm9yRWFjaCgodGltZXIpID0+IHtcbiAgICAgIGNsZWFyVGltZW91dCh0aW1lcik7XG4gICAgICB0aGlzLnRyYW5zaXRpb25zLmRlbGV0ZSh0aW1lcik7XG4gICAgfSk7XG4gICAgdGhpcy5wcm9taXNlcy5jbGVhcigpO1xuICAgIHRoaXMuZmx1c2hQZW5kaW5nT3BzKCk7XG4gIH1cblxuICBhZnRlcihjYWxsYmFjaykge1xuICAgIGlmICh0aGlzLnNpemUoKSA9PT0gMCkge1xuICAgICAgY2FsbGJhY2soKTtcbiAgICB9IGVsc2Uge1xuICAgICAgdGhpcy5wdXNoUGVuZGluZ09wKGNhbGxiYWNrKTtcbiAgICB9XG4gIH1cblxuICBhZGRUcmFuc2l0aW9uKHRpbWUsIG9uU3RhcnQsIG9uRG9uZSkge1xuICAgIG9uU3RhcnQoKTtcbiAgICBjb25zdCB0aW1lciA9IHNldFRpbWVvdXQoKCkgPT4ge1xuICAgICAgdGhpcy50cmFuc2l0aW9ucy5kZWxldGUodGltZXIpO1xuICAgICAgb25Eb25lKCk7XG4gICAgICB0aGlzLmZsdXNoUGVuZGluZ09wcygpO1xuICAgIH0sIHRpbWUpO1xuICAgIHRoaXMudHJhbnNpdGlvbnMuYWRkKHRpbWVyKTtcbiAgfVxuXG4gIGFkZEFzeW5jVHJhbnNpdGlvbihwcm9taXNlKSB7XG4gICAgdGhpcy5wcm9taXNlcy5hZGQocHJvbWlzZSk7XG4gICAgcHJvbWlzZS50aGVuKCgpID0+IHtcbiAgICAgIHRoaXMucHJvbWlzZXMuZGVsZXRlKHByb21pc2UpO1xuICAgICAgdGhpcy5mbHVzaFBlbmRpbmdPcHMoKTtcbiAgICB9KTtcbiAgfVxuXG4gIHB1c2hQZW5kaW5nT3Aob3ApIHtcbiAgICB0aGlzLnBlbmRpbmdPcHMucHVzaChvcCk7XG4gIH1cblxuICBzaXplKCkge1xuICAgIHJldHVybiB0aGlzLnRyYW5zaXRpb25zLnNpemUgKyB0aGlzLnByb21pc2VzLnNpemU7XG4gIH1cblxuICBmbHVzaFBlbmRpbmdPcHMoKSB7XG4gICAgaWYgKHRoaXMuc2l6ZSgpID4gMCkge1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICBjb25zdCBvcCA9IHRoaXMucGVuZGluZ09wcy5zaGlmdCgpO1xuICAgIGlmIChvcCkge1xuICAgICAgb3AoKTtcbiAgICAgIHRoaXMuZmx1c2hQZW5kaW5nT3BzKCk7XG4gICAgfVxuICB9XG59XG4iLCAiLypcbj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG5QaG9lbml4IExpdmVWaWV3IEphdmFTY3JpcHQgQ2xpZW50XG49PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuXG5TZWUgdGhlIGhleGRvY3MgYXQgYGh0dHBzOi8vaGV4ZG9jcy5wbS9waG9lbml4X2xpdmVfdmlld2AgZm9yIGRvY3VtZW50YXRpb24uXG4qL1xuXG5pbXBvcnQgT3JpZ2luYWxMaXZlU29ja2V0LCB7IGlzVXNlZElucHV0IH0gZnJvbSBcIi4vbGl2ZV9zb2NrZXRcIjtcbmltcG9ydCBET00gZnJvbSBcIi4vZG9tXCI7XG5pbXBvcnQgeyBWaWV3SG9vayB9IGZyb20gXCIuL3ZpZXdfaG9va1wiO1xuaW1wb3J0IFZpZXcgZnJvbSBcIi4vdmlld1wiO1xuXG5pbXBvcnQgdHlwZSB7IExpdmVTb2NrZXRKU0NvbW1hbmRzIH0gZnJvbSBcIi4vanNfY29tbWFuZHNcIjtcbmltcG9ydCB0eXBlIHsgSG9vaywgSG9va3NPcHRpb25zIH0gZnJvbSBcIi4vdmlld19ob29rXCI7XG5pbXBvcnQgdHlwZSB7IFNvY2tldCBhcyBQaG9lbml4U29ja2V0IH0gZnJvbSBcInBob2VuaXhcIjtcblxuLyoqXG4gKiBPcHRpb25zIGZvciBjb25maWd1cmluZyB0aGUgTGl2ZVNvY2tldCBpbnN0YW5jZS5cbiAqL1xuZXhwb3J0IGludGVyZmFjZSBMaXZlU29ja2V0T3B0aW9ucyB7XG4gIC8qKlxuICAgKiBEZWZhdWx0cyBmb3IgcGh4LWRlYm91bmNlIGFuZCBwaHgtdGhyb3R0bGUuXG4gICAqL1xuICBkZWZhdWx0cz86IHtcbiAgICAvKiogVGhlIG1pbGxpc2Vjb25kIHBoeC1kZWJvdW5jZSB0aW1lLiBEZWZhdWx0cyAzMDAgKi9cbiAgICBkZWJvdW5jZT86IG51bWJlcjtcbiAgICAvKiogVGhlIG1pbGxpc2Vjb25kIHBoeC10aHJvdHRsZSB0aW1lLiBEZWZhdWx0cyAzMDAgKi9cbiAgICB0aHJvdHRsZT86IG51bWJlcjtcbiAgfTtcbiAgLyoqXG4gICAqIEFuIG9iamVjdCBvciBmdW5jdGlvbiBmb3IgcGFzc2luZyBjb25uZWN0IHBhcmFtcy5cbiAgICogVGhlIGZ1bmN0aW9uIHJlY2VpdmVzIHRoZSBlbGVtZW50IGFzc29jaWF0ZWQgd2l0aCBhIGdpdmVuIExpdmVWaWV3LiBGb3IgZXhhbXBsZTpcbiAgICpcbiAgICogICAgIChlbCkgPT4ge3ZpZXc6IGVsLmdldEF0dHJpYnV0ZShcImRhdGEtbXktdmlldy1uYW1lXCIsIHRva2VuOiB3aW5kb3cubXlUb2tlbn1cbiAgICpcbiAgICovXG4gIHBhcmFtcz86XG4gICAgfCAoKGVsOiBIVE1MRWxlbWVudCkgPT4geyBba2V5OiBzdHJpbmddOiBhbnkgfSlcbiAgICB8IHsgW2tleTogc3RyaW5nXTogYW55IH07XG4gIC8qKlxuICAgKiBUaGUgb3B0aW9uYWwgcHJlZml4IHRvIHVzZSBmb3IgYWxsIHBoeCBET00gYW5ub3RhdGlvbnMuXG4gICAqXG4gICAqIERlZmF1bHRzIHRvIFwicGh4LVwiLlxuICAgKi9cbiAgYmluZGluZ1ByZWZpeD86IHN0cmluZztcbiAgLyoqXG4gICAqIENhbGxiYWNrcyBmb3IgTGl2ZVZpZXcgaG9va3MuXG4gICAqXG4gICAqIFNlZSBbQ2xpZW50IGhvb2tzIHZpYSBgcGh4LWhvb2tgXShodHRwczovL2hleGRvY3MucG0vcGhvZW5peF9saXZlX3ZpZXcvanMtaW50ZXJvcC5odG1sI2NsaWVudC1ob29rcy12aWEtcGh4LWhvb2spIGZvciBtb3JlIGluZm9ybWF0aW9uLlxuICAgKi9cbiAgaG9va3M/OiBIb29rc09wdGlvbnM7XG4gIC8qKiBDYWxsYmFja3MgZm9yIExpdmVWaWV3IHVwbG9hZGVycy4gKi9cbiAgdXBsb2FkZXJzPzogeyBba2V5OiBzdHJpbmddOiBhbnkgfTsgLy8gVE9ETzogZGVmaW5lIG1vcmUgc3BlY2lmaWNhbGx5XG4gIC8qKiBEZWxheSBpbiBtaWxsaXNlY29uZHMgYmVmb3JlIGFwcGx5aW5nIGxvYWRpbmcgc3RhdGVzLiAqL1xuICBsb2FkZXJUaW1lb3V0PzogbnVtYmVyO1xuICAvKiogRGVsYXkgaW4gbWlsbGlzZWNvbmRzIGJlZm9yZSBleGVjdXRpbmcgcGh4LWRpc2Nvbm5lY3RlZCBjb21tYW5kcy4gKi9cbiAgZGlzY29ubmVjdGVkVGltZW91dD86IG51bWJlcjtcbiAgLyoqIE1heGltdW0gcmVsb2FkcyBiZWZvcmUgZW50ZXJpbmcgZmFpbHNhZmUgbW9kZS4gKi9cbiAgbWF4UmVsb2Fkcz86IG51bWJlcjtcbiAgLyoqIE1pbmltdW0gdGltZSBiZXR3ZWVuIG5vcm1hbCByZWxvYWQgYXR0ZW1wdHMuICovXG4gIHJlbG9hZEppdHRlck1pbj86IG51bWJlcjtcbiAgLyoqIE1heGltdW0gdGltZSBiZXR3ZWVuIG5vcm1hbCByZWxvYWQgYXR0ZW1wdHMuICovXG4gIHJlbG9hZEppdHRlck1heD86IG51bWJlcjtcbiAgLyoqIFRpbWUgYmV0d2VlbiByZWxvYWQgYXR0ZW1wdHMgaW4gZmFpbHNhZmUgbW9kZS4gKi9cbiAgZmFpbHNhZmVKaXR0ZXI/OiBudW1iZXI7XG4gIC8qKlxuICAgKiBGdW5jdGlvbiB0byBsb2cgZGVidWcgaW5mb3JtYXRpb24uIEZvciBleGFtcGxlOlxuICAgKlxuICAgKiAgICAgKHZpZXcsIGtpbmQsIG1zZywgb2JqKSA9PiBjb25zb2xlLmxvZyhgJHt2aWV3LmlkfSAke2tpbmR9OiAke21zZ30gLSBgLCBvYmopXG4gICAqL1xuICB2aWV3TG9nZ2VyPzogKHZpZXc6IFZpZXcsIGtpbmQ6IHN0cmluZywgbXNnOiBzdHJpbmcsIG9iajogYW55KSA9PiB2b2lkO1xuICAvKipcbiAgICogT2JqZWN0IG1hcHBpbmcgZXZlbnQgbmFtZXMgdG8gZnVuY3Rpb25zIGZvciBwb3B1bGF0aW5nIGV2ZW50IG1ldGFkYXRhLlxuICAgKlxuICAgKiAgICAgbWV0YWRhdGE6IHtcbiAgICogICAgICAgY2xpY2s6IChlLCBlbCkgPT4ge1xuICAgKiAgICAgICAgIHJldHVybiB7XG4gICAqICAgICAgICAgICBjdHJsS2V5OiBlLmN0cmxLZXksXG4gICAqICAgICAgICAgICBtZXRhS2V5OiBlLm1ldGFLZXksXG4gICAqICAgICAgICAgICBkZXRhaWw6IGUuZGV0YWlsIHx8IDEsXG4gICAqICAgICAgICAgfVxuICAgKiAgICAgICB9LFxuICAgKiAgICAgICBrZXlkb3duOiAoZSwgZWwpID0+IHtcbiAgICogICAgICAgICByZXR1cm4ge1xuICAgKiAgICAgICAgICAga2V5OiBlLmtleSxcbiAgICogICAgICAgICAgIGN0cmxLZXk6IGUuY3RybEtleSxcbiAgICogICAgICAgICAgIG1ldGFLZXk6IGUubWV0YUtleSxcbiAgICogICAgICAgICAgIHNoaWZ0S2V5OiBlLnNoaWZ0S2V5XG4gICAqICAgICAgICAgfVxuICAgKiAgICAgICB9XG4gICAqICAgICB9XG4gICAqXG4gICAqL1xuICBtZXRhZGF0YT86IHsgW2V2ZW50TmFtZTogc3RyaW5nXTogKGU6IEV2ZW50LCBlbDogSFRNTEVsZW1lbnQpID0+IG9iamVjdCB9O1xuICAvKipcbiAgICogQW4gb3B0aW9uYWwgU3RvcmFnZSBjb21wYXRpYmxlIG9iamVjdFxuICAgKiBVc2VmdWwgd2hlbiBMaXZlVmlldyB3b24ndCBoYXZlIGFjY2VzcyB0byBgc2Vzc2lvblN0b3JhZ2VgLiBGb3IgZXhhbXBsZSwgVGhpcyBjb3VsZFxuICAgKiBoYXBwZW4gaWYgYSBzaXRlIGxvYWRzIGEgY3Jvc3MtZG9tYWluIExpdmVWaWV3IGluIGFuIGlmcmFtZS5cbiAgICpcbiAgICogRXhhbXBsZSB1c2FnZTpcbiAgICpcbiAgICogICAgIGNsYXNzIEluTWVtb3J5U3RvcmFnZSB7XG4gICAqICAgICAgIGNvbnN0cnVjdG9yKCkgeyB0aGlzLnN0b3JhZ2UgPSB7fSB9XG4gICAqICAgICAgIGdldEl0ZW0oa2V5TmFtZSkgeyByZXR1cm4gdGhpcy5zdG9yYWdlW2tleU5hbWVdIHx8IG51bGwgfVxuICAgKiAgICAgICByZW1vdmVJdGVtKGtleU5hbWUpIHsgZGVsZXRlIHRoaXMuc3RvcmFnZVtrZXlOYW1lXSB9XG4gICAqICAgICAgIHNldEl0ZW0oa2V5TmFtZSwga2V5VmFsdWUpIHsgdGhpcy5zdG9yYWdlW2tleU5hbWVdID0ga2V5VmFsdWUgfVxuICAgKiAgICAgfVxuICAgKi9cbiAgc2Vzc2lvblN0b3JhZ2U/OiBTdG9yYWdlO1xuICAvKipcbiAgICogQW4gb3B0aW9uYWwgU3RvcmFnZSBjb21wYXRpYmxlIG9iamVjdFxuICAgKiBVc2VmdWwgd2hlbiBMaXZlVmlldyB3b24ndCBoYXZlIGFjY2VzcyB0byBgbG9jYWxTdG9yYWdlYC5cbiAgICpcbiAgICogU2VlIGBzZXNzaW9uU3RvcmFnZWAgZm9yIGFuIGV4YW1wbGUuXG4gICAqL1xuICBsb2NhbFN0b3JhZ2U/OiBTdG9yYWdlO1xuICAvKipcbiAgICogSWYgc2V0IHRvIGB0cnVlYCwgYHBoeC1jaGFuZ2VgIGV2ZW50cyB3aWxsIGJlIGJsb2NrZWQgKHdpbGwgbm90IGZpcmUpXG4gICAqIHdoaWxlIHRoZSB1c2VyIGlzIGNvbXBvc2luZyBpbnB1dCB1c2luZyBhbiBJTUUgKElucHV0IE1ldGhvZCBFZGl0b3IpLlxuICAgKiBUaGlzIGlzIGRldGVybWluZWQgYnkgdGhlIGBlLmlzQ29tcG9zaW5nYCBwcm9wZXJ0eSBvbiBrZXlib2FyZCBldmVudHMsXG4gICAqIHdoaWNoIGlzIGB0cnVlYCB3aGVuIHRoZSB1c2VyIGlzIGluIHRoZSBwcm9jZXNzIG9mIGVudGVyaW5nIGNvbXBvc2VkIGNoYXJhY3RlcnMgKGZvciBleGFtcGxlLFxuICAgKiB3aGVuIHR5cGluZyBKYXBhbmVzZSBvciBDaGluZXNlIHVzaW5nIHJvbWFqaSBvciBwaW55aW4gaW5wdXQgbWV0aG9kcykuXG4gICAqIEJ5IGRlZmF1bHQsIGBwaHgtY2hhbmdlYCB3aWxsIG5vdCBiZSBibG9ja2VkIGR1cmluZyBhIGNvbXBvc2l0aW9uIHNlc3Npb24sXG4gICAqIGJ1dCBub3RlIHRoYXQgdGhlcmUgd2VyZSBpc3N1ZXMgcmVwb3J0ZWQgaW4gb2xkZXIgdmVyc2lvbnMgb2YgU2FmYXJpLFxuICAgKiB3aGVyZSBhIExpdmVWaWV3IHBhdGNoIHRvIHRoZSBpbnB1dCBjYXVzZWQgdW5leHBlY3RlZCBiZWhhdmlvci5cbiAgICpcbiAgICogRm9yIG1vcmUgaW5mb3JtYXRpb24sIHNlZVxuICAgKiAtIGh0dHBzOi8vZGV2ZWxvcGVyLm1vemlsbGEub3JnL2VuLVVTL2RvY3MvV2ViL0FQSS9LZXlib2FyZEV2ZW50L2lzQ29tcG9zaW5nXG4gICAqIC0gaHR0cHM6Ly9naXRodWIuY29tL3Bob2VuaXhmcmFtZXdvcmsvcGhvZW5peF9saXZlX3ZpZXcvaXNzdWVzLzMzMjJcbiAgICpcbiAgICogRGVmYXVsdHMgdG8gYGZhbHNlYC5cbiAgICovXG4gIGJsb2NrUGh4Q2hhbmdlV2hpbGVDb21wb3Npbmc/OiBib29sZWFuO1xuICAvKiogRE9NIGNhbGxiYWNrcy4gKi9cbiAgZG9tPzoge1xuICAgIC8qKlxuICAgICAqIEFuIG9wdGlvbmFsIGZ1bmN0aW9uIHRvIG1vZGlmeSB0aGUgYmVoYXZpb3Igb2YgcXVlcnlpbmcgZWxlbWVudHMgaW4gSlMgY29tbWFuZHMuXG4gICAgICogQHBhcmFtIHNvdXJjZUVsIC0gVGhlIHNvdXJjZSBlbGVtZW50LCBlLmcuIHRoZSBidXR0b24gdGhhdCB3YXMgY2xpY2tlZC5cbiAgICAgKiBAcGFyYW0gcXVlcnkgLSBUaGUgcXVlcnkgdmFsdWUuXG4gICAgICogQHBhcmFtIGRlZmF1bHRRdWVyeSAtIEEgZGVmYXVsdCBxdWVyeSBmdW5jdGlvbiB0aGF0IGNhbiBiZSB1c2VkIGlmIG5vIGN1c3RvbSBxdWVyeSBzaG91bGQgYmUgYXBwbGllZC5cbiAgICAgKiBAcmV0dXJucyBBIGxpc3Qgb2YgRE9NIGVsZW1lbnRzLlxuICAgICAqL1xuICAgIGpzUXVlcnlTZWxlY3RvckFsbD86IChcbiAgICAgIHNvdXJjZUVsOiBIVE1MRWxlbWVudCxcbiAgICAgIHF1ZXJ5OiBzdHJpbmcsXG4gICAgICBkZWZhdWx0UXVlcnk6ICgpID0+IEVsZW1lbnRbXSxcbiAgICApID0+IEVsZW1lbnRbXTtcbiAgICAvKipcbiAgICAgKiBDYWxsZWQgaW1tZWRpYXRlbHkgYmVmb3JlIGEgRE9NIHBhdGNoIGlzIGFwcGxpZWQuXG4gICAgICovXG4gICAgb25QYXRjaFN0YXJ0PzogKGNvbnRhaW5lcjogSFRNTEVsZW1lbnQpID0+IHZvaWQ7XG4gICAgLyoqXG4gICAgICogQ2FsbGVkIGltbWVkaWF0ZWx5IGFmdGVyIGEgRE9NIHBhdGNoIGlzIGFwcGxpZWQuXG4gICAgICovXG4gICAgb25QYXRjaEVuZD86IChjb250YWluZXI6IEhUTUxFbGVtZW50KSA9PiB2b2lkO1xuICAgIC8qKlxuICAgICAqIENhbGxlZCB3aGVuIGEgbmV3IERPTSBub2RlIGlzIGFkZGVkLlxuICAgICAqL1xuICAgIG9uTm9kZUFkZGVkPzogKG5vZGU6IE5vZGUpID0+IHZvaWQ7XG4gICAgLyoqXG4gICAgICogQ2FsbGVkIGJlZm9yZSBhbiBlbGVtZW50IGlzIHVwZGF0ZWQuXG4gICAgICovXG4gICAgb25CZWZvcmVFbFVwZGF0ZWQ/OiAoZnJvbUVsOiBFbGVtZW50LCB0b0VsOiBFbGVtZW50KSA9PiB2b2lkO1xuICB9O1xuICAvKiogQWxsb3cgcGFzc3Rocm91Z2ggb2Ygb3RoZXIgb3B0aW9ucyB0byB0aGUgUGhvZW5peCBTb2NrZXQgY29uc3RydWN0b3IuICovXG4gIFtrZXk6IHN0cmluZ106IGFueTtcbn1cblxuLyoqXG4gKiBJbnRlcmZhY2UgZGVzY3JpYmluZyB0aGUgcHVibGljIEFQSSBvZiBhIExpdmVTb2NrZXQgaW5zdGFuY2UuXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgTGl2ZVNvY2tldEluc3RhbmNlSW50ZXJmYWNlIHtcbiAgLyoqXG4gICAqIFJldHVybnMgdGhlIHZlcnNpb24gb2YgdGhlIExpdmVWaWV3IGNsaWVudC5cbiAgICovXG4gIHZlcnNpb24oKTogc3RyaW5nO1xuICAvKipcbiAgICogUmV0dXJucyB0cnVlIGlmIHByb2ZpbGluZyBpcyBlbmFibGVkLiBTZWUgYGVuYWJsZVByb2ZpbGluZ2AgYW5kIGBkaXNhYmxlUHJvZmlsaW5nYC5cbiAgICovXG4gIGlzUHJvZmlsZUVuYWJsZWQoKTogYm9vbGVhbjtcbiAgLyoqXG4gICAqIFJldHVybnMgdHJ1ZSBpZiBkZWJ1Z2dpbmcgaXMgZW5hYmxlZC4gU2VlIGBlbmFibGVEZWJ1Z2AgYW5kIGBkaXNhYmxlRGVidWdgLlxuICAgKi9cbiAgaXNEZWJ1Z0VuYWJsZWQoKTogYm9vbGVhbjtcbiAgLyoqXG4gICAqIFJldHVybnMgdHJ1ZSBpZiBkZWJ1Z2dpbmcgaXMgZGlzYWJsZWQuIFNlZSBgZW5hYmxlRGVidWdgIGFuZCBgZGlzYWJsZURlYnVnYC5cbiAgICovXG4gIGlzRGVidWdEaXNhYmxlZCgpOiBib29sZWFuO1xuICAvKipcbiAgICogRW5hYmxlcyBkZWJ1Z2dpbmcuXG4gICAqXG4gICAqIFdoZW4gZGVidWdnaW5nIGlzIGVuYWJsZWQsIHRoZSBMaXZlVmlldyBjbGllbnQgd2lsbCBsb2cgZGVidWcgaW5mb3JtYXRpb24gdG8gdGhlIGNvbnNvbGUuXG4gICAqIFNlZSBbRGVidWdnaW5nIGNsaWVudCBldmVudHNdKGh0dHBzOi8vaGV4ZG9jcy5wbS9waG9lbml4X2xpdmVfdmlldy9qcy1pbnRlcm9wLmh0bWwjZGVidWdnaW5nLWNsaWVudC1ldmVudHMpIGZvciBtb3JlIGluZm9ybWF0aW9uLlxuICAgKi9cbiAgZW5hYmxlRGVidWcoKTogdm9pZDtcbiAgLyoqXG4gICAqIEVuYWJsZXMgcHJvZmlsaW5nLlxuICAgKlxuICAgKiBXaGVuIHByb2ZpbGluZyBpcyBlbmFibGVkLCB0aGUgTGl2ZVZpZXcgY2xpZW50IHdpbGwgbG9nIHByb2ZpbGluZyBpbmZvcm1hdGlvbiB0byB0aGUgY29uc29sZS5cbiAgICovXG4gIGVuYWJsZVByb2ZpbGluZygpOiB2b2lkO1xuICAvKipcbiAgICogRGlzYWJsZXMgZGVidWdnaW5nLlxuICAgKi9cbiAgZGlzYWJsZURlYnVnKCk6IHZvaWQ7XG4gIC8qKlxuICAgKiBEaXNhYmxlcyBwcm9maWxpbmcuXG4gICAqL1xuICBkaXNhYmxlUHJvZmlsaW5nKCk6IHZvaWQ7XG4gIC8qKlxuICAgKiBFbmFibGVzIGxhdGVuY3kgc2ltdWxhdGlvbi5cbiAgICpcbiAgICogV2hlbiBsYXRlbmN5IHNpbXVsYXRpb24gaXMgZW5hYmxlZCwgdGhlIExpdmVWaWV3IGNsaWVudCB3aWxsIGFkZCBhIGRlbGF5IHRvIHJlcXVlc3RzIGFuZCByZXNwb25zZXMgZnJvbSB0aGUgc2VydmVyLlxuICAgKiBTZWUgW1NpbXVsYXRpbmcgTGF0ZW5jeV0oaHR0cHM6Ly9oZXhkb2NzLnBtL3Bob2VuaXhfbGl2ZV92aWV3L2pzLWludGVyb3AuaHRtbCNzaW11bGF0aW5nLWxhdGVuY3kpIGZvciBtb3JlIGluZm9ybWF0aW9uLlxuICAgKi9cbiAgZW5hYmxlTGF0ZW5jeVNpbSh1cHBlckJvdW5kTXM6IG51bWJlcik6IHZvaWQ7XG4gIC8qKlxuICAgKiBEaXNhYmxlcyBsYXRlbmN5IHNpbXVsYXRpb24uXG4gICAqL1xuICBkaXNhYmxlTGF0ZW5jeVNpbSgpOiB2b2lkO1xuICAvKipcbiAgICogUmV0dXJucyB0aGUgY3VycmVudCBsYXRlbmN5IHNpbXVsYXRpb24gdXBwZXIgYm91bmQuXG4gICAqL1xuICBnZXRMYXRlbmN5U2ltKCk6IG51bWJlciB8IG51bGw7XG4gIC8qKlxuICAgKiBSZXR1cm5zIHRoZSBQaG9lbml4IFNvY2tldCBpbnN0YW5jZS5cbiAgICovXG4gIGdldFNvY2tldCgpOiBQaG9lbml4U29ja2V0O1xuICAvKipcbiAgICogQ29ubmVjdHMgdG8gdGhlIExpdmVWaWV3IHNlcnZlci5cbiAgICovXG4gIGNvbm5lY3QoKTogdm9pZDtcbiAgLyoqXG4gICAqIERpc2Nvbm5lY3RzIGZyb20gdGhlIExpdmVWaWV3IHNlcnZlci5cbiAgICovXG4gIGRpc2Nvbm5lY3QoY2FsbGJhY2s/OiAoKSA9PiB2b2lkKTogdm9pZDtcbiAgLyoqXG4gICAqIENhbiBiZSB1c2VkIHRvIHJlcGxhY2UgdGhlIHRyYW5zcG9ydCB1c2VkIGJ5IHRoZSB1bmRlcmx5aW5nIFBob2VuaXggU29ja2V0LlxuICAgKi9cbiAgcmVwbGFjZVRyYW5zcG9ydCh0cmFuc3BvcnQ6IGFueSk6IHZvaWQ7XG4gIC8qKlxuICAgKiBFeGVjdXRlcyBhbiBlbmNvZGVkIEpTIGNvbW1hbmQsIHRhcmdldGluZyB0aGUgZ2l2ZW4gZWxlbWVudC5cbiAgICpcbiAgICogU2VlIFtgUGhvZW5peC5MaXZlVmlldy5KU2BdKGh0dHBzOi8vaGV4ZG9jcy5wbS9waG9lbml4X2xpdmVfdmlldy9QaG9lbml4LkxpdmVWaWV3LkpTLmh0bWwpIGZvciBtb3JlIGluZm9ybWF0aW9uLlxuICAgKi9cbiAgZXhlY0pTKGVsOiBIVE1MRWxlbWVudCwgZW5jb2RlZEpTOiBzdHJpbmcsIGV2ZW50VHlwZT86IHN0cmluZyB8IG51bGwpOiB2b2lkO1xuICAvKipcbiAgICogUmV0dXJucyBhbiBvYmplY3Qgd2l0aCBtZXRob2RzIHRvIG1hbmlwbHVhdGUgdGhlIERPTSBhbmQgZXhlY3V0ZSBKYXZhU2NyaXB0LlxuICAgKiBUaGUgYXBwbGllZCBjaGFuZ2VzIGludGVncmF0ZSB3aXRoIHNlcnZlciBET00gcGF0Y2hpbmcuXG4gICAqXG4gICAqIFNlZSBbSmF2YVNjcmlwdCBpbnRlcm9wZXJhYmlsaXR5XShodHRwczovL2hleGRvY3MucG0vcGhvZW5peF9saXZlX3ZpZXcvanMtaW50ZXJvcC5odG1sKSBmb3IgbW9yZSBpbmZvcm1hdGlvbi5cbiAgICovXG4gIGpzKCk6IExpdmVTb2NrZXRKU0NvbW1hbmRzO1xufVxuXG4vKipcbiAqIEludGVyZmFjZSBkZXNjcmliaW5nIHRoZSBMaXZlU29ja2V0IGNvbnN0cnVjdG9yLlxuICovXG5leHBvcnQgaW50ZXJmYWNlIExpdmVTb2NrZXRDb25zdHJ1Y3RvciB7XG4gIC8qKlxuICAgKiBDcmVhdGVzIGEgbmV3IExpdmVTb2NrZXQgaW5zdGFuY2UuXG4gICAqXG4gICAqIEBwYXJhbSBlbmRwb2ludCAtIFRoZSBzdHJpbmcgV2ViU29ja2V0IGVuZHBvaW50LCBpZSwgYFwid3NzOi8vZXhhbXBsZS5jb20vbGl2ZVwiYCxcbiAgICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGBcIi9saXZlXCJgIChpbmhlcml0ZWQgaG9zdCAmIHByb3RvY29sKVxuICAgKiBAcGFyYW0gc29ja2V0IC0gdGhlIHJlcXVpcmVkIFBob2VuaXggU29ja2V0IGNsYXNzIGltcG9ydGVkIGZyb20gXCJwaG9lbml4XCIuIEZvciBleGFtcGxlOlxuICAgKlxuICAgKiAgICAgaW1wb3J0IHtTb2NrZXR9IGZyb20gXCJwaG9lbml4XCJcbiAgICogICAgIGltcG9ydCB7TGl2ZVNvY2tldH0gZnJvbSBcInBob2VuaXhfbGl2ZV92aWV3XCJcbiAgICogICAgIGxldCBsaXZlU29ja2V0ID0gbmV3IExpdmVTb2NrZXQoXCIvbGl2ZVwiLCBTb2NrZXQsIHsuLi59KVxuICAgKlxuICAgKiBAcGFyYW0gb3B0cyAtIE9wdGlvbmFsIGNvbmZpZ3VyYXRpb24uXG4gICAqL1xuICBuZXcgKFxuICAgIGVuZHBvaW50OiBzdHJpbmcsXG4gICAgc29ja2V0OiB0eXBlb2YgUGhvZW5peFNvY2tldCxcbiAgICBvcHRzPzogTGl2ZVNvY2tldE9wdGlvbnMsXG4gICk6IExpdmVTb2NrZXRJbnN0YW5jZUludGVyZmFjZTtcbn1cblxuLy8gYmVjYXVzZSBMaXZlU29ja2V0IGlzIGluIEpTIChmb3Igbm93KSwgd2UgY2FzdCBpdCB0byBvdXIgZGVmaW5lZCBUeXBlU2NyaXB0IGNvbnN0cnVjdG9yLlxuY29uc3QgTGl2ZVNvY2tldCA9IE9yaWdpbmFsTGl2ZVNvY2tldCBhcyB1bmtub3duIGFzIExpdmVTb2NrZXRDb25zdHJ1Y3RvcjtcblxuLyoqIENyZWF0ZXMgYSBob29rIGluc3RhbmNlIGZvciB0aGUgZ2l2ZW4gZWxlbWVudCBhbmQgY2FsbGJhY2tzLlxuICpcbiAqIEBwYXJhbSBlbCAtIFRoZSBlbGVtZW50IHRvIGFzc29jaWF0ZSB3aXRoIHRoZSBob29rLlxuICogQHBhcmFtIGNhbGxiYWNrcyAtIFRoZSBsaXN0IG9mIGhvb2sgY2FsbGJhY2tzLCBzdWNoIGFzIG1vdW50ZWQsXG4gKiAgIHVwZGF0ZWQsIGRlc3Ryb3llZCwgZXRjLlxuICpcbiAqICpOb3RlKjogYGNyZWF0ZUhvb2tgIG11c3QgYmUgY2FsbGVkIGZyb20gdGhlIGBjb25uZWN0ZWRDYWxsYmFja2AgbGlmZWN5Y2xlXG4gKiB3aGljaCBpcyB0cmlnZ2VyZWQgYWZ0ZXIgdGhlIGVsZW1lbnQgaGFzIGJlZW4gYWRkZWQgdG8gdGhlIERPTS4gSWYgeW91IHRyeVxuICogdG8gY2FsbCBgY3JlYXRlSG9va2AgZnJvbSB0aGUgY29uc3RydWN0b3IsIGFuIGVycm9yIHdpbGwgYmUgbG9nZ2VkLlxuICpcbiAqIEBleGFtcGxlXG4gKlxuICogY2xhc3MgTXlDb21wb25lbnQgZXh0ZW5kcyBIVE1MRWxlbWVudCB7XG4gKiAgIGNvbm5lY3RlZENhbGxiYWNrKCl7XG4gKiAgICAgbGV0IG9uTGl2ZVZpZXdNb3VudGVkID0gKCkgPT4gdGhpcy5ob29rLnB1c2hFdmVudCguLi4pKVxuICogICAgIHRoaXMuaG9vayA9IGNyZWF0ZUhvb2sodGhpcywge21vdW50ZWQ6IG9uTGl2ZVZpZXdNb3VudGVkfSlcbiAqICAgfVxuICogfVxuICpcbiAqIEByZXR1cm5zIFJldHVybnMgdGhlIEhvb2sgaW5zdGFuY2UgZm9yIHRoZSBjdXN0b20gZWxlbWVudC5cbiAqL1xuZnVuY3Rpb24gY3JlYXRlSG9vayhlbDogSFRNTEVsZW1lbnQsIGNhbGxiYWNrczogSG9vayk6IFZpZXdIb29rIHtcbiAgbGV0IGV4aXN0aW5nSG9vayA9IERPTS5nZXRDdXN0b21FbEhvb2soZWwpO1xuICBpZiAoZXhpc3RpbmdIb29rKSB7XG4gICAgcmV0dXJuIGV4aXN0aW5nSG9vaztcbiAgfVxuXG4gIGxldCBob29rID0gbmV3IFZpZXdIb29rKFZpZXcuY2xvc2VzdFZpZXcoZWwpLCBlbCwgY2FsbGJhY2tzKTtcbiAgRE9NLnB1dEN1c3RvbUVsSG9vayhlbCwgaG9vayk7XG4gIHJldHVybiBob29rO1xufVxuXG5leHBvcnQgeyBMaXZlU29ja2V0LCBpc1VzZWRJbnB1dCwgY3JlYXRlSG9vaywgVmlld0hvb2ssIEhvb2ssIEhvb2tzT3B0aW9ucyB9O1xuIiwgImltcG9ydCBcInBob2VuaXhfaHRtbFwiO1xuaW1wb3J0IHsgU29ja2V0IH0gZnJvbSBcInBob2VuaXhcIjtcbmltcG9ydCB7IExpdmVTb2NrZXQgfSBmcm9tIFwicGhvZW5peF9saXZlX3ZpZXdcIjtcbmltcG9ydCBDbGlwYm9hcmRKUyBmcm9tIFwiY2xpcGJvYXJkXCI7XG5pbXBvcnQgVG9hc3RpZnkgZnJvbSBcInRvYXN0aWZ5LWpzXCI7XG5pbXBvcnQgdG9wYmFyIGZyb20gXCJ0b3BiYXJcIjtcblxudG9wYmFyLmNvbmZpZyh7XG4gIGJhckNvbG9yczogeyAwOiBcInJnYig2NywgNTYsIDIwMilcIiB9LFxuICBzaGFkb3dDb2xvcjogXCJyZ2JhKDAsIDAsIDAsIC4zKVwiLFxuICBjbGFzc05hbWU6IFwidG9wYmFyXCIsXG59KTtcbndpbmRvdy5hZGRFdmVudExpc3RlbmVyKFwicGh4OnBhZ2UtbG9hZGluZy1zdGFydFwiLCAoaW5mbykgPT4gdG9wYmFyLnNob3coKSk7XG53aW5kb3cuYWRkRXZlbnRMaXN0ZW5lcihcInBoeDpwYWdlLWxvYWRpbmctc3RvcFwiLCAoKSA9PiB0b3BiYXIuaGlkZSgpKTtcbndpbmRvdy5hZGRFdmVudExpc3RlbmVyKFwicGh4OnN1Y2Nlc3NcIiwgKGUpID0+IHtcbiAgVG9hc3RpZnkoe1xuICAgIHRleHQ6IGUuZGV0YWlsLm1zZyxcbiAgICBjbGFzc05hbWU6IFwidG9hc3RfX2NvbnRhaW5lci0tc3VjY2Vzc1wiLFxuICB9KS5zaG93VG9hc3QoKTtcbn0pO1xud2luZG93LmFkZEV2ZW50TGlzdGVuZXIoXCJwaHg6ZXJyb3JcIiwgKGUpID0+IHtcbiAgVG9hc3RpZnkoe1xuICAgIHRleHQ6IGUuZGV0YWlsLm1zZyxcbiAgICBjbGFzc05hbWU6IFwidG9hc3RfX2NvbnRhaW5lci0tZXJyb3JcIixcbiAgfSkuc2hvd1RvYXN0KCk7XG59KTtcblxubGV0IEhvb2tzID0ge307XG5cbkhvb2tzLkVtYmVkQ29tcG9uZW50ID0ge1xuICBtb3VudGVkKCkge1xuICAgIHRoaXMuZWwuYWRkRXZlbnRMaXN0ZW5lcihcImxpdmVfYWRtaW46bW92ZV9lbWJlZFwiLCAoZSkgPT4ge1xuICAgICAgY29uc3QgZW1iZWRFbCA9IGUudGFyZ2V0LnBhcmVudEVsZW1lbnQ7XG4gICAgICBjb25zdCBpbmRleEVsID0gZW1iZWRFbC5xdWVyeVNlbGVjdG9yKFwiLmVtYmVkX19pbmRleFwiKTtcbiAgICAgIGNvbnN0IGZpZWxkRWwgPSBlbWJlZEVsLnBhcmVudEVsZW1lbnQ7XG5cbiAgICAgIGNvbnN0IG5ld0luZGV4ID0gK2luZGV4RWwudmFsdWUgKyArZS50YXJnZXQuZGF0YXNldC5kaXI7XG4gICAgICBpbmRleEVsLnZhbHVlID0gbmV3SW5kZXg7XG5cbiAgICAgIGNvbnN0IHRhcmdldEVsID0gZmllbGRFbC5xdWVyeVNlbGVjdG9yQWxsKFwiLmVtYmVkX19pbmRleFwiKVtuZXdJbmRleF07XG4gICAgICB0YXJnZXRFbC52YWx1ZSA9ICt0YXJnZXRFbC52YWx1ZSArICtlLnRhcmdldC5kYXRhc2V0LmRpciAqIC0xO1xuXG4gICAgICBpbmRleEVsLmRpc3BhdGNoRXZlbnQoXG4gICAgICAgIG5ldyBFdmVudChcImlucHV0XCIsIHsgYnViYmxlczogdHJ1ZSwgY2FuY2VsYWJsZTogdHJ1ZSB9KSxcbiAgICAgICk7XG4gICAgfSk7XG5cbiAgICB0aGlzLmVsLmFkZEV2ZW50TGlzdGVuZXIoXCJsaXZlX2FkbWluOmVtYmVkX2FkZFwiLCAoZSkgPT4ge1xuICAgICAgY29uc3Qgc29ydElucHV0ID0gZS50YXJnZXQucHJldmlvdXNFbGVtZW50U2libGluZztcbiAgICAgIHNvcnRJbnB1dC5jaGVja2VkID0gdHJ1ZTtcbiAgICAgIHNvcnRJbnB1dC5kaXNwYXRjaEV2ZW50KFxuICAgICAgICBuZXcgRXZlbnQoXCJpbnB1dFwiLCB7IGJ1YmJsZXM6IHRydWUsIGNhbmNlbGFibGU6IHRydWUgfSksXG4gICAgICApO1xuICAgIH0pO1xuXG4gICAgdGhpcy5lbC5hZGRFdmVudExpc3RlbmVyKFwibGl2ZV9hZG1pbjplbWJlZF9kcm9wXCIsIChlKSA9PiB7XG4gICAgICBlLnRhcmdldC5wYXJlbnRFbGVtZW50LmNsYXNzTGlzdC5hZGQoXCJoaWRkZW5cIik7XG4gICAgICBjb25zdCBkZWxldGVJbnB1dCA9IGUudGFyZ2V0LnByZXZpb3VzRWxlbWVudFNpYmxpbmc7XG4gICAgICBkZWxldGVJbnB1dC5jaGVja2VkID0gdHJ1ZTtcbiAgICAgIGRlbGV0ZUlucHV0LmRpc3BhdGNoRXZlbnQoXG4gICAgICAgIG5ldyBFdmVudChcImlucHV0XCIsIHsgYnViYmxlczogdHJ1ZSwgY2FuY2VsYWJsZTogdHJ1ZSB9KSxcbiAgICAgICk7XG4gICAgfSk7XG5cbiAgICB0aGlzLmVsLmFkZEV2ZW50TGlzdGVuZXIoXCJsaXZlX2FkbWluOmVtYmVkX2RlbGV0ZVwiLCAoZSkgPT4ge1xuICAgICAgZS50YXJnZXQucGFyZW50RWxlbWVudC5jbGFzc0xpc3QuYWRkKFwiaGlkZGVuXCIpO1xuXG4gICAgICBjb25zdCBkZWxldGVJbnB1dCA9IGUudGFyZ2V0XG4gICAgICAgIC5jbG9zZXN0KFwiLmVtYmVkX19ncm91cFwiKVxuICAgICAgICAucXVlcnlTZWxlY3RvcignaW5wdXRbdmFsdWU9XCJcIl0nKTtcbiAgICAgIGRlbGV0ZUlucHV0LmRpc2FibGVkID0gZmFsc2U7XG4gICAgICBkZWxldGVJbnB1dC5kaXNwYXRjaEV2ZW50KFxuICAgICAgICBuZXcgRXZlbnQoXCJpbnB1dFwiLCB7IGJ1YmJsZXM6IHRydWUsIGNhbmNlbGFibGU6IHRydWUgfSksXG4gICAgICApO1xuICAgIH0pO1xuICB9LFxufTtcblxuSG9va3MuU2VhcmNoU2VsZWN0ID0ge1xuICBtb3VudGVkKCkge1xuICAgIHRoaXMuaGFuZGxlRXZlbnQoXCJjaGFuZ2VcIiwgKCkgPT4ge1xuICAgICAgdGhpcy5lbFxuICAgICAgICAucXVlcnlTZWxlY3RvcihcImlucHV0XCIpXG4gICAgICAgIC5kaXNwYXRjaEV2ZW50KG5ldyBFdmVudChcImlucHV0XCIsIHsgYnViYmxlczogdHJ1ZSwgY2FuY2VsYWJsZTogdHJ1ZSB9KSk7XG4gICAgfSk7XG4gIH0sXG59O1xuXG5Ib29rcy5BcnJheUlucHV0ID0ge1xuICBtb3VudGVkKCkge1xuICAgIHRoaXMuaGFuZGxlRXZlbnQoXCJjaGFuZ2VcIiwgKCkgPT4ge1xuICAgICAgdGhpcy5lbFxuICAgICAgICAucXVlcnlTZWxlY3RvcihcImlucHV0XCIpXG4gICAgICAgIC5kaXNwYXRjaEV2ZW50KG5ldyBFdmVudChcImlucHV0XCIsIHsgYnViYmxlczogdHJ1ZSwgY2FuY2VsYWJsZTogdHJ1ZSB9KSk7XG4gICAgfSk7XG4gIH0sXG59O1xuXG5Ib29rcy5NYXBJbnB1dCA9IHtcbiAgbW91bnRlZCgpIHtcbiAgICB0aGlzLmhhbmRsZUV2ZW50KFwiY2hhbmdlXCIsICgpID0+IHtcbiAgICAgIHRoaXMuZWxcbiAgICAgICAgLnF1ZXJ5U2VsZWN0b3IoXCJpbnB1dFwiKVxuICAgICAgICAuZGlzcGF0Y2hFdmVudChuZXcgRXZlbnQoXCJpbnB1dFwiLCB7IGJ1YmJsZXM6IHRydWUsIGNhbmNlbGFibGU6IHRydWUgfSkpO1xuICAgIH0pO1xuICB9LFxufTtcblxuSG9va3MuVmlld1BhZ2UgPSB7XG4gIG1vdW50ZWQoKSB7XG4gICAgdGhpcy5lbC5hZGRFdmVudExpc3RlbmVyKFwibGl2ZV9hZG1pbjphY3Rpb25cIiwgKGUpID0+IHtcbiAgICAgIGlmIChlLnRhcmdldC50YWdOYW1lID09PSBcIkZPUk1cIikge1xuICAgICAgICBjb25zdCBwYXJhbXMgPSBbLi4ubmV3IEZvcm1EYXRhKGUudGFyZ2V0KV0ucmVkdWNlKFxuICAgICAgICAgIChwYXJhbXMsIFtrZXksIHZhbF0pID0+IHtcbiAgICAgICAgICAgIGlmIChrZXkgPT09IFwiYXJnc1tdXCIpIHtcbiAgICAgICAgICAgICAgcmV0dXJuIHsgLi4ucGFyYW1zLCBhcmdzOiBbLi4ucGFyYW1zLmFyZ3MsIHZhbF0gfTtcbiAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgIHJldHVybiB7IC4uLnBhcmFtcywgW2tleV06IHZhbCB9O1xuICAgICAgICAgICAgfVxuICAgICAgICAgIH0sXG4gICAgICAgICAgeyBhcmdzOiBbXSB9LFxuICAgICAgICApO1xuXG4gICAgICAgIGUudGFyZ2V0LnJlc2V0KCk7XG5cbiAgICAgICAgdGhpcy5wdXNoRXZlbnRUbyh0aGlzLmVsLCBcImFjdGlvblwiLCBwYXJhbXMpO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgdGhpcy5wdXNoRXZlbnRUbyh0aGlzLmVsLCBcImFjdGlvblwiLCB7IG5hbWU6IGUudGFyZ2V0LmRhdGFzZXQuYWN0aW9uIH0pO1xuICAgICAgfVxuICAgIH0pO1xuICB9LFxufTtcblxuSG9va3MuSW5kZXhQYWdlID0ge1xuICBtb3VudGVkKCkge1xuICAgIHRoaXMuc2VsZWN0ZWQgPSBbXTtcblxuICAgIHRoaXMuZWwuYWRkRXZlbnRMaXN0ZW5lcihcImxpdmVfYWRtaW46YWN0aW9uXCIsIChlKSA9PiB7XG4gICAgICBpZiAoZS50YXJnZXQudGFnTmFtZSA9PT0gXCJGT1JNXCIpIHtcbiAgICAgICAgY29uc3QgcGFyYW1zID0gWy4uLm5ldyBGb3JtRGF0YShlLnRhcmdldCldLnJlZHVjZShcbiAgICAgICAgICAocGFyYW1zLCBba2V5LCB2YWxdKSA9PiB7XG4gICAgICAgICAgICBpZiAoa2V5ID09PSBcImFyZ3NbXVwiKSB7XG4gICAgICAgICAgICAgIHJldHVybiB7IC4uLnBhcmFtcywgYXJnczogWy4uLnBhcmFtcy5hcmdzLCB2YWxdIH07XG4gICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICByZXR1cm4geyAuLi5wYXJhbXMsIFtrZXldOiB2YWwgfTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9LFxuICAgICAgICAgIHsgYXJnczogW10gfSxcbiAgICAgICAgKTtcblxuICAgICAgICB0aGlzLnB1c2hFdmVudFRvKHRoaXMuZWwsIFwiYWN0aW9uXCIsIHsgLi4ucGFyYW1zLCBpZHM6IHRoaXMuc2VsZWN0ZWQgfSk7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICB0aGlzLnB1c2hFdmVudFRvKHRoaXMuZWwsIFwiYWN0aW9uXCIsIHtcbiAgICAgICAgICBuYW1lOiBlLnRhcmdldC5kYXRhc2V0LmFjdGlvbixcbiAgICAgICAgICBpZHM6IHRoaXMuc2VsZWN0ZWQsXG4gICAgICAgIH0pO1xuICAgICAgfVxuICAgIH0pO1xuXG4gICAgdGhpcy5lbC5hZGRFdmVudExpc3RlbmVyKFwibGl2ZV9hZG1pbjp0b2dnbGVfc2VsZWN0XCIsIChlKSA9PiB7XG4gICAgICBpZiAoZS50YXJnZXQuaWQgPT09IFwic2VsZWN0LWFsbFwiKSB7XG4gICAgICAgIHRoaXMuZWxcbiAgICAgICAgICAucXVlcnlTZWxlY3RvckFsbChcIi5yZXNvdXJjZV9fc2VsZWN0XCIpXG4gICAgICAgICAgLmZvckVhY2goKGJveCkgPT4gKGJveC5jaGVja2VkID0gZS50YXJnZXQuY2hlY2tlZCkpO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgdGhpcy5lbC5xdWVyeVNlbGVjdG9yKFwiI3NlbGVjdC1hbGxcIikuY2hlY2tlZCA9IGZhbHNlO1xuICAgICAgfVxuXG4gICAgICB0aGlzLnNlbGVjdGVkID0gQXJyYXkuZnJvbShcbiAgICAgICAgdGhpcy5lbC5xdWVyeVNlbGVjdG9yQWxsKFwiaW5wdXRbZGF0YS1yZWNvcmQta2V5XTpjaGVja2VkXCIpLFxuICAgICAgICAoZSkgPT4gZS5kYXRhc2V0LnJlY29yZEtleSxcbiAgICAgICk7XG5cbiAgICAgIGlmICh0aGlzLnNlbGVjdGVkLmxlbmd0aCA+IDApIHtcbiAgICAgICAgZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoXCJmb290ZXItc2VsZWN0XCIpLnN0eWxlLnJlbW92ZVByb3BlcnR5KFwiZGlzcGxheVwiKTtcbiAgICAgICAgZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoXCJmb290ZXItbmF2XCIpLnN0eWxlLmRpc3BsYXkgPSBcIm5vbmVcIjtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKFwiZm9vdGVyLW5hdlwiKS5zdHlsZS5yZW1vdmVQcm9wZXJ0eShcImRpc3BsYXlcIik7XG4gICAgICAgIGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKFwiZm9vdGVyLXNlbGVjdFwiKS5zdHlsZS5kaXNwbGF5ID0gXCJub25lXCI7XG4gICAgICB9XG4gICAgfSk7XG4gIH0sXG4gIHVwZGF0ZWQoKSB7XG4gICAgdGhpcy5zZWxlY3RlZCA9IFtdO1xuXG4gICAgdmFyIGNsaXBib2FyZCA9IG5ldyBDbGlwYm9hcmRKUyh0aGlzLmVsLnF1ZXJ5U2VsZWN0b3JBbGwoXCIuY2VsbF9fY29weVwiKSwge1xuICAgICAgdGFyZ2V0OiBmdW5jdGlvbiAodHJpZ2dlcikge1xuICAgICAgICByZXR1cm4gdHJpZ2dlci5jbG9zZXN0KFwiLnJlc291cmNlX19jZWxsXCIpLmZpcnN0RWxlbWVudENoaWxkO1xuICAgICAgfSxcbiAgICB9KTtcblxuICAgIGNsaXBib2FyZC5vbihcInN1Y2Nlc3NcIiwgZnVuY3Rpb24gKGUpIHtcbiAgICAgIFRvYXN0aWZ5KHtcbiAgICAgICAgdGV4dDogZS50cmlnZ2VyLmRhdGFzZXQubWVzc2FnZSxcbiAgICAgICAgY2xhc3NOYW1lOiBcInRvYXN0X19jb250YWluZXJcIixcbiAgICAgIH0pLnNob3dUb2FzdCgpO1xuICAgIH0pO1xuICB9LFxufTtcblxubGV0IGNzcmZUb2tlbiA9IGRvY3VtZW50XG4gIC5xdWVyeVNlbGVjdG9yKFwibWV0YVtuYW1lPSdjc3JmLXRva2VuJ11cIilcbiAgLmdldEF0dHJpYnV0ZShcImNvbnRlbnRcIik7XG5sZXQgbGl2ZVNvY2tldCA9IG5ldyBMaXZlU29ja2V0KFwiL2xpdmVcIiwgU29ja2V0LCB7XG4gIGhvb2tzOiBIb29rcyxcbiAgcGFyYW1zOiB7IF9jc3JmX3Rva2VuOiBjc3JmVG9rZW4gfSxcbn0pO1xuXG4vLyBDb25uZWN0IGlmIHRoZXJlIGFyZSBhbnkgTGl2ZVZpZXdzIG9uIHRoZSBwYWdlXG5saXZlU29ja2V0LmNvbm5lY3QoKTtcblxuaWYgKEVOViA9PSBcImRldlwiKSB7XG4gIGxpdmVTb2NrZXQuZW5hYmxlRGVidWcoKTtcbiAgbGl2ZVNvY2tldC5lbmFibGVMYXRlbmN5U2ltKHByb2Nlc3MuZW52LkxBVEVOQ1lfU0lNKTtcbn1cblxud2luZG93LmxpdmVTb2NrZXQgPSBsaXZlU29ja2V0O1xuIl0sCiAgIm1hcHBpbmdzIjogIjs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7O0FBQUE7QUFBQTtBQU1BLE9BQUMsU0FBUyxpQ0FBaUMsTUFBTSxTQUFTO0FBQ3pELFlBQUcsT0FBTyxZ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LEVBQUUsYUFBYSxVQUFVO0FBQUEsRUFDbkMsQ0FBQztBQUdELGFBQVcsUUFBUTtBQUVuQixNQUFJLE9BQU8sT0FBTztBQUNoQixlQUFXLFlBQVk7QUFDdkIsZUFBVyxpQkFBaUIsQ0FBdUI7QUFBQSxFQUNyRDtBQUVBLFNBQU8sYUFBYTsiLAogICJuYW1lcyI6IFsiX193ZWJwYWNrX3JlcXVpcmVfXyIsICJDbGlwYm9hcmRBY3Rpb25DdXQiLCAiQ2xpcGJvYXJkQWN0aW9uQ29weSIsICJfdHlwZW9mIiwgIm9iaiIsICJDbGlwYm9hcmRBY3Rpb25EZWZhdWx0IiwgIl9zZXRQcm90b3R5cGVPZiIsICJvIiwgInAiLCAic2VsZiIsICJfZ2V0UHJvdG90eXBlT2YiLCAiQ2xpcGJvYXJkIiwgImFjdGlvbiIsICJtb2R1bGUiLCAiZXhwb3J0cyIsICJyYW5nZSIsICJnbG9iYWwiLCAiVG9hc3RpZnkiLCAic2VsZiIsICJ3aW5kb3ciLCAiZG9jdW1lbnQiLCAidG9wYmFyIiwgIkN1c3RvbUV2ZW50IiwgImNsb3N1cmUiLCAibGl2ZVNvY2tldCIsICJjbG9zdXJlIiwgImRvYyIsICJlIiwgImlzRW1wdHkiLCAiZmlsZSIsICJtb3JwaEF0dHJzIiwgIm1vcnBoZG9tIiwgImNoaWxkcmVuT25seSIsICJ0YXJnZXRDb250YWluZXIiLCAiY2xvbmUiLCAiZWwiLCAiaW5wdXRzVW51c2VkIiwgIm9ubHlIaWRkZW5JbnB1dHMiLCAibG9jayIsICJsb2FkaW5nIiwgImVudHJ5IiwgImlucHV0IiwgImNsb3N1cmUiLCAiTGl2ZVNvY2tldCIsICJ0b3BiYXIiLCAiVG9hc3RpZnkiLCAiSG9va3MiLCAicGFyYW1zIiwgImUiLCAiQ2xpcGJvYXJkSlMiXQp9Cg== +//# sourceMappingURL=data:application/json;base64,ewogICJ2ZXJzaW9uIjogMywKICAic291cmNlcyI6IFsiLi4vLi4vYXNzZXRzL25vZGVfbW9kdWxlcy9jbGlwYm9hcmQvZGlzdC9jbGlwYm9hcmQuanMiLCAiLi4vLi4vYXNzZXRzL25vZGVfbW9kdWxlcy90b3BiYXIvdG9wYmFyLm1pbi5qcyIsICIuLi8uLi9kZXBzL3Bob2VuaXhfaHRtbC9wcml2L3N0YXRpYy9waG9lbml4X2h0bWwuanMiLCAiLi4vLi4vZGVwcy9waG9lbml4L2Fzc2V0cy9qcy9waG9lbml4L3V0aWxzLmpzIiwgIi4uLy4uL2RlcHMvcGhvZW5peC9hc3NldHMvanMvcGhvZW5peC9jb25zdGFudHMuanMiLCAiLi4vLi4vZGVwcy9waG9lbml4L2Fzc2V0cy9qcy9waG9lbml4L3B1c2guanMiLCAiLi4vLi4vZGVwcy9waG9lbml4L2Fzc2V0cy9qcy9waG9lbml4L3RpbWVyLmpzIiwgIi4uLy4uL2RlcHMvcGhvZW5peC9hc3NldHMvanMvcGhvZW5peC9jaGFubmVsLmpzIiwgIi4uLy4uL2RlcHMvcGhvZW5peC9hc3NldHMvanMvcGhvZW5peC9hamF4LmpzIiwgIi4uLy4uL2RlcHMvcGhvZW5peC9hc3NldHMvanMvcGhvZW5peC9sb25ncG9sbC5qcyIsICIuLi8uLi9kZXBzL3Bob2VuaXgvYXNzZXRzL2pzL3Bob2VuaXgvcHJlc2VuY2UuanMiLCAiLi4vLi4vZGVwcy9waG9lbml4L2Fzc2V0cy9qcy9waG9lbml4L3NlcmlhbGl6ZXIuanMiLCAiLi4vLi4vZGVwcy9waG9lbml4L2Fzc2V0cy9qcy9waG9lbml4L3NvY2tldC5qcyIsICIuLi8uLi9kZXBzL3Bob2VuaXhfbGl2ZV92aWV3L2Fzc2V0cy9qcy9waG9lbml4X2xpdmVfdmlldy9jb25zdGFudHMuanMiLCAiLi4vLi4vZGVwcy9waG9lbml4X2xpdmVfdmlldy9hc3NldHMvanMvcGhvZW5peF9saXZlX3ZpZXcvZW50cnlfdXBsb2FkZXIuanMiLCAiLi4vLi4vZGVwcy9waG9lbml4X2xpdmVfdmlldy9hc3NldHMvanMvcGhvZW5peF9saXZlX3ZpZXcvdXRpbHMuanMiLCAiLi4vLi4vZGVwcy9waG9lbml4X2xpdmVfdmlldy9hc3NldHMvanMvcGhvZW5peF9saXZlX3ZpZXcvYnJvd3Nlci5qcyIsICIuLi8uLi9kZXBzL3Bob2VuaXhfbGl2ZV92aWV3L2Fzc2V0cy9qcy9waG9lbml4X2xpdmVfdmlldy9kb20uanMiLCAiLi4vLi4vZGVwcy9waG9lbml4X2xpdmVfdmlldy9hc3NldHMvanMvcGhvZW5peF9saXZlX3ZpZXcvdXBsb2FkX2VudHJ5LmpzIiwgIi4uLy4uL2RlcHMvcGhvZW5peF9saXZlX3ZpZXcvYXNzZXRzL2pzL3Bob2VuaXhfbGl2ZV92aWV3L2xpdmVfdXBsb2FkZXIuanMiLCAiLi4vLi4vZGVwcy9waG9lbml4X2xpdmVfdmlldy9hc3NldHMvanMvcGhvZW5peF9saXZlX3ZpZXcvYXJpYS5qcyIsICIuLi8uLi9kZXBzL3Bob2VuaXhfbGl2ZV92aWV3L2Fzc2V0cy9qcy9waG9lbml4X2xpdmVfdmlldy9ob29rcy5qcyIsICIuLi8uLi9kZXBzL3Bob2VuaXhfbGl2ZV92aWV3L2Fzc2V0cy9qcy9waG9lbml4X2xpdmVfdmlldy9lbGVtZW50X3JlZi5qcyIsICIuLi8uLi9kZXBzL3Bob2VuaXhfbGl2ZV92aWV3L2Fzc2V0cy9qcy9waG9lbml4X2xpdmVfdmlldy9kb21fcG9zdF9tb3JwaF9yZXN0b3Jlci5qcyIsICIuLi8uLi9kZXBzL3Bob2VuaXhfbGl2ZV92aWV3L25vZGVfbW9kdWxlcy9tb3JwaGRvbS9kaXN0L21vcnBoZG9tLWVzbS5qcyIsICIuLi8uLi9kZXBzL3Bob2VuaXhfbGl2ZV92aWV3L2Fzc2V0cy9qcy9waG9lbml4X2xpdmVfdmlldy9kb21fcGF0Y2guanMiLCAiLi4vLi4vZGVwcy9waG9lbml4X2xpdmVfdmlldy9hc3NldHMvanMvcGhvZW5peF9saXZlX3ZpZXcvcmVuZGVyZWQuanMiLCAiLi4vLi4vZGVwcy9waG9lbml4X2xpdmVfdmlldy9hc3NldHMvanMvcGhvZW5peF9saXZlX3ZpZXcvanMuanMiLCAiLi4vLi4vZGVwcy9waG9lbml4X2xpdmVfdmlldy9hc3NldHMvanMvcGhvZW5peF9saXZlX3ZpZXcvanNfY29tbWFuZHMudHMiLCAiLi4vLi4vZGVwcy9waG9lbml4X2xpdmVfdmlldy9hc3NldHMvanMvcGhvZW5peF9saXZlX3ZpZXcvdmlld19ob29rLnRzIiwgIi4uLy4uL2RlcHMvcGhvZW5peF9saXZlX3ZpZXcvYXNzZXRzL2pzL3Bob2VuaXhfbGl2ZV92aWV3L3ZpZXcuanMiLCAiLi4vLi4vZGVwcy9waG9lbml4X2xpdmVfdmlldy9hc3NldHMvanMvcGhvZW5peF9saXZlX3ZpZXcvbGl2ZV9zb2NrZXQuanMiLCAiLi4vLi4vZGVwcy9waG9lbml4X2xpdmVfdmlldy9hc3NldHMvanMvcGhvZW5peF9saXZlX3ZpZXcvaW5kZXgudHMiLCAiLi4vLi4vYXNzZXRzL2pzL2FwcC5qcyIsICIuLi8uLi9hc3NldHMvbm9kZV9tb2R1bGVzL3Bob2VuaXgtY29sb2NhdGVkL2xpdmVfYWRtaW4vTGl2ZUFkbWluLkNvbXBvbmVudHMuQWxlcnRCYXIvMjBfNmZqbnVhNWNyaHduaWluaXMzYjRxbHRkNDQuanMiLCAiLi4vLi4vYXNzZXRzL25vZGVfbW9kdWxlcy9waG9lbml4LWNvbG9jYXRlZC9saXZlX2FkbWluL2luZGV4LmpzIl0sCiAgInNvdXJjZXNDb250ZW50IjogWyIvKiFcbiAqIGNsaXBib2FyZC5qcyB2Mi4wLjEwXG4gKiBodHRwczovL2NsaXBib2FyZGpzLmNvbS9cbiAqXG4gKiBMaWNlbnNlZCBNSVQgXHUwMEE5IFplbm8gUm9jaGFcbiAqL1xuKGZ1bmN0aW9uIHdlYnBhY2tVbml2ZXJzYWxNb2R1bGVEZWZpbml0aW9uKHJvb3QsIGZhY3RvcnkpIHtcblx0aWYodHlwZW9mIGV4cG9ydHMgPT09ICdvYmplY3QnICYmIHR5cGVvZiBtb2R1bGUgPT09ICdvYmplY3QnKVxuXHRcdG1vZHVsZS5leHBvcnRzID0gZmFjdG9yeSgpO1xuXHRlbHNlIGlmKHR5cGVvZiBkZWZpbmUgPT09ICdmdW5jdGlvbicgJiYgZGVmaW5lLmFtZClcblx0XHRkZWZpbmUoW10sIGZhY3RvcnkpO1xuXHRlbHNlIGlmKHR5cGVvZiBleHBvcnRzID09PSAnb2JqZWN0Jylcblx0XHRleHBvcnRzW1wiQ2xpcGJvYXJkSlNcIl0gPSBmYWN0b3J5KCk7XG5cdGVsc2Vcblx0XHRyb290W1wiQ2xpcGJvYXJkSlNcIl0gPSBmYWN0b3J5KCk7XG59KSh0aGlzLCBmdW5jdGlvbigpIHtcbnJldHVybiAvKioqKioqLyAoZnVuY3Rpb24oKSB7IC8vIHdlYnBhY2tCb290c3RyYXBcbi8qKioqKiovIFx0dmFyIF9fd2VicGFja19tb2R1bGVzX18gPSAoe1xuXG4vKioqLyA2ODY6XG4vKioqLyAoZnVuY3Rpb24oX191bnVzZWRfd2VicGFja19tb2R1bGUsIF9fd2VicGFja19leHBvcnRzX18sIF9fd2VicGFja19yZXF1aXJlX18pIHtcblxuXCJ1c2Ugc3RyaWN0XCI7XG5cbi8vIEVYUE9SVFNcbl9fd2VicGFja19yZXF1aXJlX18uZChfX3dlYnBhY2tfZXhwb3J0c19fLCB7XG4gIFwiZGVmYXVsdFwiOiBmdW5jdGlvbigpIHsgcmV0dXJuIC8qIGJpbmRpbmcgKi8gY2xpcGJvYXJkOyB9XG59KTtcblxuLy8gRVhURVJOQUwgTU9EVUxFOiAuL25vZGVfbW9kdWxlcy90aW55LWVtaXR0ZXIvaW5kZXguanNcbnZhciB0aW55X2VtaXR0ZXIgPSBfX3dlYnBhY2tfcmVxdWlyZV9fKDI3OSk7XG52YXIgdGlueV9lbWl0dGVyX2RlZmF1bHQgPSAvKiNfX1BVUkVfXyovX193ZWJwYWNrX3JlcXVpcmVfXy5uKHRpbnlfZW1pdHRlcik7XG4vLyBFWFRFUk5BTCBNT0RVTEU6IC4vbm9kZV9tb2R1bGVzL2dvb2QtbGlzdGVuZXIvc3JjL2xpc3Rlbi5qc1xudmFyIGxpc3RlbiA9IF9fd2VicGFja19yZXF1aXJlX18oMzcwKTtcbnZhciBsaXN0ZW5fZGVmYXVsdCA9IC8qI19fUFVSRV9fKi9fX3dlYnBhY2tfcmVxdWlyZV9fLm4obGlzdGVuKTtcbi8vIEVYVEVSTkFMIE1PRFVMRTogLi9ub2RlX21vZHVsZXMvc2VsZWN0L3NyYy9zZWxlY3QuanNcbnZhciBzcmNfc2VsZWN0ID0gX193ZWJwYWNrX3JlcXVpcmVfXyg4MTcpO1xudmFyIHNlbGVjdF9kZWZhdWx0ID0gLyojX19QVVJFX18qL19fd2VicGFja19yZXF1aXJlX18ubihzcmNfc2VsZWN0KTtcbjsvLyBDT05DQVRFTkFURUQgTU9EVUxFOiAuL3NyYy9jb21tb24vY29tbWFuZC5qc1xuLyoqXG4gKiBFeGVjdXRlcyBhIGdpdmVuIG9wZXJhdGlvbiB0eXBlLlxuICogQHBhcmFtIHtTdHJpbmd9IHR5cGVcbiAqIEByZXR1cm4ge0Jvb2xlYW59XG4gKi9cbmZ1bmN0aW9uIGNvbW1hbmQodHlwZSkge1xuICB0cnkge1xuICAgIHJldHVybiBkb2N1bWVudC5leGVjQ29tbWFuZCh0eXBlKTtcbiAgfSBjYXRjaCAoZXJyKSB7XG4gICAgcmV0dXJuIGZhbHNlO1xuICB9XG59XG47Ly8gQ09OQ0FURU5BVEVEIE1PRFVMRTogLi9zcmMvYWN0aW9ucy9jdXQuanNcblxuXG4vKipcbiAqIEN1dCBhY3Rpb24gd3JhcHBlci5cbiAqIEBwYXJhbSB7U3RyaW5nfEhUTUxFbGVtZW50fSB0YXJnZXRcbiAqIEByZXR1cm4ge1N0cmluZ31cbiAqL1xuXG52YXIgQ2xpcGJvYXJkQWN0aW9uQ3V0ID0gZnVuY3Rpb24gQ2xpcGJvYXJkQWN0aW9uQ3V0KHRhcmdldCkge1xuICB2YXIgc2VsZWN0ZWRUZXh0ID0gc2VsZWN0X2RlZmF1bHQoKSh0YXJnZXQpO1xuICBjb21tYW5kKCdjdXQnKTtcbiAgcmV0dXJuIHNlbGVjdGVkVGV4dDtcbn07XG5cbi8qIGhhcm1vbnkgZGVmYXVsdCBleHBvcnQgKi8gdmFyIGFjdGlvbnNfY3V0ID0gKENsaXBib2FyZEFjdGlvbkN1dCk7XG47Ly8gQ09OQ0FURU5BVEVEIE1PRFVMRTogLi9zcmMvY29tbW9uL2NyZWF0ZS1mYWtlLWVsZW1lbnQuanNcbi8qKlxuICogQ3JlYXRlcyBhIGZha2UgdGV4dGFyZWEgZWxlbWVudCB3aXRoIGEgdmFsdWUuXG4gKiBAcGFyYW0ge1N0cmluZ30gdmFsdWVcbiAqIEByZXR1cm4ge0hUTUxFbGVtZW50fVxuICovXG5mdW5jdGlvbiBjcmVhdGVGYWtlRWxlbWVudCh2YWx1ZSkge1xuICB2YXIgaXNSVEwgPSBkb2N1bWVudC5kb2N1bWVudEVsZW1lbnQuZ2V0QXR0cmlidXRlKCdkaXInKSA9PT0gJ3J0bCc7XG4gIHZhciBmYWtlRWxlbWVudCA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ3RleHRhcmVhJyk7IC8vIFByZXZlbnQgem9vbWluZyBvbiBpT1NcblxuICBmYWtlRWxlbWVudC5zdHlsZS5mb250U2l6ZSA9ICcxMnB0JzsgLy8gUmVzZXQgYm94IG1vZGVsXG5cbiAgZmFrZUVsZW1lbnQuc3R5bGUuYm9yZGVyID0gJzAnO1xuICBmYWtlRWxlbWVudC5zdHlsZS5wYWRkaW5nID0gJzAnO1xuICBmYWtlRWxlbWVudC5zdHlsZS5tYXJnaW4gPSAnMCc7IC8vIE1vdmUgZWxlbWVudCBvdXQgb2Ygc2NyZWVuIGhvcml6b250YWxseVxuXG4gIGZha2VFbGVtZW50LnN0eWxlLnBvc2l0aW9uID0gJ2Fic29sdXRlJztcbiAgZmFrZUVsZW1lbnQuc3R5bGVbaXNSVEwgPyAncmlnaHQnIDogJ2xlZnQnXSA9ICctOTk5OXB4JzsgLy8gTW92ZSBlbGVtZW50IHRvIHRoZSBzYW1lIHBvc2l0aW9uIHZlcnRpY2FsbHlcblxuICB2YXIgeVBvc2l0aW9uID0gd2luZG93LnBhZ2VZT2Zmc2V0IHx8IGRvY3VtZW50LmRvY3VtZW50RWxlbWVudC5zY3JvbGxUb3A7XG4gIGZha2VFbGVtZW50LnN0eWxlLnRvcCA9IFwiXCIuY29uY2F0KHlQb3NpdGlvbiwgXCJweFwiKTtcbiAgZmFrZUVsZW1lbnQuc2V0QXR0cmlidXRlKCdyZWFkb25seScsICcnKTtcbiAgZmFrZUVsZW1lbnQudmFsdWUgPSB2YWx1ZTtcbiAgcmV0dXJuIGZha2VFbGVtZW50O1xufVxuOy8vIENPTkNBVEVOQVRFRCBNT0RVTEU6IC4vc3JjL2FjdGlvbnMvY29weS5qc1xuXG5cblxuLyoqXG4gKiBDb3B5IGFjdGlvbiB3cmFwcGVyLlxuICogQHBhcmFtIHtTdHJpbmd8SFRNTEVsZW1lbnR9IHRhcmdldFxuICogQHBhcmFtIHtPYmplY3R9IG9wdGlvbnNcbiAqIEByZXR1cm4ge1N0cmluZ31cbiAqL1xuXG52YXIgQ2xpcGJvYXJkQWN0aW9uQ29weSA9IGZ1bmN0aW9uIENsaXBib2FyZEFjdGlvbkNvcHkodGFyZ2V0KSB7XG4gIHZhciBvcHRpb25zID0gYXJndW1lbnRzLmxlbmd0aCA+IDEgJiYgYXJndW1lbnRzWzFdICE9PSB1bmRlZmluZWQgPyBhcmd1bWVudHNbMV0gOiB7XG4gICAgY29udGFpbmVyOiBkb2N1bWVudC5ib2R5XG4gIH07XG4gIHZhciBzZWxlY3RlZFRleHQgPSAnJztcblxuICBpZiAodHlwZW9mIHRhcmdldCA9PT0gJ3N0cmluZycpIHtcbiAgICB2YXIgZmFrZUVsZW1lbnQgPSBjcmVhdGVGYWtlRWxlbWVudCh0YXJnZXQpO1xuICAgIG9wdGlvbnMuY29udGFpbmVyLmFwcGVuZENoaWxkKGZha2VFbGVtZW50KTtcbiAgICBzZWxlY3RlZFRleHQgPSBzZWxlY3RfZGVmYXVsdCgpKGZha2VFbGVtZW50KTtcbiAgICBjb21tYW5kKCdjb3B5Jyk7XG4gICAgZmFrZUVsZW1lbnQucmVtb3ZlKCk7XG4gIH0gZWxzZSB7XG4gICAgc2VsZWN0ZWRUZXh0ID0gc2VsZWN0X2RlZmF1bHQoKSh0YXJnZXQpO1xuICAgIGNvbW1hbmQoJ2NvcHknKTtcbiAgfVxuXG4gIHJldHVybiBzZWxlY3RlZFRleHQ7XG59O1xuXG4vKiBoYXJtb255IGRlZmF1bHQgZXhwb3J0ICovIHZhciBhY3Rpb25zX2NvcHkgPSAoQ2xpcGJvYXJkQWN0aW9uQ29weSk7XG47Ly8gQ09OQ0FURU5BVEVEIE1PRFVMRTogLi9zcmMvYWN0aW9ucy9kZWZhdWx0LmpzXG5mdW5jdGlvbiBfdHlwZW9mKG9iaikgeyBcIkBiYWJlbC9oZWxwZXJzIC0gdHlwZW9mXCI7IGlmICh0eXBlb2YgU3ltYm9sID09PSBcImZ1bmN0aW9uXCIgJiYgdHlwZW9mIFN5bWJvbC5pdGVyYXRvciA9PT0gXCJzeW1ib2xcIikgeyBfdHlwZW9mID0gZnVuY3Rpb24gX3R5cGVvZihvYmopIHsgcmV0dXJuIHR5cGVvZiBvYmo7IH07IH0gZWxzZSB7IF90eXBlb2YgPSBmdW5jdGlvbiBfdHlwZW9mKG9iaikgeyByZXR1cm4gb2JqICYmIHR5cGVvZiBTeW1ib2wgPT09IFwiZnVuY3Rpb25cIiAmJiBvYmouY29uc3RydWN0b3IgPT09IFN5bWJvbCAmJiBvYmogIT09IFN5bWJvbC5wcm90b3R5cGUgPyBcInN5bWJvbFwiIDogdHlwZW9mIG9iajsgfTsgfSByZXR1cm4gX3R5cGVvZihvYmopOyB9XG5cblxuXG4vKipcbiAqIElubmVyIGZ1bmN0aW9uIHdoaWNoIHBlcmZvcm1zIHNlbGVjdGlvbiBmcm9tIGVpdGhlciBgdGV4dGAgb3IgYHRhcmdldGBcbiAqIHByb3BlcnRpZXMgYW5kIHRoZW4gZXhlY3V0ZXMgY29weSBvciBjdXQgb3BlcmF0aW9ucy5cbiAqIEBwYXJhbSB7T2JqZWN0fSBvcHRpb25zXG4gKi9cblxudmFyIENsaXBib2FyZEFjdGlvbkRlZmF1bHQgPSBmdW5jdGlvbiBDbGlwYm9hcmRBY3Rpb25EZWZhdWx0KCkge1xuICB2YXIgb3B0aW9ucyA9IGFyZ3VtZW50cy5sZW5ndGggPiAwICYmIGFyZ3VtZW50c1swXSAhPT0gdW5kZWZpbmVkID8gYXJndW1lbnRzWzBdIDoge307XG4gIC8vIERlZmluZXMgYmFzZSBwcm9wZXJ0aWVzIHBhc3NlZCBmcm9tIGNvbnN0cnVjdG9yLlxuICB2YXIgX29wdGlvbnMkYWN0aW9uID0gb3B0aW9ucy5hY3Rpb24sXG4gICAgICBhY3Rpb24gPSBfb3B0aW9ucyRhY3Rpb24gPT09IHZvaWQgMCA/ICdjb3B5JyA6IF9vcHRpb25zJGFjdGlvbixcbiAgICAgIGNvbnRhaW5lciA9IG9wdGlvbnMuY29udGFpbmVyLFxuICAgICAgdGFyZ2V0ID0gb3B0aW9ucy50YXJnZXQsXG4gICAgICB0ZXh0ID0gb3B0aW9ucy50ZXh0OyAvLyBTZXRzIHRoZSBgYWN0aW9uYCB0byBiZSBwZXJmb3JtZWQgd2hpY2ggY2FuIGJlIGVpdGhlciAnY29weScgb3IgJ2N1dCcuXG5cbiAgaWYgKGFjdGlvbiAhPT0gJ2NvcHknICYmIGFjdGlvbiAhPT0gJ2N1dCcpIHtcbiAgICB0aHJvdyBuZXcgRXJyb3IoJ0ludmFsaWQgXCJhY3Rpb25cIiB2YWx1ZSwgdXNlIGVpdGhlciBcImNvcHlcIiBvciBcImN1dFwiJyk7XG4gIH0gLy8gU2V0cyB0aGUgYHRhcmdldGAgcHJvcGVydHkgdXNpbmcgYW4gZWxlbWVudCB0aGF0IHdpbGwgYmUgaGF2ZSBpdHMgY29udGVudCBjb3BpZWQuXG5cblxuICBpZiAodGFyZ2V0ICE9PSB1bmRlZmluZWQpIHtcbiAgICBpZiAodGFyZ2V0ICYmIF90eXBlb2YodGFyZ2V0KSA9PT0gJ29iamVjdCcgJiYgdGFyZ2V0Lm5vZGVUeXBlID09PSAxKSB7XG4gICAgICBpZiAoYWN0aW9uID09PSAnY29weScgJiYgdGFyZ2V0Lmhhc0F0dHJpYnV0ZSgnZGlzYWJsZWQnKSkge1xuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ0ludmFsaWQgXCJ0YXJnZXRcIiBhdHRyaWJ1dGUuIFBsZWFzZSB1c2UgXCJyZWFkb25seVwiIGluc3RlYWQgb2YgXCJkaXNhYmxlZFwiIGF0dHJpYnV0ZScpO1xuICAgICAgfVxuXG4gICAgICBpZiAoYWN0aW9uID09PSAnY3V0JyAmJiAodGFyZ2V0Lmhhc0F0dHJpYnV0ZSgncmVhZG9ubHknKSB8fCB0YXJnZXQuaGFzQXR0cmlidXRlKCdkaXNhYmxlZCcpKSkge1xuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ0ludmFsaWQgXCJ0YXJnZXRcIiBhdHRyaWJ1dGUuIFlvdSBjYW5cXCd0IGN1dCB0ZXh0IGZyb20gZWxlbWVudHMgd2l0aCBcInJlYWRvbmx5XCIgb3IgXCJkaXNhYmxlZFwiIGF0dHJpYnV0ZXMnKTtcbiAgICAgIH1cbiAgICB9IGVsc2Uge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKCdJbnZhbGlkIFwidGFyZ2V0XCIgdmFsdWUsIHVzZSBhIHZhbGlkIEVsZW1lbnQnKTtcbiAgICB9XG4gIH0gLy8gRGVmaW5lIHNlbGVjdGlvbiBzdHJhdGVneSBiYXNlZCBvbiBgdGV4dGAgcHJvcGVydHkuXG5cblxuICBpZiAodGV4dCkge1xuICAgIHJldHVybiBhY3Rpb25zX2NvcHkodGV4dCwge1xuICAgICAgY29udGFpbmVyOiBjb250YWluZXJcbiAgICB9KTtcbiAgfSAvLyBEZWZpbmVzIHdoaWNoIHNlbGVjdGlvbiBzdHJhdGVneSBiYXNlZCBvbiBgdGFyZ2V0YCBwcm9wZXJ0eS5cblxuXG4gIGlmICh0YXJnZXQpIHtcbiAgICByZXR1cm4gYWN0aW9uID09PSAnY3V0JyA/IGFjdGlvbnNfY3V0KHRhcmdldCkgOiBhY3Rpb25zX2NvcHkodGFyZ2V0LCB7XG4gICAgICBjb250YWluZXI6IGNvbnRhaW5lclxuICAgIH0pO1xuICB9XG59O1xuXG4vKiBoYXJtb255IGRlZmF1bHQgZXhwb3J0ICovIHZhciBhY3Rpb25zX2RlZmF1bHQgPSAoQ2xpcGJvYXJkQWN0aW9uRGVmYXVsdCk7XG47Ly8gQ09OQ0FURU5BVEVEIE1PRFVMRTogLi9zcmMvY2xpcGJvYXJkLmpzXG5mdW5jdGlvbiBjbGlwYm9hcmRfdHlwZW9mKG9iaikgeyBcIkBiYWJlbC9oZWxwZXJzIC0gdHlwZW9mXCI7IGlmICh0eXBlb2YgU3ltYm9sID09PSBcImZ1bmN0aW9uXCIgJiYgdHlwZW9mIFN5bWJvbC5pdGVyYXRvciA9PT0gXCJzeW1ib2xcIikgeyBjbGlwYm9hcmRfdHlwZW9mID0gZnVuY3Rpb24gX3R5cGVvZihvYmopIHsgcmV0dXJuIHR5cGVvZiBvYmo7IH07IH0gZWxzZSB7IGNsaXBib2FyZF90eXBlb2YgPSBmdW5jdGlvbiBfdHlwZW9mKG9iaikgeyByZXR1cm4gb2JqICYmIHR5cGVvZiBTeW1ib2wgPT09IFwiZnVuY3Rpb25cIiAmJiBvYmouY29uc3RydWN0b3IgPT09IFN5bWJvbCAmJiBvYmogIT09IFN5bWJvbC5wcm90b3R5cGUgPyBcInN5bWJvbFwiIDogdHlwZW9mIG9iajsgfTsgfSByZXR1cm4gY2xpcGJvYXJkX3R5cGVvZihvYmopOyB9XG5cbmZ1bmN0aW9uIF9jbGFzc0NhbGxDaGVjayhpbnN0YW5jZSwgQ29uc3RydWN0b3IpIHsgaWYgKCEoaW5zdGFuY2UgaW5zdGFuY2VvZiBDb25zdHJ1Y3RvcikpIHsgdGhyb3cgbmV3IFR5cGVFcnJvcihcIkNhbm5vdCBjYWxsIGEgY2xhc3MgYXMgYSBmdW5jdGlvblwiKTsgfSB9XG5cbmZ1bmN0aW9uIF9kZWZpbmVQcm9wZXJ0aWVzKHRhcmdldCwgcHJvcHMpIHsgZm9yICh2YXIgaSA9IDA7IGkgPCBwcm9wcy5sZW5ndGg7IGkrKykgeyB2YXIgZGVzY3JpcHRvciA9IHByb3BzW2ldOyBkZXNjcmlwdG9yLmVudW1lcmFibGUgPSBkZXNjcmlwdG9yLmVudW1lcmFibGUgfHwgZmFsc2U7IGRlc2NyaXB0b3IuY29uZmlndXJhYmxlID0gdHJ1ZTsgaWYgKFwidmFsdWVcIiBpbiBkZXNjcmlwdG9yKSBkZXNjcmlwdG9yLndyaXRhYmxlID0gdHJ1ZTsgT2JqZWN0LmRlZmluZVByb3BlcnR5KHRhcmdldCwgZGVzY3JpcHRvci5rZXksIGRlc2NyaXB0b3IpOyB9IH1cblxuZnVuY3Rpb24gX2NyZWF0ZUNsYXNzKENvbnN0cnVjdG9yLCBwcm90b1Byb3BzLCBzdGF0aWNQcm9wcykgeyBpZiAocHJvdG9Qcm9wcykgX2RlZmluZVByb3BlcnRpZXMoQ29uc3RydWN0b3IucHJvdG90eXBlLCBwcm90b1Byb3BzKTsgaWYgKHN0YXRpY1Byb3BzKSBfZGVmaW5lUHJvcGVydGllcyhDb25zdHJ1Y3Rvciwgc3RhdGljUHJvcHMpOyByZXR1cm4gQ29uc3RydWN0b3I7IH1cblxuZnVuY3Rpb24gX2luaGVyaXRzKHN1YkNsYXNzLCBzdXBlckNsYXNzKSB7IGlmICh0eXBlb2Ygc3VwZXJDbGFzcyAhPT0gXCJmdW5jdGlvblwiICYmIHN1cGVyQ2xhc3MgIT09IG51bGwpIHsgdGhyb3cgbmV3IFR5cGVFcnJvcihcIlN1cGVyIGV4cHJlc3Npb24gbXVzdCBlaXRoZXIgYmUgbnVsbCBvciBhIGZ1bmN0aW9uXCIpOyB9IHN1YkNsYXNzLnByb3RvdHlwZSA9IE9iamVjdC5jcmVhdGUoc3VwZXJDbGFzcyAmJiBzdXBlckNsYXNzLnByb3RvdHlwZSwgeyBjb25zdHJ1Y3RvcjogeyB2YWx1ZTogc3ViQ2xhc3MsIHdyaXRhYmxlOiB0cnVlLCBjb25maWd1cmFibGU6IHRydWUgfSB9KTsgaWYgKHN1cGVyQ2xhc3MpIF9zZXRQcm90b3R5cGVPZihzdWJDbGFzcywgc3VwZXJDbGFzcyk7IH1cblxuZnVuY3Rpb24gX3NldFByb3RvdHlwZU9mKG8sIHApIHsgX3NldFByb3RvdHlwZU9mID0gT2JqZWN0LnNldFByb3RvdHlwZU9mIHx8IGZ1bmN0aW9uIF9zZXRQcm90b3R5cGVPZihvLCBwKSB7IG8uX19wcm90b19fID0gcDsgcmV0dXJuIG87IH07IHJldHVybiBfc2V0UHJvdG90eXBlT2YobywgcCk7IH1cblxuZnVuY3Rpb24gX2NyZWF0ZVN1cGVyKERlcml2ZWQpIHsgdmFyIGhhc05hdGl2ZVJlZmxlY3RDb25zdHJ1Y3QgPSBfaXNOYXRpdmVSZWZsZWN0Q29uc3RydWN0KCk7IHJldHVybiBmdW5jdGlvbiBfY3JlYXRlU3VwZXJJbnRlcm5hbCgpIHsgdmFyIFN1cGVyID0gX2dldFByb3RvdHlwZU9mKERlcml2ZWQpLCByZXN1bHQ7IGlmIChoYXNOYXRpdmVSZWZsZWN0Q29uc3RydWN0KSB7IHZhciBOZXdUYXJnZXQgPSBfZ2V0UHJvdG90eXBlT2YodGhpcykuY29uc3RydWN0b3I7IHJlc3VsdCA9IFJlZmxlY3QuY29uc3RydWN0KFN1cGVyLCBhcmd1bWVudHMsIE5ld1RhcmdldCk7IH0gZWxzZSB7IHJlc3VsdCA9IFN1cGVyLmFwcGx5KHRoaXMsIGFyZ3VtZW50cyk7IH0gcmV0dXJuIF9wb3NzaWJsZUNvbnN0cnVjdG9yUmV0dXJuKHRoaXMsIHJlc3VsdCk7IH07IH1cblxuZnVuY3Rpb24gX3Bvc3NpYmxlQ29uc3RydWN0b3JSZXR1cm4oc2VsZiwgY2FsbCkgeyBpZiAoY2FsbCAmJiAoY2xpcGJvYXJkX3R5cGVvZihjYWxsKSA9PT0gXCJvYmplY3RcIiB8fCB0eXBlb2YgY2FsbCA9PT0gXCJmdW5jdGlvblwiKSkgeyByZXR1cm4gY2FsbDsgfSByZXR1cm4gX2Fzc2VydFRoaXNJbml0aWFsaXplZChzZWxmKTsgfVxuXG5mdW5jdGlvbiBfYXNzZXJ0VGhpc0luaXRpYWxpemVkKHNlbGYpIHsgaWYgKHNlbGYgPT09IHZvaWQgMCkgeyB0aHJvdyBuZXcgUmVmZXJlbmNlRXJyb3IoXCJ0aGlzIGhhc24ndCBiZWVuIGluaXRpYWxpc2VkIC0gc3VwZXIoKSBoYXNuJ3QgYmVlbiBjYWxsZWRcIik7IH0gcmV0dXJuIHNlbGY7IH1cblxuZnVuY3Rpb24gX2lzTmF0aXZlUmVmbGVjdENvbnN0cnVjdCgpIHsgaWYgKHR5cGVvZiBSZWZsZWN0ID09PSBcInVuZGVmaW5lZFwiIHx8ICFSZWZsZWN0LmNvbnN0cnVjdCkgcmV0dXJuIGZhbHNlOyBpZiAoUmVmbGVjdC5jb25zdHJ1Y3Quc2hhbSkgcmV0dXJuIGZhbHNlOyBpZiAodHlwZW9mIFByb3h5ID09PSBcImZ1bmN0aW9uXCIpIHJldHVybiB0cnVlOyB0cnkgeyBEYXRlLnByb3RvdHlwZS50b1N0cmluZy5jYWxsKFJlZmxlY3QuY29uc3RydWN0KERhdGUsIFtdLCBmdW5jdGlvbiAoKSB7fSkpOyByZXR1cm4gdHJ1ZTsgfSBjYXRjaCAoZSkgeyByZXR1cm4gZmFsc2U7IH0gfVxuXG5mdW5jdGlvbiBfZ2V0UHJvdG90eXBlT2YobykgeyBfZ2V0UHJvdG90eXBlT2YgPSBPYmplY3Quc2V0UHJvdG90eXBlT2YgPyBPYmplY3QuZ2V0UHJvdG90eXBlT2YgOiBmdW5jdGlvbiBfZ2V0UHJvdG90eXBlT2YobykgeyByZXR1cm4gby5fX3Byb3RvX18gfHwgT2JqZWN0LmdldFByb3RvdHlwZU9mKG8pOyB9OyByZXR1cm4gX2dldFByb3RvdHlwZU9mKG8pOyB9XG5cblxuXG5cblxuXG4vKipcbiAqIEhlbHBlciBmdW5jdGlvbiB0byByZXRyaWV2ZSBhdHRyaWJ1dGUgdmFsdWUuXG4gKiBAcGFyYW0ge1N0cmluZ30gc3VmZml4XG4gKiBAcGFyYW0ge0VsZW1lbnR9IGVsZW1lbnRcbiAqL1xuXG5mdW5jdGlvbiBnZXRBdHRyaWJ1dGVWYWx1ZShzdWZmaXgsIGVsZW1lbnQpIHtcbiAgdmFyIGF0dHJpYnV0ZSA9IFwiZGF0YS1jbGlwYm9hcmQtXCIuY29uY2F0KHN1ZmZpeCk7XG5cbiAgaWYgKCFlbGVtZW50Lmhhc0F0dHJpYnV0ZShhdHRyaWJ1dGUpKSB7XG4gICAgcmV0dXJuO1xuICB9XG5cbiAgcmV0dXJuIGVsZW1lbnQuZ2V0QXR0cmlidXRlKGF0dHJpYnV0ZSk7XG59XG4vKipcbiAqIEJhc2UgY2xhc3Mgd2hpY2ggdGFrZXMgb25lIG9yIG1vcmUgZWxlbWVudHMsIGFkZHMgZXZlbnQgbGlzdGVuZXJzIHRvIHRoZW0sXG4gKiBhbmQgaW5zdGFudGlhdGVzIGEgbmV3IGBDbGlwYm9hcmRBY3Rpb25gIG9uIGVhY2ggY2xpY2suXG4gKi9cblxuXG52YXIgQ2xpcGJvYXJkID0gLyojX19QVVJFX18qL2Z1bmN0aW9uIChfRW1pdHRlcikge1xuICBfaW5oZXJpdHMoQ2xpcGJvYXJkLCBfRW1pdHRlcik7XG5cbiAgdmFyIF9zdXBlciA9IF9jcmVhdGVTdXBlcihDbGlwYm9hcmQpO1xuXG4gIC8qKlxuICAgKiBAcGFyYW0ge1N0cmluZ3xIVE1MRWxlbWVudHxIVE1MQ29sbGVjdGlvbnxOb2RlTGlzdH0gdHJpZ2dlclxuICAgKiBAcGFyYW0ge09iamVjdH0gb3B0aW9uc1xuICAgKi9cbiAgZnVuY3Rpb24gQ2xpcGJvYXJkKHRyaWdnZXIsIG9wdGlvbnMpIHtcbiAgICB2YXIgX3RoaXM7XG5cbiAgICBfY2xhc3NDYWxsQ2hlY2sodGhpcywgQ2xpcGJvYXJkKTtcblxuICAgIF90aGlzID0gX3N1cGVyLmNhbGwodGhpcyk7XG5cbiAgICBfdGhpcy5yZXNvbHZlT3B0aW9ucyhvcHRpb25zKTtcblxuICAgIF90aGlzLmxpc3RlbkNsaWNrKHRyaWdnZXIpO1xuXG4gICAgcmV0dXJuIF90aGlzO1xuICB9XG4gIC8qKlxuICAgKiBEZWZpbmVzIGlmIGF0dHJpYnV0ZXMgd291bGQgYmUgcmVzb2x2ZWQgdXNpbmcgaW50ZXJuYWwgc2V0dGVyIGZ1bmN0aW9uc1xuICAgKiBvciBjdXN0b20gZnVuY3Rpb25zIHRoYXQgd2VyZSBwYXNzZWQgaW4gdGhlIGNvbnN0cnVjdG9yLlxuICAgKiBAcGFyYW0ge09iamVjdH0gb3B0aW9uc1xuICAgKi9cblxuXG4gIF9jcmVhdGVDbGFzcyhDbGlwYm9hcmQsIFt7XG4gICAga2V5OiBcInJlc29sdmVPcHRpb25zXCIsXG4gICAgdmFsdWU6IGZ1bmN0aW9uIHJlc29sdmVPcHRpb25zKCkge1xuICAgICAgdmFyIG9wdGlvbnMgPSBhcmd1bWVudHMubGVuZ3RoID4gMCAmJiBhcmd1bWVudHNbMF0gIT09IHVuZGVmaW5lZCA/IGFyZ3VtZW50c1swXSA6IHt9O1xuICAgICAgdGhpcy5hY3Rpb24gPSB0eXBlb2Ygb3B0aW9ucy5hY3Rpb24gPT09ICdmdW5jdGlvbicgPyBvcHRpb25zLmFjdGlvbiA6IHRoaXMuZGVmYXVsdEFjdGlvbjtcbiAgICAgIHRoaXMudGFyZ2V0ID0gdHlwZW9mIG9wdGlvbnMudGFyZ2V0ID09PSAnZnVuY3Rpb24nID8gb3B0aW9ucy50YXJnZXQgOiB0aGlzLmRlZmF1bHRUYXJnZXQ7XG4gICAgICB0aGlzLnRleHQgPSB0eXBlb2Ygb3B0aW9ucy50ZXh0ID09PSAnZnVuY3Rpb24nID8gb3B0aW9ucy50ZXh0IDogdGhpcy5kZWZhdWx0VGV4dDtcbiAgICAgIHRoaXMuY29udGFpbmVyID0gY2xpcGJvYXJkX3R5cGVvZihvcHRpb25zLmNvbnRhaW5lcikgPT09ICdvYmplY3QnID8gb3B0aW9ucy5jb250YWluZXIgOiBkb2N1bWVudC5ib2R5O1xuICAgIH1cbiAgICAvKipcbiAgICAgKiBBZGRzIGEgY2xpY2sgZXZlbnQgbGlzdGVuZXIgdG8gdGhlIHBhc3NlZCB0cmlnZ2VyLlxuICAgICAqIEBwYXJhbSB7U3RyaW5nfEhUTUxFbGVtZW50fEhUTUxDb2xsZWN0aW9ufE5vZGVMaXN0fSB0cmlnZ2VyXG4gICAgICovXG5cbiAgfSwge1xuICAgIGtleTogXCJsaXN0ZW5DbGlja1wiLFxuICAgIHZhbHVlOiBmdW5jdGlvbiBsaXN0ZW5DbGljayh0cmlnZ2VyKSB7XG4gICAgICB2YXIgX3RoaXMyID0gdGhpcztcblxuICAgICAgdGhpcy5saXN0ZW5lciA9IGxpc3Rlbl9kZWZhdWx0KCkodHJpZ2dlciwgJ2NsaWNrJywgZnVuY3Rpb24gKGUpIHtcbiAgICAgICAgcmV0dXJuIF90aGlzMi5vbkNsaWNrKGUpO1xuICAgICAgfSk7XG4gICAgfVxuICAgIC8qKlxuICAgICAqIERlZmluZXMgYSBuZXcgYENsaXBib2FyZEFjdGlvbmAgb24gZWFjaCBjbGljayBldmVudC5cbiAgICAgKiBAcGFyYW0ge0V2ZW50fSBlXG4gICAgICovXG5cbiAgfSwge1xuICAgIGtleTogXCJvbkNsaWNrXCIsXG4gICAgdmFsdWU6IGZ1bmN0aW9uIG9uQ2xpY2soZSkge1xuICAgICAgdmFyIHRyaWdnZXIgPSBlLmRlbGVnYXRlVGFyZ2V0IHx8IGUuY3VycmVudFRhcmdldDtcbiAgICAgIHZhciBhY3Rpb24gPSB0aGlzLmFjdGlvbih0cmlnZ2VyKSB8fCAnY29weSc7XG4gICAgICB2YXIgdGV4dCA9IGFjdGlvbnNfZGVmYXVsdCh7XG4gICAgICAgIGFjdGlvbjogYWN0aW9uLFxuICAgICAgICBjb250YWluZXI6IHRoaXMuY29udGFpbmVyLFxuICAgICAgICB0YXJnZXQ6IHRoaXMudGFyZ2V0KHRyaWdnZXIpLFxuICAgICAgICB0ZXh0OiB0aGlzLnRleHQodHJpZ2dlcilcbiAgICAgIH0pOyAvLyBGaXJlcyBhbiBldmVudCBiYXNlZCBvbiB0aGUgY29weSBvcGVyYXRpb24gcmVzdWx0LlxuXG4gICAgICB0aGlzLmVtaXQodGV4dCA/ICdzdWNjZXNzJyA6ICdlcnJvcicsIHtcbiAgICAgICAgYWN0aW9uOiBhY3Rpb24sXG4gICAgICAgIHRleHQ6IHRleHQsXG4gICAgICAgIHRyaWdnZXI6IHRyaWdnZXIsXG4gICAgICAgIGNsZWFyU2VsZWN0aW9uOiBmdW5jdGlvbiBjbGVhclNlbGVjdGlvbigpIHtcbiAgICAgICAgICBpZiAodHJpZ2dlcikge1xuICAgICAgICAgICAgdHJpZ2dlci5mb2N1cygpO1xuICAgICAgICAgIH1cblxuICAgICAgICAgIGRvY3VtZW50LmFjdGl2ZUVsZW1lbnQuYmx1cigpO1xuICAgICAgICAgIHdpbmRvdy5nZXRTZWxlY3Rpb24oKS5yZW1vdmVBbGxSYW5nZXMoKTtcbiAgICAgICAgfVxuICAgICAgfSk7XG4gICAgfVxuICAgIC8qKlxuICAgICAqIERlZmF1bHQgYGFjdGlvbmAgbG9va3VwIGZ1bmN0aW9uLlxuICAgICAqIEBwYXJhbSB7RWxlbWVudH0gdHJpZ2dlclxuICAgICAqL1xuXG4gIH0sIHtcbiAgICBrZXk6IFwiZGVmYXVsdEFjdGlvblwiLFxuICAgIHZhbHVlOiBmdW5jdGlvbiBkZWZhdWx0QWN0aW9uKHRyaWdnZXIpIHtcbiAgICAgIHJldHVybiBnZXRBdHRyaWJ1dGVWYWx1ZSgnYWN0aW9uJywgdHJpZ2dlcik7XG4gICAgfVxuICAgIC8qKlxuICAgICAqIERlZmF1bHQgYHRhcmdldGAgbG9va3VwIGZ1bmN0aW9uLlxuICAgICAqIEBwYXJhbSB7RWxlbWVudH0gdHJpZ2dlclxuICAgICAqL1xuXG4gIH0sIHtcbiAgICBrZXk6IFwiZGVmYXVsdFRhcmdldFwiLFxuICAgIHZhbHVlOiBmdW5jdGlvbiBkZWZhdWx0VGFyZ2V0KHRyaWdnZXIpIHtcbiAgICAgIHZhciBzZWxlY3RvciA9IGdldEF0dHJpYnV0ZVZhbHVlKCd0YXJnZXQnLCB0cmlnZ2VyKTtcblxuICAgICAgaWYgKHNlbGVjdG9yKSB7XG4gICAgICAgIHJldHVybiBkb2N1bWVudC5xdWVyeVNlbGVjdG9yKHNlbGVjdG9yKTtcbiAgICAgIH1cbiAgICB9XG4gICAgLyoqXG4gICAgICogQWxsb3cgZmlyZSBwcm9ncmFtbWF0aWNhbGx5IGEgY29weSBhY3Rpb25cbiAgICAgKiBAcGFyYW0ge1N0cmluZ3xIVE1MRWxlbWVudH0gdGFyZ2V0XG4gICAgICogQHBhcmFtIHtPYmplY3R9IG9wdGlvbnNcbiAgICAgKiBAcmV0dXJucyBUZXh0IGNvcGllZC5cbiAgICAgKi9cblxuICB9LCB7XG4gICAga2V5OiBcImRlZmF1bHRUZXh0XCIsXG5cbiAgICAvKipcbiAgICAgKiBEZWZhdWx0IGB0ZXh0YCBsb29rdXAgZnVuY3Rpb24uXG4gICAgICogQHBhcmFtIHtFbGVtZW50fSB0cmlnZ2VyXG4gICAgICovXG4gICAgdmFsdWU6IGZ1bmN0aW9uIGRlZmF1bHRUZXh0KHRyaWdnZXIpIHtcbiAgICAgIHJldHVybiBnZXRBdHRyaWJ1dGVWYWx1ZSgndGV4dCcsIHRyaWdnZXIpO1xuICAgIH1cbiAgICAvKipcbiAgICAgKiBEZXN0cm95IGxpZmVjeWNsZS5cbiAgICAgKi9cblxuICB9LCB7XG4gICAga2V5OiBcImRlc3Ryb3lcIixcbiAgICB2YWx1ZTogZnVuY3Rpb24gZGVzdHJveSgpIHtcbiAgICAgIHRoaXMubGlzdGVuZXIuZGVzdHJveSgpO1xuICAgIH1cbiAgfV0sIFt7XG4gICAga2V5OiBcImNvcHlcIixcbiAgICB2YWx1ZTogZnVuY3Rpb24gY29weSh0YXJnZXQpIHtcbiAgICAgIHZhciBvcHRpb25zID0gYXJndW1lbnRzLmxlbmd0aCA+IDEgJiYgYXJndW1lbnRzWzFdICE9PSB1bmRlZmluZWQgPyBhcmd1bWVudHNbMV0gOiB7XG4gICAgICAgIGNvbnRhaW5lcjogZG9jdW1lbnQuYm9keVxuICAgICAgfTtcbiAgICAgIHJldHVybiBhY3Rpb25zX2NvcHkodGFyZ2V0LCBvcHRpb25zKTtcbiAgICB9XG4gICAgLyoqXG4gICAgICogQWxsb3cgZmlyZSBwcm9ncmFtbWF0aWNhbGx5IGEgY3V0IGFjdGlvblxuICAgICAqIEBwYXJhbSB7U3RyaW5nfEhUTUxFbGVtZW50fSB0YXJnZXRcbiAgICAgKiBAcmV0dXJucyBUZXh0IGN1dHRlZC5cbiAgICAgKi9cblxuICB9LCB7XG4gICAga2V5OiBcImN1dFwiLFxuICAgIHZhbHVlOiBmdW5jdGlvbiBjdXQodGFyZ2V0KSB7XG4gICAgICByZXR1cm4gYWN0aW9uc19jdXQodGFyZ2V0KTtcbiAgICB9XG4gICAgLyoqXG4gICAgICogUmV0dXJucyB0aGUgc3VwcG9ydCBvZiB0aGUgZ2l2ZW4gYWN0aW9uLCBvciBhbGwgYWN0aW9ucyBpZiBubyBhY3Rpb24gaXNcbiAgICAgKiBnaXZlbi5cbiAgICAgKiBAcGFyYW0ge1N0cmluZ30gW2FjdGlvbl1cbiAgICAgKi9cblxuICB9LCB7XG4gICAga2V5OiBcImlzU3VwcG9ydGVkXCIsXG4gICAgdmFsdWU6IGZ1bmN0aW9uIGlzU3VwcG9ydGVkKCkge1xuICAgICAgdmFyIGFjdGlvbiA9IGFyZ3VtZW50cy5sZW5ndGggPiAwICYmIGFyZ3VtZW50c1swXSAhPT0gdW5kZWZpbmVkID8gYXJndW1lbnRzWzBdIDogWydjb3B5JywgJ2N1dCddO1xuICAgICAgdmFyIGFjdGlvbnMgPSB0eXBlb2YgYWN0aW9uID09PSAnc3RyaW5nJyA/IFthY3Rpb25dIDogYWN0aW9uO1xuICAgICAgdmFyIHN1cHBvcnQgPSAhIWRvY3VtZW50LnF1ZXJ5Q29tbWFuZFN1cHBvcnRlZDtcbiAgICAgIGFjdGlvbnMuZm9yRWFjaChmdW5jdGlvbiAoYWN0aW9uKSB7XG4gICAgICAgIHN1cHBvcnQgPSBzdXBwb3J0ICYmICEhZG9jdW1lbnQucXVlcnlDb21tYW5kU3VwcG9ydGVkKGFjdGlvbik7XG4gICAgICB9KTtcbiAgICAgIHJldHVybiBzdXBwb3J0O1xuICAgIH1cbiAgfV0pO1xuXG4gIHJldHVybiBDbGlwYm9hcmQ7XG59KCh0aW55X2VtaXR0ZXJfZGVmYXVsdCgpKSk7XG5cbi8qIGhhcm1vbnkgZGVmYXVsdCBleHBvcnQgKi8gdmFyIGNsaXBib2FyZCA9IChDbGlwYm9hcmQpO1xuXG4vKioqLyB9KSxcblxuLyoqKi8gODI4OlxuLyoqKi8gKGZ1bmN0aW9uKG1vZHVsZSkge1xuXG52YXIgRE9DVU1FTlRfTk9ERV9UWVBFID0gOTtcblxuLyoqXG4gKiBBIHBvbHlmaWxsIGZvciBFbGVtZW50Lm1hdGNoZXMoKVxuICovXG5pZiAodHlwZW9mIEVsZW1lbnQgIT09ICd1bmRlZmluZWQnICYmICFFbGVtZW50LnByb3RvdHlwZS5tYXRjaGVzKSB7XG4gICAgdmFyIHByb3RvID0gRWxlbWVudC5wcm90b3R5cGU7XG5cbiAgICBwcm90by5tYXRjaGVzID0gcHJvdG8ubWF0Y2hlc1NlbGVjdG9yIHx8XG4gICAgICAgICAgICAgICAgICAgIHByb3RvLm1vek1hdGNoZXNTZWxlY3RvciB8fFxuICAgICAgICAgICAgICAgICAgICBwcm90by5tc01hdGNoZXNTZWxlY3RvciB8fFxuICAgICAgICAgICAgICAgICAgICBwcm90by5vTWF0Y2hlc1NlbGVjdG9yIHx8XG4gICAgICAgICAgICAgICAgICAgIHByb3RvLndlYmtpdE1hdGNoZXNTZWxlY3Rvcjtcbn1cblxuLyoqXG4gKiBGaW5kcyB0aGUgY2xvc2VzdCBwYXJlbnQgdGhhdCBtYXRjaGVzIGEgc2VsZWN0b3IuXG4gKlxuICogQHBhcmFtIHtFbGVtZW50fSBlbGVtZW50XG4gKiBAcGFyYW0ge1N0cmluZ30gc2VsZWN0b3JcbiAqIEByZXR1cm4ge0Z1bmN0aW9ufVxuICovXG5mdW5jdGlvbiBjbG9zZXN0IChlbGVtZW50LCBzZWxlY3Rvcikge1xuICAgIHdoaWxlIChlbGVtZW50ICYmIGVsZW1lbnQubm9kZVR5cGUgIT09IERPQ1VNRU5UX05PREVfVFlQRSkge1xuICAgICAgICBpZiAodHlwZW9mIGVsZW1lbnQubWF0Y2hlcyA9PT0gJ2Z1bmN0aW9uJyAmJlxuICAgICAgICAgICAgZWxlbWVudC5tYXRjaGVzKHNlbGVjdG9yKSkge1xuICAgICAgICAgIHJldHVybiBlbGVtZW50O1xuICAgICAgICB9XG4gICAgICAgIGVsZW1lbnQgPSBlbGVtZW50LnBhcmVudE5vZGU7XG4gICAgfVxufVxuXG5tb2R1bGUuZXhwb3J0cyA9IGNsb3Nlc3Q7XG5cblxuLyoqKi8gfSksXG5cbi8qKiovIDQzODpcbi8qKiovIChmdW5jdGlvbihtb2R1bGUsIF9fdW51c2VkX3dlYnBhY2tfZXhwb3J0cywgX193ZWJwYWNrX3JlcXVpcmVfXykge1xuXG52YXIgY2xvc2VzdCA9IF9fd2VicGFja19yZXF1aXJlX18oODI4KTtcblxuLyoqXG4gKiBEZWxlZ2F0ZXMgZXZlbnQgdG8gYSBzZWxlY3Rvci5cbiAqXG4gKiBAcGFyYW0ge0VsZW1lbnR9IGVsZW1lbnRcbiAqIEBwYXJhbSB7U3RyaW5nfSBzZWxlY3RvclxuICogQHBhcmFtIHtTdHJpbmd9IHR5cGVcbiAqIEBwYXJhbSB7RnVuY3Rpb259IGNhbGxiYWNrXG4gKiBAcGFyYW0ge0Jvb2xlYW59IHVzZUNhcHR1cmVcbiAqIEByZXR1cm4ge09iamVjdH1cbiAqL1xuZnVuY3Rpb24gX2RlbGVnYXRlKGVsZW1lbnQsIHNlbGVjdG9yLCB0eXBlLCBjYWxsYmFjaywgdXNlQ2FwdHVyZSkge1xuICAgIHZhciBsaXN0ZW5lckZuID0gbGlzdGVuZXIuYXBwbHkodGhpcywgYXJndW1lbnRzKTtcblxuICAgIGVsZW1lbnQuYWRkRXZlbnRMaXN0ZW5lcih0eXBlLCBsaXN0ZW5lckZuLCB1c2VDYXB0dXJlKTtcblxuICAgIHJldHVybiB7XG4gICAgICAgIGRlc3Ryb3k6IGZ1bmN0aW9uKCkge1xuICAgICAgICAgICAgZWxlbWVudC5yZW1vdmVFdmVudExpc3RlbmVyKHR5cGUsIGxpc3RlbmVyRm4sIHVzZUNhcHR1cmUpO1xuICAgICAgICB9XG4gICAgfVxufVxuXG4vKipcbiAqIERlbGVnYXRlcyBldmVudCB0byBhIHNlbGVjdG9yLlxuICpcbiAqIEBwYXJhbSB7RWxlbWVudHxTdHJpbmd8QXJyYXl9IFtlbGVtZW50c11cbiAqIEBwYXJhbSB7U3RyaW5nfSBzZWxlY3RvclxuICogQHBhcmFtIHtTdHJpbmd9IHR5cGVcbiAqIEBwYXJhbSB7RnVuY3Rpb259IGNhbGxiYWNrXG4gKiBAcGFyYW0ge0Jvb2xlYW59IHVzZUNhcHR1cmVcbiAqIEByZXR1cm4ge09iamVjdH1cbiAqL1xuZnVuY3Rpb24gZGVsZWdhdGUoZWxlbWVudHMsIHNlbGVjdG9yLCB0eXBlLCBjYWxsYmFjaywgdXNlQ2FwdHVyZSkge1xuICAgIC8vIEhhbmRsZSB0aGUgcmVndWxhciBFbGVtZW50IHVzYWdlXG4gICAgaWYgKHR5cGVvZiBlbGVtZW50cy5hZGRFdmVudExpc3RlbmVyID09PSAnZnVuY3Rpb24nKSB7XG4gICAgICAgIHJldHVybiBfZGVsZWdhdGUuYXBwbHkobnVsbCwgYXJndW1lbnRzKTtcbiAgICB9XG5cbiAgICAvLyBIYW5kbGUgRWxlbWVudC1sZXNzIHVzYWdlLCBpdCBkZWZhdWx0cyB0byBnbG9iYWwgZGVsZWdhdGlvblxuICAgIGlmICh0eXBlb2YgdHlwZSA9PT0gJ2Z1bmN0aW9uJykge1xuICAgICAgICAvLyBVc2UgYGRvY3VtZW50YCBhcyB0aGUgZmlyc3QgcGFyYW1ldGVyLCB0aGVuIGFwcGx5IGFyZ3VtZW50c1xuICAgICAgICAvLyBUaGlzIGlzIGEgc2hvcnQgd2F5IHRvIC51bnNoaWZ0IGBhcmd1bWVudHNgIHdpdGhvdXQgcnVubmluZyBpbnRvIGRlb3B0aW1pemF0aW9uc1xuICAgICAgICByZXR1cm4gX2RlbGVnYXRlLmJpbmQobnVsbCwgZG9jdW1lbnQpLmFwcGx5KG51bGwsIGFyZ3VtZW50cyk7XG4gICAgfVxuXG4gICAgLy8gSGFuZGxlIFNlbGVjdG9yLWJhc2VkIHVzYWdlXG4gICAgaWYgKHR5cGVvZiBlbGVtZW50cyA9PT0gJ3N0cmluZycpIHtcbiAgICAgICAgZWxlbWVudHMgPSBkb2N1bWVudC5xdWVyeVNlbGVjdG9yQWxsKGVsZW1lbnRzKTtcbiAgICB9XG5cbiAgICAvLyBIYW5kbGUgQXJyYXktbGlrZSBiYXNlZCB1c2FnZVxuICAgIHJldHVybiBBcnJheS5wcm90b3R5cGUubWFwLmNhbGwoZWxlbWVudHMsIGZ1bmN0aW9uIChlbGVtZW50KSB7XG4gICAgICAgIHJldHVybiBfZGVsZWdhdGUoZWxlbWVudCwgc2VsZWN0b3IsIHR5cGUsIGNhbGxiYWNrLCB1c2VDYXB0dXJlKTtcbiAgICB9KTtcbn1cblxuLyoqXG4gKiBGaW5kcyBjbG9zZXN0IG1hdGNoIGFuZCBpbnZva2VzIGNhbGxiYWNrLlxuICpcbiAqIEBwYXJhbSB7RWxlbWVudH0gZWxlbWVudFxuICogQHBhcmFtIHtTdHJpbmd9IHNlbGVjdG9yXG4gKiBAcGFyYW0ge1N0cmluZ30gdHlwZVxuICogQHBhcmFtIHtGdW5jdGlvbn0gY2FsbGJhY2tcbiAqIEByZXR1cm4ge0Z1bmN0aW9ufVxuICovXG5mdW5jdGlvbiBsaXN0ZW5lcihlbGVtZW50LCBzZWxlY3RvciwgdHlwZSwgY2FsbGJhY2spIHtcbiAgICByZXR1cm4gZnVuY3Rpb24oZSkge1xuICAgICAgICBlLmRlbGVnYXRlVGFyZ2V0ID0gY2xvc2VzdChlLnRhcmdldCwgc2VsZWN0b3IpO1xuXG4gICAgICAgIGlmIChlLmRlbGVnYXRlVGFyZ2V0KSB7XG4gICAgICAgICAgICBjYWxsYmFjay5jYWxsKGVsZW1lbnQsIGUpO1xuICAgICAgICB9XG4gICAgfVxufVxuXG5tb2R1bGUuZXhwb3J0cyA9IGRlbGVnYXRlO1xuXG5cbi8qKiovIH0pLFxuXG4vKioqLyA4Nzk6XG4vKioqLyAoZnVuY3Rpb24oX191bnVzZWRfd2VicGFja19tb2R1bGUsIGV4cG9ydHMpIHtcblxuLyoqXG4gKiBDaGVjayBpZiBhcmd1bWVudCBpcyBhIEhUTUwgZWxlbWVudC5cbiAqXG4gKiBAcGFyYW0ge09iamVjdH0gdmFsdWVcbiAqIEByZXR1cm4ge0Jvb2xlYW59XG4gKi9cbmV4cG9ydHMubm9kZSA9IGZ1bmN0aW9uKHZhbHVlKSB7XG4gICAgcmV0dXJuIHZhbHVlICE9PSB1bmRlZmluZWRcbiAgICAgICAgJiYgdmFsdWUgaW5zdGFuY2VvZiBIVE1MRWxlbWVudFxuICAgICAgICAmJiB2YWx1ZS5ub2RlVHlwZSA9PT0gMTtcbn07XG5cbi8qKlxuICogQ2hlY2sgaWYgYXJndW1lbnQgaXMgYSBsaXN0IG9mIEhUTUwgZWxlbWVudHMuXG4gKlxuICogQHBhcmFtIHtPYmplY3R9IHZhbHVlXG4gKiBAcmV0dXJuIHtCb29sZWFufVxuICovXG5leHBvcnRzLm5vZGVMaXN0ID0gZnVuY3Rpb24odmFsdWUpIHtcbiAgICB2YXIgdHlwZSA9IE9iamVjdC5wcm90b3R5cGUudG9TdHJpbmcuY2FsbCh2YWx1ZSk7XG5cbiAgICByZXR1cm4gdmFsdWUgIT09IHVuZGVmaW5lZFxuICAgICAgICAmJiAodHlwZSA9PT0gJ1tvYmplY3QgTm9kZUxpc3RdJyB8fCB0eXBlID09PSAnW29iamVjdCBIVE1MQ29sbGVjdGlvbl0nKVxuICAgICAgICAmJiAoJ2xlbmd0aCcgaW4gdmFsdWUpXG4gICAgICAgICYmICh2YWx1ZS5sZW5ndGggPT09IDAgfHwgZXhwb3J0cy5ub2RlKHZhbHVlWzBdKSk7XG59O1xuXG4vKipcbiAqIENoZWNrIGlmIGFyZ3VtZW50IGlzIGEgc3RyaW5nLlxuICpcbiAqIEBwYXJhbSB7T2JqZWN0fSB2YWx1ZVxuICogQHJldHVybiB7Qm9vbGVhbn1cbiAqL1xuZXhwb3J0cy5zdHJpbmcgPSBmdW5jdGlvbih2YWx1ZSkge1xuICAgIHJldHVybiB0eXBlb2YgdmFsdWUgPT09ICdzdHJpbmcnXG4gICAgICAgIHx8IHZhbHVlIGluc3RhbmNlb2YgU3RyaW5nO1xufTtcblxuLyoqXG4gKiBDaGVjayBpZiBhcmd1bWVudCBpcyBhIGZ1bmN0aW9uLlxuICpcbiAqIEBwYXJhbSB7T2JqZWN0fSB2YWx1ZVxuICogQHJldHVybiB7Qm9vbGVhbn1cbiAqL1xuZXhwb3J0cy5mbiA9IGZ1bmN0aW9uKHZhbHVlKSB7XG4gICAgdmFyIHR5cGUgPSBPYmplY3QucHJvdG90eXBlLnRvU3RyaW5nLmNhbGwodmFsdWUpO1xuXG4gICAgcmV0dXJuIHR5cGUgPT09ICdbb2JqZWN0IEZ1bmN0aW9uXSc7XG59O1xuXG5cbi8qKiovIH0pLFxuXG4vKioqLyAzNzA6XG4vKioqLyAoZnVuY3Rpb24obW9kdWxlLCBfX3VudXNlZF93ZWJwYWNrX2V4cG9ydHMsIF9fd2VicGFja19yZXF1aXJlX18pIHtcblxudmFyIGlzID0gX193ZWJwYWNrX3JlcXVpcmVfXyg4NzkpO1xudmFyIGRlbGVnYXRlID0gX193ZWJwYWNrX3JlcXVpcmVfXyg0MzgpO1xuXG4vKipcbiAqIFZhbGlkYXRlcyBhbGwgcGFyYW1zIGFuZCBjYWxscyB0aGUgcmlnaHRcbiAqIGxpc3RlbmVyIGZ1bmN0aW9uIGJhc2VkIG9uIGl0cyB0YXJnZXQgdHlwZS5cbiAqXG4gKiBAcGFyYW0ge1N0cmluZ3xIVE1MRWxlbWVudHxIVE1MQ29sbGVjdGlvbnxOb2RlTGlzdH0gdGFyZ2V0XG4gKiBAcGFyYW0ge1N0cmluZ30gdHlwZVxuICogQHBhcmFtIHtGdW5jdGlvbn0gY2FsbGJhY2tcbiAqIEByZXR1cm4ge09iamVjdH1cbiAqL1xuZnVuY3Rpb24gbGlzdGVuKHRhcmdldCwgdHlwZSwgY2FsbGJhY2spIHtcbiAgICBpZiAoIXRhcmdldCAmJiAhdHlwZSAmJiAhY2FsbGJhY2spIHtcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKCdNaXNzaW5nIHJlcXVpcmVkIGFyZ3VtZW50cycpO1xuICAgIH1cblxuICAgIGlmICghaXMuc3RyaW5nKHR5cGUpKSB7XG4gICAgICAgIHRocm93IG5ldyBUeXBlRXJyb3IoJ1NlY29uZCBhcmd1bWVudCBtdXN0IGJlIGEgU3RyaW5nJyk7XG4gICAgfVxuXG4gICAgaWYgKCFpcy5mbihjYWxsYmFjaykpIHtcbiAgICAgICAgdGhyb3cgbmV3IFR5cGVFcnJvcignVGhpcmQgYXJndW1lbnQgbXVzdCBiZSBhIEZ1bmN0aW9uJyk7XG4gICAgfVxuXG4gICAgaWYgKGlzLm5vZGUodGFyZ2V0KSkge1xuICAgICAgICByZXR1cm4gbGlzdGVuTm9kZSh0YXJnZXQsIHR5cGUsIGNhbGxiYWNrKTtcbiAgICB9XG4gICAgZWxzZSBpZiAoaXMubm9kZUxpc3QodGFyZ2V0KSkge1xuICAgICAgICByZXR1cm4gbGlzdGVuTm9kZUxpc3QodGFyZ2V0LCB0eXBlLCBjYWxsYmFjayk7XG4gICAgfVxuICAgIGVsc2UgaWYgKGlzLnN0cmluZyh0YXJnZXQpKSB7XG4gICAgICAgIHJldHVybiBsaXN0ZW5TZWxlY3Rvcih0YXJnZXQsIHR5cGUsIGNhbGxiYWNrKTtcbiAgICB9XG4gICAgZWxzZSB7XG4gICAgICAgIHRocm93IG5ldyBUeXBlRXJyb3IoJ0ZpcnN0IGFyZ3VtZW50IG11c3QgYmUgYSBTdHJpbmcsIEhUTUxFbGVtZW50LCBIVE1MQ29sbGVjdGlvbiwgb3IgTm9kZUxpc3QnKTtcbiAgICB9XG59XG5cbi8qKlxuICogQWRkcyBhbiBldmVudCBsaXN0ZW5lciB0byBhIEhUTUwgZWxlbWVudFxuICogYW5kIHJldHVybnMgYSByZW1vdmUgbGlzdGVuZXIgZnVuY3Rpb24uXG4gKlxuICogQHBhcmFtIHtIVE1MRWxlbWVudH0gbm9kZVxuICogQHBhcmFtIHtTdHJpbmd9IHR5cGVcbiAqIEBwYXJhbSB7RnVuY3Rpb259IGNhbGxiYWNrXG4gKiBAcmV0dXJuIHtPYmplY3R9XG4gKi9cbmZ1bmN0aW9uIGxpc3Rlbk5vZGUobm9kZSwgdHlwZSwgY2FsbGJhY2spIHtcbiAgICBub2RlLmFkZEV2ZW50TGlzdGVuZXIodHlwZSwgY2FsbGJhY2spO1xuXG4gICAgcmV0dXJuIHtcbiAgICAgICAgZGVzdHJveTogZnVuY3Rpb24oKSB7XG4gICAgICAgICAgICBub2RlLnJlbW92ZUV2ZW50TGlzdGVuZXIodHlwZSwgY2FsbGJhY2spO1xuICAgICAgICB9XG4gICAgfVxufVxuXG4vKipcbiAqIEFkZCBhbiBldmVudCBsaXN0ZW5lciB0byBhIGxpc3Qgb2YgSFRNTCBlbGVtZW50c1xuICogYW5kIHJldHVybnMgYSByZW1vdmUgbGlzdGVuZXIgZnVuY3Rpb24uXG4gKlxuICogQHBhcmFtIHtOb2RlTGlzdHxIVE1MQ29sbGVjdGlvbn0gbm9kZUxpc3RcbiAqIEBwYXJhbSB7U3RyaW5nfSB0eXBlXG4gKiBAcGFyYW0ge0Z1bmN0aW9ufSBjYWxsYmFja1xuICogQHJldHVybiB7T2JqZWN0fVxuICovXG5mdW5jdGlvbiBsaXN0ZW5Ob2RlTGlzdChub2RlTGlzdCwgdHlwZSwgY2FsbGJhY2spIHtcbiAgICBBcnJheS5wcm90b3R5cGUuZm9yRWFjaC5jYWxsKG5vZGVMaXN0LCBmdW5jdGlvbihub2RlKSB7XG4gICAgICAgIG5vZGUuYWRkRXZlbnRMaXN0ZW5lcih0eXBlLCBjYWxsYmFjayk7XG4gICAgfSk7XG5cbiAgICByZXR1cm4ge1xuICAgICAgICBkZXN0cm95OiBmdW5jdGlvbigpIHtcbiAgICAgICAgICAgIEFycmF5LnByb3RvdHlwZS5mb3JFYWNoLmNhbGwobm9kZUxpc3QsIGZ1bmN0aW9uKG5vZGUpIHtcbiAgICAgICAgICAgICAgICBub2RlLnJlbW92ZUV2ZW50TGlzdGVuZXIodHlwZSwgY2FsbGJhY2spO1xuICAgICAgICAgICAgfSk7XG4gICAgICAgIH1cbiAgICB9XG59XG5cbi8qKlxuICogQWRkIGFuIGV2ZW50IGxpc3RlbmVyIHRvIGEgc2VsZWN0b3JcbiAqIGFuZCByZXR1cm5zIGEgcmVtb3ZlIGxpc3RlbmVyIGZ1bmN0aW9uLlxuICpcbiAqIEBwYXJhbSB7U3RyaW5nfSBzZWxlY3RvclxuICogQHBhcmFtIHtTdHJpbmd9IHR5cGVcbiAqIEBwYXJhbSB7RnVuY3Rpb259IGNhbGxiYWNrXG4gKiBAcmV0dXJuIHtPYmplY3R9XG4gKi9cbmZ1bmN0aW9uIGxpc3RlblNlbGVjdG9yKHNlbGVjdG9yLCB0eXBlLCBjYWxsYmFjaykge1xuICAgIHJldHVybiBkZWxlZ2F0ZShkb2N1bWVudC5ib2R5LCBzZWxlY3RvciwgdHlwZSwgY2FsbGJhY2spO1xufVxuXG5tb2R1bGUuZXhwb3J0cyA9IGxpc3RlbjtcblxuXG4vKioqLyB9KSxcblxuLyoqKi8gODE3OlxuLyoqKi8gKGZ1bmN0aW9uKG1vZHVsZSkge1xuXG5mdW5jdGlvbiBzZWxlY3QoZWxlbWVudCkge1xuICAgIHZhciBzZWxlY3RlZFRleHQ7XG5cbiAgICBpZiAoZWxlbWVudC5ub2RlTmFtZSA9PT0gJ1NFTEVDVCcpIHtcbiAgICAgICAgZWxlbWVudC5mb2N1cygpO1xuXG4gICAgICAgIHNlbGVjdGVkVGV4dCA9IGVsZW1lbnQudmFsdWU7XG4gICAgfVxuICAgIGVsc2UgaWYgKGVsZW1lbnQubm9kZU5hbWUgPT09ICdJTlBVVCcgfHwgZWxlbWVudC5ub2RlTmFtZSA9PT0gJ1RFWFRBUkVBJykge1xuICAgICAgICB2YXIgaXNSZWFkT25seSA9IGVsZW1lbnQuaGFzQXR0cmlidXRlKCdyZWFkb25seScpO1xuXG4gICAgICAgIGlmICghaXNSZWFkT25seSkge1xuICAgICAgICAgICAgZWxlbWVudC5zZXRBdHRyaWJ1dGUoJ3JlYWRvbmx5JywgJycpO1xuICAgICAgICB9XG5cbiAgICAgICAgZWxlbWVudC5zZWxlY3QoKTtcbiAgICAgICAgZWxlbWVudC5zZXRTZWxlY3Rpb25SYW5nZSgwLCBlbGVtZW50LnZhbHVlLmxlbmd0aCk7XG5cbiAgICAgICAgaWYgKCFpc1JlYWRPbmx5KSB7XG4gICAgICAgICAgICBlbGVtZW50LnJlbW92ZUF0dHJpYnV0ZSgncmVhZG9ubHknKTtcbiAgICAgICAgfVxuXG4gICAgICAgIHNlbGVjdGVkVGV4dCA9IGVsZW1lbnQudmFsdWU7XG4gICAgfVxuICAgIGVsc2Uge1xuICAgICAgICBpZiAoZWxlbWVudC5oYXNBdHRyaWJ1dGUoJ2NvbnRlbnRlZGl0YWJsZScpKSB7XG4gICAgICAgICAgICBlbGVtZW50LmZvY3VzKCk7XG4gICAgICAgIH1cblxuICAgICAgICB2YXIgc2VsZWN0aW9uID0gd2luZG93LmdldFNlbGVjdGlvbigpO1xuICAgICAgICB2YXIgcmFuZ2UgPSBkb2N1bWVudC5jcmVhdGVSYW5nZSgpO1xuXG4gICAgICAgIHJhbmdlLnNlbGVjdE5vZGVDb250ZW50cyhlbGVtZW50KTtcbiAgICAgICAgc2VsZWN0aW9uLnJlbW92ZUFsbFJhbmdlcygpO1xuICAgICAgICBzZWxlY3Rpb24uYWRkUmFuZ2UocmFuZ2UpO1xuXG4gICAgICAgIHNlbGVjdGVkVGV4dCA9IHNlbGVjdGlvbi50b1N0cmluZygpO1xuICAgIH1cblxuICAgIHJldHVybiBzZWxlY3RlZFRleHQ7XG59XG5cbm1vZHVsZS5leHBvcnRzID0gc2VsZWN0O1xuXG5cbi8qKiovIH0pLFxuXG4vKioqLyAyNzk6XG4vKioqLyAoZnVuY3Rpb24obW9kdWxlKSB7XG5cbmZ1bmN0aW9uIEUgKCkge1xuICAvLyBLZWVwIHRoaXMgZW1wdHkgc28gaXQncyBlYXNpZXIgdG8gaW5oZXJpdCBmcm9tXG4gIC8vICh2aWEgaHR0cHM6Ly9naXRodWIuY29tL2xpcHNtYWNrIGZyb20gaHR0cHM6Ly9naXRodWIuY29tL3Njb3R0Y29yZ2FuL3RpbnktZW1pdHRlci9pc3N1ZXMvMylcbn1cblxuRS5wcm90b3R5cGUgPSB7XG4gIG9uOiBmdW5jdGlvbiAobmFtZSwgY2FsbGJhY2ssIGN0eCkge1xuICAgIHZhciBlID0gdGhpcy5lIHx8ICh0aGlzLmUgPSB7fSk7XG5cbiAgICAoZVtuYW1lXSB8fCAoZVtuYW1lXSA9IFtdKSkucHVzaCh7XG4gICAgICBmbjogY2FsbGJhY2ssXG4gICAgICBjdHg6IGN0eFxuICAgIH0pO1xuXG4gICAgcmV0dXJuIHRoaXM7XG4gIH0sXG5cbiAgb25jZTogZnVuY3Rpb24gKG5hbWUsIGNhbGxiYWNrLCBjdHgpIHtcbiAgICB2YXIgc2VsZiA9IHRoaXM7XG4gICAgZnVuY3Rpb24gbGlzdGVuZXIgKCkge1xuICAgICAgc2VsZi5vZmYobmFtZSwgbGlzdGVuZXIpO1xuICAgICAgY2FsbGJhY2suYXBwbHkoY3R4LCBhcmd1bWVudHMpO1xuICAgIH07XG5cbiAgICBsaXN0ZW5lci5fID0gY2FsbGJhY2tcbiAgICByZXR1cm4gdGhpcy5vbihuYW1lLCBsaXN0ZW5lciwgY3R4KTtcbiAgfSxcblxuICBlbWl0OiBmdW5jdGlvbiAobmFtZSkge1xuICAgIHZhciBkYXRhID0gW10uc2xpY2UuY2FsbChhcmd1bWVudHMsIDEpO1xuICAgIHZhciBldnRBcnIgPSAoKHRoaXMuZSB8fCAodGhpcy5lID0ge30pKVtuYW1lXSB8fCBbXSkuc2xpY2UoKTtcbiAgICB2YXIgaSA9IDA7XG4gICAgdmFyIGxlbiA9IGV2dEFyci5sZW5ndGg7XG5cbiAgICBmb3IgKGk7IGkgPCBsZW47IGkrKykge1xuICAgICAgZXZ0QXJyW2ldLmZuLmFwcGx5KGV2dEFycltpXS5jdHgsIGRhdGEpO1xuICAgIH1cblxuICAgIHJldHVybiB0aGlzO1xuICB9LFxuXG4gIG9mZjogZnVuY3Rpb24gKG5hbWUsIGNhbGxiYWNrKSB7XG4gICAgdmFyIGUgPSB0aGlzLmUgfHwgKHRoaXMuZSA9IHt9KTtcbiAgICB2YXIgZXZ0cyA9IGVbbmFtZV07XG4gICAgdmFyIGxpdmVFdmVudHMgPSBbXTtcblxuICAgIGlmIChldnRzICYmIGNhbGxiYWNrKSB7XG4gICAgICBmb3IgKHZhciBpID0gMCwgbGVuID0gZXZ0cy5sZW5ndGg7IGkgPCBsZW47IGkrKykge1xuICAgICAgICBpZiAoZXZ0c1tpXS5mbiAhPT0gY2FsbGJhY2sgJiYgZXZ0c1tpXS5mbi5fICE9PSBjYWxsYmFjaylcbiAgICAgICAgICBsaXZlRXZlbnRzLnB1c2goZXZ0c1tpXSk7XG4gICAgICB9XG4gICAgfVxuXG4gICAgLy8gUmVtb3ZlIGV2ZW50IGZyb20gcXVldWUgdG8gcHJldmVudCBtZW1vcnkgbGVha1xuICAgIC8vIFN1Z2dlc3RlZCBieSBodHRwczovL2dpdGh1Yi5jb20vbGF6ZFxuICAgIC8vIFJlZjogaHR0cHM6Ly9naXRodWIuY29tL3Njb3R0Y29yZ2FuL3RpbnktZW1pdHRlci9jb21taXQvYzZlYmZhYTliYzk3M2IzM2QxMTBhODRhMzA3NzQyYjdjZjk0Yzk1MyNjb21taXRjb21tZW50LTUwMjQ5MTBcblxuICAgIChsaXZlRXZlbnRzLmxlbmd0aClcbiAgICAgID8gZVtuYW1lXSA9IGxpdmVFdmVudHNcbiAgICAgIDogZGVsZXRlIGVbbmFtZV07XG5cbiAgICByZXR1cm4gdGhpcztcbiAgfVxufTtcblxubW9kdWxlLmV4cG9ydHMgPSBFO1xubW9kdWxlLmV4cG9ydHMuVGlueUVtaXR0ZXIgPSBFO1xuXG5cbi8qKiovIH0pXG5cbi8qKioqKiovIFx0fSk7XG4vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqL1xuLyoqKioqKi8gXHQvLyBUaGUgbW9kdWxlIGNhY2hlXG4vKioqKioqLyBcdHZhciBfX3dlYnBhY2tfbW9kdWxlX2NhY2hlX18gPSB7fTtcbi8qKioqKiovIFx0XG4vKioqKioqLyBcdC8vIFRoZSByZXF1aXJlIGZ1bmN0aW9uXG4vKioqKioqLyBcdGZ1bmN0aW9uIF9fd2VicGFja19yZXF1aXJlX18obW9kdWxlSWQpIHtcbi8qKioqKiovIFx0XHQvLyBDaGVjayBpZiBtb2R1bGUgaXMgaW4gY2FjaGVcbi8qKioqKiovIFx0XHRpZihfX3dlYnBhY2tfbW9kdWxlX2NhY2hlX19bbW9kdWxlSWRdKSB7XG4vKioqKioqLyBcdFx0XHRyZXR1cm4gX193ZWJwYWNrX21vZHVsZV9jYWNoZV9fW21vZHVsZUlkXS5leHBvcnRzO1xuLyoqKioqKi8gXHRcdH1cbi8qKioqKiovIFx0XHQvLyBDcmVhdGUgYSBuZXcgbW9kdWxlIChhbmQgcHV0IGl0IGludG8gdGhlIGNhY2hlKVxuLyoqKioqKi8gXHRcdHZhciBtb2R1bGUgPSBfX3dlYnBhY2tfbW9kdWxlX2NhY2hlX19bbW9kdWxlSWRdID0ge1xuLyoqKioqKi8gXHRcdFx0Ly8gbm8gbW9kdWxlLmlkIG5lZWRlZFxuLyoqKioqKi8gXHRcdFx0Ly8gbm8gbW9kdWxlLmxvYWRlZCBuZWVkZWRcbi8qKioqKiovIFx0XHRcdGV4cG9ydHM6IHt9XG4vKioqKioqLyBcdFx0fTtcbi8qKioqKiovIFx0XG4vKioqKioqLyBcdFx0Ly8gRXhlY3V0ZSB0aGUgbW9kdWxlIGZ1bmN0aW9uXG4vKioqKioqLyBcdFx0X193ZWJwYWNrX21vZHVsZXNfX1ttb2R1bGVJZF0obW9kdWxlLCBtb2R1bGUuZXhwb3J0cywgX193ZWJwYWNrX3JlcXVpcmVfXyk7XG4vKioqKioqLyBcdFxuLyoqKioqKi8gXHRcdC8vIFJldHVybiB0aGUgZXhwb3J0cyBvZiB0aGUgbW9kdWxlXG4vKioqKioqLyBcdFx0cmV0dXJuIG1vZHVsZS5leHBvcnRzO1xuLyoqKioqKi8gXHR9XG4vKioqKioqLyBcdFxuLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi9cbi8qKioqKiovIFx0Lyogd2VicGFjay9ydW50aW1lL2NvbXBhdCBnZXQgZGVmYXVsdCBleHBvcnQgKi9cbi8qKioqKiovIFx0IWZ1bmN0aW9uKCkge1xuLyoqKioqKi8gXHRcdC8vIGdldERlZmF1bHRFeHBvcnQgZnVuY3Rpb24gZm9yIGNvbXBhdGliaWxpdHkgd2l0aCBub24taGFybW9ueSBtb2R1bGVzXG4vKioqKioqLyBcdFx0X193ZWJwYWNrX3JlcXVpcmVfXy5uID0gZnVuY3Rpb24obW9kdWxlKSB7XG4vKioqKioqLyBcdFx0XHR2YXIgZ2V0dGVyID0gbW9kdWxlICYmIG1vZHVsZS5fX2VzTW9kdWxlID9cbi8qKioqKiovIFx0XHRcdFx0ZnVuY3Rpb24oKSB7IHJldHVybiBtb2R1bGVbJ2RlZmF1bHQnXTsgfSA6XG4vKioqKioqLyBcdFx0XHRcdGZ1bmN0aW9uKCkgeyByZXR1cm4gbW9kdWxlOyB9O1xuLyoqKioqKi8gXHRcdFx0X193ZWJwYWNrX3JlcXVpcmVfXy5kKGdldHRlciwgeyBhOiBnZXR0ZXIgfSk7XG4vKioqKioqLyBcdFx0XHRyZXR1cm4gZ2V0dGVyO1xuLyoqKioqKi8gXHRcdH07XG4vKioqKioqLyBcdH0oKTtcbi8qKioqKiovIFx0XG4vKioqKioqLyBcdC8qIHdlYnBhY2svcnVudGltZS9kZWZpbmUgcHJvcGVydHkgZ2V0dGVycyAqL1xuLyoqKioqKi8gXHQhZnVuY3Rpb24oKSB7XG4vKioqKioqLyBcdFx0Ly8gZGVmaW5lIGdldHRlciBmdW5jdGlvbnMgZm9yIGhhcm1vbnkgZXhwb3J0c1xuLyoqKioqKi8gXHRcdF9fd2VicGFja19yZXF1aXJlX18uZCA9IGZ1bmN0aW9uKGV4cG9ydHMsIGRlZmluaXRpb24pIHtcbi8qKioqKiovIFx0XHRcdGZvcih2YXIga2V5IGluIGRlZmluaXRpb24pIHtcbi8qKioqKiovIFx0XHRcdFx0aWYoX193ZWJwYWNrX3JlcXVpcmVfXy5vKGRlZmluaXRpb24sIGtleSkgJiYgIV9fd2VicGFja19yZXF1aXJlX18ubyhleHBvcnRzLCBrZXkpKSB7XG4vKioqKioqLyBcdFx0XHRcdFx0T2JqZWN0LmRlZmluZVByb3BlcnR5KGV4cG9ydHMsIGtleSwgeyBlbnVtZXJhYmxlOiB0cnVlLCBnZXQ6IGRlZmluaXRpb25ba2V5XSB9KTtcbi8qKioqKiovIFx0XHRcdFx0fVxuLyoqKioqKi8gXHRcdFx0fVxuLyoqKioqKi8gXHRcdH07XG4vKioqKioqLyBcdH0oKTtcbi8qKioqKiovIFx0XG4vKioqKioqLyBcdC8qIHdlYnBhY2svcnVudGltZS9oYXNPd25Qcm9wZXJ0eSBzaG9ydGhhbmQgKi9cbi8qKioqKiovIFx0IWZ1bmN0aW9uKCkge1xuLyoqKioqKi8gXHRcdF9fd2VicGFja19yZXF1aXJlX18ubyA9IGZ1bmN0aW9uKG9iaiwgcHJvcCkgeyByZXR1cm4gT2JqZWN0LnByb3RvdHlwZS5oYXNPd25Qcm9wZXJ0eS5jYWxsKG9iaiwgcHJvcCk7IH1cbi8qKioqKiovIFx0fSgpO1xuLyoqKioqKi8gXHRcbi8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovXG4vKioqKioqLyBcdC8vIG1vZHVsZSBleHBvcnRzIG11c3QgYmUgcmV0dXJuZWQgZnJvbSBydW50aW1lIHNvIGVudHJ5IGlubGluaW5nIGlzIGRpc2FibGVkXG4vKioqKioqLyBcdC8vIHN0YXJ0dXBcbi8qKioqKiovIFx0Ly8gTG9hZCBlbnRyeSBtb2R1bGUgYW5kIHJldHVybiBleHBvcnRzXG4vKioqKioqLyBcdHJldHVybiBfX3dlYnBhY2tfcmVxdWlyZV9fKDY4Nik7XG4vKioqKioqLyB9KSgpXG4uZGVmYXVsdDtcbn0pOyIsICIvKipcbiAqIEBsaWNlbnNlIE1JVFxuICogdG9wYmFyIDEuMC4wLCAyMDIxLTAxLTA2XG4gKiBodHRwOi8vYnV1bmd1eWVuLmdpdGh1Yi5pby90b3BiYXJcbiAqIENvcHlyaWdodCAoYykgMjAyMSBCdXUgTmd1eWVuXG4gKi9cbihmdW5jdGlvbih3aW5kb3csZG9jdW1lbnQpe1widXNlIHN0cmljdFwiOyFmdW5jdGlvbigpe2Zvcih2YXIgbGFzdFRpbWU9MCx2ZW5kb3JzPVtcIm1zXCIsXCJtb3pcIixcIndlYmtpdFwiLFwib1wiXSx4PTA7eDx2ZW5kb3JzLmxlbmd0aCYmIXdpbmRvdy5yZXF1ZXN0QW5pbWF0aW9uRnJhbWU7Kyt4KXdpbmRvdy5yZXF1ZXN0QW5pbWF0aW9uRnJhbWU9d2luZG93W3ZlbmRvcnNbeF0rXCJSZXF1ZXN0QW5pbWF0aW9uRnJhbWVcIl0sd2luZG93LmNhbmNlbEFuaW1hdGlvbkZyYW1lPXdpbmRvd1t2ZW5kb3JzW3hdK1wiQ2FuY2VsQW5pbWF0aW9uRnJhbWVcIl18fHdpbmRvd1t2ZW5kb3JzW3hdK1wiQ2FuY2VsUmVxdWVzdEFuaW1hdGlvbkZyYW1lXCJdO3dpbmRvdy5yZXF1ZXN0QW5pbWF0aW9uRnJhbWV8fCh3aW5kb3cucmVxdWVzdEFuaW1hdGlvbkZyYW1lPWZ1bmN0aW9uKGNhbGxiYWNrLGVsZW1lbnQpe3ZhciBjdXJyVGltZT0obmV3IERhdGUpLmdldFRpbWUoKSx0aW1lVG9DYWxsPU1hdGgubWF4KDAsMTYtKGN1cnJUaW1lLWxhc3RUaW1lKSksaWQ9d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXtjYWxsYmFjayhjdXJyVGltZSt0aW1lVG9DYWxsKX0sdGltZVRvQ2FsbCk7cmV0dXJuIGxhc3RUaW1lPWN1cnJUaW1lK3RpbWVUb0NhbGwsaWR9KSx3aW5kb3cuY2FuY2VsQW5pbWF0aW9uRnJhbWV8fCh3aW5kb3cuY2FuY2VsQW5pbWF0aW9uRnJhbWU9ZnVuY3Rpb24oaWQpe2NsZWFyVGltZW91dChpZCl9KX0oKTtmdW5jdGlvbiByZXBhaW50KCl7Y2FudmFzLndpZHRoPXdpbmRvdy5pbm5lcldpZHRoLGNhbnZhcy5oZWlnaHQ9NSpvcHRpb25zLmJhclRoaWNrbmVzczt2YXIgY3R4PWNhbnZhcy5nZXRDb250ZXh0KFwiMmRcIik7Y3R4LnNoYWRvd0JsdXI9b3B0aW9ucy5zaGFkb3dCbHVyLGN0eC5zaGFkb3dDb2xvcj1vcHRpb25zLnNoYWRvd0NvbG9yO3ZhciBzdG9wLGxpbmVHcmFkaWVudD1jdHguY3JlYXRlTGluZWFyR3JhZGllbnQoMCwwLGNhbnZhcy53aWR0aCwwKTtmb3Ioc3RvcCBpbiBvcHRpb25zLmJhckNvbG9ycylsaW5lR3JhZGllbnQuYWRkQ29sb3JTdG9wKHN0b3Asb3B0aW9ucy5iYXJDb2xvcnNbc3RvcF0pO2N0eC5saW5lV2lkdGg9b3B0aW9ucy5iYXJUaGlja25lc3MsY3R4LmJlZ2luUGF0aCgpLGN0eC5tb3ZlVG8oMCxvcHRpb25zLmJhclRoaWNrbmVzcy8yKSxjdHgubGluZVRvKE1hdGguY2VpbChjdXJyZW50UHJvZ3Jlc3MqY2FudmFzLndpZHRoKSxvcHRpb25zLmJhclRoaWNrbmVzcy8yKSxjdHguc3Ryb2tlU3R5bGU9bGluZUdyYWRpZW50LGN0eC5zdHJva2UoKX12YXIgY2FudmFzLHByb2dyZXNzVGltZXJJZCxmYWRlVGltZXJJZCxjdXJyZW50UHJvZ3Jlc3Msc2hvd2luZyxvcHRpb25zPXthdXRvUnVuOiEwLGJhclRoaWNrbmVzczozLGJhckNvbG9yczp7MDpcInJnYmEoMjYsICAxODgsIDE1NiwgLjkpXCIsXCIuMjVcIjpcInJnYmEoNTIsICAxNTIsIDIxOSwgLjkpXCIsXCIuNTBcIjpcInJnYmEoMjQxLCAxOTYsIDE1LCAgLjkpXCIsXCIuNzVcIjpcInJnYmEoMjMwLCAxMjYsIDM0LCAgLjkpXCIsXCIxLjBcIjpcInJnYmEoMjExLCA4NCwgIDAsICAgLjkpXCJ9LHNoYWRvd0JsdXI6MTAsc2hhZG93Q29sb3I6XCJyZ2JhKDAsICAgMCwgICAwLCAgIC42KVwiLGNsYXNzTmFtZTpudWxsfSx0b3BiYXI9e2NvbmZpZzpmdW5jdGlvbihvcHRzKXtmb3IodmFyIGtleSBpbiBvcHRzKW9wdGlvbnMuaGFzT3duUHJvcGVydHkoa2V5KSYmKG9wdGlvbnNba2V5XT1vcHRzW2tleV0pfSxzaG93OmZ1bmN0aW9uKCl7dmFyIHR5cGUsaGFuZGxlcixlbGVtO3Nob3dpbmd8fChzaG93aW5nPSEwLG51bGwhPT1mYWRlVGltZXJJZCYmd2luZG93LmNhbmNlbEFuaW1hdGlvbkZyYW1lKGZhZGVUaW1lcklkKSxjYW52YXN8fCgoZWxlbT0oY2FudmFzPWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoXCJjYW52YXNcIikpLnN0eWxlKS5wb3NpdGlvbj1cImZpeGVkXCIsZWxlbS50b3A9ZWxlbS5sZWZ0PWVsZW0ucmlnaHQ9ZWxlbS5tYXJnaW49ZWxlbS5wYWRkaW5nPTAsZWxlbS56SW5kZXg9MTAwMDAxLGVsZW0uZGlzcGxheT1cIm5vbmVcIixvcHRpb25zLmNsYXNzTmFtZSYmY2FudmFzLmNsYXNzTGlzdC5hZGQob3B0aW9ucy5jbGFzc05hbWUpLGRvY3VtZW50LmJvZHkuYXBwZW5kQ2hpbGQoY2FudmFzKSx0eXBlPVwicmVzaXplXCIsaGFuZGxlcj1yZXBhaW50LChlbGVtPXdpbmRvdykuYWRkRXZlbnRMaXN0ZW5lcj9lbGVtLmFkZEV2ZW50TGlzdGVuZXIodHlwZSxoYW5kbGVyLCExKTplbGVtLmF0dGFjaEV2ZW50P2VsZW0uYXR0YWNoRXZlbnQoXCJvblwiK3R5cGUsaGFuZGxlcik6ZWxlbVtcIm9uXCIrdHlwZV09aGFuZGxlciksY2FudmFzLnN0eWxlLm9wYWNpdHk9MSxjYW52YXMuc3R5bGUuZGlzcGxheT1cImJsb2NrXCIsdG9wYmFyLnByb2dyZXNzKDApLG9wdGlvbnMuYXV0b1J1biYmZnVuY3Rpb24gbG9vcCgpe3Byb2dyZXNzVGltZXJJZD13aW5kb3cucmVxdWVzdEFuaW1hdGlvbkZyYW1lKGxvb3ApLHRvcGJhci5wcm9ncmVzcyhcIitcIisuMDUqTWF0aC5wb3coMS1NYXRoLnNxcnQoY3VycmVudFByb2dyZXNzKSwyKSl9KCkpfSxwcm9ncmVzczpmdW5jdGlvbih0byl7cmV0dXJuIHZvaWQgMD09PXRvfHwoXCJzdHJpbmdcIj09dHlwZW9mIHRvJiYodG89KDA8PXRvLmluZGV4T2YoXCIrXCIpfHwwPD10by5pbmRleE9mKFwiLVwiKT9jdXJyZW50UHJvZ3Jlc3M6MCkrcGFyc2VGbG9hdCh0bykpLGN1cnJlbnRQcm9ncmVzcz0xPHRvPzE6dG8scmVwYWludCgpKSxjdXJyZW50UHJvZ3Jlc3N9LGhpZGU6ZnVuY3Rpb24oKXtzaG93aW5nJiYoc2hvd2luZz0hMSxudWxsIT1wcm9ncmVzc1RpbWVySWQmJih3aW5kb3cuY2FuY2VsQW5pbWF0aW9uRnJhbWUocHJvZ3Jlc3NUaW1lcklkKSxwcm9ncmVzc1RpbWVySWQ9bnVsbCksZnVuY3Rpb24gbG9vcCgpe3JldHVybiAxPD10b3BiYXIucHJvZ3Jlc3MoXCIrLjFcIikmJihjYW52YXMuc3R5bGUub3BhY2l0eS09LjA1LGNhbnZhcy5zdHlsZS5vcGFjaXR5PD0uMDUpPyhjYW52YXMuc3R5bGUuZGlzcGxheT1cIm5vbmVcIix2b2lkKGZhZGVUaW1lcklkPW51bGwpKTp2b2lkKGZhZGVUaW1lcklkPXdpbmRvdy5yZXF1ZXN0QW5pbWF0aW9uRnJhbWUobG9vcCkpfSgpKX19O1wib2JqZWN0XCI9PXR5cGVvZiBtb2R1bGUmJlwib2JqZWN0XCI9PXR5cGVvZiBtb2R1bGUuZXhwb3J0cz9tb2R1bGUuZXhwb3J0cz10b3BiYXI6XCJmdW5jdGlvblwiPT10eXBlb2YgZGVmaW5lJiZkZWZpbmUuYW1kP2RlZmluZShmdW5jdGlvbigpe3JldHVybiB0b3BiYXJ9KTp0aGlzLnRvcGJhcj10b3BiYXJ9KS5jYWxsKHRoaXMsd2luZG93LGRvY3VtZW50KTsiLCAiXCJ1c2Ugc3RyaWN0XCI7XG5cbihmdW5jdGlvbigpIHtcbiAgdmFyIFBvbHlmaWxsRXZlbnQgPSBldmVudENvbnN0cnVjdG9yKCk7XG5cbiAgZnVuY3Rpb24gZXZlbnRDb25zdHJ1Y3RvcigpIHtcbiAgICBpZiAodHlwZW9mIHdpbmRvdy5DdXN0b21FdmVudCA9PT0gXCJmdW5jdGlvblwiKSByZXR1cm4gd2luZG93LkN1c3RvbUV2ZW50O1xuICAgIC8vIElFPD05IFN1cHBvcnRcbiAgICBmdW5jdGlvbiBDdXN0b21FdmVudChldmVudCwgcGFyYW1zKSB7XG4gICAgICBwYXJhbXMgPSBwYXJhbXMgfHwge2J1YmJsZXM6IGZhbHNlLCBjYW5jZWxhYmxlOiBmYWxzZSwgZGV0YWlsOiB1bmRlZmluZWR9O1xuICAgICAgdmFyIGV2dCA9IGRvY3VtZW50LmNyZWF0ZUV2ZW50KCdDdXN0b21FdmVudCcpO1xuICAgICAgZXZ0LmluaXRDdXN0b21FdmVudChldmVudCwgcGFyYW1zLmJ1YmJsZXMsIHBhcmFtcy5jYW5jZWxhYmxlLCBwYXJhbXMuZGV0YWlsKTtcbiAgICAgIHJldHVybiBldnQ7XG4gICAgfVxuICAgIEN1c3RvbUV2ZW50LnByb3RvdHlwZSA9IHdpbmRvdy5FdmVudC5wcm90b3R5cGU7XG4gICAgcmV0dXJuIEN1c3RvbUV2ZW50O1xuICB9XG5cbiAgZnVuY3Rpb24gYnVpbGRIaWRkZW5JbnB1dChuYW1lLCB2YWx1ZSkge1xuICAgIHZhciBpbnB1dCA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoXCJpbnB1dFwiKTtcbiAgICBpbnB1dC50eXBlID0gXCJoaWRkZW5cIjtcbiAgICBpbnB1dC5uYW1lID0gbmFtZTtcbiAgICBpbnB1dC52YWx1ZSA9IHZhbHVlO1xuICAgIHJldHVybiBpbnB1dDtcbiAgfVxuXG4gIGZ1bmN0aW9uIGhhbmRsZUNsaWNrKGVsZW1lbnQsIHRhcmdldE1vZGlmaWVyS2V5KSB7XG4gICAgdmFyIHRvID0gZWxlbWVudC5nZXRBdHRyaWJ1dGUoXCJkYXRhLXRvXCIpLFxuICAgICAgICBtZXRob2QgPSBidWlsZEhpZGRlbklucHV0KFwiX21ldGhvZFwiLCBlbGVtZW50LmdldEF0dHJpYnV0ZShcImRhdGEtbWV0aG9kXCIpKSxcbiAgICAgICAgY3NyZiA9IGJ1aWxkSGlkZGVuSW5wdXQoXCJfY3NyZl90b2tlblwiLCBlbGVtZW50LmdldEF0dHJpYnV0ZShcImRhdGEtY3NyZlwiKSksXG4gICAgICAgIGZvcm0gPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KFwiZm9ybVwiKSxcbiAgICAgICAgc3VibWl0ID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudChcImlucHV0XCIpLFxuICAgICAgICB0YXJnZXQgPSBlbGVtZW50LmdldEF0dHJpYnV0ZShcInRhcmdldFwiKTtcblxuICAgIGZvcm0ubWV0aG9kID0gKGVsZW1lbnQuZ2V0QXR0cmlidXRlKFwiZGF0YS1tZXRob2RcIikgPT09IFwiZ2V0XCIpID8gXCJnZXRcIiA6IFwicG9zdFwiO1xuICAgIGZvcm0uYWN0aW9uID0gdG87XG4gICAgZm9ybS5zdHlsZS5kaXNwbGF5ID0gXCJub25lXCI7XG5cbiAgICBpZiAodGFyZ2V0KSBmb3JtLnRhcmdldCA9IHRhcmdldDtcbiAgICBlbHNlIGlmICh0YXJnZXRNb2RpZmllcktleSkgZm9ybS50YXJnZXQgPSBcIl9ibGFua1wiO1xuXG4gICAgZm9ybS5hcHBlbmRDaGlsZChjc3JmKTtcbiAgICBmb3JtLmFwcGVuZENoaWxkKG1ldGhvZCk7XG4gICAgZG9jdW1lbnQuYm9keS5hcHBlbmRDaGlsZChmb3JtKTtcblxuICAgIC8vIEluc2VydCBhIGJ1dHRvbiBhbmQgY2xpY2sgaXQgaW5zdGVhZCBvZiB1c2luZyBgZm9ybS5zdWJtaXRgXG4gICAgLy8gYmVjYXVzZSB0aGUgYHN1Ym1pdGAgZnVuY3Rpb24gZG9lcyBub3QgZW1pdCBhIGBzdWJtaXRgIGV2ZW50LlxuICAgIHN1Ym1pdC50eXBlID0gXCJzdWJtaXRcIjtcbiAgICBmb3JtLmFwcGVuZENoaWxkKHN1Ym1pdCk7XG4gICAgc3VibWl0LmNsaWNrKCk7XG4gIH1cblxuICB3aW5kb3cuYWRkRXZlbnRMaXN0ZW5lcihcImNsaWNrXCIsIGZ1bmN0aW9uKGUpIHtcbiAgICB2YXIgZWxlbWVudCA9IGUudGFyZ2V0O1xuICAgIGlmIChlLmRlZmF1bHRQcmV2ZW50ZWQpIHJldHVybjtcblxuICAgIHdoaWxlIChlbGVtZW50ICYmIGVsZW1lbnQuZ2V0QXR0cmlidXRlKSB7XG4gICAgICB2YXIgcGhvZW5peExpbmtFdmVudCA9IG5ldyBQb2x5ZmlsbEV2ZW50KCdwaG9lbml4LmxpbmsuY2xpY2snLCB7XG4gICAgICAgIFwiYnViYmxlc1wiOiB0cnVlLCBcImNhbmNlbGFibGVcIjogdHJ1ZVxuICAgICAgfSk7XG5cbiAgICAgIGlmICghZWxlbWVudC5kaXNwYXRjaEV2ZW50KHBob2VuaXhMaW5rRXZlbnQpKSB7XG4gICAgICAgIGUucHJldmVudERlZmF1bHQoKTtcbiAgICAgICAgZS5zdG9wSW1tZWRpYXRlUHJvcGFnYXRpb24oKTtcbiAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgfVxuXG4gICAgICBpZiAoZWxlbWVudC5nZXRBdHRyaWJ1dGUoXCJkYXRhLW1ldGhvZFwiKSAmJiBlbGVtZW50LmdldEF0dHJpYnV0ZShcImRhdGEtdG9cIikpIHtcbiAgICAgICAgaGFuZGxlQ2xpY2soZWxlbWVudCwgZS5tZXRhS2V5IHx8IGUuc2hpZnRLZXkpO1xuICAgICAgICBlLnByZXZlbnREZWZhdWx0KCk7XG4gICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIGVsZW1lbnQgPSBlbGVtZW50LnBhcmVudE5vZGU7XG4gICAgICB9XG4gICAgfVxuICB9LCBmYWxzZSk7XG5cbiAgd2luZG93LmFkZEV2ZW50TGlzdGVuZXIoJ3Bob2VuaXgubGluay5jbGljaycsIGZ1bmN0aW9uIChlKSB7XG4gICAgdmFyIG1lc3NhZ2UgPSBlLnRhcmdldC5nZXRBdHRyaWJ1dGUoXCJkYXRhLWNvbmZpcm1cIik7XG4gICAgaWYobWVzc2FnZSAmJiAhd2luZG93LmNvbmZpcm0obWVzc2FnZSkpIHtcbiAgICAgIGUucHJldmVudERlZmF1bHQoKTtcbiAgICB9XG4gIH0sIGZhbHNlKTtcbn0pKCk7XG4iLCAiLy8gd3JhcHMgdmFsdWUgaW4gY2xvc3VyZSBvciByZXR1cm5zIGNsb3N1cmVcbmV4cG9ydCBsZXQgY2xvc3VyZSA9ICh2YWx1ZSkgPT4ge1xuICBpZih0eXBlb2YgdmFsdWUgPT09IFwiZnVuY3Rpb25cIil7XG4gICAgcmV0dXJuIHZhbHVlXG4gIH0gZWxzZSB7XG4gICAgbGV0IGNsb3N1cmUgPSBmdW5jdGlvbiAoKXsgcmV0dXJuIHZhbHVlIH1cbiAgICByZXR1cm4gY2xvc3VyZVxuICB9XG59XG4iLCAiZXhwb3J0IGNvbnN0IGdsb2JhbFNlbGYgPSB0eXBlb2Ygc2VsZiAhPT0gXCJ1bmRlZmluZWRcIiA/IHNlbGYgOiBudWxsXG5leHBvcnQgY29uc3QgcGh4V2luZG93ID0gdHlwZW9mIHdpbmRvdyAhPT0gXCJ1bmRlZmluZWRcIiA/IHdpbmRvdyA6IG51bGxcbmV4cG9ydCBjb25zdCBnbG9iYWwgPSBnbG9iYWxTZWxmIHx8IHBoeFdpbmRvdyB8fCBnbG9iYWxUaGlzXG5leHBvcnQgY29uc3QgREVGQVVMVF9WU04gPSBcIjIuMC4wXCJcbmV4cG9ydCBjb25zdCBTT0NLRVRfU1RBVEVTID0ge2Nvbm5lY3Rpbmc6IDAsIG9wZW46IDEsIGNsb3Npbmc6IDIsIGNsb3NlZDogM31cbmV4cG9ydCBjb25zdCBERUZBVUxUX1RJTUVPVVQgPSAxMDAwMFxuZXhwb3J0IGNvbnN0IFdTX0NMT1NFX05PUk1BTCA9IDEwMDBcbmV4cG9ydCBjb25zdCBDSEFOTkVMX1NUQVRFUyA9IHtcbiAgY2xvc2VkOiBcImNsb3NlZFwiLFxuICBlcnJvcmVkOiBcImVycm9yZWRcIixcbiAgam9pbmVkOiBcImpvaW5lZFwiLFxuICBqb2luaW5nOiBcImpvaW5pbmdcIixcbiAgbGVhdmluZzogXCJsZWF2aW5nXCIsXG59XG5leHBvcnQgY29uc3QgQ0hBTk5FTF9FVkVOVFMgPSB7XG4gIGNsb3NlOiBcInBoeF9jbG9zZVwiLFxuICBlcnJvcjogXCJwaHhfZXJyb3JcIixcbiAgam9pbjogXCJwaHhfam9pblwiLFxuICByZXBseTogXCJwaHhfcmVwbHlcIixcbiAgbGVhdmU6IFwicGh4X2xlYXZlXCJcbn1cblxuZXhwb3J0IGNvbnN0IFRSQU5TUE9SVFMgPSB7XG4gIGxvbmdwb2xsOiBcImxvbmdwb2xsXCIsXG4gIHdlYnNvY2tldDogXCJ3ZWJzb2NrZXRcIlxufVxuZXhwb3J0IGNvbnN0IFhIUl9TVEFURVMgPSB7XG4gIGNvbXBsZXRlOiA0XG59XG5leHBvcnQgY29uc3QgQVVUSF9UT0tFTl9QUkVGSVggPSBcImJhc2U2NHVybC5iZWFyZXIucGh4LlwiXG4iLCAiLyoqXG4gKiBJbml0aWFsaXplcyB0aGUgUHVzaFxuICogQHBhcmFtIHtDaGFubmVsfSBjaGFubmVsIC0gVGhlIENoYW5uZWxcbiAqIEBwYXJhbSB7c3RyaW5nfSBldmVudCAtIFRoZSBldmVudCwgZm9yIGV4YW1wbGUgYFwicGh4X2pvaW5cImBcbiAqIEBwYXJhbSB7T2JqZWN0fSBwYXlsb2FkIC0gVGhlIHBheWxvYWQsIGZvciBleGFtcGxlIGB7dXNlcl9pZDogMTIzfWBcbiAqIEBwYXJhbSB7bnVtYmVyfSB0aW1lb3V0IC0gVGhlIHB1c2ggdGltZW91dCBpbiBtaWxsaXNlY29uZHNcbiAqL1xuZXhwb3J0IGRlZmF1bHQgY2xhc3MgUHVzaCB7XG4gIGNvbnN0cnVjdG9yKGNoYW5uZWwsIGV2ZW50LCBwYXlsb2FkLCB0aW1lb3V0KXtcbiAgICB0aGlzLmNoYW5uZWwgPSBjaGFubmVsXG4gICAgdGhpcy5ldmVudCA9IGV2ZW50XG4gICAgdGhpcy5wYXlsb2FkID0gcGF5bG9hZCB8fCBmdW5jdGlvbiAoKXsgcmV0dXJuIHt9IH1cbiAgICB0aGlzLnJlY2VpdmVkUmVzcCA9IG51bGxcbiAgICB0aGlzLnRpbWVvdXQgPSB0aW1lb3V0XG4gICAgdGhpcy50aW1lb3V0VGltZXIgPSBudWxsXG4gICAgdGhpcy5yZWNIb29rcyA9IFtdXG4gICAgdGhpcy5zZW50ID0gZmFsc2VcbiAgfVxuXG4gIC8qKlxuICAgKlxuICAgKiBAcGFyYW0ge251bWJlcn0gdGltZW91dFxuICAgKi9cbiAgcmVzZW5kKHRpbWVvdXQpe1xuICAgIHRoaXMudGltZW91dCA9IHRpbWVvdXRcbiAgICB0aGlzLnJlc2V0KClcbiAgICB0aGlzLnNlbmQoKVxuICB9XG5cbiAgLyoqXG4gICAqXG4gICAqL1xuICBzZW5kKCl7XG4gICAgaWYodGhpcy5oYXNSZWNlaXZlZChcInRpbWVvdXRcIikpeyByZXR1cm4gfVxuICAgIHRoaXMuc3RhcnRUaW1lb3V0KClcbiAgICB0aGlzLnNlbnQgPSB0cnVlXG4gICAgdGhpcy5jaGFubmVsLnNvY2tldC5wdXNoKHtcbiAgICAgIHRvcGljOiB0aGlzLmNoYW5uZWwudG9waWMsXG4gICAgICBldmVudDogdGhpcy5ldmVudCxcbiAgICAgIHBheWxvYWQ6IHRoaXMucGF5bG9hZCgpLFxuICAgICAgcmVmOiB0aGlzLnJlZixcbiAgICAgIGpvaW5fcmVmOiB0aGlzLmNoYW5uZWwuam9pblJlZigpXG4gICAgfSlcbiAgfVxuXG4gIC8qKlxuICAgKlxuICAgKiBAcGFyYW0geyp9IHN0YXR1c1xuICAgKiBAcGFyYW0geyp9IGNhbGxiYWNrXG4gICAqL1xuICByZWNlaXZlKHN0YXR1cywgY2FsbGJhY2spe1xuICAgIGlmKHRoaXMuaGFzUmVjZWl2ZWQoc3RhdHVzKSl7XG4gICAgICBjYWxsYmFjayh0aGlzLnJlY2VpdmVkUmVzcC5yZXNwb25zZSlcbiAgICB9XG5cbiAgICB0aGlzLnJlY0hvb2tzLnB1c2goe3N0YXR1cywgY2FsbGJhY2t9KVxuICAgIHJldHVybiB0aGlzXG4gIH1cblxuICAvKipcbiAgICogQHByaXZhdGVcbiAgICovXG4gIHJlc2V0KCl7XG4gICAgdGhpcy5jYW5jZWxSZWZFdmVudCgpXG4gICAgdGhpcy5yZWYgPSBudWxsXG4gICAgdGhpcy5yZWZFdmVudCA9IG51bGxcbiAgICB0aGlzLnJlY2VpdmVkUmVzcCA9IG51bGxcbiAgICB0aGlzLnNlbnQgPSBmYWxzZVxuICB9XG5cbiAgLyoqXG4gICAqIEBwcml2YXRlXG4gICAqL1xuICBtYXRjaFJlY2VpdmUoe3N0YXR1cywgcmVzcG9uc2UsIF9yZWZ9KXtcbiAgICB0aGlzLnJlY0hvb2tzLmZpbHRlcihoID0+IGguc3RhdHVzID09PSBzdGF0dXMpXG4gICAgICAuZm9yRWFjaChoID0+IGguY2FsbGJhY2socmVzcG9uc2UpKVxuICB9XG5cbiAgLyoqXG4gICAqIEBwcml2YXRlXG4gICAqL1xuICBjYW5jZWxSZWZFdmVudCgpe1xuICAgIGlmKCF0aGlzLnJlZkV2ZW50KXsgcmV0dXJuIH1cbiAgICB0aGlzLmNoYW5uZWwub2ZmKHRoaXMucmVmRXZlbnQpXG4gIH1cblxuICAvKipcbiAgICogQHByaXZhdGVcbiAgICovXG4gIGNhbmNlbFRpbWVvdXQoKXtcbiAgICBjbGVhclRpbWVvdXQodGhpcy50aW1lb3V0VGltZXIpXG4gICAgdGhpcy50aW1lb3V0VGltZXIgPSBudWxsXG4gIH1cblxuICAvKipcbiAgICogQHByaXZhdGVcbiAgICovXG4gIHN0YXJ0VGltZW91dCgpe1xuICAgIGlmKHRoaXMudGltZW91dFRpbWVyKXsgdGhpcy5jYW5jZWxUaW1lb3V0KCkgfVxuICAgIHRoaXMucmVmID0gdGhpcy5jaGFubmVsLnNvY2tldC5tYWtlUmVmKClcbiAgICB0aGlzLnJlZkV2ZW50ID0gdGhpcy5jaGFubmVsLnJlcGx5RXZlbnROYW1lKHRoaXMucmVmKVxuXG4gICAgdGhpcy5jaGFubmVsLm9uKHRoaXMucmVmRXZlbnQsIHBheWxvYWQgPT4ge1xuICAgICAgdGhpcy5jYW5jZWxSZWZFdmVudCgpXG4gICAgICB0aGlzLmNhbmNlbFRpbWVvdXQoKVxuICAgICAgdGhpcy5yZWNlaXZlZFJlc3AgPSBwYXlsb2FkXG4gICAgICB0aGlzLm1hdGNoUmVjZWl2ZShwYXlsb2FkKVxuICAgIH0pXG5cbiAgICB0aGlzLnRpbWVvdXRUaW1lciA9IHNldFRpbWVvdXQoKCkgPT4ge1xuICAgICAgdGhpcy50cmlnZ2VyKFwidGltZW91dFwiLCB7fSlcbiAgICB9LCB0aGlzLnRpbWVvdXQpXG4gIH1cblxuICAvKipcbiAgICogQHByaXZhdGVcbiAgICovXG4gIGhhc1JlY2VpdmVkKHN0YXR1cyl7XG4gICAgcmV0dXJuIHRoaXMucmVjZWl2ZWRSZXNwICYmIHRoaXMucmVjZWl2ZWRSZXNwLnN0YXR1cyA9PT0gc3RhdHVzXG4gIH1cblxuICAvKipcbiAgICogQHByaXZhdGVcbiAgICovXG4gIHRyaWdnZXIoc3RhdHVzLCByZXNwb25zZSl7XG4gICAgdGhpcy5jaGFubmVsLnRyaWdnZXIodGhpcy5yZWZFdmVudCwge3N0YXR1cywgcmVzcG9uc2V9KVxuICB9XG59XG4iLCAiLyoqXG4gKlxuICogQ3JlYXRlcyBhIHRpbWVyIHRoYXQgYWNjZXB0cyBhIGB0aW1lckNhbGNgIGZ1bmN0aW9uIHRvIHBlcmZvcm1cbiAqIGNhbGN1bGF0ZWQgdGltZW91dCByZXRyaWVzLCBzdWNoIGFzIGV4cG9uZW50aWFsIGJhY2tvZmYuXG4gKlxuICogQGV4YW1wbGVcbiAqIGxldCByZWNvbm5lY3RUaW1lciA9IG5ldyBUaW1lcigoKSA9PiB0aGlzLmNvbm5lY3QoKSwgZnVuY3Rpb24odHJpZXMpe1xuICogICByZXR1cm4gWzEwMDAsIDUwMDAsIDEwMDAwXVt0cmllcyAtIDFdIHx8IDEwMDAwXG4gKiB9KVxuICogcmVjb25uZWN0VGltZXIuc2NoZWR1bGVUaW1lb3V0KCkgLy8gZmlyZXMgYWZ0ZXIgMTAwMFxuICogcmVjb25uZWN0VGltZXIuc2NoZWR1bGVUaW1lb3V0KCkgLy8gZmlyZXMgYWZ0ZXIgNTAwMFxuICogcmVjb25uZWN0VGltZXIucmVzZXQoKVxuICogcmVjb25uZWN0VGltZXIuc2NoZWR1bGVUaW1lb3V0KCkgLy8gZmlyZXMgYWZ0ZXIgMTAwMFxuICpcbiAqIEBwYXJhbSB7RnVuY3Rpb259IGNhbGxiYWNrXG4gKiBAcGFyYW0ge0Z1bmN0aW9ufSB0aW1lckNhbGNcbiAqL1xuZXhwb3J0IGRlZmF1bHQgY2xhc3MgVGltZXIge1xuICBjb25zdHJ1Y3RvcihjYWxsYmFjaywgdGltZXJDYWxjKXtcbiAgICB0aGlzLmNhbGxiYWNrID0gY2FsbGJhY2tcbiAgICB0aGlzLnRpbWVyQ2FsYyA9IHRpbWVyQ2FsY1xuICAgIHRoaXMudGltZXIgPSBudWxsXG4gICAgdGhpcy50cmllcyA9IDBcbiAgfVxuXG4gIHJlc2V0KCl7XG4gICAgdGhpcy50cmllcyA9IDBcbiAgICBjbGVhclRpbWVvdXQodGhpcy50aW1lcilcbiAgfVxuXG4gIC8qKlxuICAgKiBDYW5jZWxzIGFueSBwcmV2aW91cyBzY2hlZHVsZVRpbWVvdXQgYW5kIHNjaGVkdWxlcyBjYWxsYmFja1xuICAgKi9cbiAgc2NoZWR1bGVUaW1lb3V0KCl7XG4gICAgY2xlYXJUaW1lb3V0KHRoaXMudGltZXIpXG5cbiAgICB0aGlzLnRpbWVyID0gc2V0VGltZW91dCgoKSA9PiB7XG4gICAgICB0aGlzLnRyaWVzID0gdGhpcy50cmllcyArIDFcbiAgICAgIHRoaXMuY2FsbGJhY2soKVxuICAgIH0sIHRoaXMudGltZXJDYWxjKHRoaXMudHJpZXMgKyAxKSlcbiAgfVxufVxuIiwgImltcG9ydCB7Y2xvc3VyZX0gZnJvbSBcIi4vdXRpbHNcIlxuaW1wb3J0IHtcbiAgQ0hBTk5FTF9FVkVOVFMsXG4gIENIQU5ORUxfU1RBVEVTLFxufSBmcm9tIFwiLi9jb25zdGFudHNcIlxuXG5pbXBvcnQgUHVzaCBmcm9tIFwiLi9wdXNoXCJcbmltcG9ydCBUaW1lciBmcm9tIFwiLi90aW1lclwiXG5cbi8qKlxuICpcbiAqIEBwYXJhbSB7c3RyaW5nfSB0b3BpY1xuICogQHBhcmFtIHsoT2JqZWN0fGZ1bmN0aW9uKX0gcGFyYW1zXG4gKiBAcGFyYW0ge1NvY2tldH0gc29ja2V0XG4gKi9cbmV4cG9ydCBkZWZhdWx0IGNsYXNzIENoYW5uZWwge1xuICBjb25zdHJ1Y3Rvcih0b3BpYywgcGFyYW1zLCBzb2NrZXQpe1xuICAgIHRoaXMuc3RhdGUgPSBDSEFOTkVMX1NUQVRFUy5jbG9zZWRcbiAgICB0aGlzLnRvcGljID0gdG9waWNcbiAgICB0aGlzLnBhcmFtcyA9IGNsb3N1cmUocGFyYW1zIHx8IHt9KVxuICAgIHRoaXMuc29ja2V0ID0gc29ja2V0XG4gICAgdGhpcy5iaW5kaW5ncyA9IFtdXG4gICAgdGhpcy5iaW5kaW5nUmVmID0gMFxuICAgIHRoaXMudGltZW91dCA9IHRoaXMuc29ja2V0LnRpbWVvdXRcbiAgICB0aGlzLmpvaW5lZE9uY2UgPSBmYWxzZVxuICAgIHRoaXMuam9pblB1c2ggPSBuZXcgUHVzaCh0aGlzLCBDSEFOTkVMX0VWRU5UUy5qb2luLCB0aGlzLnBhcmFtcywgdGhpcy50aW1lb3V0KVxuICAgIHRoaXMucHVzaEJ1ZmZlciA9IFtdXG4gICAgdGhpcy5zdGF0ZUNoYW5nZVJlZnMgPSBbXVxuXG4gICAgdGhpcy5yZWpvaW5UaW1lciA9IG5ldyBUaW1lcigoKSA9PiB7XG4gICAgICBpZih0aGlzLnNvY2tldC5pc0Nvbm5lY3RlZCgpKXsgdGhpcy5yZWpvaW4oKSB9XG4gICAgfSwgdGhpcy5zb2NrZXQucmVqb2luQWZ0ZXJNcylcbiAgICB0aGlzLnN0YXRlQ2hhbmdlUmVmcy5wdXNoKHRoaXMuc29ja2V0Lm9uRXJyb3IoKCkgPT4gdGhpcy5yZWpvaW5UaW1lci5yZXNldCgpKSlcbiAgICB0aGlzLnN0YXRlQ2hhbmdlUmVmcy5wdXNoKHRoaXMuc29ja2V0Lm9uT3BlbigoKSA9PiB7XG4gICAgICB0aGlzLnJlam9pblRpbWVyLnJlc2V0KClcbiAgICAgIGlmKHRoaXMuaXNFcnJvcmVkKCkpeyB0aGlzLnJlam9pbigpIH1cbiAgICB9KVxuICAgIClcbiAgICB0aGlzLmpvaW5QdXNoLnJlY2VpdmUoXCJva1wiLCAoKSA9PiB7XG4gICAgICB0aGlzLnN0YXRlID0gQ0hBTk5FTF9TVEFURVMuam9pbmVkXG4gICAgICB0aGlzLnJlam9pblRpbWVyLnJlc2V0KClcbiAgICAgIHRoaXMucHVzaEJ1ZmZlci5mb3JFYWNoKHB1c2hFdmVudCA9PiBwdXNoRXZlbnQuc2VuZCgpKVxuICAgICAgdGhpcy5wdXNoQnVmZmVyID0gW11cbiAgICB9KVxuICAgIHRoaXMuam9pblB1c2gucmVjZWl2ZShcImVycm9yXCIsICgpID0+IHtcbiAgICAgIHRoaXMuc3RhdGUgPSBDSEFOTkVMX1NUQVRFUy5lcnJvcmVkXG4gICAgICBpZih0aGlzLnNvY2tldC5pc0Nvbm5lY3RlZCgpKXsgdGhpcy5yZWpvaW5UaW1lci5zY2hlZHVsZVRpbWVvdXQoKSB9XG4gICAgfSlcbiAgICB0aGlzLm9uQ2xvc2UoKCkgPT4ge1xuICAgICAgdGhpcy5yZWpvaW5UaW1lci5yZXNldCgpXG4gICAgICBpZih0aGlzLnNvY2tldC5oYXNMb2dnZXIoKSkgdGhpcy5zb2NrZXQubG9nKFwiY2hhbm5lbFwiLCBgY2xvc2UgJHt0aGlzLnRvcGljfSAke3RoaXMuam9pblJlZigpfWApXG4gICAgICB0aGlzLnN0YXRlID0gQ0hBTk5FTF9TVEFURVMuY2xvc2VkXG4gICAgICB0aGlzLnNvY2tldC5yZW1vdmUodGhpcylcbiAgICB9KVxuICAgIHRoaXMub25FcnJvcihyZWFzb24gPT4ge1xuICAgICAgaWYodGhpcy5zb2NrZXQuaGFzTG9nZ2VyKCkpIHRoaXMuc29ja2V0LmxvZyhcImNoYW5uZWxcIiwgYGVycm9yICR7dGhpcy50b3BpY31gLCByZWFzb24pXG4gICAgICBpZih0aGlzLmlzSm9pbmluZygpKXsgdGhpcy5qb2luUHVzaC5yZXNldCgpIH1cbiAgICAgIHRoaXMuc3RhdGUgPSBDSEFOTkVMX1NUQVRFUy5lcnJvcmVkXG4gICAgICBpZih0aGlzLnNvY2tldC5pc0Nvbm5lY3RlZCgpKXsgdGhpcy5yZWpvaW5UaW1lci5zY2hlZHVsZVRpbWVvdXQoKSB9XG4gICAgfSlcbiAgICB0aGlzLmpvaW5QdXNoLnJlY2VpdmUoXCJ0aW1lb3V0XCIsICgpID0+IHtcbiAgICAgIGlmKHRoaXMuc29ja2V0Lmhhc0xvZ2dlcigpKSB0aGlzLnNvY2tldC5sb2coXCJjaGFubmVsXCIsIGB0aW1lb3V0ICR7dGhpcy50b3BpY30gKCR7dGhpcy5qb2luUmVmKCl9KWAsIHRoaXMuam9pblB1c2gudGltZW91dClcbiAgICAgIGxldCBsZWF2ZVB1c2ggPSBuZXcgUHVzaCh0aGlzLCBDSEFOTkVMX0VWRU5UUy5sZWF2ZSwgY2xvc3VyZSh7fSksIHRoaXMudGltZW91dClcbiAgICAgIGxlYXZlUHVzaC5zZW5kKClcbiAgICAgIHRoaXMuc3RhdGUgPSBDSEFOTkVMX1NUQVRFUy5lcnJvcmVkXG4gICAgICB0aGlzLmpvaW5QdXNoLnJlc2V0KClcbiAgICAgIGlmKHRoaXMuc29ja2V0LmlzQ29ubmVjdGVkKCkpeyB0aGlzLnJlam9pblRpbWVyLnNjaGVkdWxlVGltZW91dCgpIH1cbiAgICB9KVxuICAgIHRoaXMub24oQ0hBTk5FTF9FVkVOVFMucmVwbHksIChwYXlsb2FkLCByZWYpID0+IHtcbiAgICAgIHRoaXMudHJpZ2dlcih0aGlzLnJlcGx5RXZlbnROYW1lKHJlZiksIHBheWxvYWQpXG4gICAgfSlcbiAgfVxuXG4gIC8qKlxuICAgKiBKb2luIHRoZSBjaGFubmVsXG4gICAqIEBwYXJhbSB7aW50ZWdlcn0gdGltZW91dFxuICAgKiBAcmV0dXJucyB7UHVzaH1cbiAgICovXG4gIGpvaW4odGltZW91dCA9IHRoaXMudGltZW91dCl7XG4gICAgaWYodGhpcy5qb2luZWRPbmNlKXtcbiAgICAgIHRocm93IG5ldyBFcnJvcihcInRyaWVkIHRvIGpvaW4gbXVsdGlwbGUgdGltZXMuICdqb2luJyBjYW4gb25seSBiZSBjYWxsZWQgYSBzaW5nbGUgdGltZSBwZXIgY2hhbm5lbCBpbnN0YW5jZVwiKVxuICAgIH0gZWxzZSB7XG4gICAgICB0aGlzLnRpbWVvdXQgPSB0aW1lb3V0XG4gICAgICB0aGlzLmpvaW5lZE9uY2UgPSB0cnVlXG4gICAgICB0aGlzLnJlam9pbigpXG4gICAgICByZXR1cm4gdGhpcy5qb2luUHVzaFxuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBIb29rIGludG8gY2hhbm5lbCBjbG9zZVxuICAgKiBAcGFyYW0ge0Z1bmN0aW9ufSBjYWxsYmFja1xuICAgKi9cbiAgb25DbG9zZShjYWxsYmFjayl7XG4gICAgdGhpcy5vbihDSEFOTkVMX0VWRU5UUy5jbG9zZSwgY2FsbGJhY2spXG4gIH1cblxuICAvKipcbiAgICogSG9vayBpbnRvIGNoYW5uZWwgZXJyb3JzXG4gICAqIEBwYXJhbSB7RnVuY3Rpb259IGNhbGxiYWNrXG4gICAqL1xuICBvbkVycm9yKGNhbGxiYWNrKXtcbiAgICByZXR1cm4gdGhpcy5vbihDSEFOTkVMX0VWRU5UUy5lcnJvciwgcmVhc29uID0+IGNhbGxiYWNrKHJlYXNvbikpXG4gIH1cblxuICAvKipcbiAgICogU3Vic2NyaWJlcyBvbiBjaGFubmVsIGV2ZW50c1xuICAgKlxuICAgKiBTdWJzY3JpcHRpb24gcmV0dXJucyBhIHJlZiBjb3VudGVyLCB3aGljaCBjYW4gYmUgdXNlZCBsYXRlciB0b1xuICAgKiB1bnN1YnNjcmliZSB0aGUgZXhhY3QgZXZlbnQgbGlzdGVuZXJcbiAgICpcbiAgICogQGV4YW1wbGVcbiAgICogY29uc3QgcmVmMSA9IGNoYW5uZWwub24oXCJldmVudFwiLCBkb19zdHVmZilcbiAgICogY29uc3QgcmVmMiA9IGNoYW5uZWwub24oXCJldmVudFwiLCBkb19vdGhlcl9zdHVmZilcbiAgICogY2hhbm5lbC5vZmYoXCJldmVudFwiLCByZWYxKVxuICAgKiAvLyBTaW5jZSB1bnN1YnNjcmlwdGlvbiwgZG9fc3R1ZmYgd29uJ3QgZmlyZSxcbiAgICogLy8gd2hpbGUgZG9fb3RoZXJfc3R1ZmYgd2lsbCBrZWVwIGZpcmluZyBvbiB0aGUgXCJldmVudFwiXG4gICAqXG4gICAqIEBwYXJhbSB7c3RyaW5nfSBldmVudFxuICAgKiBAcGFyYW0ge0Z1bmN0aW9ufSBjYWxsYmFja1xuICAgKiBAcmV0dXJucyB7aW50ZWdlcn0gcmVmXG4gICAqL1xuICBvbihldmVudCwgY2FsbGJhY2spe1xuICAgIGxldCByZWYgPSB0aGlzLmJpbmRpbmdSZWYrK1xuICAgIHRoaXMuYmluZGluZ3MucHVzaCh7ZXZlbnQsIHJlZiwgY2FsbGJhY2t9KVxuICAgIHJldHVybiByZWZcbiAgfVxuXG4gIC8qKlxuICAgKiBVbnN1YnNjcmliZXMgb2ZmIG9mIGNoYW5uZWwgZXZlbnRzXG4gICAqXG4gICAqIFVzZSB0aGUgcmVmIHJldHVybmVkIGZyb20gYSBjaGFubmVsLm9uKCkgdG8gdW5zdWJzY3JpYmUgb25lXG4gICAqIGhhbmRsZXIsIG9yIHBhc3Mgbm90aGluZyBmb3IgdGhlIHJlZiB0byB1bnN1YnNjcmliZSBhbGxcbiAgICogaGFuZGxlcnMgZm9yIHRoZSBnaXZlbiBldmVudC5cbiAgICpcbiAgICogQGV4YW1wbGVcbiAgICogLy8gVW5zdWJzY3JpYmUgdGhlIGRvX3N0dWZmIGhhbmRsZXJcbiAgICogY29uc3QgcmVmMSA9IGNoYW5uZWwub24oXCJldmVudFwiLCBkb19zdHVmZilcbiAgICogY2hhbm5lbC5vZmYoXCJldmVudFwiLCByZWYxKVxuICAgKlxuICAgKiAvLyBVbnN1YnNjcmliZSBhbGwgaGFuZGxlcnMgZnJvbSBldmVudFxuICAgKiBjaGFubmVsLm9mZihcImV2ZW50XCIpXG4gICAqXG4gICAqIEBwYXJhbSB7c3RyaW5nfSBldmVudFxuICAgKiBAcGFyYW0ge2ludGVnZXJ9IHJlZlxuICAgKi9cbiAgb2ZmKGV2ZW50LCByZWYpe1xuICAgIHRoaXMuYmluZGluZ3MgPSB0aGlzLmJpbmRpbmdzLmZpbHRlcigoYmluZCkgPT4ge1xuICAgICAgcmV0dXJuICEoYmluZC5ldmVudCA9PT0gZXZlbnQgJiYgKHR5cGVvZiByZWYgPT09IFwidW5kZWZpbmVkXCIgfHwgcmVmID09PSBiaW5kLnJlZikpXG4gICAgfSlcbiAgfVxuXG4gIC8qKlxuICAgKiBAcHJpdmF0ZVxuICAgKi9cbiAgY2FuUHVzaCgpeyByZXR1cm4gdGhpcy5zb2NrZXQuaXNDb25uZWN0ZWQoKSAmJiB0aGlzLmlzSm9pbmVkKCkgfVxuXG4gIC8qKlxuICAgKiBTZW5kcyBhIG1lc3NhZ2UgYGV2ZW50YCB0byBwaG9lbml4IHdpdGggdGhlIHBheWxvYWQgYHBheWxvYWRgLlxuICAgKiBQaG9lbml4IHJlY2VpdmVzIHRoaXMgaW4gdGhlIGBoYW5kbGVfaW4oZXZlbnQsIHBheWxvYWQsIHNvY2tldClgXG4gICAqIGZ1bmN0aW9uLiBpZiBwaG9lbml4IHJlcGxpZXMgb3IgaXQgdGltZXMgb3V0IChkZWZhdWx0IDEwMDAwbXMpLFxuICAgKiB0aGVuIG9wdGlvbmFsbHkgdGhlIHJlcGx5IGNhbiBiZSByZWNlaXZlZC5cbiAgICpcbiAgICogQGV4YW1wbGVcbiAgICogY2hhbm5lbC5wdXNoKFwiZXZlbnRcIilcbiAgICogICAucmVjZWl2ZShcIm9rXCIsIHBheWxvYWQgPT4gY29uc29sZS5sb2coXCJwaG9lbml4IHJlcGxpZWQ6XCIsIHBheWxvYWQpKVxuICAgKiAgIC5yZWNlaXZlKFwiZXJyb3JcIiwgZXJyID0+IGNvbnNvbGUubG9nKFwicGhvZW5peCBlcnJvcmVkXCIsIGVycikpXG4gICAqICAgLnJlY2VpdmUoXCJ0aW1lb3V0XCIsICgpID0+IGNvbnNvbGUubG9nKFwidGltZWQgb3V0IHB1c2hpbmdcIikpXG4gICAqIEBwYXJhbSB7c3RyaW5nfSBldmVudFxuICAgKiBAcGFyYW0ge09iamVjdH0gcGF5bG9hZFxuICAgKiBAcGFyYW0ge251bWJlcn0gW3RpbWVvdXRdXG4gICAqIEByZXR1cm5zIHtQdXNofVxuICAgKi9cbiAgcHVzaChldmVudCwgcGF5bG9hZCwgdGltZW91dCA9IHRoaXMudGltZW91dCl7XG4gICAgcGF5bG9hZCA9IHBheWxvYWQgfHwge31cbiAgICBpZighdGhpcy5qb2luZWRPbmNlKXtcbiAgICAgIHRocm93IG5ldyBFcnJvcihgdHJpZWQgdG8gcHVzaCAnJHtldmVudH0nIHRvICcke3RoaXMudG9waWN9JyBiZWZvcmUgam9pbmluZy4gVXNlIGNoYW5uZWwuam9pbigpIGJlZm9yZSBwdXNoaW5nIGV2ZW50c2ApXG4gICAgfVxuICAgIGxldCBwdXNoRXZlbnQgPSBuZXcgUHVzaCh0aGlzLCBldmVudCwgZnVuY3Rpb24gKCl7IHJldHVybiBwYXlsb2FkIH0sIHRpbWVvdXQpXG4gICAgaWYodGhpcy5jYW5QdXNoKCkpe1xuICAgICAgcHVzaEV2ZW50LnNlbmQoKVxuICAgIH0gZWxzZSB7XG4gICAgICBwdXNoRXZlbnQuc3RhcnRUaW1lb3V0KClcbiAgICAgIHRoaXMucHVzaEJ1ZmZlci5wdXNoKHB1c2hFdmVudClcbiAgICB9XG5cbiAgICByZXR1cm4gcHVzaEV2ZW50XG4gIH1cblxuICAvKiogTGVhdmVzIHRoZSBjaGFubmVsXG4gICAqXG4gICAqIFVuc3Vic2NyaWJlcyBmcm9tIHNlcnZlciBldmVudHMsIGFuZFxuICAgKiBpbnN0cnVjdHMgY2hhbm5lbCB0byB0ZXJtaW5hdGUgb24gc2VydmVyXG4gICAqXG4gICAqIFRyaWdnZXJzIG9uQ2xvc2UoKSBob29rc1xuICAgKlxuICAgKiBUbyByZWNlaXZlIGxlYXZlIGFja25vd2xlZGdlbWVudHMsIHVzZSB0aGUgYHJlY2VpdmVgXG4gICAqIGhvb2sgdG8gYmluZCB0byB0aGUgc2VydmVyIGFjaywgaWU6XG4gICAqXG4gICAqIEBleGFtcGxlXG4gICAqIGNoYW5uZWwubGVhdmUoKS5yZWNlaXZlKFwib2tcIiwgKCkgPT4gYWxlcnQoXCJsZWZ0IVwiKSApXG4gICAqXG4gICAqIEBwYXJhbSB7aW50ZWdlcn0gdGltZW91dFxuICAgKiBAcmV0dXJucyB7UHVzaH1cbiAgICovXG4gIGxlYXZlKHRpbWVvdXQgPSB0aGlzLnRpbWVvdXQpe1xuICAgIHRoaXMucmVqb2luVGltZXIucmVzZXQoKVxuICAgIHRoaXMuam9pblB1c2guY2FuY2VsVGltZW91dCgpXG5cbiAgICB0aGlzLnN0YXRlID0gQ0hBTk5FTF9TVEFURVMubGVhdmluZ1xuICAgIGxldCBvbkNsb3NlID0gKCkgPT4ge1xuICAgICAgaWYodGhpcy5zb2NrZXQuaGFzTG9nZ2VyKCkpIHRoaXMuc29ja2V0LmxvZyhcImNoYW5uZWxcIiwgYGxlYXZlICR7dGhpcy50b3BpY31gKVxuICAgICAgdGhpcy50cmlnZ2VyKENIQU5ORUxfRVZFTlRTLmNsb3NlLCBcImxlYXZlXCIpXG4gICAgfVxuICAgIGxldCBsZWF2ZVB1c2ggPSBuZXcgUHVzaCh0aGlzLCBDSEFOTkVMX0VWRU5UUy5sZWF2ZSwgY2xvc3VyZSh7fSksIHRpbWVvdXQpXG4gICAgbGVhdmVQdXNoLnJlY2VpdmUoXCJva1wiLCAoKSA9PiBvbkNsb3NlKCkpXG4gICAgICAucmVjZWl2ZShcInRpbWVvdXRcIiwgKCkgPT4gb25DbG9zZSgpKVxuICAgIGxlYXZlUHVzaC5zZW5kKClcbiAgICBpZighdGhpcy5jYW5QdXNoKCkpeyBsZWF2ZVB1c2gudHJpZ2dlcihcIm9rXCIsIHt9KSB9XG5cbiAgICByZXR1cm4gbGVhdmVQdXNoXG4gIH1cblxuICAvKipcbiAgICogT3ZlcnJpZGFibGUgbWVzc2FnZSBob29rXG4gICAqXG4gICAqIFJlY2VpdmVzIGFsbCBldmVudHMgZm9yIHNwZWNpYWxpemVkIG1lc3NhZ2UgaGFuZGxpbmdcbiAgICogYmVmb3JlIGRpc3BhdGNoaW5nIHRvIHRoZSBjaGFubmVsIGNhbGxiYWNrcy5cbiAgICpcbiAgICogTXVzdCByZXR1cm4gdGhlIHBheWxvYWQsIG1vZGlmaWVkIG9yIHVubW9kaWZpZWRcbiAgICogQHBhcmFtIHtzdHJpbmd9IGV2ZW50XG4gICAqIEBwYXJhbSB7T2JqZWN0fSBwYXlsb2FkXG4gICAqIEBwYXJhbSB7aW50ZWdlcn0gcmVmXG4gICAqIEByZXR1cm5zIHtPYmplY3R9XG4gICAqL1xuICBvbk1lc3NhZ2UoX2V2ZW50LCBwYXlsb2FkLCBfcmVmKXsgcmV0dXJuIHBheWxvYWQgfVxuXG4gIC8qKlxuICAgKiBAcHJpdmF0ZVxuICAgKi9cbiAgaXNNZW1iZXIodG9waWMsIGV2ZW50LCBwYXlsb2FkLCBqb2luUmVmKXtcbiAgICBpZih0aGlzLnRvcGljICE9PSB0b3BpYyl7IHJldHVybiBmYWxzZSB9XG5cbiAgICBpZihqb2luUmVmICYmIGpvaW5SZWYgIT09IHRoaXMuam9pblJlZigpKXtcbiAgICAgIGlmKHRoaXMuc29ja2V0Lmhhc0xvZ2dlcigpKSB0aGlzLnNvY2tldC5sb2coXCJjaGFubmVsXCIsIFwiZHJvcHBpbmcgb3V0ZGF0ZWQgbWVzc2FnZVwiLCB7dG9waWMsIGV2ZW50LCBwYXlsb2FkLCBqb2luUmVmfSlcbiAgICAgIHJldHVybiBmYWxzZVxuICAgIH0gZWxzZSB7XG4gICAgICByZXR1cm4gdHJ1ZVxuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBAcHJpdmF0ZVxuICAgKi9cbiAgam9pblJlZigpeyByZXR1cm4gdGhpcy5qb2luUHVzaC5yZWYgfVxuXG4gIC8qKlxuICAgKiBAcHJpdmF0ZVxuICAgKi9cbiAgcmVqb2luKHRpbWVvdXQgPSB0aGlzLnRpbWVvdXQpe1xuICAgIGlmKHRoaXMuaXNMZWF2aW5nKCkpeyByZXR1cm4gfVxuICAgIHRoaXMuc29ja2V0LmxlYXZlT3BlblRvcGljKHRoaXMudG9waWMpXG4gICAgdGhpcy5zdGF0ZSA9IENIQU5ORUxfU1RBVEVTLmpvaW5pbmdcbiAgICB0aGlzLmpvaW5QdXNoLnJlc2VuZCh0aW1lb3V0KVxuICB9XG5cbiAgLyoqXG4gICAqIEBwcml2YXRlXG4gICAqL1xuICB0cmlnZ2VyKGV2ZW50LCBwYXlsb2FkLCByZWYsIGpvaW5SZWYpe1xuICAgIGxldCBoYW5kbGVkUGF5bG9hZCA9IHRoaXMub25NZXNzYWdlKGV2ZW50LCBwYXlsb2FkLCByZWYsIGpvaW5SZWYpXG4gICAgaWYocGF5bG9hZCAmJiAhaGFuZGxlZFBheWxvYWQpeyB0aHJvdyBuZXcgRXJyb3IoXCJjaGFubmVsIG9uTWVzc2FnZSBjYWxsYmFja3MgbXVzdCByZXR1cm4gdGhlIHBheWxvYWQsIG1vZGlmaWVkIG9yIHVubW9kaWZpZWRcIikgfVxuXG4gICAgbGV0IGV2ZW50QmluZGluZ3MgPSB0aGlzLmJpbmRpbmdzLmZpbHRlcihiaW5kID0+IGJpbmQuZXZlbnQgPT09IGV2ZW50KVxuXG4gICAgZm9yKGxldCBpID0gMDsgaSA8IGV2ZW50QmluZGluZ3MubGVuZ3RoOyBpKyspe1xuICAgICAgbGV0IGJpbmQgPSBldmVudEJpbmRpbmdzW2ldXG4gICAgICBiaW5kLmNhbGxiYWNrKGhhbmRsZWRQYXlsb2FkLCByZWYsIGpvaW5SZWYgfHwgdGhpcy5qb2luUmVmKCkpXG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIEBwcml2YXRlXG4gICAqL1xuICByZXBseUV2ZW50TmFtZShyZWYpeyByZXR1cm4gYGNoYW5fcmVwbHlfJHtyZWZ9YCB9XG5cbiAgLyoqXG4gICAqIEBwcml2YXRlXG4gICAqL1xuICBpc0Nsb3NlZCgpeyByZXR1cm4gdGhpcy5zdGF0ZSA9PT0gQ0hBTk5FTF9TVEFURVMuY2xvc2VkIH1cblxuICAvKipcbiAgICogQHByaXZhdGVcbiAgICovXG4gIGlzRXJyb3JlZCgpeyByZXR1cm4gdGhpcy5zdGF0ZSA9PT0gQ0hBTk5FTF9TVEFURVMuZXJyb3JlZCB9XG5cbiAgLyoqXG4gICAqIEBwcml2YXRlXG4gICAqL1xuICBpc0pvaW5lZCgpeyByZXR1cm4gdGhpcy5zdGF0ZSA9PT0gQ0hBTk5FTF9TVEFURVMuam9pbmVkIH1cblxuICAvKipcbiAgICogQHByaXZhdGVcbiAgICovXG4gIGlzSm9pbmluZygpeyByZXR1cm4gdGhpcy5zdGF0ZSA9PT0gQ0hBTk5FTF9TVEFURVMuam9pbmluZyB9XG5cbiAgLyoqXG4gICAqIEBwcml2YXRlXG4gICAqL1xuICBpc0xlYXZpbmcoKXsgcmV0dXJuIHRoaXMuc3RhdGUgPT09IENIQU5ORUxfU1RBVEVTLmxlYXZpbmcgfVxufVxuIiwgImltcG9ydCB7XG4gIGdsb2JhbCxcbiAgWEhSX1NUQVRFU1xufSBmcm9tIFwiLi9jb25zdGFudHNcIlxuXG5leHBvcnQgZGVmYXVsdCBjbGFzcyBBamF4IHtcblxuICBzdGF0aWMgcmVxdWVzdChtZXRob2QsIGVuZFBvaW50LCBoZWFkZXJzLCBib2R5LCB0aW1lb3V0LCBvbnRpbWVvdXQsIGNhbGxiYWNrKXtcbiAgICBpZihnbG9iYWwuWERvbWFpblJlcXVlc3Qpe1xuICAgICAgbGV0IHJlcSA9IG5ldyBnbG9iYWwuWERvbWFpblJlcXVlc3QoKSAvLyBJRTgsIElFOVxuICAgICAgcmV0dXJuIHRoaXMueGRvbWFpblJlcXVlc3QocmVxLCBtZXRob2QsIGVuZFBvaW50LCBib2R5LCB0aW1lb3V0LCBvbnRpbWVvdXQsIGNhbGxiYWNrKVxuICAgIH0gZWxzZSBpZihnbG9iYWwuWE1MSHR0cFJlcXVlc3Qpe1xuICAgICAgbGV0IHJlcSA9IG5ldyBnbG9iYWwuWE1MSHR0cFJlcXVlc3QoKSAvLyBJRTcrLCBGaXJlZm94LCBDaHJvbWUsIE9wZXJhLCBTYWZhcmlcbiAgICAgIHJldHVybiB0aGlzLnhoclJlcXVlc3QocmVxLCBtZXRob2QsIGVuZFBvaW50LCBoZWFkZXJzLCBib2R5LCB0aW1lb3V0LCBvbnRpbWVvdXQsIGNhbGxiYWNrKVxuICAgIH0gZWxzZSBpZihnbG9iYWwuZmV0Y2ggJiYgZ2xvYmFsLkFib3J0Q29udHJvbGxlcil7XG4gICAgICAvLyBGZXRjaCB3aXRoIEFib3J0Q29udHJvbGxlciBmb3IgbW9kZXJuIGJyb3dzZXJzXG4gICAgICByZXR1cm4gdGhpcy5mZXRjaFJlcXVlc3QobWV0aG9kLCBlbmRQb2ludCwgaGVhZGVycywgYm9keSwgdGltZW91dCwgb250aW1lb3V0LCBjYWxsYmFjaylcbiAgICB9IGVsc2Uge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKFwiTm8gc3VpdGFibGUgWE1MSHR0cFJlcXVlc3QgaW1wbGVtZW50YXRpb24gZm91bmRcIilcbiAgICB9XG4gIH1cblxuICBzdGF0aWMgZmV0Y2hSZXF1ZXN0KG1ldGhvZCwgZW5kUG9pbnQsIGhlYWRlcnMsIGJvZHksIHRpbWVvdXQsIG9udGltZW91dCwgY2FsbGJhY2spe1xuICAgIGxldCBvcHRpb25zID0ge1xuICAgICAgbWV0aG9kLFxuICAgICAgaGVhZGVycyxcbiAgICAgIGJvZHksXG4gICAgfVxuICAgIGxldCBjb250cm9sbGVyID0gbnVsbFxuICAgIGlmKHRpbWVvdXQpe1xuICAgICAgY29udHJvbGxlciA9IG5ldyBBYm9ydENvbnRyb2xsZXIoKVxuICAgICAgY29uc3QgX3RpbWVvdXRJZCA9IHNldFRpbWVvdXQoKCkgPT4gY29udHJvbGxlci5hYm9ydCgpLCB0aW1lb3V0KVxuICAgICAgb3B0aW9ucy5zaWduYWwgPSBjb250cm9sbGVyLnNpZ25hbFxuICAgIH1cbiAgICBnbG9iYWwuZmV0Y2goZW5kUG9pbnQsIG9wdGlvbnMpXG4gICAgICAudGhlbihyZXNwb25zZSA9PiByZXNwb25zZS50ZXh0KCkpXG4gICAgICAudGhlbihkYXRhID0+IHRoaXMucGFyc2VKU09OKGRhdGEpKVxuICAgICAgLnRoZW4oZGF0YSA9PiBjYWxsYmFjayAmJiBjYWxsYmFjayhkYXRhKSlcbiAgICAgIC5jYXRjaChlcnIgPT4ge1xuICAgICAgICBpZihlcnIubmFtZSA9PT0gXCJBYm9ydEVycm9yXCIgJiYgb250aW1lb3V0KXtcbiAgICAgICAgICBvbnRpbWVvdXQoKVxuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIGNhbGxiYWNrICYmIGNhbGxiYWNrKG51bGwpXG4gICAgICAgIH1cbiAgICAgIH0pXG4gICAgcmV0dXJuIGNvbnRyb2xsZXJcbiAgfVxuXG4gIHN0YXRpYyB4ZG9tYWluUmVxdWVzdChyZXEsIG1ldGhvZCwgZW5kUG9pbnQsIGJvZHksIHRpbWVvdXQsIG9udGltZW91dCwgY2FsbGJhY2spe1xuICAgIHJlcS50aW1lb3V0ID0gdGltZW91dFxuICAgIHJlcS5vcGVuKG1ldGhvZCwgZW5kUG9pbnQpXG4gICAgcmVxLm9ubG9hZCA9ICgpID0+IHtcbiAgICAgIGxldCByZXNwb25zZSA9IHRoaXMucGFyc2VKU09OKHJlcS5yZXNwb25zZVRleHQpXG4gICAgICBjYWxsYmFjayAmJiBjYWxsYmFjayhyZXNwb25zZSlcbiAgICB9XG4gICAgaWYob250aW1lb3V0KXsgcmVxLm9udGltZW91dCA9IG9udGltZW91dCB9XG5cbiAgICAvLyBXb3JrIGFyb3VuZCBidWcgaW4gSUU5IHRoYXQgcmVxdWlyZXMgYW4gYXR0YWNoZWQgb25wcm9ncmVzcyBoYW5kbGVyXG4gICAgcmVxLm9ucHJvZ3Jlc3MgPSAoKSA9PiB7IH1cblxuICAgIHJlcS5zZW5kKGJvZHkpXG4gICAgcmV0dXJuIHJlcVxuICB9XG5cbiAgc3RhdGljIHhoclJlcXVlc3QocmVxLCBtZXRob2QsIGVuZFBvaW50LCBoZWFkZXJzLCBib2R5LCB0aW1lb3V0LCBvbnRpbWVvdXQsIGNhbGxiYWNrKXtcbiAgICByZXEub3BlbihtZXRob2QsIGVuZFBvaW50LCB0cnVlKVxuICAgIHJlcS50aW1lb3V0ID0gdGltZW91dFxuICAgIGZvcihsZXQgW2tleSwgdmFsdWVdIG9mIE9iamVjdC5lbnRyaWVzKGhlYWRlcnMpKXtcbiAgICAgIHJlcS5zZXRSZXF1ZXN0SGVhZGVyKGtleSwgdmFsdWUpXG4gICAgfVxuICAgIHJlcS5vbmVycm9yID0gKCkgPT4gY2FsbGJhY2sgJiYgY2FsbGJhY2sobnVsbClcbiAgICByZXEub25yZWFkeXN0YXRlY2hhbmdlID0gKCkgPT4ge1xuICAgICAgaWYocmVxLnJlYWR5U3RhdGUgPT09IFhIUl9TVEFURVMuY29tcGxldGUgJiYgY2FsbGJhY2spe1xuICAgICAgICBsZXQgcmVzcG9uc2UgPSB0aGlzLnBhcnNlSlNPTihyZXEucmVzcG9uc2VUZXh0KVxuICAgICAgICBjYWxsYmFjayhyZXNwb25zZSlcbiAgICAgIH1cbiAgICB9XG4gICAgaWYob250aW1lb3V0KXsgcmVxLm9udGltZW91dCA9IG9udGltZW91dCB9XG5cbiAgICByZXEuc2VuZChib2R5KVxuICAgIHJldHVybiByZXFcbiAgfVxuXG4gIHN0YXRpYyBwYXJzZUpTT04ocmVzcCl7XG4gICAgaWYoIXJlc3AgfHwgcmVzcCA9PT0gXCJcIil7IHJldHVybiBudWxsIH1cblxuICAgIHRyeSB7XG4gICAgICByZXR1cm4gSlNPTi5wYXJzZShyZXNwKVxuICAgIH0gY2F0Y2gge1xuICAgICAgY29uc29sZSAmJiBjb25zb2xlLmxvZyhcImZhaWxlZCB0byBwYXJzZSBKU09OIHJlc3BvbnNlXCIsIHJlc3ApXG4gICAgICByZXR1cm4gbnVsbFxuICAgIH1cbiAgfVxuXG4gIHN0YXRpYyBzZXJpYWxpemUob2JqLCBwYXJlbnRLZXkpe1xuICAgIGxldCBxdWVyeVN0ciA9IFtdXG4gICAgZm9yKHZhciBrZXkgaW4gb2JqKXtcbiAgICAgIGlmKCFPYmplY3QucHJvdG90eXBlLmhhc093blByb3BlcnR5LmNhbGwob2JqLCBrZXkpKXsgY29udGludWUgfVxuICAgICAgbGV0IHBhcmFtS2V5ID0gcGFyZW50S2V5ID8gYCR7cGFyZW50S2V5fVske2tleX1dYCA6IGtleVxuICAgICAgbGV0IHBhcmFtVmFsID0gb2JqW2tleV1cbiAgICAgIGlmKHR5cGVvZiBwYXJhbVZhbCA9PT0gXCJvYmplY3RcIil7XG4gICAgICAgIHF1ZXJ5U3RyLnB1c2godGhpcy5zZXJpYWxpemUocGFyYW1WYWwsIHBhcmFtS2V5KSlcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHF1ZXJ5U3RyLnB1c2goZW5jb2RlVVJJQ29tcG9uZW50KHBhcmFtS2V5KSArIFwiPVwiICsgZW5jb2RlVVJJQ29tcG9uZW50KHBhcmFtVmFsKSlcbiAgICAgIH1cbiAgICB9XG4gICAgcmV0dXJuIHF1ZXJ5U3RyLmpvaW4oXCImXCIpXG4gIH1cblxuICBzdGF0aWMgYXBwZW5kUGFyYW1zKHVybCwgcGFyYW1zKXtcbiAgICBpZihPYmplY3Qua2V5cyhwYXJhbXMpLmxlbmd0aCA9PT0gMCl7IHJldHVybiB1cmwgfVxuXG4gICAgbGV0IHByZWZpeCA9IHVybC5tYXRjaCgvXFw/LykgPyBcIiZcIiA6IFwiP1wiXG4gICAgcmV0dXJuIGAke3VybH0ke3ByZWZpeH0ke3RoaXMuc2VyaWFsaXplKHBhcmFtcyl9YFxuICB9XG59XG4iLCAiaW1wb3J0IHtcbiAgU09DS0VUX1NUQVRFUyxcbiAgVFJBTlNQT1JUUyxcbiAgQVVUSF9UT0tFTl9QUkVGSVhcbn0gZnJvbSBcIi4vY29uc3RhbnRzXCJcblxuaW1wb3J0IEFqYXggZnJvbSBcIi4vYWpheFwiXG5cbmxldCBhcnJheUJ1ZmZlclRvQmFzZTY0ID0gKGJ1ZmZlcikgPT4ge1xuICBsZXQgYmluYXJ5ID0gXCJcIlxuICBsZXQgYnl0ZXMgPSBuZXcgVWludDhBcnJheShidWZmZXIpXG4gIGxldCBsZW4gPSBieXRlcy5ieXRlTGVuZ3RoXG4gIGZvcihsZXQgaSA9IDA7IGkgPCBsZW47IGkrKyl7IGJpbmFyeSArPSBTdHJpbmcuZnJvbUNoYXJDb2RlKGJ5dGVzW2ldKSB9XG4gIHJldHVybiBidG9hKGJpbmFyeSlcbn1cblxuZXhwb3J0IGRlZmF1bHQgY2xhc3MgTG9uZ1BvbGwge1xuXG4gIGNvbnN0cnVjdG9yKGVuZFBvaW50LCBwcm90b2NvbHMpe1xuICAgIC8vIHdlIG9ubHkgc3VwcG9ydCBzdWJwcm90b2NvbHMgZm9yIGF1dGhUb2tlblxuICAgIC8vIFtcInBob2VuaXhcIiwgXCJiYXNlNjR1cmwuYmVhcmVyLnBoeC5CQVNFNjRfRU5DT0RFRF9UT0tFTlwiXVxuICAgIGlmKHByb3RvY29scyAmJiBwcm90b2NvbHMubGVuZ3RoID09PSAyICYmIHByb3RvY29sc1sxXS5zdGFydHNXaXRoKEFVVEhfVE9LRU5fUFJFRklYKSl7XG4gICAgICB0aGlzLmF1dGhUb2tlbiA9IGF0b2IocHJvdG9jb2xzWzFdLnNsaWNlKEFVVEhfVE9LRU5fUFJFRklYLmxlbmd0aCkpXG4gICAgfVxuICAgIHRoaXMuZW5kUG9pbnQgPSBudWxsXG4gICAgdGhpcy50b2tlbiA9IG51bGxcbiAgICB0aGlzLnNraXBIZWFydGJlYXQgPSB0cnVlXG4gICAgdGhpcy5yZXFzID0gbmV3IFNldCgpXG4gICAgdGhpcy5hd2FpdGluZ0JhdGNoQWNrID0gZmFsc2VcbiAgICB0aGlzLmN1cnJlbnRCYXRjaCA9IG51bGxcbiAgICB0aGlzLmN1cnJlbnRCYXRjaFRpbWVyID0gbnVsbFxuICAgIHRoaXMuYmF0Y2hCdWZmZXIgPSBbXVxuICAgIHRoaXMub25vcGVuID0gZnVuY3Rpb24gKCl7IH0gLy8gbm9vcFxuICAgIHRoaXMub25lcnJvciA9IGZ1bmN0aW9uICgpeyB9IC8vIG5vb3BcbiAgICB0aGlzLm9ubWVzc2FnZSA9IGZ1bmN0aW9uICgpeyB9IC8vIG5vb3BcbiAgICB0aGlzLm9uY2xvc2UgPSBmdW5jdGlvbiAoKXsgfSAvLyBub29wXG4gICAgdGhpcy5wb2xsRW5kcG9pbnQgPSB0aGlzLm5vcm1hbGl6ZUVuZHBvaW50KGVuZFBvaW50KVxuICAgIHRoaXMucmVhZHlTdGF0ZSA9IFNPQ0tFVF9TVEFURVMuY29ubmVjdGluZ1xuICAgIC8vIHdlIG11c3Qgd2FpdCBmb3IgdGhlIGNhbGxlciB0byBmaW5pc2ggc2V0dGluZyB1cCBvdXIgY2FsbGJhY2tzIGFuZCB0aW1lb3V0IHByb3BlcnRpZXNcbiAgICBzZXRUaW1lb3V0KCgpID0+IHRoaXMucG9sbCgpLCAwKVxuICB9XG5cbiAgbm9ybWFsaXplRW5kcG9pbnQoZW5kUG9pbnQpe1xuICAgIHJldHVybiAoZW5kUG9pbnRcbiAgICAgIC5yZXBsYWNlKFwid3M6Ly9cIiwgXCJodHRwOi8vXCIpXG4gICAgICAucmVwbGFjZShcIndzczovL1wiLCBcImh0dHBzOi8vXCIpXG4gICAgICAucmVwbGFjZShuZXcgUmVnRXhwKFwiKC4qKVxcL1wiICsgVFJBTlNQT1JUUy53ZWJzb2NrZXQpLCBcIiQxL1wiICsgVFJBTlNQT1JUUy5sb25ncG9sbCkpXG4gIH1cblxuICBlbmRwb2ludFVSTCgpe1xuICAgIHJldHVybiBBamF4LmFwcGVuZFBhcmFtcyh0aGlzLnBvbGxFbmRwb2ludCwge3Rva2VuOiB0aGlzLnRva2VufSlcbiAgfVxuXG4gIGNsb3NlQW5kUmV0cnkoY29kZSwgcmVhc29uLCB3YXNDbGVhbil7XG4gICAgdGhpcy5jbG9zZShjb2RlLCByZWFzb24sIHdhc0NsZWFuKVxuICAgIHRoaXMucmVhZHlTdGF0ZSA9IFNPQ0tFVF9TVEFURVMuY29ubmVjdGluZ1xuICB9XG5cbiAgb250aW1lb3V0KCl7XG4gICAgdGhpcy5vbmVycm9yKFwidGltZW91dFwiKVxuICAgIHRoaXMuY2xvc2VBbmRSZXRyeSgxMDA1LCBcInRpbWVvdXRcIiwgZmFsc2UpXG4gIH1cblxuICBpc0FjdGl2ZSgpeyByZXR1cm4gdGhpcy5yZWFkeVN0YXRlID09PSBTT0NLRVRfU1RBVEVTLm9wZW4gfHwgdGhpcy5yZWFkeVN0YXRlID09PSBTT0NLRVRfU1RBVEVTLmNvbm5lY3RpbmcgfVxuXG4gIHBvbGwoKXtcbiAgICBjb25zdCBoZWFkZXJzID0ge1wiQWNjZXB0XCI6IFwiYXBwbGljYXRpb24vanNvblwifVxuICAgIGlmKHRoaXMuYXV0aFRva2VuKXtcbiAgICAgIGhlYWRlcnNbXCJYLVBob2VuaXgtQXV0aFRva2VuXCJdID0gdGhpcy5hdXRoVG9rZW5cbiAgICB9XG4gICAgdGhpcy5hamF4KFwiR0VUXCIsIGhlYWRlcnMsIG51bGwsICgpID0+IHRoaXMub250aW1lb3V0KCksIHJlc3AgPT4ge1xuICAgICAgaWYocmVzcCl7XG4gICAgICAgIHZhciB7c3RhdHVzLCB0b2tlbiwgbWVzc2FnZXN9ID0gcmVzcFxuICAgICAgICB0aGlzLnRva2VuID0gdG9rZW5cbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHN0YXR1cyA9IDBcbiAgICAgIH1cblxuICAgICAgc3dpdGNoKHN0YXR1cyl7XG4gICAgICAgIGNhc2UgMjAwOlxuICAgICAgICAgIG1lc3NhZ2VzLmZvckVhY2gobXNnID0+IHtcbiAgICAgICAgICAgIC8vIFRhc2tzIGFyZSB3aGF0IHRoaW5ncyBsaWtlIGV2ZW50IGhhbmRsZXJzLCBzZXRUaW1lb3V0IGNhbGxiYWNrcyxcbiAgICAgICAgICAgIC8vIHByb21pc2UgcmVzb2x2ZXMgYW5kIG1vcmUgYXJlIHJ1biB3aXRoaW4uXG4gICAgICAgICAgICAvLyBJbiBtb2Rlcm4gYnJvd3NlcnMsIHRoZXJlIGFyZSB0d28gZGlmZmVyZW50IGtpbmRzIG9mIHRhc2tzLFxuICAgICAgICAgICAgLy8gbWljcm90YXNrcyBhbmQgbWFjcm90YXNrcy5cbiAgICAgICAgICAgIC8vIE1pY3JvdGFza3MgYXJlIG1haW5seSB1c2VkIGZvciBQcm9taXNlcywgd2hpbGUgbWFjcm90YXNrcyBhcmVcbiAgICAgICAgICAgIC8vIHVzZWQgZm9yIGV2ZXJ5dGhpbmcgZWxzZS5cbiAgICAgICAgICAgIC8vIE1pY3JvdGFza3MgYWx3YXlzIGhhdmUgcHJpb3JpdHkgb3ZlciBtYWNyb3Rhc2tzLiBJZiB0aGUgSlMgZW5naW5lXG4gICAgICAgICAgICAvLyBpcyBsb29raW5nIGZvciBhIHRhc2sgdG8gcnVuLCBpdCB3aWxsIGFsd2F5cyB0cnkgdG8gZW1wdHkgdGhlXG4gICAgICAgICAgICAvLyBtaWNyb3Rhc2sgcXVldWUgYmVmb3JlIGF0dGVtcHRpbmcgdG8gcnVuIGFueXRoaW5nIGZyb20gdGhlXG4gICAgICAgICAgICAvLyBtYWNyb3Rhc2sgcXVldWUuXG4gICAgICAgICAgICAvL1xuICAgICAgICAgICAgLy8gRm9yIHRoZSBXZWJTb2NrZXQgdHJhbnNwb3J0LCBtZXNzYWdlcyBhbHdheXMgYXJyaXZlIGluIHRoZWlyIG93blxuICAgICAgICAgICAgLy8gZXZlbnQuIFRoaXMgbWVhbnMgdGhhdCBpZiBhbnkgcHJvbWlzZXMgYXJlIHJlc29sdmVkIGZyb20gd2l0aGluLFxuICAgICAgICAgICAgLy8gdGhlaXIgY2FsbGJhY2tzIHdpbGwgYWx3YXlzIGZpbmlzaCBleGVjdXRpb24gYnkgdGhlIHRpbWUgdGhlXG4gICAgICAgICAgICAvLyBuZXh0IG1lc3NhZ2UgZXZlbnQgaGFuZGxlciBpcyBydW4uXG4gICAgICAgICAgICAvL1xuICAgICAgICAgICAgLy8gSW4gb3JkZXIgdG8gZW11bGF0ZSB0aGlzIGJlaGF2aW91ciwgd2UgbmVlZCB0byBtYWtlIHN1cmUgZWFjaFxuICAgICAgICAgICAgLy8gb25tZXNzYWdlIGhhbmRsZXIgaXMgcnVuIHdpdGhpbiBpdHMgb3duIG1hY3JvdGFzay5cbiAgICAgICAgICAgIHNldFRpbWVvdXQoKCkgPT4gdGhpcy5vbm1lc3NhZ2Uoe2RhdGE6IG1zZ30pLCAwKVxuICAgICAgICAgIH0pXG4gICAgICAgICAgdGhpcy5wb2xsKClcbiAgICAgICAgICBicmVha1xuICAgICAgICBjYXNlIDIwNDpcbiAgICAgICAgICB0aGlzLnBvbGwoKVxuICAgICAgICAgIGJyZWFrXG4gICAgICAgIGNhc2UgNDEwOlxuICAgICAgICAgIHRoaXMucmVhZHlTdGF0ZSA9IFNPQ0tFVF9TVEFURVMub3BlblxuICAgICAgICAgIHRoaXMub25vcGVuKHt9KVxuICAgICAgICAgIHRoaXMucG9sbCgpXG4gICAgICAgICAgYnJlYWtcbiAgICAgICAgY2FzZSA0MDM6XG4gICAgICAgICAgdGhpcy5vbmVycm9yKDQwMylcbiAgICAgICAgICB0aGlzLmNsb3NlKDEwMDgsIFwiZm9yYmlkZGVuXCIsIGZhbHNlKVxuICAgICAgICAgIGJyZWFrXG4gICAgICAgIGNhc2UgMDpcbiAgICAgICAgY2FzZSA1MDA6XG4gICAgICAgICAgdGhpcy5vbmVycm9yKDUwMClcbiAgICAgICAgICB0aGlzLmNsb3NlQW5kUmV0cnkoMTAxMSwgXCJpbnRlcm5hbCBzZXJ2ZXIgZXJyb3JcIiwgNTAwKVxuICAgICAgICAgIGJyZWFrXG4gICAgICAgIGRlZmF1bHQ6IHRocm93IG5ldyBFcnJvcihgdW5oYW5kbGVkIHBvbGwgc3RhdHVzICR7c3RhdHVzfWApXG4gICAgICB9XG4gICAgfSlcbiAgfVxuXG4gIC8vIHdlIGNvbGxlY3QgYWxsIHB1c2hlcyB3aXRoaW4gdGhlIGN1cnJlbnQgZXZlbnQgbG9vcCBieVxuICAvLyBzZXRUaW1lb3V0IDAsIHdoaWNoIG9wdGltaXplcyBiYWNrLXRvLWJhY2sgcHJvY2VkdXJhbFxuICAvLyBwdXNoZXMgYWdhaW5zdCBhbiBlbXB0eSBidWZmZXJcblxuICBzZW5kKGJvZHkpe1xuICAgIGlmKHR5cGVvZihib2R5KSAhPT0gXCJzdHJpbmdcIil7IGJvZHkgPSBhcnJheUJ1ZmZlclRvQmFzZTY0KGJvZHkpIH1cbiAgICBpZih0aGlzLmN1cnJlbnRCYXRjaCl7XG4gICAgICB0aGlzLmN1cnJlbnRCYXRjaC5wdXNoKGJvZHkpXG4gICAgfSBlbHNlIGlmKHRoaXMuYXdhaXRpbmdCYXRjaEFjayl7XG4gICAgICB0aGlzLmJhdGNoQnVmZmVyLnB1c2goYm9keSlcbiAgICB9IGVsc2Uge1xuICAgICAgdGhpcy5jdXJyZW50QmF0Y2ggPSBbYm9keV1cbiAgICAgIHRoaXMuY3VycmVudEJhdGNoVGltZXIgPSBzZXRUaW1lb3V0KCgpID0+IHtcbiAgICAgICAgdGhpcy5iYXRjaFNlbmQodGhpcy5jdXJyZW50QmF0Y2gpXG4gICAgICAgIHRoaXMuY3VycmVudEJhdGNoID0gbnVsbFxuICAgICAgfSwgMClcbiAgICB9XG4gIH1cblxuICBiYXRjaFNlbmQobWVzc2FnZXMpe1xuICAgIHRoaXMuYXdhaXRpbmdCYXRjaEFjayA9IHRydWVcbiAgICB0aGlzLmFqYXgoXCJQT1NUXCIsIHtcIkNvbnRlbnQtVHlwZVwiOiBcImFwcGxpY2F0aW9uL3gtbmRqc29uXCJ9LCBtZXNzYWdlcy5qb2luKFwiXFxuXCIpLCAoKSA9PiB0aGlzLm9uZXJyb3IoXCJ0aW1lb3V0XCIpLCByZXNwID0+IHtcbiAgICAgIHRoaXMuYXdhaXRpbmdCYXRjaEFjayA9IGZhbHNlXG4gICAgICBpZighcmVzcCB8fCByZXNwLnN0YXR1cyAhPT0gMjAwKXtcbiAgICAgICAgdGhpcy5vbmVycm9yKHJlc3AgJiYgcmVzcC5zdGF0dXMpXG4gICAgICAgIHRoaXMuY2xvc2VBbmRSZXRyeSgxMDExLCBcImludGVybmFsIHNlcnZlciBlcnJvclwiLCBmYWxzZSlcbiAgICAgIH0gZWxzZSBpZih0aGlzLmJhdGNoQnVmZmVyLmxlbmd0aCA+IDApe1xuICAgICAgICB0aGlzLmJhdGNoU2VuZCh0aGlzLmJhdGNoQnVmZmVyKVxuICAgICAgICB0aGlzLmJhdGNoQnVmZmVyID0gW11cbiAgICAgIH1cbiAgICB9KVxuICB9XG5cbiAgY2xvc2UoY29kZSwgcmVhc29uLCB3YXNDbGVhbil7XG4gICAgZm9yKGxldCByZXEgb2YgdGhpcy5yZXFzKXsgcmVxLmFib3J0KCkgfVxuICAgIHRoaXMucmVhZHlTdGF0ZSA9IFNPQ0tFVF9TVEFURVMuY2xvc2VkXG4gICAgbGV0IG9wdHMgPSBPYmplY3QuYXNzaWduKHtjb2RlOiAxMDAwLCByZWFzb246IHVuZGVmaW5lZCwgd2FzQ2xlYW46IHRydWV9LCB7Y29kZSwgcmVhc29uLCB3YXNDbGVhbn0pXG4gICAgdGhpcy5iYXRjaEJ1ZmZlciA9IFtdXG4gICAgY2xlYXJUaW1lb3V0KHRoaXMuY3VycmVudEJhdGNoVGltZXIpXG4gICAgdGhpcy5jdXJyZW50QmF0Y2hUaW1lciA9IG51bGxcbiAgICBpZih0eXBlb2YoQ2xvc2VFdmVudCkgIT09IFwidW5kZWZpbmVkXCIpe1xuICAgICAgdGhpcy5vbmNsb3NlKG5ldyBDbG9zZUV2ZW50KFwiY2xvc2VcIiwgb3B0cykpXG4gICAgfSBlbHNlIHtcbiAgICAgIHRoaXMub25jbG9zZShvcHRzKVxuICAgIH1cbiAgfVxuXG4gIGFqYXgobWV0aG9kLCBoZWFkZXJzLCBib2R5LCBvbkNhbGxlclRpbWVvdXQsIGNhbGxiYWNrKXtcbiAgICBsZXQgcmVxXG4gICAgbGV0IG9udGltZW91dCA9ICgpID0+IHtcbiAgICAgIHRoaXMucmVxcy5kZWxldGUocmVxKVxuICAgICAgb25DYWxsZXJUaW1lb3V0KClcbiAgICB9XG4gICAgcmVxID0gQWpheC5yZXF1ZXN0KG1ldGhvZCwgdGhpcy5lbmRwb2ludFVSTCgpLCBoZWFkZXJzLCBib2R5LCB0aGlzLnRpbWVvdXQsIG9udGltZW91dCwgcmVzcCA9PiB7XG4gICAgICB0aGlzLnJlcXMuZGVsZXRlKHJlcSlcbiAgICAgIGlmKHRoaXMuaXNBY3RpdmUoKSl7IGNhbGxiYWNrKHJlc3ApIH1cbiAgICB9KVxuICAgIHRoaXMucmVxcy5hZGQocmVxKVxuICB9XG59XG4iLCAiLyoqXG4gKiBJbml0aWFsaXplcyB0aGUgUHJlc2VuY2VcbiAqIEBwYXJhbSB7Q2hhbm5lbH0gY2hhbm5lbCAtIFRoZSBDaGFubmVsXG4gKiBAcGFyYW0ge09iamVjdH0gb3B0cyAtIFRoZSBvcHRpb25zLFxuICogICAgICAgIGZvciBleGFtcGxlIGB7ZXZlbnRzOiB7c3RhdGU6IFwic3RhdGVcIiwgZGlmZjogXCJkaWZmXCJ9fWBcbiAqL1xuZXhwb3J0IGRlZmF1bHQgY2xhc3MgUHJlc2VuY2Uge1xuXG4gIGNvbnN0cnVjdG9yKGNoYW5uZWwsIG9wdHMgPSB7fSl7XG4gICAgbGV0IGV2ZW50cyA9IG9wdHMuZXZlbnRzIHx8IHtzdGF0ZTogXCJwcmVzZW5jZV9zdGF0ZVwiLCBkaWZmOiBcInByZXNlbmNlX2RpZmZcIn1cbiAgICB0aGlzLnN0YXRlID0ge31cbiAgICB0aGlzLnBlbmRpbmdEaWZmcyA9IFtdXG4gICAgdGhpcy5jaGFubmVsID0gY2hhbm5lbFxuICAgIHRoaXMuam9pblJlZiA9IG51bGxcbiAgICB0aGlzLmNhbGxlciA9IHtcbiAgICAgIG9uSm9pbjogZnVuY3Rpb24gKCl7IH0sXG4gICAgICBvbkxlYXZlOiBmdW5jdGlvbiAoKXsgfSxcbiAgICAgIG9uU3luYzogZnVuY3Rpb24gKCl7IH1cbiAgICB9XG5cbiAgICB0aGlzLmNoYW5uZWwub24oZXZlbnRzLnN0YXRlLCBuZXdTdGF0ZSA9PiB7XG4gICAgICBsZXQge29uSm9pbiwgb25MZWF2ZSwgb25TeW5jfSA9IHRoaXMuY2FsbGVyXG5cbiAgICAgIHRoaXMuam9pblJlZiA9IHRoaXMuY2hhbm5lbC5qb2luUmVmKClcbiAgICAgIHRoaXMuc3RhdGUgPSBQcmVzZW5jZS5zeW5jU3RhdGUodGhpcy5zdGF0ZSwgbmV3U3RhdGUsIG9uSm9pbiwgb25MZWF2ZSlcblxuICAgICAgdGhpcy5wZW5kaW5nRGlmZnMuZm9yRWFjaChkaWZmID0+IHtcbiAgICAgICAgdGhpcy5zdGF0ZSA9IFByZXNlbmNlLnN5bmNEaWZmKHRoaXMuc3RhdGUsIGRpZmYsIG9uSm9pbiwgb25MZWF2ZSlcbiAgICAgIH0pXG4gICAgICB0aGlzLnBlbmRpbmdEaWZmcyA9IFtdXG4gICAgICBvblN5bmMoKVxuICAgIH0pXG5cbiAgICB0aGlzLmNoYW5uZWwub24oZXZlbnRzLmRpZmYsIGRpZmYgPT4ge1xuICAgICAgbGV0IHtvbkpvaW4sIG9uTGVhdmUsIG9uU3luY30gPSB0aGlzLmNhbGxlclxuXG4gICAgICBpZih0aGlzLmluUGVuZGluZ1N5bmNTdGF0ZSgpKXtcbiAgICAgICAgdGhpcy5wZW5kaW5nRGlmZnMucHVzaChkaWZmKVxuICAgICAgfSBlbHNlIHtcbiAgICAgICAgdGhpcy5zdGF0ZSA9IFByZXNlbmNlLnN5bmNEaWZmKHRoaXMuc3RhdGUsIGRpZmYsIG9uSm9pbiwgb25MZWF2ZSlcbiAgICAgICAgb25TeW5jKClcbiAgICAgIH1cbiAgICB9KVxuICB9XG5cbiAgb25Kb2luKGNhbGxiYWNrKXsgdGhpcy5jYWxsZXIub25Kb2luID0gY2FsbGJhY2sgfVxuXG4gIG9uTGVhdmUoY2FsbGJhY2speyB0aGlzLmNhbGxlci5vbkxlYXZlID0gY2FsbGJhY2sgfVxuXG4gIG9uU3luYyhjYWxsYmFjayl7IHRoaXMuY2FsbGVyLm9uU3luYyA9IGNhbGxiYWNrIH1cblxuICBsaXN0KGJ5KXsgcmV0dXJuIFByZXNlbmNlLmxpc3QodGhpcy5zdGF0ZSwgYnkpIH1cblxuICBpblBlbmRpbmdTeW5jU3RhdGUoKXtcbiAgICByZXR1cm4gIXRoaXMuam9pblJlZiB8fCAodGhpcy5qb2luUmVmICE9PSB0aGlzLmNoYW5uZWwuam9pblJlZigpKVxuICB9XG5cbiAgLy8gbG93ZXItbGV2ZWwgcHVibGljIHN0YXRpYyBBUElcblxuICAvKipcbiAgICogVXNlZCB0byBzeW5jIHRoZSBsaXN0IG9mIHByZXNlbmNlcyBvbiB0aGUgc2VydmVyXG4gICAqIHdpdGggdGhlIGNsaWVudCdzIHN0YXRlLiBBbiBvcHRpb25hbCBgb25Kb2luYCBhbmQgYG9uTGVhdmVgIGNhbGxiYWNrIGNhblxuICAgKiBiZSBwcm92aWRlZCB0byByZWFjdCB0byBjaGFuZ2VzIGluIHRoZSBjbGllbnQncyBsb2NhbCBwcmVzZW5jZXMgYWNyb3NzXG4gICAqIGRpc2Nvbm5lY3RzIGFuZCByZWNvbm5lY3RzIHdpdGggdGhlIHNlcnZlci5cbiAgICpcbiAgICogQHJldHVybnMge1ByZXNlbmNlfVxuICAgKi9cbiAgc3RhdGljIHN5bmNTdGF0ZShjdXJyZW50U3RhdGUsIG5ld1N0YXRlLCBvbkpvaW4sIG9uTGVhdmUpe1xuICAgIGxldCBzdGF0ZSA9IHRoaXMuY2xvbmUoY3VycmVudFN0YXRlKVxuICAgIGxldCBqb2lucyA9IHt9XG4gICAgbGV0IGxlYXZlcyA9IHt9XG5cbiAgICB0aGlzLm1hcChzdGF0ZSwgKGtleSwgcHJlc2VuY2UpID0+IHtcbiAgICAgIGlmKCFuZXdTdGF0ZVtrZXldKXtcbiAgICAgICAgbGVhdmVzW2tleV0gPSBwcmVzZW5jZVxuICAgICAgfVxuICAgIH0pXG4gICAgdGhpcy5tYXAobmV3U3RhdGUsIChrZXksIG5ld1ByZXNlbmNlKSA9PiB7XG4gICAgICBsZXQgY3VycmVudFByZXNlbmNlID0gc3RhdGVba2V5XVxuICAgICAgaWYoY3VycmVudFByZXNlbmNlKXtcbiAgICAgICAgbGV0IG5ld1JlZnMgPSBuZXdQcmVzZW5jZS5tZXRhcy5tYXAobSA9PiBtLnBoeF9yZWYpXG4gICAgICAgIGxldCBjdXJSZWZzID0gY3VycmVudFByZXNlbmNlLm1ldGFzLm1hcChtID0+IG0ucGh4X3JlZilcbiAgICAgICAgbGV0IGpvaW5lZE1ldGFzID0gbmV3UHJlc2VuY2UubWV0YXMuZmlsdGVyKG0gPT4gY3VyUmVmcy5pbmRleE9mKG0ucGh4X3JlZikgPCAwKVxuICAgICAgICBsZXQgbGVmdE1ldGFzID0gY3VycmVudFByZXNlbmNlLm1ldGFzLmZpbHRlcihtID0+IG5ld1JlZnMuaW5kZXhPZihtLnBoeF9yZWYpIDwgMClcbiAgICAgICAgaWYoam9pbmVkTWV0YXMubGVuZ3RoID4gMCl7XG4gICAgICAgICAgam9pbnNba2V5XSA9IG5ld1ByZXNlbmNlXG4gICAgICAgICAgam9pbnNba2V5XS5tZXRhcyA9IGpvaW5lZE1ldGFzXG4gICAgICAgIH1cbiAgICAgICAgaWYobGVmdE1ldGFzLmxlbmd0aCA+IDApe1xuICAgICAgICAgIGxlYXZlc1trZXldID0gdGhpcy5jbG9uZShjdXJyZW50UHJlc2VuY2UpXG4gICAgICAgICAgbGVhdmVzW2tleV0ubWV0YXMgPSBsZWZ0TWV0YXNcbiAgICAgICAgfVxuICAgICAgfSBlbHNlIHtcbiAgICAgICAgam9pbnNba2V5XSA9IG5ld1ByZXNlbmNlXG4gICAgICB9XG4gICAgfSlcbiAgICByZXR1cm4gdGhpcy5zeW5jRGlmZihzdGF0ZSwge2pvaW5zOiBqb2lucywgbGVhdmVzOiBsZWF2ZXN9LCBvbkpvaW4sIG9uTGVhdmUpXG4gIH1cblxuICAvKipcbiAgICpcbiAgICogVXNlZCB0byBzeW5jIGEgZGlmZiBvZiBwcmVzZW5jZSBqb2luIGFuZCBsZWF2ZVxuICAgKiBldmVudHMgZnJvbSB0aGUgc2VydmVyLCBhcyB0aGV5IGhhcHBlbi4gTGlrZSBgc3luY1N0YXRlYCwgYHN5bmNEaWZmYFxuICAgKiBhY2NlcHRzIG9wdGlvbmFsIGBvbkpvaW5gIGFuZCBgb25MZWF2ZWAgY2FsbGJhY2tzIHRvIHJlYWN0IHRvIGEgdXNlclxuICAgKiBqb2luaW5nIG9yIGxlYXZpbmcgZnJvbSBhIGRldmljZS5cbiAgICpcbiAgICogQHJldHVybnMge1ByZXNlbmNlfVxuICAgKi9cbiAgc3RhdGljIHN5bmNEaWZmKHN0YXRlLCBkaWZmLCBvbkpvaW4sIG9uTGVhdmUpe1xuICAgIGxldCB7am9pbnMsIGxlYXZlc30gPSB0aGlzLmNsb25lKGRpZmYpXG4gICAgaWYoIW9uSm9pbil7IG9uSm9pbiA9IGZ1bmN0aW9uICgpeyB9IH1cbiAgICBpZighb25MZWF2ZSl7IG9uTGVhdmUgPSBmdW5jdGlvbiAoKXsgfSB9XG5cbiAgICB0aGlzLm1hcChqb2lucywgKGtleSwgbmV3UHJlc2VuY2UpID0+IHtcbiAgICAgIGxldCBjdXJyZW50UHJlc2VuY2UgPSBzdGF0ZVtrZXldXG4gICAgICBzdGF0ZVtrZXldID0gdGhpcy5jbG9uZShuZXdQcmVzZW5jZSlcbiAgICAgIGlmKGN1cnJlbnRQcmVzZW5jZSl7XG4gICAgICAgIGxldCBqb2luZWRSZWZzID0gc3RhdGVba2V5XS5tZXRhcy5tYXAobSA9PiBtLnBoeF9yZWYpXG4gICAgICAgIGxldCBjdXJNZXRhcyA9IGN1cnJlbnRQcmVzZW5jZS5tZXRhcy5maWx0ZXIobSA9PiBqb2luZWRSZWZzLmluZGV4T2YobS5waHhfcmVmKSA8IDApXG4gICAgICAgIHN0YXRlW2tleV0ubWV0YXMudW5zaGlmdCguLi5jdXJNZXRhcylcbiAgICAgIH1cbiAgICAgIG9uSm9pbihrZXksIGN1cnJlbnRQcmVzZW5jZSwgbmV3UHJlc2VuY2UpXG4gICAgfSlcbiAgICB0aGlzLm1hcChsZWF2ZXMsIChrZXksIGxlZnRQcmVzZW5jZSkgPT4ge1xuICAgICAgbGV0IGN1cnJlbnRQcmVzZW5jZSA9IHN0YXRlW2tleV1cbiAgICAgIGlmKCFjdXJyZW50UHJlc2VuY2UpeyByZXR1cm4gfVxuICAgICAgbGV0IHJlZnNUb1JlbW92ZSA9IGxlZnRQcmVzZW5jZS5tZXRhcy5tYXAobSA9PiBtLnBoeF9yZWYpXG4gICAgICBjdXJyZW50UHJlc2VuY2UubWV0YXMgPSBjdXJyZW50UHJlc2VuY2UubWV0YXMuZmlsdGVyKHAgPT4ge1xuICAgICAgICByZXR1cm4gcmVmc1RvUmVtb3ZlLmluZGV4T2YocC5waHhfcmVmKSA8IDBcbiAgICAgIH0pXG4gICAgICBvbkxlYXZlKGtleSwgY3VycmVudFByZXNlbmNlLCBsZWZ0UHJlc2VuY2UpXG4gICAgICBpZihjdXJyZW50UHJlc2VuY2UubWV0YXMubGVuZ3RoID09PSAwKXtcbiAgICAgICAgZGVsZXRlIHN0YXRlW2tleV1cbiAgICAgIH1cbiAgICB9KVxuICAgIHJldHVybiBzdGF0ZVxuICB9XG5cbiAgLyoqXG4gICAqIFJldHVybnMgdGhlIGFycmF5IG9mIHByZXNlbmNlcywgd2l0aCBzZWxlY3RlZCBtZXRhZGF0YS5cbiAgICpcbiAgICogQHBhcmFtIHtPYmplY3R9IHByZXNlbmNlc1xuICAgKiBAcGFyYW0ge0Z1bmN0aW9ufSBjaG9vc2VyXG4gICAqXG4gICAqIEByZXR1cm5zIHtQcmVzZW5jZX1cbiAgICovXG4gIHN0YXRpYyBsaXN0KHByZXNlbmNlcywgY2hvb3Nlcil7XG4gICAgaWYoIWNob29zZXIpeyBjaG9vc2VyID0gZnVuY3Rpb24gKGtleSwgcHJlcyl7IHJldHVybiBwcmVzIH0gfVxuXG4gICAgcmV0dXJuIHRoaXMubWFwKHByZXNlbmNlcywgKGtleSwgcHJlc2VuY2UpID0+IHtcbiAgICAgIHJldHVybiBjaG9vc2VyKGtleSwgcHJlc2VuY2UpXG4gICAgfSlcbiAgfVxuXG4gIC8vIHByaXZhdGVcblxuICBzdGF0aWMgbWFwKG9iaiwgZnVuYyl7XG4gICAgcmV0dXJuIE9iamVjdC5nZXRPd25Qcm9wZXJ0eU5hbWVzKG9iaikubWFwKGtleSA9PiBmdW5jKGtleSwgb2JqW2tleV0pKVxuICB9XG5cbiAgc3RhdGljIGNsb25lKG9iail7IHJldHVybiBKU09OLnBhcnNlKEpTT04uc3RyaW5naWZ5KG9iaikpIH1cbn1cbiIsICIvKiBUaGUgZGVmYXVsdCBzZXJpYWxpemVyIGZvciBlbmNvZGluZyBhbmQgZGVjb2RpbmcgbWVzc2FnZXMgKi9cbmltcG9ydCB7XG4gIENIQU5ORUxfRVZFTlRTXG59IGZyb20gXCIuL2NvbnN0YW50c1wiXG5cbmV4cG9ydCBkZWZhdWx0IHtcbiAgSEVBREVSX0xFTkdUSDogMSxcbiAgTUVUQV9MRU5HVEg6IDQsXG4gIEtJTkRTOiB7cHVzaDogMCwgcmVwbHk6IDEsIGJyb2FkY2FzdDogMn0sXG5cbiAgZW5jb2RlKG1zZywgY2FsbGJhY2spe1xuICAgIGlmKG1zZy5wYXlsb2FkLmNvbnN0cnVjdG9yID09PSBBcnJheUJ1ZmZlcil7XG4gICAgICByZXR1cm4gY2FsbGJhY2sodGhpcy5iaW5hcnlFbmNvZGUobXNnKSlcbiAgICB9IGVsc2Uge1xuICAgICAgbGV0IHBheWxvYWQgPSBbbXNnLmpvaW5fcmVmLCBtc2cucmVmLCBtc2cudG9waWMsIG1zZy5ldmVudCwgbXNnLnBheWxvYWRdXG4gICAgICByZXR1cm4gY2FsbGJhY2soSlNPTi5zdHJpbmdpZnkocGF5bG9hZCkpXG4gICAgfVxuICB9LFxuXG4gIGRlY29kZShyYXdQYXlsb2FkLCBjYWxsYmFjayl7XG4gICAgaWYocmF3UGF5bG9hZC5jb25zdHJ1Y3RvciA9PT0gQXJyYXlCdWZmZXIpe1xuICAgICAgcmV0dXJuIGNhbGxiYWNrKHRoaXMuYmluYXJ5RGVjb2RlKHJhd1BheWxvYWQpKVxuICAgIH0gZWxzZSB7XG4gICAgICBsZXQgW2pvaW5fcmVmLCByZWYsIHRvcGljLCBldmVudCwgcGF5bG9hZF0gPSBKU09OLnBhcnNlKHJhd1BheWxvYWQpXG4gICAgICByZXR1cm4gY2FsbGJhY2soe2pvaW5fcmVmLCByZWYsIHRvcGljLCBldmVudCwgcGF5bG9hZH0pXG4gICAgfVxuICB9LFxuXG4gIC8vIHByaXZhdGVcblxuICBiaW5hcnlFbmNvZGUobWVzc2FnZSl7XG4gICAgbGV0IHtqb2luX3JlZiwgcmVmLCBldmVudCwgdG9waWMsIHBheWxvYWR9ID0gbWVzc2FnZVxuICAgIGxldCBtZXRhTGVuZ3RoID0gdGhpcy5NRVRBX0xFTkdUSCArIGpvaW5fcmVmLmxlbmd0aCArIHJlZi5sZW5ndGggKyB0b3BpYy5sZW5ndGggKyBldmVudC5sZW5ndGhcbiAgICBsZXQgaGVhZGVyID0gbmV3IEFycmF5QnVmZmVyKHRoaXMuSEVBREVSX0xFTkdUSCArIG1ldGFMZW5ndGgpXG4gICAgbGV0IHZpZXcgPSBuZXcgRGF0YVZpZXcoaGVhZGVyKVxuICAgIGxldCBvZmZzZXQgPSAwXG5cbiAgICB2aWV3LnNldFVpbnQ4KG9mZnNldCsrLCB0aGlzLktJTkRTLnB1c2gpIC8vIGtpbmRcbiAgICB2aWV3LnNldFVpbnQ4KG9mZnNldCsrLCBqb2luX3JlZi5sZW5ndGgpXG4gICAgdmlldy5zZXRVaW50OChvZmZzZXQrKywgcmVmLmxlbmd0aClcbiAgICB2aWV3LnNldFVpbnQ4KG9mZnNldCsrLCB0b3BpYy5sZW5ndGgpXG4gICAgdmlldy5zZXRVaW50OChvZmZzZXQrKywgZXZlbnQubGVuZ3RoKVxuICAgIEFycmF5LmZyb20oam9pbl9yZWYsIGNoYXIgPT4gdmlldy5zZXRVaW50OChvZmZzZXQrKywgY2hhci5jaGFyQ29kZUF0KDApKSlcbiAgICBBcnJheS5mcm9tKHJlZiwgY2hhciA9PiB2aWV3LnNldFVpbnQ4KG9mZnNldCsrLCBjaGFyLmNoYXJDb2RlQXQoMCkpKVxuICAgIEFycmF5LmZyb20odG9waWMsIGNoYXIgPT4gdmlldy5zZXRVaW50OChvZmZzZXQrKywgY2hhci5jaGFyQ29kZUF0KDApKSlcbiAgICBBcnJheS5mcm9tKGV2ZW50LCBjaGFyID0+IHZpZXcuc2V0VWludDgob2Zmc2V0KyssIGNoYXIuY2hhckNvZGVBdCgwKSkpXG5cbiAgICB2YXIgY29tYmluZWQgPSBuZXcgVWludDhBcnJheShoZWFkZXIuYnl0ZUxlbmd0aCArIHBheWxvYWQuYnl0ZUxlbmd0aClcbiAgICBjb21iaW5lZC5zZXQobmV3IFVpbnQ4QXJyYXkoaGVhZGVyKSwgMClcbiAgICBjb21iaW5lZC5zZXQobmV3IFVpbnQ4QXJyYXkocGF5bG9hZCksIGhlYWRlci5ieXRlTGVuZ3RoKVxuXG4gICAgcmV0dXJuIGNvbWJpbmVkLmJ1ZmZlclxuICB9LFxuXG4gIGJpbmFyeURlY29kZShidWZmZXIpe1xuICAgIGxldCB2aWV3ID0gbmV3IERhdGFWaWV3KGJ1ZmZlcilcbiAgICBsZXQga2luZCA9IHZpZXcuZ2V0VWludDgoMClcbiAgICBsZXQgZGVjb2RlciA9IG5ldyBUZXh0RGVjb2RlcigpXG4gICAgc3dpdGNoKGtpbmQpe1xuICAgICAgY2FzZSB0aGlzLktJTkRTLnB1c2g6IHJldHVybiB0aGlzLmRlY29kZVB1c2goYnVmZmVyLCB2aWV3LCBkZWNvZGVyKVxuICAgICAgY2FzZSB0aGlzLktJTkRTLnJlcGx5OiByZXR1cm4gdGhpcy5kZWNvZGVSZXBseShidWZmZXIsIHZpZXcsIGRlY29kZXIpXG4gICAgICBjYXNlIHRoaXMuS0lORFMuYnJvYWRjYXN0OiByZXR1cm4gdGhpcy5kZWNvZGVCcm9hZGNhc3QoYnVmZmVyLCB2aWV3LCBkZWNvZGVyKVxuICAgIH1cbiAgfSxcblxuICBkZWNvZGVQdXNoKGJ1ZmZlciwgdmlldywgZGVjb2Rlcil7XG4gICAgbGV0IGpvaW5SZWZTaXplID0gdmlldy5nZXRVaW50OCgxKVxuICAgIGxldCB0b3BpY1NpemUgPSB2aWV3LmdldFVpbnQ4KDIpXG4gICAgbGV0IGV2ZW50U2l6ZSA9IHZpZXcuZ2V0VWludDgoMylcbiAgICBsZXQgb2Zmc2V0ID0gdGhpcy5IRUFERVJfTEVOR1RIICsgdGhpcy5NRVRBX0xFTkdUSCAtIDEgLy8gcHVzaGVzIGhhdmUgbm8gcmVmXG4gICAgbGV0IGpvaW5SZWYgPSBkZWNvZGVyLmRlY29kZShidWZmZXIuc2xpY2Uob2Zmc2V0LCBvZmZzZXQgKyBqb2luUmVmU2l6ZSkpXG4gICAgb2Zmc2V0ID0gb2Zmc2V0ICsgam9pblJlZlNpemVcbiAgICBsZXQgdG9waWMgPSBkZWNvZGVyLmRlY29kZShidWZmZXIuc2xpY2Uob2Zmc2V0LCBvZmZzZXQgKyB0b3BpY1NpemUpKVxuICAgIG9mZnNldCA9IG9mZnNldCArIHRvcGljU2l6ZVxuICAgIGxldCBldmVudCA9IGRlY29kZXIuZGVjb2RlKGJ1ZmZlci5zbGljZShvZmZzZXQsIG9mZnNldCArIGV2ZW50U2l6ZSkpXG4gICAgb2Zmc2V0ID0gb2Zmc2V0ICsgZXZlbnRTaXplXG4gICAgbGV0IGRhdGEgPSBidWZmZXIuc2xpY2Uob2Zmc2V0LCBidWZmZXIuYnl0ZUxlbmd0aClcbiAgICByZXR1cm4ge2pvaW5fcmVmOiBqb2luUmVmLCByZWY6IG51bGwsIHRvcGljOiB0b3BpYywgZXZlbnQ6IGV2ZW50LCBwYXlsb2FkOiBkYXRhfVxuICB9LFxuXG4gIGRlY29kZVJlcGx5KGJ1ZmZlciwgdmlldywgZGVjb2Rlcil7XG4gICAgbGV0IGpvaW5SZWZTaXplID0gdmlldy5nZXRVaW50OCgxKVxuICAgIGxldCByZWZTaXplID0gdmlldy5nZXRVaW50OCgyKVxuICAgIGxldCB0b3BpY1NpemUgPSB2aWV3LmdldFVpbnQ4KDMpXG4gICAgbGV0IGV2ZW50U2l6ZSA9IHZpZXcuZ2V0VWludDgoNClcbiAgICBsZXQgb2Zmc2V0ID0gdGhpcy5IRUFERVJfTEVOR1RIICsgdGhpcy5NRVRBX0xFTkdUSFxuICAgIGxldCBqb2luUmVmID0gZGVjb2Rlci5kZWNvZGUoYnVmZmVyLnNsaWNlKG9mZnNldCwgb2Zmc2V0ICsgam9pblJlZlNpemUpKVxuICAgIG9mZnNldCA9IG9mZnNldCArIGpvaW5SZWZTaXplXG4gICAgbGV0IHJlZiA9IGRlY29kZXIuZGVjb2RlKGJ1ZmZlci5zbGljZShvZmZzZXQsIG9mZnNldCArIHJlZlNpemUpKVxuICAgIG9mZnNldCA9IG9mZnNldCArIHJlZlNpemVcbiAgICBsZXQgdG9waWMgPSBkZWNvZGVyLmRlY29kZShidWZmZXIuc2xpY2Uob2Zmc2V0LCBvZmZzZXQgKyB0b3BpY1NpemUpKVxuICAgIG9mZnNldCA9IG9mZnNldCArIHRvcGljU2l6ZVxuICAgIGxldCBldmVudCA9IGRlY29kZXIuZGVjb2RlKGJ1ZmZlci5zbGljZShvZmZzZXQsIG9mZnNldCArIGV2ZW50U2l6ZSkpXG4gICAgb2Zmc2V0ID0gb2Zmc2V0ICsgZXZlbnRTaXplXG4gICAgbGV0IGRhdGEgPSBidWZmZXIuc2xpY2Uob2Zmc2V0LCBidWZmZXIuYnl0ZUxlbmd0aClcbiAgICBsZXQgcGF5bG9hZCA9IHtzdGF0dXM6IGV2ZW50LCByZXNwb25zZTogZGF0YX1cbiAgICByZXR1cm4ge2pvaW5fcmVmOiBqb2luUmVmLCByZWY6IHJlZiwgdG9waWM6IHRvcGljLCBldmVudDogQ0hBTk5FTF9FVkVOVFMucmVwbHksIHBheWxvYWQ6IHBheWxvYWR9XG4gIH0sXG5cbiAgZGVjb2RlQnJvYWRjYXN0KGJ1ZmZlciwgdmlldywgZGVjb2Rlcil7XG4gICAgbGV0IHRvcGljU2l6ZSA9IHZpZXcuZ2V0VWludDgoMSlcbiAgICBsZXQgZXZlbnRTaXplID0gdmlldy5nZXRVaW50OCgyKVxuICAgIGxldCBvZmZzZXQgPSB0aGlzLkhFQURFUl9MRU5HVEggKyAyXG4gICAgbGV0IHRvcGljID0gZGVjb2Rlci5kZWNvZGUoYnVmZmVyLnNsaWNlKG9mZnNldCwgb2Zmc2V0ICsgdG9waWNTaXplKSlcbiAgICBvZmZzZXQgPSBvZmZzZXQgKyB0b3BpY1NpemVcbiAgICBsZXQgZXZlbnQgPSBkZWNvZGVyLmRlY29kZShidWZmZXIuc2xpY2Uob2Zmc2V0LCBvZmZzZXQgKyBldmVudFNpemUpKVxuICAgIG9mZnNldCA9IG9mZnNldCArIGV2ZW50U2l6ZVxuICAgIGxldCBkYXRhID0gYnVmZmVyLnNsaWNlKG9mZnNldCwgYnVmZmVyLmJ5dGVMZW5ndGgpXG5cbiAgICByZXR1cm4ge2pvaW5fcmVmOiBudWxsLCByZWY6IG51bGwsIHRvcGljOiB0b3BpYywgZXZlbnQ6IGV2ZW50LCBwYXlsb2FkOiBkYXRhfVxuICB9XG59XG4iLCAiaW1wb3J0IHtcbiAgZ2xvYmFsLFxuICBwaHhXaW5kb3csXG4gIENIQU5ORUxfRVZFTlRTLFxuICBERUZBVUxUX1RJTUVPVVQsXG4gIERFRkFVTFRfVlNOLFxuICBTT0NLRVRfU1RBVEVTLFxuICBUUkFOU1BPUlRTLFxuICBXU19DTE9TRV9OT1JNQUwsXG4gIEFVVEhfVE9LRU5fUFJFRklYXG59IGZyb20gXCIuL2NvbnN0YW50c1wiXG5cbmltcG9ydCB7XG4gIGNsb3N1cmVcbn0gZnJvbSBcIi4vdXRpbHNcIlxuXG5pbXBvcnQgQWpheCBmcm9tIFwiLi9hamF4XCJcbmltcG9ydCBDaGFubmVsIGZyb20gXCIuL2NoYW5uZWxcIlxuaW1wb3J0IExvbmdQb2xsIGZyb20gXCIuL2xvbmdwb2xsXCJcbmltcG9ydCBTZXJpYWxpemVyIGZyb20gXCIuL3NlcmlhbGl6ZXJcIlxuaW1wb3J0IFRpbWVyIGZyb20gXCIuL3RpbWVyXCJcblxuLyoqIEluaXRpYWxpemVzIHRoZSBTb2NrZXQgKlxuICpcbiAqIEZvciBJRTggc3VwcG9ydCB1c2UgYW4gRVM1LXNoaW0gKGh0dHBzOi8vZ2l0aHViLmNvbS9lcy1zaGltcy9lczUtc2hpbSlcbiAqXG4gKiBAcGFyYW0ge3N0cmluZ30gZW5kUG9pbnQgLSBUaGUgc3RyaW5nIFdlYlNvY2tldCBlbmRwb2ludCwgaWUsIGBcIndzOi8vZXhhbXBsZS5jb20vc29ja2V0XCJgLFxuICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGBcIndzczovL2V4YW1wbGUuY29tXCJgXG4gKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYFwiL3NvY2tldFwiYCAoaW5oZXJpdGVkIGhvc3QgJiBwcm90b2NvbClcbiAqIEBwYXJhbSB7T2JqZWN0fSBbb3B0c10gLSBPcHRpb25hbCBjb25maWd1cmF0aW9uXG4gKiBAcGFyYW0ge0Z1bmN0aW9ufSBbb3B0cy50cmFuc3BvcnRdIC0gVGhlIFdlYnNvY2tldCBUcmFuc3BvcnQsIGZvciBleGFtcGxlIFdlYlNvY2tldCBvciBQaG9lbml4LkxvbmdQb2xsLlxuICpcbiAqIERlZmF1bHRzIHRvIFdlYlNvY2tldCB3aXRoIGF1dG9tYXRpYyBMb25nUG9sbCBmYWxsYmFjayBpZiBXZWJTb2NrZXQgaXMgbm90IGRlZmluZWQuXG4gKiBUbyBmYWxsYmFjayB0byBMb25nUG9sbCB3aGVuIFdlYlNvY2tldCBhdHRlbXB0cyBmYWlsLCB1c2UgYGxvbmdQb2xsRmFsbGJhY2tNczogMjUwMGAuXG4gKlxuICogQHBhcmFtIHtudW1iZXJ9IFtvcHRzLmxvbmdQb2xsRmFsbGJhY2tNc10gLSBUaGUgbWlsbGlzZWNvbmQgdGltZSB0byBhdHRlbXB0IHRoZSBwcmltYXJ5IHRyYW5zcG9ydFxuICogYmVmb3JlIGZhbGxpbmcgYmFjayB0byB0aGUgTG9uZ1BvbGwgdHJhbnNwb3J0LiBEaXNhYmxlZCBieSBkZWZhdWx0LlxuICpcbiAqIEBwYXJhbSB7Ym9vbGVhbn0gW29wdHMuZGVidWddIC0gV2hlbiB0cnVlLCBlbmFibGVzIGRlYnVnIGxvZ2dpbmcuIERlZmF1bHQgZmFsc2UuXG4gKlxuICogQHBhcmFtIHtGdW5jdGlvbn0gW29wdHMuZW5jb2RlXSAtIFRoZSBmdW5jdGlvbiB0byBlbmNvZGUgb3V0Z29pbmcgbWVzc2FnZXMuXG4gKlxuICogRGVmYXVsdHMgdG8gSlNPTiBlbmNvZGVyLlxuICpcbiAqIEBwYXJhbSB7RnVuY3Rpb259IFtvcHRzLmRlY29kZV0gLSBUaGUgZnVuY3Rpb24gdG8gZGVjb2RlIGluY29taW5nIG1lc3NhZ2VzLlxuICpcbiAqIERlZmF1bHRzIHRvIEpTT046XG4gKlxuICogYGBgamF2YXNjcmlwdFxuICogKHBheWxvYWQsIGNhbGxiYWNrKSA9PiBjYWxsYmFjayhKU09OLnBhcnNlKHBheWxvYWQpKVxuICogYGBgXG4gKlxuICogQHBhcmFtIHtudW1iZXJ9IFtvcHRzLnRpbWVvdXRdIC0gVGhlIGRlZmF1bHQgdGltZW91dCBpbiBtaWxsaXNlY29uZHMgdG8gdHJpZ2dlciBwdXNoIHRpbWVvdXRzLlxuICpcbiAqIERlZmF1bHRzIGBERUZBVUxUX1RJTUVPVVRgXG4gKiBAcGFyYW0ge251bWJlcn0gW29wdHMuaGVhcnRiZWF0SW50ZXJ2YWxNc10gLSBUaGUgbWlsbGlzZWMgaW50ZXJ2YWwgdG8gc2VuZCBhIGhlYXJ0YmVhdCBtZXNzYWdlXG4gKiBAcGFyYW0ge0Z1bmN0aW9ufSBbb3B0cy5yZWNvbm5lY3RBZnRlck1zXSAtIFRoZSBvcHRpb25hbCBmdW5jdGlvbiB0aGF0IHJldHVybnMgdGhlXG4gKiBzb2NrZXQgcmVjb25uZWN0IGludGVydmFsLCBpbiBtaWxsaXNlY29uZHMuXG4gKlxuICogRGVmYXVsdHMgdG8gc3RlcHBlZCBiYWNrb2ZmIG9mOlxuICpcbiAqIGBgYGphdmFzY3JpcHRcbiAqIGZ1bmN0aW9uKHRyaWVzKXtcbiAqICAgcmV0dXJuIFsxMCwgNTAsIDEwMCwgMTUwLCAyMDAsIDI1MCwgNTAwLCAxMDAwLCAyMDAwXVt0cmllcyAtIDFdIHx8IDUwMDBcbiAqIH1cbiAqIGBgYGBcbiAqXG4gKiBAcGFyYW0ge0Z1bmN0aW9ufSBbb3B0cy5yZWpvaW5BZnRlck1zXSAtIFRoZSBvcHRpb25hbCBmdW5jdGlvbiB0aGF0IHJldHVybnMgdGhlIG1pbGxpc2VjXG4gKiByZWpvaW4gaW50ZXJ2YWwgZm9yIGluZGl2aWR1YWwgY2hhbm5lbHMuXG4gKlxuICogYGBgamF2YXNjcmlwdFxuICogZnVuY3Rpb24odHJpZXMpe1xuICogICByZXR1cm4gWzEwMDAsIDIwMDAsIDUwMDBdW3RyaWVzIC0gMV0gfHwgMTAwMDBcbiAqIH1cbiAqIGBgYGBcbiAqXG4gKiBAcGFyYW0ge0Z1bmN0aW9ufSBbb3B0cy5sb2dnZXJdIC0gVGhlIG9wdGlvbmFsIGZ1bmN0aW9uIGZvciBzcGVjaWFsaXplZCBsb2dnaW5nLCBpZTpcbiAqXG4gKiBgYGBqYXZhc2NyaXB0XG4gKiBmdW5jdGlvbihraW5kLCBtc2csIGRhdGEpIHtcbiAqICAgY29uc29sZS5sb2coYCR7a2luZH06ICR7bXNnfWAsIGRhdGEpXG4gKiB9XG4gKiBgYGBcbiAqXG4gKiBAcGFyYW0ge251bWJlcn0gW29wdHMubG9uZ3BvbGxlclRpbWVvdXRdIC0gVGhlIG1heGltdW0gdGltZW91dCBvZiBhIGxvbmcgcG9sbCBBSkFYIHJlcXVlc3QuXG4gKlxuICogRGVmYXVsdHMgdG8gMjBzIChkb3VibGUgdGhlIHNlcnZlciBsb25nIHBvbGwgdGltZXIpLlxuICpcbiAqIEBwYXJhbSB7KE9iamVjdHxmdW5jdGlvbil9IFtvcHRzLnBhcmFtc10gLSBUaGUgb3B0aW9uYWwgcGFyYW1zIHRvIHBhc3Mgd2hlbiBjb25uZWN0aW5nXG4gKiBAcGFyYW0ge3N0cmluZ30gW29wdHMuYXV0aFRva2VuXSAtIHRoZSBvcHRpb25hbCBhdXRoZW50aWNhdGlvbiB0b2tlbiB0byBiZSBleHBvc2VkIG9uIHRoZSBzZXJ2ZXJcbiAqIHVuZGVyIHRoZSBgOmF1dGhfdG9rZW5gIGNvbm5lY3RfaW5mbyBrZXkuXG4gKiBAcGFyYW0ge3N0cmluZ30gW29wdHMuYmluYXJ5VHlwZV0gLSBUaGUgYmluYXJ5IHR5cGUgdG8gdXNlIGZvciBiaW5hcnkgV2ViU29ja2V0IGZyYW1lcy5cbiAqXG4gKiBEZWZhdWx0cyB0byBcImFycmF5YnVmZmVyXCJcbiAqXG4gKiBAcGFyYW0ge3Zzbn0gW29wdHMudnNuXSAtIFRoZSBzZXJpYWxpemVyJ3MgcHJvdG9jb2wgdmVyc2lvbiB0byBzZW5kIG9uIGNvbm5lY3QuXG4gKlxuICogRGVmYXVsdHMgdG8gREVGQVVMVF9WU04uXG4gKlxuICogQHBhcmFtIHtPYmplY3R9IFtvcHRzLnNlc3Npb25TdG9yYWdlXSAtIEFuIG9wdGlvbmFsIFN0b3JhZ2UgY29tcGF0aWJsZSBvYmplY3RcbiAqIFBob2VuaXggdXNlcyBzZXNzaW9uU3RvcmFnZSBmb3IgbG9uZ3BvbGwgZmFsbGJhY2sgaGlzdG9yeS4gT3ZlcnJpZGluZyB0aGUgc3RvcmUgaXNcbiAqIHVzZWZ1bCB3aGVuIFBob2VuaXggd29uJ3QgaGF2ZSBhY2Nlc3MgdG8gYHNlc3Npb25TdG9yYWdlYC4gRm9yIGV4YW1wbGUsIFRoaXMgY291bGRcbiAqIGhhcHBlbiBpZiBhIHNpdGUgbG9hZHMgYSBjcm9zcy1kb21haW4gY2hhbm5lbCBpbiBhbiBpZnJhbWUuIEV4YW1wbGUgdXNhZ2U6XG4gKlxuICogICAgIGNsYXNzIEluTWVtb3J5U3RvcmFnZSB7XG4gKiAgICAgICBjb25zdHJ1Y3RvcigpIHsgdGhpcy5zdG9yYWdlID0ge30gfVxuICogICAgICAgZ2V0SXRlbShrZXlOYW1lKSB7IHJldHVybiB0aGlzLnN0b3JhZ2Vba2V5TmFtZV0gfHwgbnVsbCB9XG4gKiAgICAgICByZW1vdmVJdGVtKGtleU5hbWUpIHsgZGVsZXRlIHRoaXMuc3RvcmFnZVtrZXlOYW1lXSB9XG4gKiAgICAgICBzZXRJdGVtKGtleU5hbWUsIGtleVZhbHVlKSB7IHRoaXMuc3RvcmFnZVtrZXlOYW1lXSA9IGtleVZhbHVlIH1cbiAqICAgICB9XG4gKlxuKi9cbmV4cG9ydCBkZWZhdWx0IGNsYXNzIFNvY2tldCB7XG4gIGNvbnN0cnVjdG9yKGVuZFBvaW50LCBvcHRzID0ge30pe1xuICAgIHRoaXMuc3RhdGVDaGFuZ2VDYWxsYmFja3MgPSB7b3BlbjogW10sIGNsb3NlOiBbXSwgZXJyb3I6IFtdLCBtZXNzYWdlOiBbXX1cbiAgICB0aGlzLmNoYW5uZWxzID0gW11cbiAgICB0aGlzLnNlbmRCdWZmZXIgPSBbXVxuICAgIHRoaXMucmVmID0gMFxuICAgIHRoaXMudGltZW91dCA9IG9wdHMudGltZW91dCB8fCBERUZBVUxUX1RJTUVPVVRcbiAgICB0aGlzLnRyYW5zcG9ydCA9IG9wdHMudHJhbnNwb3J0IHx8IGdsb2JhbC5XZWJTb2NrZXQgfHwgTG9uZ1BvbGxcbiAgICB0aGlzLnByaW1hcnlQYXNzZWRIZWFsdGhDaGVjayA9IGZhbHNlXG4gICAgdGhpcy5sb25nUG9sbEZhbGxiYWNrTXMgPSBvcHRzLmxvbmdQb2xsRmFsbGJhY2tNc1xuICAgIHRoaXMuZmFsbGJhY2tUaW1lciA9IG51bGxcbiAgICB0aGlzLnNlc3Npb25TdG9yZSA9IG9wdHMuc2Vzc2lvblN0b3JhZ2UgfHwgKGdsb2JhbCAmJiBnbG9iYWwuc2Vzc2lvblN0b3JhZ2UpXG4gICAgdGhpcy5lc3RhYmxpc2hlZENvbm5lY3Rpb25zID0gMFxuICAgIHRoaXMuZGVmYXVsdEVuY29kZXIgPSBTZXJpYWxpemVyLmVuY29kZS5iaW5kKFNlcmlhbGl6ZXIpXG4gICAgdGhpcy5kZWZhdWx0RGVjb2RlciA9IFNlcmlhbGl6ZXIuZGVjb2RlLmJpbmQoU2VyaWFsaXplcilcbiAgICB0aGlzLmNsb3NlV2FzQ2xlYW4gPSBmYWxzZVxuICAgIHRoaXMuZGlzY29ubmVjdGluZyA9IGZhbHNlXG4gICAgdGhpcy5iaW5hcnlUeXBlID0gb3B0cy5iaW5hcnlUeXBlIHx8IFwiYXJyYXlidWZmZXJcIlxuICAgIHRoaXMuY29ubmVjdENsb2NrID0gMVxuICAgIGlmKHRoaXMudHJhbnNwb3J0ICE9PSBMb25nUG9sbCl7XG4gICAgICB0aGlzLmVuY29kZSA9IG9wdHMuZW5jb2RlIHx8IHRoaXMuZGVmYXVsdEVuY29kZXJcbiAgICAgIHRoaXMuZGVjb2RlID0gb3B0cy5kZWNvZGUgfHwgdGhpcy5kZWZhdWx0RGVjb2RlclxuICAgIH0gZWxzZSB7XG4gICAgICB0aGlzLmVuY29kZSA9IHRoaXMuZGVmYXVsdEVuY29kZXJcbiAgICAgIHRoaXMuZGVjb2RlID0gdGhpcy5kZWZhdWx0RGVjb2RlclxuICAgIH1cbiAgICBsZXQgYXdhaXRpbmdDb25uZWN0aW9uT25QYWdlU2hvdyA9IG51bGxcbiAgICBpZihwaHhXaW5kb3cgJiYgcGh4V2luZG93LmFkZEV2ZW50TGlzdGVuZXIpe1xuICAgICAgcGh4V2luZG93LmFkZEV2ZW50TGlzdGVuZXIoXCJwYWdlaGlkZVwiLCBfZSA9PiB7XG4gICAgICAgIGlmKHRoaXMuY29ubil7XG4gICAgICAgICAgdGhpcy5kaXNjb25uZWN0KClcbiAgICAgICAgICBhd2FpdGluZ0Nvbm5lY3Rpb25PblBhZ2VTaG93ID0gdGhpcy5jb25uZWN0Q2xvY2tcbiAgICAgICAgfVxuICAgICAgfSlcbiAgICAgIHBoeFdpbmRvdy5hZGRFdmVudExpc3RlbmVyKFwicGFnZXNob3dcIiwgX2UgPT4ge1xuICAgICAgICBpZihhd2FpdGluZ0Nvbm5lY3Rpb25PblBhZ2VTaG93ID09PSB0aGlzLmNvbm5lY3RDbG9jayl7XG4gICAgICAgICAgYXdhaXRpbmdDb25uZWN0aW9uT25QYWdlU2hvdyA9IG51bGxcbiAgICAgICAgICB0aGlzLmNvbm5lY3QoKVxuICAgICAgICB9XG4gICAgICB9KVxuICAgIH1cbiAgICB0aGlzLmhlYXJ0YmVhdEludGVydmFsTXMgPSBvcHRzLmhlYXJ0YmVhdEludGVydmFsTXMgfHwgMzAwMDBcbiAgICB0aGlzLnJlam9pbkFmdGVyTXMgPSAodHJpZXMpID0+IHtcbiAgICAgIGlmKG9wdHMucmVqb2luQWZ0ZXJNcyl7XG4gICAgICAgIHJldHVybiBvcHRzLnJlam9pbkFmdGVyTXModHJpZXMpXG4gICAgICB9IGVsc2Uge1xuICAgICAgICByZXR1cm4gWzEwMDAsIDIwMDAsIDUwMDBdW3RyaWVzIC0gMV0gfHwgMTAwMDBcbiAgICAgIH1cbiAgICB9XG4gICAgdGhpcy5yZWNvbm5lY3RBZnRlck1zID0gKHRyaWVzKSA9PiB7XG4gICAgICBpZihvcHRzLnJlY29ubmVjdEFmdGVyTXMpe1xuICAgICAgICByZXR1cm4gb3B0cy5yZWNvbm5lY3RBZnRlck1zKHRyaWVzKVxuICAgICAgfSBlbHNlIHtcbiAgICAgICAgcmV0dXJuIFsxMCwgNTAsIDEwMCwgMTUwLCAyMDAsIDI1MCwgNTAwLCAxMDAwLCAyMDAwXVt0cmllcyAtIDFdIHx8IDUwMDBcbiAgICAgIH1cbiAgICB9XG4gICAgdGhpcy5sb2dnZXIgPSBvcHRzLmxvZ2dlciB8fCBudWxsXG4gICAgaWYoIXRoaXMubG9nZ2VyICYmIG9wdHMuZGVidWcpe1xuICAgICAgdGhpcy5sb2dnZXIgPSAoa2luZCwgbXNnLCBkYXRhKSA9PiB7IGNvbnNvbGUubG9nKGAke2tpbmR9OiAke21zZ31gLCBkYXRhKSB9XG4gICAgfVxuICAgIHRoaXMubG9uZ3BvbGxlclRpbWVvdXQgPSBvcHRzLmxvbmdwb2xsZXJUaW1lb3V0IHx8IDIwMDAwXG4gICAgdGhpcy5wYXJhbXMgPSBjbG9zdXJlKG9wdHMucGFyYW1zIHx8IHt9KVxuICAgIHRoaXMuZW5kUG9pbnQgPSBgJHtlbmRQb2ludH0vJHtUUkFOU1BPUlRTLndlYnNvY2tldH1gXG4gICAgdGhpcy52c24gPSBvcHRzLnZzbiB8fCBERUZBVUxUX1ZTTlxuICAgIHRoaXMuaGVhcnRiZWF0VGltZW91dFRpbWVyID0gbnVsbFxuICAgIHRoaXMuaGVhcnRiZWF0VGltZXIgPSBudWxsXG4gICAgdGhpcy5wZW5kaW5nSGVhcnRiZWF0UmVmID0gbnVsbFxuICAgIHRoaXMucmVjb25uZWN0VGltZXIgPSBuZXcgVGltZXIoKCkgPT4ge1xuICAgICAgdGhpcy50ZWFyZG93bigoKSA9PiB0aGlzLmNvbm5lY3QoKSlcbiAgICB9LCB0aGlzLnJlY29ubmVjdEFmdGVyTXMpXG4gICAgdGhpcy5hdXRoVG9rZW4gPSBvcHRzLmF1dGhUb2tlblxuICB9XG5cbiAgLyoqXG4gICAqIFJldHVybnMgdGhlIExvbmdQb2xsIHRyYW5zcG9ydCByZWZlcmVuY2VcbiAgICovXG4gIGdldExvbmdQb2xsVHJhbnNwb3J0KCl7IHJldHVybiBMb25nUG9sbCB9XG5cbiAgLyoqXG4gICAqIERpc2Nvbm5lY3RzIGFuZCByZXBsYWNlcyB0aGUgYWN0aXZlIHRyYW5zcG9ydFxuICAgKlxuICAgKiBAcGFyYW0ge0Z1bmN0aW9ufSBuZXdUcmFuc3BvcnQgLSBUaGUgbmV3IHRyYW5zcG9ydCBjbGFzcyB0byBpbnN0YW50aWF0ZVxuICAgKlxuICAgKi9cbiAgcmVwbGFjZVRyYW5zcG9ydChuZXdUcmFuc3BvcnQpe1xuICAgIHRoaXMuY29ubmVjdENsb2NrKytcbiAgICB0aGlzLmNsb3NlV2FzQ2xlYW4gPSB0cnVlXG4gICAgY2xlYXJUaW1lb3V0KHRoaXMuZmFsbGJhY2tUaW1lcilcbiAgICB0aGlzLnJlY29ubmVjdFRpbWVyLnJlc2V0KClcbiAgICBpZih0aGlzLmNvbm4pe1xuICAgICAgdGhpcy5jb25uLmNsb3NlKClcbiAgICAgIHRoaXMuY29ubiA9IG51bGxcbiAgICB9XG4gICAgdGhpcy50cmFuc3BvcnQgPSBuZXdUcmFuc3BvcnRcbiAgfVxuXG4gIC8qKlxuICAgKiBSZXR1cm5zIHRoZSBzb2NrZXQgcHJvdG9jb2xcbiAgICpcbiAgICogQHJldHVybnMge3N0cmluZ31cbiAgICovXG4gIHByb3RvY29sKCl7IHJldHVybiBsb2NhdGlvbi5wcm90b2NvbC5tYXRjaCgvXmh0dHBzLykgPyBcIndzc1wiIDogXCJ3c1wiIH1cblxuICAvKipcbiAgICogVGhlIGZ1bGx5IHF1YWxpZmllZCBzb2NrZXQgdXJsXG4gICAqXG4gICAqIEByZXR1cm5zIHtzdHJpbmd9XG4gICAqL1xuICBlbmRQb2ludFVSTCgpe1xuICAgIGxldCB1cmkgPSBBamF4LmFwcGVuZFBhcmFtcyhcbiAgICAgIEFqYXguYXBwZW5kUGFyYW1zKHRoaXMuZW5kUG9pbnQsIHRoaXMucGFyYW1zKCkpLCB7dnNuOiB0aGlzLnZzbn0pXG4gICAgaWYodXJpLmNoYXJBdCgwKSAhPT0gXCIvXCIpeyByZXR1cm4gdXJpIH1cbiAgICBpZih1cmkuY2hhckF0KDEpID09PSBcIi9cIil7IHJldHVybiBgJHt0aGlzLnByb3RvY29sKCl9OiR7dXJpfWAgfVxuXG4gICAgcmV0dXJuIGAke3RoaXMucHJvdG9jb2woKX06Ly8ke2xvY2F0aW9uLmhvc3R9JHt1cml9YFxuICB9XG5cbiAgLyoqXG4gICAqIERpc2Nvbm5lY3RzIHRoZSBzb2NrZXRcbiAgICpcbiAgICogU2VlIGh0dHBzOi8vZGV2ZWxvcGVyLm1vemlsbGEub3JnL2VuLVVTL2RvY3MvV2ViL0FQSS9DbG9zZUV2ZW50I1N0YXR1c19jb2RlcyBmb3IgdmFsaWQgc3RhdHVzIGNvZGVzLlxuICAgKlxuICAgKiBAcGFyYW0ge0Z1bmN0aW9ufSBjYWxsYmFjayAtIE9wdGlvbmFsIGNhbGxiYWNrIHdoaWNoIGlzIGNhbGxlZCBhZnRlciBzb2NrZXQgaXMgZGlzY29ubmVjdGVkLlxuICAgKiBAcGFyYW0ge2ludGVnZXJ9IGNvZGUgLSBBIHN0YXR1cyBjb2RlIGZvciBkaXNjb25uZWN0aW9uIChPcHRpb25hbCkuXG4gICAqIEBwYXJhbSB7c3RyaW5nfSByZWFzb24gLSBBIHRleHR1YWwgZGVzY3JpcHRpb24gb2YgdGhlIHJlYXNvbiB0byBkaXNjb25uZWN0LiAoT3B0aW9uYWwpXG4gICAqL1xuICBkaXNjb25uZWN0KGNhbGxiYWNrLCBjb2RlLCByZWFzb24pe1xuICAgIHRoaXMuY29ubmVjdENsb2NrKytcbiAgICB0aGlzLmRpc2Nvbm5lY3RpbmcgPSB0cnVlXG4gICAgdGhpcy5jbG9zZVdhc0NsZWFuID0gdHJ1ZVxuICAgIGNsZWFyVGltZW91dCh0aGlzLmZhbGxiYWNrVGltZXIpXG4gICAgdGhpcy5yZWNvbm5lY3RUaW1lci5yZXNldCgpXG4gICAgdGhpcy50ZWFyZG93bigoKSA9PiB7XG4gICAgICB0aGlzLmRpc2Nvbm5lY3RpbmcgPSBmYWxzZVxuICAgICAgY2FsbGJhY2sgJiYgY2FsbGJhY2soKVxuICAgIH0sIGNvZGUsIHJlYXNvbilcbiAgfVxuXG4gIC8qKlxuICAgKlxuICAgKiBAcGFyYW0ge09iamVjdH0gcGFyYW1zIC0gVGhlIHBhcmFtcyB0byBzZW5kIHdoZW4gY29ubmVjdGluZywgZm9yIGV4YW1wbGUgYHt1c2VyX2lkOiB1c2VyVG9rZW59YFxuICAgKlxuICAgKiBQYXNzaW5nIHBhcmFtcyB0byBjb25uZWN0IGlzIGRlcHJlY2F0ZWQ7IHBhc3MgdGhlbSBpbiB0aGUgU29ja2V0IGNvbnN0cnVjdG9yIGluc3RlYWQ6XG4gICAqIGBuZXcgU29ja2V0KFwiL3NvY2tldFwiLCB7cGFyYW1zOiB7dXNlcl9pZDogdXNlclRva2VufX0pYC5cbiAgICovXG4gIGNvbm5lY3QocGFyYW1zKXtcbiAgICBpZihwYXJhbXMpe1xuICAgICAgY29uc29sZSAmJiBjb25zb2xlLmxvZyhcInBhc3NpbmcgcGFyYW1zIHRvIGNvbm5lY3QgaXMgZGVwcmVjYXRlZC4gSW5zdGVhZCBwYXNzIDpwYXJhbXMgdG8gdGhlIFNvY2tldCBjb25zdHJ1Y3RvclwiKVxuICAgICAgdGhpcy5wYXJhbXMgPSBjbG9zdXJlKHBhcmFtcylcbiAgICB9XG4gICAgaWYodGhpcy5jb25uICYmICF0aGlzLmRpc2Nvbm5lY3RpbmcpeyByZXR1cm4gfVxuICAgIGlmKHRoaXMubG9uZ1BvbGxGYWxsYmFja01zICYmIHRoaXMudHJhbnNwb3J0ICE9PSBMb25nUG9sbCl7XG4gICAgICB0aGlzLmNvbm5lY3RXaXRoRmFsbGJhY2soTG9uZ1BvbGwsIHRoaXMubG9uZ1BvbGxGYWxsYmFja01zKVxuICAgIH0gZWxzZSB7XG4gICAgICB0aGlzLnRyYW5zcG9ydENvbm5lY3QoKVxuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBMb2dzIHRoZSBtZXNzYWdlLiBPdmVycmlkZSBgdGhpcy5sb2dnZXJgIGZvciBzcGVjaWFsaXplZCBsb2dnaW5nLiBub29wcyBieSBkZWZhdWx0XG4gICAqIEBwYXJhbSB7c3RyaW5nfSBraW5kXG4gICAqIEBwYXJhbSB7c3RyaW5nfSBtc2dcbiAgICogQHBhcmFtIHtPYmplY3R9IGRhdGFcbiAgICovXG4gIGxvZyhraW5kLCBtc2csIGRhdGEpeyB0aGlzLmxvZ2dlciAmJiB0aGlzLmxvZ2dlcihraW5kLCBtc2csIGRhdGEpIH1cblxuICAvKipcbiAgICogUmV0dXJucyB0cnVlIGlmIGEgbG9nZ2VyIGhhcyBiZWVuIHNldCBvbiB0aGlzIHNvY2tldC5cbiAgICovXG4gIGhhc0xvZ2dlcigpeyByZXR1cm4gdGhpcy5sb2dnZXIgIT09IG51bGwgfVxuXG4gIC8qKlxuICAgKiBSZWdpc3RlcnMgY2FsbGJhY2tzIGZvciBjb25uZWN0aW9uIG9wZW4gZXZlbnRzXG4gICAqXG4gICAqIEBleGFtcGxlIHNvY2tldC5vbk9wZW4oZnVuY3Rpb24oKXsgY29uc29sZS5pbmZvKFwidGhlIHNvY2tldCB3YXMgb3BlbmVkXCIpIH0pXG4gICAqXG4gICAqIEBwYXJhbSB7RnVuY3Rpb259IGNhbGxiYWNrXG4gICAqL1xuICBvbk9wZW4oY2FsbGJhY2spe1xuICAgIGxldCByZWYgPSB0aGlzLm1ha2VSZWYoKVxuICAgIHRoaXMuc3RhdGVDaGFuZ2VDYWxsYmFja3Mub3Blbi5wdXNoKFtyZWYsIGNhbGxiYWNrXSlcbiAgICByZXR1cm4gcmVmXG4gIH1cblxuICAvKipcbiAgICogUmVnaXN0ZXJzIGNhbGxiYWNrcyBmb3IgY29ubmVjdGlvbiBjbG9zZSBldmVudHNcbiAgICogQHBhcmFtIHtGdW5jdGlvbn0gY2FsbGJhY2tcbiAgICovXG4gIG9uQ2xvc2UoY2FsbGJhY2spe1xuICAgIGxldCByZWYgPSB0aGlzLm1ha2VSZWYoKVxuICAgIHRoaXMuc3RhdGVDaGFuZ2VDYWxsYmFja3MuY2xvc2UucHVzaChbcmVmLCBjYWxsYmFja10pXG4gICAgcmV0dXJuIHJlZlxuICB9XG5cbiAgLyoqXG4gICAqIFJlZ2lzdGVycyBjYWxsYmFja3MgZm9yIGNvbm5lY3Rpb24gZXJyb3IgZXZlbnRzXG4gICAqXG4gICAqIEBleGFtcGxlIHNvY2tldC5vbkVycm9yKGZ1bmN0aW9uKGVycm9yKXsgYWxlcnQoXCJBbiBlcnJvciBvY2N1cnJlZFwiKSB9KVxuICAgKlxuICAgKiBAcGFyYW0ge0Z1bmN0aW9ufSBjYWxsYmFja1xuICAgKi9cbiAgb25FcnJvcihjYWxsYmFjayl7XG4gICAgbGV0IHJlZiA9IHRoaXMubWFrZVJlZigpXG4gICAgdGhpcy5zdGF0ZUNoYW5nZUNhbGxiYWNrcy5lcnJvci5wdXNoKFtyZWYsIGNhbGxiYWNrXSlcbiAgICByZXR1cm4gcmVmXG4gIH1cblxuICAvKipcbiAgICogUmVnaXN0ZXJzIGNhbGxiYWNrcyBmb3IgY29ubmVjdGlvbiBtZXNzYWdlIGV2ZW50c1xuICAgKiBAcGFyYW0ge0Z1bmN0aW9ufSBjYWxsYmFja1xuICAgKi9cbiAgb25NZXNzYWdlKGNhbGxiYWNrKXtcbiAgICBsZXQgcmVmID0gdGhpcy5tYWtlUmVmKClcbiAgICB0aGlzLnN0YXRlQ2hhbmdlQ2FsbGJhY2tzLm1lc3NhZ2UucHVzaChbcmVmLCBjYWxsYmFja10pXG4gICAgcmV0dXJuIHJlZlxuICB9XG5cbiAgLyoqXG4gICAqIFBpbmdzIHRoZSBzZXJ2ZXIgYW5kIGludm9rZXMgdGhlIGNhbGxiYWNrIHdpdGggdGhlIFJUVCBpbiBtaWxsaXNlY29uZHNcbiAgICogQHBhcmFtIHtGdW5jdGlvbn0gY2FsbGJhY2tcbiAgICpcbiAgICogUmV0dXJucyB0cnVlIGlmIHRoZSBwaW5nIHdhcyBwdXNoZWQgb3IgZmFsc2UgaWYgdW5hYmxlIHRvIGJlIHB1c2hlZC5cbiAgICovXG4gIHBpbmcoY2FsbGJhY2spe1xuICAgIGlmKCF0aGlzLmlzQ29ubmVjdGVkKCkpeyByZXR1cm4gZmFsc2UgfVxuICAgIGxldCByZWYgPSB0aGlzLm1ha2VSZWYoKVxuICAgIGxldCBzdGFydFRpbWUgPSBEYXRlLm5vdygpXG4gICAgdGhpcy5wdXNoKHt0b3BpYzogXCJwaG9lbml4XCIsIGV2ZW50OiBcImhlYXJ0YmVhdFwiLCBwYXlsb2FkOiB7fSwgcmVmOiByZWZ9KVxuICAgIGxldCBvbk1zZ1JlZiA9IHRoaXMub25NZXNzYWdlKG1zZyA9PiB7XG4gICAgICBpZihtc2cucmVmID09PSByZWYpe1xuICAgICAgICB0aGlzLm9mZihbb25Nc2dSZWZdKVxuICAgICAgICBjYWxsYmFjayhEYXRlLm5vdygpIC0gc3RhcnRUaW1lKVxuICAgICAgfVxuICAgIH0pXG4gICAgcmV0dXJuIHRydWVcbiAgfVxuXG4gIC8qKlxuICAgKiBAcHJpdmF0ZVxuICAgKi9cblxuICB0cmFuc3BvcnRDb25uZWN0KCl7XG4gICAgdGhpcy5jb25uZWN0Q2xvY2srK1xuICAgIHRoaXMuY2xvc2VXYXNDbGVhbiA9IGZhbHNlXG4gICAgbGV0IHByb3RvY29scyA9IHVuZGVmaW5lZFxuICAgIC8vIFNlYy1XZWJTb2NrZXQtUHJvdG9jb2wgYmFzZWQgdG9rZW5cbiAgICAvLyAobG9uZ3BvbGwgdXNlcyBBdXRob3JpemF0aW9uIGhlYWRlciBpbnN0ZWFkKVxuICAgIGlmKHRoaXMuYXV0aFRva2VuKXtcbiAgICAgIHByb3RvY29scyA9IFtcInBob2VuaXhcIiwgYCR7QVVUSF9UT0tFTl9QUkVGSVh9JHtidG9hKHRoaXMuYXV0aFRva2VuKS5yZXBsYWNlKC89L2csIFwiXCIpfWBdXG4gICAgfVxuICAgIHRoaXMuY29ubiA9IG5ldyB0aGlzLnRyYW5zcG9ydCh0aGlzLmVuZFBvaW50VVJMKCksIHByb3RvY29scylcbiAgICB0aGlzLmNvbm4uYmluYXJ5VHlwZSA9IHRoaXMuYmluYXJ5VHlwZVxuICAgIHRoaXMuY29ubi50aW1lb3V0ID0gdGhpcy5sb25ncG9sbGVyVGltZW91dFxuICAgIHRoaXMuY29ubi5vbm9wZW4gPSAoKSA9PiB0aGlzLm9uQ29ubk9wZW4oKVxuICAgIHRoaXMuY29ubi5vbmVycm9yID0gZXJyb3IgPT4gdGhpcy5vbkNvbm5FcnJvcihlcnJvcilcbiAgICB0aGlzLmNvbm4ub25tZXNzYWdlID0gZXZlbnQgPT4gdGhpcy5vbkNvbm5NZXNzYWdlKGV2ZW50KVxuICAgIHRoaXMuY29ubi5vbmNsb3NlID0gZXZlbnQgPT4gdGhpcy5vbkNvbm5DbG9zZShldmVudClcbiAgfVxuXG4gIGdldFNlc3Npb24oa2V5KXsgcmV0dXJuIHRoaXMuc2Vzc2lvblN0b3JlICYmIHRoaXMuc2Vzc2lvblN0b3JlLmdldEl0ZW0oa2V5KSB9XG5cbiAgc3RvcmVTZXNzaW9uKGtleSwgdmFsKXsgdGhpcy5zZXNzaW9uU3RvcmUgJiYgdGhpcy5zZXNzaW9uU3RvcmUuc2V0SXRlbShrZXksIHZhbCkgfVxuXG4gIGNvbm5lY3RXaXRoRmFsbGJhY2soZmFsbGJhY2tUcmFuc3BvcnQsIGZhbGxiYWNrVGhyZXNob2xkID0gMjUwMCl7XG4gICAgY2xlYXJUaW1lb3V0KHRoaXMuZmFsbGJhY2tUaW1lcilcbiAgICBsZXQgZXN0YWJsaXNoZWQgPSBmYWxzZVxuICAgIGxldCBwcmltYXJ5VHJhbnNwb3J0ID0gdHJ1ZVxuICAgIGxldCBvcGVuUmVmLCBlcnJvclJlZlxuICAgIGxldCBmYWxsYmFjayA9IChyZWFzb24pID0+IHtcbiAgICAgIHRoaXMubG9nKFwidHJhbnNwb3J0XCIsIGBmYWxsaW5nIGJhY2sgdG8gJHtmYWxsYmFja1RyYW5zcG9ydC5uYW1lfS4uLmAsIHJlYXNvbilcbiAgICAgIHRoaXMub2ZmKFtvcGVuUmVmLCBlcnJvclJlZl0pXG4gICAgICBwcmltYXJ5VHJhbnNwb3J0ID0gZmFsc2VcbiAgICAgIHRoaXMucmVwbGFjZVRyYW5zcG9ydChmYWxsYmFja1RyYW5zcG9ydClcbiAgICAgIHRoaXMudHJhbnNwb3J0Q29ubmVjdCgpXG4gICAgfVxuICAgIGlmKHRoaXMuZ2V0U2Vzc2lvbihgcGh4OmZhbGxiYWNrOiR7ZmFsbGJhY2tUcmFuc3BvcnQubmFtZX1gKSl7IHJldHVybiBmYWxsYmFjayhcIm1lbW9yaXplZFwiKSB9XG5cbiAgICB0aGlzLmZhbGxiYWNrVGltZXIgPSBzZXRUaW1lb3V0KGZhbGxiYWNrLCBmYWxsYmFja1RocmVzaG9sZClcblxuICAgIGVycm9yUmVmID0gdGhpcy5vbkVycm9yKHJlYXNvbiA9PiB7XG4gICAgICB0aGlzLmxvZyhcInRyYW5zcG9ydFwiLCBcImVycm9yXCIsIHJlYXNvbilcbiAgICAgIGlmKHByaW1hcnlUcmFuc3BvcnQgJiYgIWVzdGFibGlzaGVkKXtcbiAgICAgICAgY2xlYXJUaW1lb3V0KHRoaXMuZmFsbGJhY2tUaW1lcilcbiAgICAgICAgZmFsbGJhY2socmVhc29uKVxuICAgICAgfVxuICAgIH0pXG4gICAgdGhpcy5vbk9wZW4oKCkgPT4ge1xuICAgICAgZXN0YWJsaXNoZWQgPSB0cnVlXG4gICAgICBpZighcHJpbWFyeVRyYW5zcG9ydCl7XG4gICAgICAgIC8vIG9ubHkgbWVtb3JpemUgTFAgaWYgd2UgbmV2ZXIgY29ubmVjdGVkIHRvIHByaW1hcnlcbiAgICAgICAgaWYoIXRoaXMucHJpbWFyeVBhc3NlZEhlYWx0aENoZWNrKXsgdGhpcy5zdG9yZVNlc3Npb24oYHBoeDpmYWxsYmFjazoke2ZhbGxiYWNrVHJhbnNwb3J0Lm5hbWV9YCwgXCJ0cnVlXCIpIH1cbiAgICAgICAgcmV0dXJuIHRoaXMubG9nKFwidHJhbnNwb3J0XCIsIGBlc3RhYmxpc2hlZCAke2ZhbGxiYWNrVHJhbnNwb3J0Lm5hbWV9IGZhbGxiYWNrYClcbiAgICAgIH1cbiAgICAgIC8vIGlmIHdlJ3ZlIGVzdGFibGlzaGVkIHByaW1hcnksIGdpdmUgdGhlIGZhbGxiYWNrIGEgbmV3IHBlcmlvZCB0byBhdHRlbXB0IHBpbmdcbiAgICAgIGNsZWFyVGltZW91dCh0aGlzLmZhbGxiYWNrVGltZXIpXG4gICAgICB0aGlzLmZhbGxiYWNrVGltZXIgPSBzZXRUaW1lb3V0KGZhbGxiYWNrLCBmYWxsYmFja1RocmVzaG9sZClcbiAgICAgIHRoaXMucGluZyhydHQgPT4ge1xuICAgICAgICB0aGlzLmxvZyhcInRyYW5zcG9ydFwiLCBcImNvbm5lY3RlZCB0byBwcmltYXJ5IGFmdGVyXCIsIHJ0dClcbiAgICAgICAgdGhpcy5wcmltYXJ5UGFzc2VkSGVhbHRoQ2hlY2sgPSB0cnVlXG4gICAgICAgIGNsZWFyVGltZW91dCh0aGlzLmZhbGxiYWNrVGltZXIpXG4gICAgICB9KVxuICAgIH0pXG4gICAgdGhpcy50cmFuc3BvcnRDb25uZWN0KClcbiAgfVxuXG4gIGNsZWFySGVhcnRiZWF0cygpe1xuICAgIGNsZWFyVGltZW91dCh0aGlzLmhlYXJ0YmVhdFRpbWVyKVxuICAgIGNsZWFyVGltZW91dCh0aGlzLmhlYXJ0YmVhdFRpbWVvdXRUaW1lcilcbiAgfVxuXG4gIG9uQ29ubk9wZW4oKXtcbiAgICBpZih0aGlzLmhhc0xvZ2dlcigpKSB0aGlzLmxvZyhcInRyYW5zcG9ydFwiLCBgJHt0aGlzLnRyYW5zcG9ydC5uYW1lfSBjb25uZWN0ZWQgdG8gJHt0aGlzLmVuZFBvaW50VVJMKCl9YClcbiAgICB0aGlzLmNsb3NlV2FzQ2xlYW4gPSBmYWxzZVxuICAgIHRoaXMuZGlzY29ubmVjdGluZyA9IGZhbHNlXG4gICAgdGhpcy5lc3RhYmxpc2hlZENvbm5lY3Rpb25zKytcbiAgICB0aGlzLmZsdXNoU2VuZEJ1ZmZlcigpXG4gICAgdGhpcy5yZWNvbm5lY3RUaW1lci5yZXNldCgpXG4gICAgdGhpcy5yZXNldEhlYXJ0YmVhdCgpXG4gICAgdGhpcy5zdGF0ZUNoYW5nZUNhbGxiYWNrcy5vcGVuLmZvckVhY2goKFssIGNhbGxiYWNrXSkgPT4gY2FsbGJhY2soKSlcbiAgfVxuXG4gIC8qKlxuICAgKiBAcHJpdmF0ZVxuICAgKi9cblxuICBoZWFydGJlYXRUaW1lb3V0KCl7XG4gICAgaWYodGhpcy5wZW5kaW5nSGVhcnRiZWF0UmVmKXtcbiAgICAgIHRoaXMucGVuZGluZ0hlYXJ0YmVhdFJlZiA9IG51bGxcbiAgICAgIGlmKHRoaXMuaGFzTG9nZ2VyKCkpeyB0aGlzLmxvZyhcInRyYW5zcG9ydFwiLCBcImhlYXJ0YmVhdCB0aW1lb3V0LiBBdHRlbXB0aW5nIHRvIHJlLWVzdGFibGlzaCBjb25uZWN0aW9uXCIpIH1cbiAgICAgIHRoaXMudHJpZ2dlckNoYW5FcnJvcigpXG4gICAgICB0aGlzLmNsb3NlV2FzQ2xlYW4gPSBmYWxzZVxuICAgICAgdGhpcy50ZWFyZG93bigoKSA9PiB0aGlzLnJlY29ubmVjdFRpbWVyLnNjaGVkdWxlVGltZW91dCgpLCBXU19DTE9TRV9OT1JNQUwsIFwiaGVhcnRiZWF0IHRpbWVvdXRcIilcbiAgICB9XG4gIH1cblxuICByZXNldEhlYXJ0YmVhdCgpe1xuICAgIGlmKHRoaXMuY29ubiAmJiB0aGlzLmNvbm4uc2tpcEhlYXJ0YmVhdCl7IHJldHVybiB9XG4gICAgdGhpcy5wZW5kaW5nSGVhcnRiZWF0UmVmID0gbnVsbFxuICAgIHRoaXMuY2xlYXJIZWFydGJlYXRzKClcbiAgICB0aGlzLmhlYXJ0YmVhdFRpbWVyID0gc2V0VGltZW91dCgoKSA9PiB0aGlzLnNlbmRIZWFydGJlYXQoKSwgdGhpcy5oZWFydGJlYXRJbnRlcnZhbE1zKVxuICB9XG5cbiAgdGVhcmRvd24oY2FsbGJhY2ssIGNvZGUsIHJlYXNvbil7XG4gICAgaWYoIXRoaXMuY29ubil7XG4gICAgICByZXR1cm4gY2FsbGJhY2sgJiYgY2FsbGJhY2soKVxuICAgIH1cbiAgICBsZXQgY29ubmVjdENsb2NrID0gdGhpcy5jb25uZWN0Q2xvY2tcblxuICAgIHRoaXMud2FpdEZvckJ1ZmZlckRvbmUoKCkgPT4ge1xuICAgICAgaWYoY29ubmVjdENsb2NrICE9PSB0aGlzLmNvbm5lY3RDbG9jayl7IHJldHVybiB9XG4gICAgICBpZih0aGlzLmNvbm4pe1xuICAgICAgICBpZihjb2RlKXsgdGhpcy5jb25uLmNsb3NlKGNvZGUsIHJlYXNvbiB8fCBcIlwiKSB9IGVsc2UgeyB0aGlzLmNvbm4uY2xvc2UoKSB9XG4gICAgICB9XG5cbiAgICAgIHRoaXMud2FpdEZvclNvY2tldENsb3NlZCgoKSA9PiB7XG4gICAgICAgIGlmKGNvbm5lY3RDbG9jayAhPT0gdGhpcy5jb25uZWN0Q2xvY2speyByZXR1cm4gfVxuICAgICAgICBpZih0aGlzLmNvbm4pe1xuICAgICAgICAgIHRoaXMuY29ubi5vbm9wZW4gPSBmdW5jdGlvbiAoKXsgfSAvLyBub29wXG4gICAgICAgICAgdGhpcy5jb25uLm9uZXJyb3IgPSBmdW5jdGlvbiAoKXsgfSAvLyBub29wXG4gICAgICAgICAgdGhpcy5jb25uLm9ubWVzc2FnZSA9IGZ1bmN0aW9uICgpeyB9IC8vIG5vb3BcbiAgICAgICAgICB0aGlzLmNvbm4ub25jbG9zZSA9IGZ1bmN0aW9uICgpeyB9IC8vIG5vb3BcbiAgICAgICAgICB0aGlzLmNvbm4gPSBudWxsXG4gICAgICAgIH1cblxuICAgICAgICBjYWxsYmFjayAmJiBjYWxsYmFjaygpXG4gICAgICB9KVxuICAgIH0pXG4gIH1cblxuICB3YWl0Rm9yQnVmZmVyRG9uZShjYWxsYmFjaywgdHJpZXMgPSAxKXtcbiAgICBpZih0cmllcyA9PT0gNSB8fCAhdGhpcy5jb25uIHx8ICF0aGlzLmNvbm4uYnVmZmVyZWRBbW91bnQpe1xuICAgICAgY2FsbGJhY2soKVxuICAgICAgcmV0dXJuXG4gICAgfVxuXG4gICAgc2V0VGltZW91dCgoKSA9PiB7XG4gICAgICB0aGlzLndhaXRGb3JCdWZmZXJEb25lKGNhbGxiYWNrLCB0cmllcyArIDEpXG4gICAgfSwgMTUwICogdHJpZXMpXG4gIH1cblxuICB3YWl0Rm9yU29ja2V0Q2xvc2VkKGNhbGxiYWNrLCB0cmllcyA9IDEpe1xuICAgIGlmKHRyaWVzID09PSA1IHx8ICF0aGlzLmNvbm4gfHwgdGhpcy5jb25uLnJlYWR5U3RhdGUgPT09IFNPQ0tFVF9TVEFURVMuY2xvc2VkKXtcbiAgICAgIGNhbGxiYWNrKClcbiAgICAgIHJldHVyblxuICAgIH1cblxuICAgIHNldFRpbWVvdXQoKCkgPT4ge1xuICAgICAgdGhpcy53YWl0Rm9yU29ja2V0Q2xvc2VkKGNhbGxiYWNrLCB0cmllcyArIDEpXG4gICAgfSwgMTUwICogdHJpZXMpXG4gIH1cblxuICBvbkNvbm5DbG9zZShldmVudCl7XG4gICAgbGV0IGNsb3NlQ29kZSA9IGV2ZW50ICYmIGV2ZW50LmNvZGVcbiAgICBpZih0aGlzLmhhc0xvZ2dlcigpKSB0aGlzLmxvZyhcInRyYW5zcG9ydFwiLCBcImNsb3NlXCIsIGV2ZW50KVxuICAgIHRoaXMudHJpZ2dlckNoYW5FcnJvcigpXG4gICAgdGhpcy5jbGVhckhlYXJ0YmVhdHMoKVxuICAgIGlmKCF0aGlzLmNsb3NlV2FzQ2xlYW4gJiYgY2xvc2VDb2RlICE9PSAxMDAwKXtcbiAgICAgIHRoaXMucmVjb25uZWN0VGltZXIuc2NoZWR1bGVUaW1lb3V0KClcbiAgICB9XG4gICAgdGhpcy5zdGF0ZUNoYW5nZUNhbGxiYWNrcy5jbG9zZS5mb3JFYWNoKChbLCBjYWxsYmFja10pID0+IGNhbGxiYWNrKGV2ZW50KSlcbiAgfVxuXG4gIC8qKlxuICAgKiBAcHJpdmF0ZVxuICAgKi9cbiAgb25Db25uRXJyb3IoZXJyb3Ipe1xuICAgIGlmKHRoaXMuaGFzTG9nZ2VyKCkpIHRoaXMubG9nKFwidHJhbnNwb3J0XCIsIGVycm9yKVxuICAgIGxldCB0cmFuc3BvcnRCZWZvcmUgPSB0aGlzLnRyYW5zcG9ydFxuICAgIGxldCBlc3RhYmxpc2hlZEJlZm9yZSA9IHRoaXMuZXN0YWJsaXNoZWRDb25uZWN0aW9uc1xuICAgIHRoaXMuc3RhdGVDaGFuZ2VDYWxsYmFja3MuZXJyb3IuZm9yRWFjaCgoWywgY2FsbGJhY2tdKSA9PiB7XG4gICAgICBjYWxsYmFjayhlcnJvciwgdHJhbnNwb3J0QmVmb3JlLCBlc3RhYmxpc2hlZEJlZm9yZSlcbiAgICB9KVxuICAgIGlmKHRyYW5zcG9ydEJlZm9yZSA9PT0gdGhpcy50cmFuc3BvcnQgfHwgZXN0YWJsaXNoZWRCZWZvcmUgPiAwKXtcbiAgICAgIHRoaXMudHJpZ2dlckNoYW5FcnJvcigpXG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIEBwcml2YXRlXG4gICAqL1xuICB0cmlnZ2VyQ2hhbkVycm9yKCl7XG4gICAgdGhpcy5jaGFubmVscy5mb3JFYWNoKGNoYW5uZWwgPT4ge1xuICAgICAgaWYoIShjaGFubmVsLmlzRXJyb3JlZCgpIHx8IGNoYW5uZWwuaXNMZWF2aW5nKCkgfHwgY2hhbm5lbC5pc0Nsb3NlZCgpKSl7XG4gICAgICAgIGNoYW5uZWwudHJpZ2dlcihDSEFOTkVMX0VWRU5UUy5lcnJvcilcbiAgICAgIH1cbiAgICB9KVxuICB9XG5cbiAgLyoqXG4gICAqIEByZXR1cm5zIHtzdHJpbmd9XG4gICAqL1xuICBjb25uZWN0aW9uU3RhdGUoKXtcbiAgICBzd2l0Y2godGhpcy5jb25uICYmIHRoaXMuY29ubi5yZWFkeVN0YXRlKXtcbiAgICAgIGNhc2UgU09DS0VUX1NUQVRFUy5jb25uZWN0aW5nOiByZXR1cm4gXCJjb25uZWN0aW5nXCJcbiAgICAgIGNhc2UgU09DS0VUX1NUQVRFUy5vcGVuOiByZXR1cm4gXCJvcGVuXCJcbiAgICAgIGNhc2UgU09DS0VUX1NUQVRFUy5jbG9zaW5nOiByZXR1cm4gXCJjbG9zaW5nXCJcbiAgICAgIGRlZmF1bHQ6IHJldHVybiBcImNsb3NlZFwiXG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIEByZXR1cm5zIHtib29sZWFufVxuICAgKi9cbiAgaXNDb25uZWN0ZWQoKXsgcmV0dXJuIHRoaXMuY29ubmVjdGlvblN0YXRlKCkgPT09IFwib3BlblwiIH1cblxuICAvKipcbiAgICogQHByaXZhdGVcbiAgICpcbiAgICogQHBhcmFtIHtDaGFubmVsfVxuICAgKi9cbiAgcmVtb3ZlKGNoYW5uZWwpe1xuICAgIHRoaXMub2ZmKGNoYW5uZWwuc3RhdGVDaGFuZ2VSZWZzKVxuICAgIHRoaXMuY2hhbm5lbHMgPSB0aGlzLmNoYW5uZWxzLmZpbHRlcihjID0+IGMgIT09IGNoYW5uZWwpXG4gIH1cblxuICAvKipcbiAgICogUmVtb3ZlcyBgb25PcGVuYCwgYG9uQ2xvc2VgLCBgb25FcnJvcixgIGFuZCBgb25NZXNzYWdlYCByZWdpc3RyYXRpb25zLlxuICAgKlxuICAgKiBAcGFyYW0ge3JlZnN9IC0gbGlzdCBvZiByZWZzIHJldHVybmVkIGJ5IGNhbGxzIHRvXG4gICAqICAgICAgICAgICAgICAgICBgb25PcGVuYCwgYG9uQ2xvc2VgLCBgb25FcnJvcixgIGFuZCBgb25NZXNzYWdlYFxuICAgKi9cbiAgb2ZmKHJlZnMpe1xuICAgIGZvcihsZXQga2V5IGluIHRoaXMuc3RhdGVDaGFuZ2VDYWxsYmFja3Mpe1xuICAgICAgdGhpcy5zdGF0ZUNoYW5nZUNhbGxiYWNrc1trZXldID0gdGhpcy5zdGF0ZUNoYW5nZUNhbGxiYWNrc1trZXldLmZpbHRlcigoW3JlZl0pID0+IHtcbiAgICAgICAgcmV0dXJuIHJlZnMuaW5kZXhPZihyZWYpID09PSAtMVxuICAgICAgfSlcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogSW5pdGlhdGVzIGEgbmV3IGNoYW5uZWwgZm9yIHRoZSBnaXZlbiB0b3BpY1xuICAgKlxuICAgKiBAcGFyYW0ge3N0cmluZ30gdG9waWNcbiAgICogQHBhcmFtIHtPYmplY3R9IGNoYW5QYXJhbXMgLSBQYXJhbWV0ZXJzIGZvciB0aGUgY2hhbm5lbFxuICAgKiBAcmV0dXJucyB7Q2hhbm5lbH1cbiAgICovXG4gIGNoYW5uZWwodG9waWMsIGNoYW5QYXJhbXMgPSB7fSl7XG4gICAgbGV0IGNoYW4gPSBuZXcgQ2hhbm5lbCh0b3BpYywgY2hhblBhcmFtcywgdGhpcylcbiAgICB0aGlzLmNoYW5uZWxzLnB1c2goY2hhbilcbiAgICByZXR1cm4gY2hhblxuICB9XG5cbiAgLyoqXG4gICAqIEBwYXJhbSB7T2JqZWN0fSBkYXRhXG4gICAqL1xuICBwdXNoKGRhdGEpe1xuICAgIGlmKHRoaXMuaGFzTG9nZ2VyKCkpe1xuICAgICAgbGV0IHt0b3BpYywgZXZlbnQsIHBheWxvYWQsIHJlZiwgam9pbl9yZWZ9ID0gZGF0YVxuICAgICAgdGhpcy5sb2coXCJwdXNoXCIsIGAke3RvcGljfSAke2V2ZW50fSAoJHtqb2luX3JlZn0sICR7cmVmfSlgLCBwYXlsb2FkKVxuICAgIH1cblxuICAgIGlmKHRoaXMuaXNDb25uZWN0ZWQoKSl7XG4gICAgICB0aGlzLmVuY29kZShkYXRhLCByZXN1bHQgPT4gdGhpcy5jb25uLnNlbmQocmVzdWx0KSlcbiAgICB9IGVsc2Uge1xuICAgICAgdGhpcy5zZW5kQnVmZmVyLnB1c2goKCkgPT4gdGhpcy5lbmNvZGUoZGF0YSwgcmVzdWx0ID0+IHRoaXMuY29ubi5zZW5kKHJlc3VsdCkpKVxuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBSZXR1cm4gdGhlIG5leHQgbWVzc2FnZSByZWYsIGFjY291bnRpbmcgZm9yIG92ZXJmbG93c1xuICAgKiBAcmV0dXJucyB7c3RyaW5nfVxuICAgKi9cbiAgbWFrZVJlZigpe1xuICAgIGxldCBuZXdSZWYgPSB0aGlzLnJlZiArIDFcbiAgICBpZihuZXdSZWYgPT09IHRoaXMucmVmKXsgdGhpcy5yZWYgPSAwIH0gZWxzZSB7IHRoaXMucmVmID0gbmV3UmVmIH1cblxuICAgIHJldHVybiB0aGlzLnJlZi50b1N0cmluZygpXG4gIH1cblxuICBzZW5kSGVhcnRiZWF0KCl7XG4gICAgaWYodGhpcy5wZW5kaW5nSGVhcnRiZWF0UmVmICYmICF0aGlzLmlzQ29ubmVjdGVkKCkpeyByZXR1cm4gfVxuICAgIHRoaXMucGVuZGluZ0hlYXJ0YmVhdFJlZiA9IHRoaXMubWFrZVJlZigpXG4gICAgdGhpcy5wdXNoKHt0b3BpYzogXCJwaG9lbml4XCIsIGV2ZW50OiBcImhlYXJ0YmVhdFwiLCBwYXlsb2FkOiB7fSwgcmVmOiB0aGlzLnBlbmRpbmdIZWFydGJlYXRSZWZ9KVxuICAgIHRoaXMuaGVhcnRiZWF0VGltZW91dFRpbWVyID0gc2V0VGltZW91dCgoKSA9PiB0aGlzLmhlYXJ0YmVhdFRpbWVvdXQoKSwgdGhpcy5oZWFydGJlYXRJbnRlcnZhbE1zKVxuICB9XG5cbiAgZmx1c2hTZW5kQnVmZmVyKCl7XG4gICAgaWYodGhpcy5pc0Nvbm5lY3RlZCgpICYmIHRoaXMuc2VuZEJ1ZmZlci5sZW5ndGggPiAwKXtcbiAgICAgIHRoaXMuc2VuZEJ1ZmZlci5mb3JFYWNoKGNhbGxiYWNrID0+IGNhbGxiYWNrKCkpXG4gICAgICB0aGlzLnNlbmRCdWZmZXIgPSBbXVxuICAgIH1cbiAgfVxuXG4gIG9uQ29ubk1lc3NhZ2UocmF3TWVzc2FnZSl7XG4gICAgdGhpcy5kZWNvZGUocmF3TWVzc2FnZS5kYXRhLCBtc2cgPT4ge1xuICAgICAgbGV0IHt0b3BpYywgZXZlbnQsIHBheWxvYWQsIHJlZiwgam9pbl9yZWZ9ID0gbXNnXG4gICAgICBpZihyZWYgJiYgcmVmID09PSB0aGlzLnBlbmRpbmdIZWFydGJlYXRSZWYpe1xuICAgICAgICB0aGlzLmNsZWFySGVhcnRiZWF0cygpXG4gICAgICAgIHRoaXMucGVuZGluZ0hlYXJ0YmVhdFJlZiA9IG51bGxcbiAgICAgICAgdGhpcy5oZWFydGJlYXRUaW1lciA9IHNldFRpbWVvdXQoKCkgPT4gdGhpcy5zZW5kSGVhcnRiZWF0KCksIHRoaXMuaGVhcnRiZWF0SW50ZXJ2YWxNcylcbiAgICAgIH1cblxuICAgICAgaWYodGhpcy5oYXNMb2dnZXIoKSkgdGhpcy5sb2coXCJyZWNlaXZlXCIsIGAke3BheWxvYWQuc3RhdHVzIHx8IFwiXCJ9ICR7dG9waWN9ICR7ZXZlbnR9ICR7cmVmICYmIFwiKFwiICsgcmVmICsgXCIpXCIgfHwgXCJcIn1gLCBwYXlsb2FkKVxuXG4gICAgICBmb3IobGV0IGkgPSAwOyBpIDwgdGhpcy5jaGFubmVscy5sZW5ndGg7IGkrKyl7XG4gICAgICAgIGNvbnN0IGNoYW5uZWwgPSB0aGlzLmNoYW5uZWxzW2ldXG4gICAgICAgIGlmKCFjaGFubmVsLmlzTWVtYmVyKHRvcGljLCBldmVudCwgcGF5bG9hZCwgam9pbl9yZWYpKXsgY29udGludWUgfVxuICAgICAgICBjaGFubmVsLnRyaWdnZXIoZXZlbnQsIHBheWxvYWQsIHJlZiwgam9pbl9yZWYpXG4gICAgICB9XG5cbiAgICAgIGZvcihsZXQgaSA9IDA7IGkgPCB0aGlzLnN0YXRlQ2hhbmdlQ2FsbGJhY2tzLm1lc3NhZ2UubGVuZ3RoOyBpKyspe1xuICAgICAgICBsZXQgWywgY2FsbGJhY2tdID0gdGhpcy5zdGF0ZUNoYW5nZUNhbGxiYWNrcy5tZXNzYWdlW2ldXG4gICAgICAgIGNhbGxiYWNrKG1zZylcbiAgICAgIH1cbiAgICB9KVxuICB9XG5cbiAgbGVhdmVPcGVuVG9waWModG9waWMpe1xuICAgIGxldCBkdXBDaGFubmVsID0gdGhpcy5jaGFubmVscy5maW5kKGMgPT4gYy50b3BpYyA9PT0gdG9waWMgJiYgKGMuaXNKb2luZWQoKSB8fCBjLmlzSm9pbmluZygpKSlcbiAgICBpZihkdXBDaGFubmVsKXtcbiAgICAgIGlmKHRoaXMuaGFzTG9nZ2VyKCkpIHRoaXMubG9nKFwidHJhbnNwb3J0XCIsIGBsZWF2aW5nIGR1cGxpY2F0ZSB0b3BpYyBcIiR7dG9waWN9XCJgKVxuICAgICAgZHVwQ2hhbm5lbC5sZWF2ZSgpXG4gICAgfVxuICB9XG59XG4iLCAiZXhwb3J0IGNvbnN0IENPTlNFQ1VUSVZFX1JFTE9BRFMgPSBcImNvbnNlY3V0aXZlLXJlbG9hZHNcIjtcbmV4cG9ydCBjb25zdCBNQVhfUkVMT0FEUyA9IDEwO1xuZXhwb3J0IGNvbnN0IFJFTE9BRF9KSVRURVJfTUlOID0gNTAwMDtcbmV4cG9ydCBjb25zdCBSRUxPQURfSklUVEVSX01BWCA9IDEwMDAwO1xuZXhwb3J0IGNvbnN0IEZBSUxTQUZFX0pJVFRFUiA9IDMwMDAwO1xuZXhwb3J0IGNvbnN0IFBIWF9FVkVOVF9DTEFTU0VTID0gW1xuICBcInBoeC1jbGljay1sb2FkaW5nXCIsXG4gIFwicGh4LWNoYW5nZS1sb2FkaW5nXCIsXG4gIFwicGh4LXN1Ym1pdC1sb2FkaW5nXCIsXG4gIFwicGh4LWtleWRvd24tbG9hZGluZ1wiLFxuICBcInBoeC1rZXl1cC1sb2FkaW5nXCIsXG4gIFwicGh4LWJsdXItbG9hZGluZ1wiLFxuICBcInBoeC1mb2N1cy1sb2FkaW5nXCIsXG4gIFwicGh4LWhvb2stbG9hZGluZ1wiLFxuXTtcbmV4cG9ydCBjb25zdCBQSFhfQ09NUE9ORU5UID0gXCJkYXRhLXBoeC1jb21wb25lbnRcIjtcbmV4cG9ydCBjb25zdCBQSFhfVklFV19SRUYgPSBcImRhdGEtcGh4LXZpZXdcIjtcbmV4cG9ydCBjb25zdCBQSFhfTElWRV9MSU5LID0gXCJkYXRhLXBoeC1saW5rXCI7XG5leHBvcnQgY29uc3QgUEhYX1RSQUNLX1NUQVRJQyA9IFwidHJhY2stc3RhdGljXCI7XG5leHBvcnQgY29uc3QgUEhYX0xJTktfU1RBVEUgPSBcImRhdGEtcGh4LWxpbmstc3RhdGVcIjtcbmV4cG9ydCBjb25zdCBQSFhfUkVGX0xPQURJTkcgPSBcImRhdGEtcGh4LXJlZi1sb2FkaW5nXCI7XG5leHBvcnQgY29uc3QgUEhYX1JFRl9TUkMgPSBcImRhdGEtcGh4LXJlZi1zcmNcIjtcbmV4cG9ydCBjb25zdCBQSFhfUkVGX0xPQ0sgPSBcImRhdGEtcGh4LXJlZi1sb2NrXCI7XG5leHBvcnQgY29uc3QgUEhYX1BFTkRJTkdfUkVGUyA9IFwicGh4LXBlbmRpbmctcmVmc1wiO1xuZXhwb3J0IGNvbnN0IFBIWF9UUkFDS19VUExPQURTID0gXCJ0cmFjay11cGxvYWRzXCI7XG5leHBvcnQgY29uc3QgUEhYX1VQTE9BRF9SRUYgPSBcImRhdGEtcGh4LXVwbG9hZC1yZWZcIjtcbmV4cG9ydCBjb25zdCBQSFhfUFJFRkxJR0hURURfUkVGUyA9IFwiZGF0YS1waHgtcHJlZmxpZ2h0ZWQtcmVmc1wiO1xuZXhwb3J0IGNvbnN0IFBIWF9ET05FX1JFRlMgPSBcImRhdGEtcGh4LWRvbmUtcmVmc1wiO1xuZXhwb3J0IGNvbnN0IFBIWF9EUk9QX1RBUkdFVCA9IFwiZHJvcC10YXJnZXRcIjtcbmV4cG9ydCBjb25zdCBQSFhfQUNUSVZFX0VOVFJZX1JFRlMgPSBcImRhdGEtcGh4LWFjdGl2ZS1yZWZzXCI7XG5leHBvcnQgY29uc3QgUEhYX0xJVkVfRklMRV9VUERBVEVEID0gXCJwaHg6bGl2ZS1maWxlOnVwZGF0ZWRcIjtcbmV4cG9ydCBjb25zdCBQSFhfU0tJUCA9IFwiZGF0YS1waHgtc2tpcFwiO1xuZXhwb3J0IGNvbnN0IFBIWF9NQUdJQ19JRCA9IFwiZGF0YS1waHgtaWRcIjtcbmV4cG9ydCBjb25zdCBQSFhfUFJVTkUgPSBcImRhdGEtcGh4LXBydW5lXCI7XG5leHBvcnQgY29uc3QgUEhYX0NPTk5FQ1RFRF9DTEFTUyA9IFwicGh4LWNvbm5lY3RlZFwiO1xuZXhwb3J0IGNvbnN0IFBIWF9MT0FESU5HX0NMQVNTID0gXCJwaHgtbG9hZGluZ1wiO1xuZXhwb3J0IGNvbnN0IFBIWF9FUlJPUl9DTEFTUyA9IFwicGh4LWVycm9yXCI7XG5leHBvcnQgY29uc3QgUEhYX0NMSUVOVF9FUlJPUl9DTEFTUyA9IFwicGh4LWNsaWVudC1lcnJvclwiO1xuZXhwb3J0IGNvbnN0IFBIWF9TRVJWRVJfRVJST1JfQ0xBU1MgPSBcInBoeC1zZXJ2ZXItZXJyb3JcIjtcbmV4cG9ydCBjb25zdCBQSFhfUEFSRU5UX0lEID0gXCJkYXRhLXBoeC1wYXJlbnQtaWRcIjtcbmV4cG9ydCBjb25zdCBQSFhfTUFJTiA9IFwiZGF0YS1waHgtbWFpblwiO1xuZXhwb3J0IGNvbnN0IFBIWF9ST09UX0lEID0gXCJkYXRhLXBoeC1yb290LWlkXCI7XG5leHBvcnQgY29uc3QgUEhYX1ZJRVdQT1JUX1RPUCA9IFwidmlld3BvcnQtdG9wXCI7XG5leHBvcnQgY29uc3QgUEhYX1ZJRVdQT1JUX0JPVFRPTSA9IFwidmlld3BvcnQtYm90dG9tXCI7XG5leHBvcnQgY29uc3QgUEhYX1RSSUdHRVJfQUNUSU9OID0gXCJ0cmlnZ2VyLWFjdGlvblwiO1xuZXhwb3J0IGNvbnN0IFBIWF9IQVNfRk9DVVNFRCA9IFwicGh4LWhhcy1mb2N1c2VkXCI7XG5leHBvcnQgY29uc3QgRk9DVVNBQkxFX0lOUFVUUyA9IFtcbiAgXCJ0ZXh0XCIsXG4gIFwidGV4dGFyZWFcIixcbiAgXCJudW1iZXJcIixcbiAgXCJlbWFpbFwiLFxuICBcInBhc3N3b3JkXCIsXG4gIFwic2VhcmNoXCIsXG4gIFwidGVsXCIsXG4gIFwidXJsXCIsXG4gIFwiZGF0ZVwiLFxuICBcInRpbWVcIixcbiAgXCJkYXRldGltZS1sb2NhbFwiLFxuICBcImNvbG9yXCIsXG4gIFwicmFuZ2VcIixcbl07XG5leHBvcnQgY29uc3QgQ0hFQ0tBQkxFX0lOUFVUUyA9IFtcImNoZWNrYm94XCIsIFwicmFkaW9cIl07XG5leHBvcnQgY29uc3QgUEhYX0hBU19TVUJNSVRURUQgPSBcInBoeC1oYXMtc3VibWl0dGVkXCI7XG5leHBvcnQgY29uc3QgUEhYX1NFU1NJT04gPSBcImRhdGEtcGh4LXNlc3Npb25cIjtcbmV4cG9ydCBjb25zdCBQSFhfVklFV19TRUxFQ1RPUiA9IGBbJHtQSFhfU0VTU0lPTn1dYDtcbmV4cG9ydCBjb25zdCBQSFhfU1RJQ0tZID0gXCJkYXRhLXBoeC1zdGlja3lcIjtcbmV4cG9ydCBjb25zdCBQSFhfU1RBVElDID0gXCJkYXRhLXBoeC1zdGF0aWNcIjtcbmV4cG9ydCBjb25zdCBQSFhfUkVBRE9OTFkgPSBcImRhdGEtcGh4LXJlYWRvbmx5XCI7XG5leHBvcnQgY29uc3QgUEhYX0RJU0FCTEVEID0gXCJkYXRhLXBoeC1kaXNhYmxlZFwiO1xuZXhwb3J0IGNvbnN0IFBIWF9ESVNBQkxFX1dJVEggPSBcImRpc2FibGUtd2l0aFwiO1xuZXhwb3J0IGNvbnN0IFBIWF9ESVNBQkxFX1dJVEhfUkVTVE9SRSA9IFwiZGF0YS1waHgtZGlzYWJsZS13aXRoLXJlc3RvcmVcIjtcbmV4cG9ydCBjb25zdCBQSFhfSE9PSyA9IFwiaG9va1wiO1xuZXhwb3J0IGNvbnN0IFBIWF9ERUJPVU5DRSA9IFwiZGVib3VuY2VcIjtcbmV4cG9ydCBjb25zdCBQSFhfVEhST1RUTEUgPSBcInRocm90dGxlXCI7XG5leHBvcnQgY29uc3QgUEhYX1VQREFURSA9IFwidXBkYXRlXCI7XG5leHBvcnQgY29uc3QgUEhYX1NUUkVBTSA9IFwic3RyZWFtXCI7XG5leHBvcnQgY29uc3QgUEhYX1NUUkVBTV9SRUYgPSBcImRhdGEtcGh4LXN0cmVhbVwiO1xuZXhwb3J0IGNvbnN0IFBIWF9QT1JUQUwgPSBcImRhdGEtcGh4LXBvcnRhbFwiO1xuZXhwb3J0IGNvbnN0IFBIWF9URUxFUE9SVEVEX1JFRiA9IFwiZGF0YS1waHgtdGVsZXBvcnRlZFwiO1xuZXhwb3J0IGNvbnN0IFBIWF9URUxFUE9SVEVEX1NSQyA9IFwiZGF0YS1waHgtdGVsZXBvcnRlZC1zcmNcIjtcbmV4cG9ydCBjb25zdCBQSFhfUlVOVElNRV9IT09LID0gXCJkYXRhLXBoeC1ydW50aW1lLWhvb2tcIjtcbmV4cG9ydCBjb25zdCBQSFhfTFZfUElEID0gXCJkYXRhLXBoeC1waWRcIjtcbmV4cG9ydCBjb25zdCBQSFhfS0VZID0gXCJrZXlcIjtcbmV4cG9ydCBjb25zdCBQSFhfUFJJVkFURSA9IFwicGh4UHJpdmF0ZVwiO1xuZXhwb3J0IGNvbnN0IFBIWF9BVVRPX1JFQ09WRVIgPSBcImF1dG8tcmVjb3ZlclwiO1xuZXhwb3J0IGNvbnN0IFBIWF9MVl9ERUJVRyA9IFwicGh4OmxpdmUtc29ja2V0OmRlYnVnXCI7XG5leHBvcnQgY29uc3QgUEhYX0xWX1BST0ZJTEUgPSBcInBoeDpsaXZlLXNvY2tldDpwcm9maWxpbmdcIjtcbmV4cG9ydCBjb25zdCBQSFhfTFZfTEFURU5DWV9TSU0gPSBcInBoeDpsaXZlLXNvY2tldDpsYXRlbmN5LXNpbVwiO1xuZXhwb3J0IGNvbnN0IFBIWF9MVl9ISVNUT1JZX1BPU0lUSU9OID0gXCJwaHg6bmF2LWhpc3RvcnktcG9zaXRpb25cIjtcbmV4cG9ydCBjb25zdCBQSFhfUFJPR1JFU1MgPSBcInByb2dyZXNzXCI7XG5leHBvcnQgY29uc3QgUEhYX01PVU5URUQgPSBcIm1vdW50ZWRcIjtcbmV4cG9ydCBjb25zdCBQSFhfUkVMT0FEX1NUQVRVUyA9IFwiX19waG9lbml4X3JlbG9hZF9zdGF0dXNfX1wiO1xuZXhwb3J0IGNvbnN0IExPQURFUl9USU1FT1VUID0gMTtcbmV4cG9ydCBjb25zdCBNQVhfQ0hJTERfSk9JTl9BVFRFTVBUUyA9IDM7XG5leHBvcnQgY29uc3QgQkVGT1JFX1VOTE9BRF9MT0FERVJfVElNRU9VVCA9IDIwMDtcbmV4cG9ydCBjb25zdCBESVNDT05ORUNURURfVElNRU9VVCA9IDUwMDtcbmV4cG9ydCBjb25zdCBCSU5ESU5HX1BSRUZJWCA9IFwicGh4LVwiO1xuZXhwb3J0IGNvbnN0IFBVU0hfVElNRU9VVCA9IDMwMDAwO1xuZXhwb3J0IGNvbnN0IExJTktfSEVBREVSID0gXCJ4LXJlcXVlc3RlZC13aXRoXCI7XG5leHBvcnQgY29uc3QgUkVTUE9OU0VfVVJMX0hFQURFUiA9IFwieC1yZXNwb25zZS11cmxcIjtcbmV4cG9ydCBjb25zdCBERUJPVU5DRV9UUklHR0VSID0gXCJkZWJvdW5jZS10cmlnZ2VyXCI7XG5leHBvcnQgY29uc3QgVEhST1RUTEVEID0gXCJ0aHJvdHRsZWRcIjtcbmV4cG9ydCBjb25zdCBERUJPVU5DRV9QUkVWX0tFWSA9IFwiZGVib3VuY2UtcHJldi1rZXlcIjtcbmV4cG9ydCBjb25zdCBERUZBVUxUUyA9IHtcbiAgZGVib3VuY2U6IDMwMCxcbiAgdGhyb3R0bGU6IDMwMCxcbn07XG5leHBvcnQgY29uc3QgUEhYX1BFTkRJTkdfQVRUUlMgPSBbUEhYX1JFRl9MT0FESU5HLCBQSFhfUkVGX1NSQywgUEhYX1JFRl9MT0NLXTtcbi8vIFJlbmRlcmVkXG5leHBvcnQgY29uc3QgU1RBVElDID0gXCJzXCI7XG5leHBvcnQgY29uc3QgUk9PVCA9IFwiclwiO1xuZXhwb3J0IGNvbnN0IENPTVBPTkVOVFMgPSBcImNcIjtcbmV4cG9ydCBjb25zdCBLRVlFRCA9IFwia1wiO1xuZXhwb3J0IGNvbnN0IEtFWUVEX0NPVU5UID0gXCJrY1wiO1xuZXhwb3J0IGNvbnN0IEVWRU5UUyA9IFwiZVwiO1xuZXhwb3J0IGNvbnN0IFJFUExZID0gXCJyXCI7XG5leHBvcnQgY29uc3QgVElUTEUgPSBcInRcIjtcbmV4cG9ydCBjb25zdCBURU1QTEFURVMgPSBcInBcIjtcbmV4cG9ydCBjb25zdCBTVFJFQU0gPSBcInN0cmVhbVwiO1xuIiwgImltcG9ydCB7IGxvZ0Vycm9yIH0gZnJvbSBcIi4vdXRpbHNcIjtcblxuZXhwb3J0IGRlZmF1bHQgY2xhc3MgRW50cnlVcGxvYWRlciB7XG4gIGNvbnN0cnVjdG9yKGVudHJ5LCBjb25maWcsIGxpdmVTb2NrZXQpIHtcbiAgICBjb25zdCB7IGNodW5rX3NpemUsIGNodW5rX3RpbWVvdXQgfSA9IGNvbmZpZztcbiAgICB0aGlzLmxpdmVTb2NrZXQgPSBsaXZlU29ja2V0O1xuICAgIHRoaXMuZW50cnkgPSBlbnRyeTtcbiAgICB0aGlzLm9mZnNldCA9IDA7XG4gICAgdGhpcy5jaHVua1NpemUgPSBjaHVua19zaXplO1xuICAgIHRoaXMuY2h1bmtUaW1lb3V0ID0gY2h1bmtfdGltZW91dDtcbiAgICB0aGlzLmNodW5rVGltZXIgPSBudWxsO1xuICAgIHRoaXMuZXJyb3JlZCA9IGZhbHNlO1xuICAgIHRoaXMudXBsb2FkQ2hhbm5lbCA9IGxpdmVTb2NrZXQuY2hhbm5lbChgbHZ1OiR7ZW50cnkucmVmfWAsIHtcbiAgICAgIHRva2VuOiBlbnRyeS5tZXRhZGF0YSgpLFxuICAgIH0pO1xuICB9XG5cbiAgZXJyb3IocmVhc29uKSB7XG4gICAgaWYgKHRoaXMuZXJyb3JlZCkge1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICB0aGlzLnVwbG9hZENoYW5uZWwubGVhdmUoKTtcbiAgICB0aGlzLmVycm9yZWQgPSB0cnVlO1xuICAgIGNsZWFyVGltZW91dCh0aGlzLmNodW5rVGltZXIpO1xuICAgIHRoaXMuZW50cnkuZXJyb3IocmVhc29uKTtcbiAgfVxuXG4gIHVwbG9hZCgpIHtcbiAgICB0aGlzLnVwbG9hZENoYW5uZWwub25FcnJvcigocmVhc29uKSA9PiB0aGlzLmVycm9yKHJlYXNvbikpO1xuICAgIHRoaXMudXBsb2FkQ2hhbm5lbFxuICAgICAgLmpvaW4oKVxuICAgICAgLnJlY2VpdmUoXCJva1wiLCAoX2RhdGEpID0+IHRoaXMucmVhZE5leHRDaHVuaygpKVxuICAgICAgLnJlY2VpdmUoXCJlcnJvclwiLCAocmVhc29uKSA9PiB0aGlzLmVycm9yKHJlYXNvbikpO1xuICB9XG5cbiAgaXNEb25lKCkge1xuICAgIHJldHVybiB0aGlzLm9mZnNldCA+PSB0aGlzLmVudHJ5LmZpbGUuc2l6ZTtcbiAgfVxuXG4gIHJlYWROZXh0Q2h1bmsoKSB7XG4gICAgY29uc3QgcmVhZGVyID0gbmV3IHdpbmRvdy5GaWxlUmVhZGVyKCk7XG4gICAgY29uc3QgYmxvYiA9IHRoaXMuZW50cnkuZmlsZS5zbGljZShcbiAgICAgIHRoaXMub2Zmc2V0LFxuICAgICAgdGhpcy5jaHVua1NpemUgKyB0aGlzLm9mZnNldCxcbiAgICApO1xuICAgIHJlYWRlci5vbmxvYWQgPSAoZSkgPT4ge1xuICAgICAgaWYgKGUudGFyZ2V0LmVycm9yID09PSBudWxsKSB7XG4gICAgICAgIHRoaXMub2Zmc2V0ICs9IC8qKiBAdHlwZSB7QXJyYXlCdWZmZXJ9ICovIChlLnRhcmdldC5yZXN1bHQpLmJ5dGVMZW5ndGg7XG4gICAgICAgIHRoaXMucHVzaENodW5rKC8qKiBAdHlwZSB7QXJyYXlCdWZmZXJ9ICovIChlLnRhcmdldC5yZXN1bHQpKTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHJldHVybiBsb2dFcnJvcihcIlJlYWQgZXJyb3I6IFwiICsgZS50YXJnZXQuZXJyb3IpO1xuICAgICAgfVxuICAgIH07XG4gICAgcmVhZGVyLnJlYWRBc0FycmF5QnVmZmVyKGJsb2IpO1xuICB9XG5cbiAgcHVzaENodW5rKGNodW5rKSB7XG4gICAgaWYgKCF0aGlzLnVwbG9hZENoYW5uZWwuaXNKb2luZWQoKSkge1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICB0aGlzLnVwbG9hZENoYW5uZWxcbiAgICAgIC5wdXNoKFwiY2h1bmtcIiwgY2h1bmssIHRoaXMuY2h1bmtUaW1lb3V0KVxuICAgICAgLnJlY2VpdmUoXCJva1wiLCAoKSA9PiB7XG4gICAgICAgIHRoaXMuZW50cnkucHJvZ3Jlc3MoKHRoaXMub2Zmc2V0IC8gdGhpcy5lbnRyeS5maWxlLnNpemUpICogMTAwKTtcbiAgICAgICAgaWYgKCF0aGlzLmlzRG9uZSgpKSB7XG4gICAgICAgICAgdGhpcy5jaHVua1RpbWVyID0gc2V0VGltZW91dChcbiAgICAgICAgICAgICgpID0+IHRoaXMucmVhZE5leHRDaHVuaygpLFxuICAgICAgICAgICAgdGhpcy5saXZlU29ja2V0LmdldExhdGVuY3lTaW0oKSB8fCAwLFxuICAgICAgICAgICk7XG4gICAgICAgIH1cbiAgICAgIH0pXG4gICAgICAucmVjZWl2ZShcImVycm9yXCIsICh7IHJlYXNvbiB9KSA9PiB0aGlzLmVycm9yKHJlYXNvbikpO1xuICB9XG59XG4iLCAiaW1wb3J0IHsgUEhYX1ZJRVdfU0VMRUNUT1IgfSBmcm9tIFwiLi9jb25zdGFudHNcIjtcblxuaW1wb3J0IEVudHJ5VXBsb2FkZXIgZnJvbSBcIi4vZW50cnlfdXBsb2FkZXJcIjtcblxuZXhwb3J0IGNvbnN0IGxvZ0Vycm9yID0gKG1zZywgb2JqKSA9PiBjb25zb2xlLmVycm9yICYmIGNvbnNvbGUuZXJyb3IobXNnLCBvYmopO1xuXG5leHBvcnQgY29uc3QgaXNDaWQgPSAoY2lkKSA9PiB7XG4gIGNvbnN0IHR5cGUgPSB0eXBlb2YgY2lkO1xuICByZXR1cm4gdHlwZSA9PT0gXCJudW1iZXJcIiB8fCAodHlwZSA9PT0gXCJzdHJpbmdcIiAmJiAvXigwfFsxLTldXFxkKikkLy50ZXN0KGNpZCkpO1xufTtcblxuZXhwb3J0IGZ1bmN0aW9uIGRldGVjdER1cGxpY2F0ZUlkcygpIHtcbiAgY29uc3QgaWRzID0gbmV3IFNldCgpO1xuICBjb25zdCBlbGVtcyA9IGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3JBbGwoXCIqW2lkXVwiKTtcbiAgZm9yIChsZXQgaSA9IDAsIGxlbiA9IGVsZW1zLmxlbmd0aDsgaSA8IGxlbjsgaSsrKSB7XG4gICAgaWYgKGlkcy5oYXMoZWxlbXNbaV0uaWQpKSB7XG4gICAgICBjb25zb2xlLmVycm9yKFxuICAgICAgICBgTXVsdGlwbGUgSURzIGRldGVjdGVkOiAke2VsZW1zW2ldLmlkfS4gRW5zdXJlIHVuaXF1ZSBlbGVtZW50IGlkcy5gLFxuICAgICAgKTtcbiAgICB9IGVsc2Uge1xuICAgICAgaWRzLmFkZChlbGVtc1tpXS5pZCk7XG4gICAgfVxuICB9XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBkZXRlY3RJbnZhbGlkU3RyZWFtSW5zZXJ0cyhpbnNlcnRzKSB7XG4gIGNvbnN0IGVycm9ycyA9IG5ldyBTZXQoKTtcbiAgT2JqZWN0LmtleXMoaW5zZXJ0cykuZm9yRWFjaCgoaWQpID0+IHtcbiAgICBjb25zdCBzdHJlYW1FbCA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKGlkKTtcbiAgICBpZiAoXG4gICAgICBzdHJlYW1FbCAmJlxuICAgICAgc3RyZWFtRWwucGFyZW50RWxlbWVudCAmJlxuICAgICAgc3RyZWFtRWwucGFyZW50RWxlbWVudC5nZXRBdHRyaWJ1dGUoXCJwaHgtdXBkYXRlXCIpICE9PSBcInN0cmVhbVwiXG4gICAgKSB7XG4gICAgICBlcnJvcnMuYWRkKFxuICAgICAgICBgVGhlIHN0cmVhbSBjb250YWluZXIgd2l0aCBpZCBcIiR7c3RyZWFtRWwucGFyZW50RWxlbWVudC5pZH1cIiBpcyBtaXNzaW5nIHRoZSBwaHgtdXBkYXRlPVwic3RyZWFtXCIgYXR0cmlidXRlLiBFbnN1cmUgaXQgaXMgc2V0IGZvciBzdHJlYW1zIHRvIHdvcmsgcHJvcGVybHkuYCxcbiAgICAgICk7XG4gICAgfVxuICB9KTtcbiAgZXJyb3JzLmZvckVhY2goKGVycm9yKSA9PiBjb25zb2xlLmVycm9yKGVycm9yKSk7XG59XG5cbmV4cG9ydCBjb25zdCBkZWJ1ZyA9ICh2aWV3LCBraW5kLCBtc2csIG9iaikgPT4ge1xuICBpZiAodmlldy5saXZlU29ja2V0LmlzRGVidWdFbmFibGVkKCkpIHtcbiAgICBjb25zb2xlLmxvZyhgJHt2aWV3LmlkfSAke2tpbmR9OiAke21zZ30gLSBgLCBvYmopO1xuICB9XG59O1xuXG4vLyB3cmFwcyB2YWx1ZSBpbiBjbG9zdXJlIG9yIHJldHVybnMgY2xvc3VyZVxuZXhwb3J0IGNvbnN0IGNsb3N1cmUgPSAodmFsKSA9PlxuICB0eXBlb2YgdmFsID09PSBcImZ1bmN0aW9uXCJcbiAgICA/IHZhbFxuICAgIDogZnVuY3Rpb24gKCkge1xuICAgICAgICByZXR1cm4gdmFsO1xuICAgICAgfTtcblxuZXhwb3J0IGNvbnN0IGNsb25lID0gKG9iaikgPT4ge1xuICByZXR1cm4gSlNPTi5wYXJzZShKU09OLnN0cmluZ2lmeShvYmopKTtcbn07XG5cbmV4cG9ydCBjb25zdCBjbG9zZXN0UGh4QmluZGluZyA9IChlbCwgYmluZGluZywgYm9yZGVyRWwpID0+IHtcbiAgZG8ge1xuICAgIGlmIChlbC5tYXRjaGVzKGBbJHtiaW5kaW5nfV1gKSAmJiAhZWwuZGlzYWJsZWQpIHtcbiAgICAgIHJldHVybiBlbDtcbiAgICB9XG4gICAgZWwgPSBlbC5wYXJlbnRFbGVtZW50IHx8IGVsLnBhcmVudE5vZGU7XG4gIH0gd2hpbGUgKFxuICAgIGVsICE9PSBudWxsICYmXG4gICAgZWwubm9kZVR5cGUgPT09IDEgJiZcbiAgICAhKChib3JkZXJFbCAmJiBib3JkZXJFbC5pc1NhbWVOb2RlKGVsKSkgfHwgZWwubWF0Y2hlcyhQSFhfVklFV19TRUxFQ1RPUikpXG4gICk7XG4gIHJldHVybiBudWxsO1xufTtcblxuZXhwb3J0IGNvbnN0IGlzT2JqZWN0ID0gKG9iaikgPT4ge1xuICByZXR1cm4gb2JqICE9PSBudWxsICYmIHR5cGVvZiBvYmogPT09IFwib2JqZWN0XCIgJiYgIShvYmogaW5zdGFuY2VvZiBBcnJheSk7XG59O1xuXG5leHBvcnQgY29uc3QgaXNFcXVhbE9iaiA9IChvYmoxLCBvYmoyKSA9PlxuICBKU09OLnN0cmluZ2lmeShvYmoxKSA9PT0gSlNPTi5zdHJpbmdpZnkob2JqMik7XG5cbmV4cG9ydCBjb25zdCBpc0VtcHR5ID0gKG9iaikgPT4ge1xuICBmb3IgKGNvbnN0IHggaW4gb2JqKSB7XG4gICAgcmV0dXJuIGZhbHNlO1xuICB9XG4gIHJldHVybiB0cnVlO1xufTtcblxuZXhwb3J0IGNvbnN0IG1heWJlID0gKGVsLCBjYWxsYmFjaykgPT4gZWwgJiYgY2FsbGJhY2soZWwpO1xuXG5leHBvcnQgY29uc3QgY2hhbm5lbFVwbG9hZGVyID0gZnVuY3Rpb24gKGVudHJpZXMsIG9uRXJyb3IsIHJlc3AsIGxpdmVTb2NrZXQpIHtcbiAgZW50cmllcy5mb3JFYWNoKChlbnRyeSkgPT4ge1xuICAgIGNvbnN0IGVudHJ5VXBsb2FkZXIgPSBuZXcgRW50cnlVcGxvYWRlcihlbnRyeSwgcmVzcC5jb25maWcsIGxpdmVTb2NrZXQpO1xuICAgIGVudHJ5VXBsb2FkZXIudXBsb2FkKCk7XG4gIH0pO1xufTtcbiIsICJjb25zdCBCcm93c2VyID0ge1xuICBjYW5QdXNoU3RhdGUoKSB7XG4gICAgcmV0dXJuIHR5cGVvZiBoaXN0b3J5LnB1c2hTdGF0ZSAhPT0gXCJ1bmRlZmluZWRcIjtcbiAgfSxcblxuICBkcm9wTG9jYWwobG9jYWxTdG9yYWdlLCBuYW1lc3BhY2UsIHN1YmtleSkge1xuICAgIHJldHVybiBsb2NhbFN0b3JhZ2UucmVtb3ZlSXRlbSh0aGlzLmxvY2FsS2V5KG5hbWVzcGFjZSwgc3Via2V5KSk7XG4gIH0sXG5cbiAgdXBkYXRlTG9jYWwobG9jYWxTdG9yYWdlLCBuYW1lc3BhY2UsIHN1YmtleSwgaW5pdGlhbCwgZnVuYykge1xuICAgIGNvbnN0IGN1cnJlbnQgPSB0aGlzLmdldExvY2FsKGxvY2FsU3RvcmFnZSwgbmFtZXNwYWNlLCBzdWJrZXkpO1xuICAgIGNvbnN0IGtleSA9IHRoaXMubG9jYWxLZXkobmFtZXNwYWNlLCBzdWJrZXkpO1xuICAgIGNvbnN0IG5ld1ZhbCA9IGN1cnJlbnQgPT09IG51bGwgPyBpbml0aWFsIDogZnVuYyhjdXJyZW50KTtcbiAgICBsb2NhbFN0b3JhZ2Uuc2V0SXRlbShrZXksIEpTT04uc3RyaW5naWZ5KG5ld1ZhbCkpO1xuICAgIHJldHVybiBuZXdWYWw7XG4gIH0sXG5cbiAgZ2V0TG9jYWwobG9jYWxTdG9yYWdlLCBuYW1lc3BhY2UsIHN1YmtleSkge1xuICAgIHJldHVybiBKU09OLnBhcnNlKGxvY2FsU3RvcmFnZS5nZXRJdGVtKHRoaXMubG9jYWxLZXkobmFtZXNwYWNlLCBzdWJrZXkpKSk7XG4gIH0sXG5cbiAgdXBkYXRlQ3VycmVudFN0YXRlKGNhbGxiYWNrKSB7XG4gICAgaWYgKCF0aGlzLmNhblB1c2hTdGF0ZSgpKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIGhpc3RvcnkucmVwbGFjZVN0YXRlKFxuICAgICAgY2FsbGJhY2soaGlzdG9yeS5zdGF0ZSB8fCB7fSksXG4gICAgICBcIlwiLFxuICAgICAgd2luZG93LmxvY2F0aW9uLmhyZWYsXG4gICAgKTtcbiAgfSxcblxuICBwdXNoU3RhdGUoa2luZCwgbWV0YSwgdG8pIHtcbiAgICBpZiAodGhpcy5jYW5QdXNoU3RhdGUoKSkge1xuICAgICAgaWYgKHRvICE9PSB3aW5kb3cubG9jYXRpb24uaHJlZikge1xuICAgICAgICBpZiAobWV0YS50eXBlID09IFwicmVkaXJlY3RcIiAmJiBtZXRhLnNjcm9sbCkge1xuICAgICAgICAgIC8vIElmIHdlJ3JlIHJlZGlyZWN0aW5nIHN0b3JlIHRoZSBjdXJyZW50IHNjcm9sbFkgZm9yIHRoZSBjdXJyZW50IGhpc3Rvcnkgc3RhdGUuXG4gICAgICAgICAgY29uc3QgY3VycmVudFN0YXRlID0gaGlzdG9yeS5zdGF0ZSB8fCB7fTtcbiAgICAgICAgICBjdXJyZW50U3RhdGUuc2Nyb2xsID0gbWV0YS5zY3JvbGw7XG4gICAgICAgICAgaGlzdG9yeS5yZXBsYWNlU3RhdGUoY3VycmVudFN0YXRlLCBcIlwiLCB3aW5kb3cubG9jYXRpb24uaHJlZik7XG4gICAgICAgIH1cblxuICAgICAgICBkZWxldGUgbWV0YS5zY3JvbGw7IC8vIE9ubHkgc3RvcmUgdGhlIHNjcm9sbCBpbiB0aGUgcmVkaXJlY3QgY2FzZS5cbiAgICAgICAgaGlzdG9yeVtraW5kICsgXCJTdGF0ZVwiXShtZXRhLCBcIlwiLCB0byB8fCBudWxsKTsgLy8gSUUgd2lsbCBjb2VyY2UgdW5kZWZpbmVkIHRvIHN0cmluZ1xuXG4gICAgICAgIC8vIHdoZW4gdXNpbmcgbmF2aWdhdGUsIHdlJ2QgY2FsbCBwdXNoU3RhdGUgaW1tZWRpYXRlbHkgYmVmb3JlIHBhdGNoaW5nIHRoZSBET00sXG4gICAgICAgIC8vIGp1bXBpbmcgYmFjayB0byB0aGUgdG9wIG9mIHRoZSBwYWdlLCBlZmZlY3RpdmVseSBpZ25vcmluZyB0aGUgc2Nyb2xsSW50b1ZpZXc7XG4gICAgICAgIC8vIHRoZXJlZm9yZSB3ZSB3YWl0IGZvciB0aGUgbmV4dCBmcmFtZSAoYWZ0ZXIgdGhlIERPTSBwYXRjaCkgYW5kIG9ubHkgdGhlbiB0cnlcbiAgICAgICAgLy8gdG8gc2Nyb2xsIHRvIHRoZSBoYXNoRWxcbiAgICAgICAgd2luZG93LnJlcXVlc3RBbmltYXRpb25GcmFtZSgoKSA9PiB7XG4gICAgICAgICAgY29uc3QgaGFzaEVsID0gdGhpcy5nZXRIYXNoVGFyZ2V0RWwod2luZG93LmxvY2F0aW9uLmhhc2gpO1xuXG4gICAgICAgICAgaWYgKGhhc2hFbCkge1xuICAgICAgICAgICAgaGFzaEVsLnNjcm9sbEludG9WaWV3KCk7XG4gICAgICAgICAgfSBlbHNlIGlmIChtZXRhLnR5cGUgPT09IFwicmVkaXJlY3RcIikge1xuICAgICAgICAgICAgd2luZG93LnNjcm9sbCgwLCAwKTtcbiAgICAgICAgICB9XG4gICAgICAgIH0pO1xuICAgICAgfVxuICAgIH0gZWxzZSB7XG4gICAgICB0aGlzLnJlZGlyZWN0KHRvKTtcbiAgICB9XG4gIH0sXG5cbiAgc2V0Q29va2llKG5hbWUsIHZhbHVlLCBtYXhBZ2VTZWNvbmRzKSB7XG4gICAgY29uc3QgZXhwaXJlcyA9XG4gICAgICB0eXBlb2YgbWF4QWdlU2Vjb25kcyA9PT0gXCJudW1iZXJcIiA/IGAgbWF4LWFnZT0ke21heEFnZVNlY29uZHN9O2AgOiBcIlwiO1xuICAgIGRvY3VtZW50LmNvb2tpZSA9IGAke25hbWV9PSR7dmFsdWV9OyR7ZXhwaXJlc30gcGF0aD0vYDtcbiAgfSxcblxuICBnZXRDb29raWUobmFtZSkge1xuICAgIHJldHVybiBkb2N1bWVudC5jb29raWUucmVwbGFjZShcbiAgICAgIG5ldyBSZWdFeHAoYCg/Oig/Ol58Lio7XFxzKikke25hbWV9XFxzKlxcPVxccyooW147XSopLiokKXxeLiokYCksXG4gICAgICBcIiQxXCIsXG4gICAgKTtcbiAgfSxcblxuICBkZWxldGVDb29raWUobmFtZSkge1xuICAgIGRvY3VtZW50LmNvb2tpZSA9IGAke25hbWV9PTsgbWF4LWFnZT0tMTsgcGF0aD0vYDtcbiAgfSxcblxuICByZWRpcmVjdChcbiAgICB0b1VSTCxcbiAgICBmbGFzaCxcbiAgICBuYXZpZ2F0ZSA9ICh1cmwpID0+IHtcbiAgICAgIHdpbmRvdy5sb2NhdGlvbi5ocmVmID0gdXJsO1xuICAgIH0sXG4gICkge1xuICAgIGlmIChmbGFzaCkge1xuICAgICAgdGhpcy5zZXRDb29raWUoXCJfX3Bob2VuaXhfZmxhc2hfX1wiLCBmbGFzaCwgNjApO1xuICAgIH1cbiAgICBuYXZpZ2F0ZSh0b1VSTCk7XG4gIH0sXG5cbiAgbG9jYWxLZXkobmFtZXNwYWNlLCBzdWJrZXkpIHtcbiAgICByZXR1cm4gYCR7bmFtZXNwYWNlfS0ke3N1YmtleX1gO1xuICB9LFxuXG4gIGdldEhhc2hUYXJnZXRFbChtYXliZUhhc2gpIHtcbiAgICBjb25zdCBoYXNoID0gbWF5YmVIYXNoLnRvU3RyaW5nKCkuc3Vic3RyaW5nKDEpO1xuICAgIGlmIChoYXNoID09PSBcIlwiKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIHJldHVybiAoXG4gICAgICBkb2N1bWVudC5nZXRFbGVtZW50QnlJZChoYXNoKSB8fFxuICAgICAgZG9jdW1lbnQucXVlcnlTZWxlY3RvcihgYVtuYW1lPVwiJHtoYXNofVwiXWApXG4gICAgKTtcbiAgfSxcbn07XG5cbmV4cG9ydCBkZWZhdWx0IEJyb3dzZXI7XG4iLCAiaW1wb3J0IHtcbiAgQ0hFQ0tBQkxFX0lOUFVUUyxcbiAgREVCT1VOQ0VfUFJFVl9LRVksXG4gIERFQk9VTkNFX1RSSUdHRVIsXG4gIEZPQ1VTQUJMRV9JTlBVVFMsXG4gIFBIWF9DT01QT05FTlQsXG4gIFBIWF9WSUVXX1JFRixcbiAgUEhYX1RFTEVQT1JURURfUkVGLFxuICBQSFhfSEFTX0ZPQ1VTRUQsXG4gIFBIWF9IQVNfU1VCTUlUVEVELFxuICBQSFhfTUFJTixcbiAgUEhYX1BBUkVOVF9JRCxcbiAgUEhYX1BSSVZBVEUsXG4gIFBIWF9SRUZfU1JDLFxuICBQSFhfUkVGX0xPQ0ssXG4gIFBIWF9QRU5ESU5HX0FUVFJTLFxuICBQSFhfUk9PVF9JRCxcbiAgUEhYX1NFU1NJT04sXG4gIFBIWF9TVEFUSUMsXG4gIFBIWF9VUExPQURfUkVGLFxuICBQSFhfVklFV19TRUxFQ1RPUixcbiAgUEhYX1NUSUNLWSxcbiAgUEhYX0VWRU5UX0NMQVNTRVMsXG4gIFRIUk9UVExFRCxcbiAgUEhYX1BPUlRBTCxcbiAgUEhYX1NUUkVBTSxcbn0gZnJvbSBcIi4vY29uc3RhbnRzXCI7XG5cbmltcG9ydCB7IGxvZ0Vycm9yIH0gZnJvbSBcIi4vdXRpbHNcIjtcblxuY29uc3QgRE9NID0ge1xuICBieUlkKGlkKSB7XG4gICAgcmV0dXJuIGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKGlkKSB8fCBsb2dFcnJvcihgbm8gaWQgZm91bmQgZm9yICR7aWR9YCk7XG4gIH0sXG5cbiAgcmVtb3ZlQ2xhc3MoZWwsIGNsYXNzTmFtZSkge1xuICAgIGVsLmNsYXNzTGlzdC5yZW1vdmUoY2xhc3NOYW1lKTtcbiAgICBpZiAoZWwuY2xhc3NMaXN0Lmxlbmd0aCA9PT0gMCkge1xuICAgICAgZWwucmVtb3ZlQXR0cmlidXRlKFwiY2xhc3NcIik7XG4gICAgfVxuICB9LFxuXG4gIGFsbChub2RlLCBxdWVyeSwgY2FsbGJhY2spIHtcbiAgICBpZiAoIW5vZGUpIHtcbiAgICAgIHJldHVybiBbXTtcbiAgICB9XG4gICAgY29uc3QgYXJyYXkgPSBBcnJheS5mcm9tKG5vZGUucXVlcnlTZWxlY3RvckFsbChxdWVyeSkpO1xuICAgIGlmIChjYWxsYmFjaykge1xuICAgICAgYXJyYXkuZm9yRWFjaChjYWxsYmFjayk7XG4gICAgfVxuICAgIHJldHVybiBhcnJheTtcbiAgfSxcblxuICBjaGlsZE5vZGVMZW5ndGgoaHRtbCkge1xuICAgIGNvbnN0IHRlbXBsYXRlID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudChcInRlbXBsYXRlXCIpO1xuICAgIHRlbXBsYXRlLmlubmVySFRNTCA9IGh0bWw7XG4gICAgcmV0dXJuIHRlbXBsYXRlLmNvbnRlbnQuY2hpbGRFbGVtZW50Q291bnQ7XG4gIH0sXG5cbiAgaXNVcGxvYWRJbnB1dChlbCkge1xuICAgIHJldHVybiBlbC50eXBlID09PSBcImZpbGVcIiAmJiBlbC5nZXRBdHRyaWJ1dGUoUEhYX1VQTE9BRF9SRUYpICE9PSBudWxsO1xuICB9LFxuXG4gIGlzQXV0b1VwbG9hZChpbnB1dEVsKSB7XG4gICAgcmV0dXJuIGlucHV0RWwuaGFzQXR0cmlidXRlKFwiZGF0YS1waHgtYXV0by11cGxvYWRcIik7XG4gIH0sXG5cbiAgZmluZFVwbG9hZElucHV0cyhub2RlKSB7XG4gICAgY29uc3QgZm9ybUlkID0gbm9kZS5pZDtcbiAgICBjb25zdCBpbnB1dHNPdXRzaWRlRm9ybSA9IHRoaXMuYWxsKFxuICAgICAgZG9jdW1lbnQsXG4gICAgICBgaW5wdXRbdHlwZT1cImZpbGVcIl1bJHtQSFhfVVBMT0FEX1JFRn1dW2Zvcm09XCIke2Zvcm1JZH1cIl1gLFxuICAgICk7XG4gICAgcmV0dXJuIHRoaXMuYWxsKG5vZGUsIGBpbnB1dFt0eXBlPVwiZmlsZVwiXVske1BIWF9VUExPQURfUkVGfV1gKS5jb25jYXQoXG4gICAgICBpbnB1dHNPdXRzaWRlRm9ybSxcbiAgICApO1xuICB9LFxuXG4gIGZpbmRDb21wb25lbnROb2RlTGlzdCh2aWV3SWQsIGNpZCwgZG9jID0gZG9jdW1lbnQpIHtcbiAgICByZXR1cm4gdGhpcy5hbGwoXG4gICAgICBkb2MsXG4gICAgICBgWyR7UEhYX1ZJRVdfUkVGfT1cIiR7dmlld0lkfVwiXVske1BIWF9DT01QT05FTlR9PVwiJHtjaWR9XCJdYCxcbiAgICApO1xuICB9LFxuXG4gIGlzUGh4RGVzdHJveWVkKG5vZGUpIHtcbiAgICByZXR1cm4gbm9kZS5pZCAmJiBET00ucHJpdmF0ZShub2RlLCBcImRlc3Ryb3llZFwiKSA/IHRydWUgOiBmYWxzZTtcbiAgfSxcblxuICB3YW50c05ld1RhYihlKSB7XG4gICAgY29uc3Qgd2FudHNOZXdUYWIgPVxuICAgICAgZS5jdHJsS2V5IHx8IGUuc2hpZnRLZXkgfHwgZS5tZXRhS2V5IHx8IChlLmJ1dHRvbiAmJiBlLmJ1dHRvbiA9PT0gMSk7XG4gICAgY29uc3QgaXNEb3dubG9hZCA9XG4gICAgICBlLnRhcmdldCBpbnN0YW5jZW9mIEhUTUxBbmNob3JFbGVtZW50ICYmXG4gICAgICBlLnRhcmdldC5oYXNBdHRyaWJ1dGUoXCJkb3dubG9hZFwiKTtcbiAgICBjb25zdCBpc1RhcmdldEJsYW5rID1cbiAgICAgIGUudGFyZ2V0Lmhhc0F0dHJpYnV0ZShcInRhcmdldFwiKSAmJlxuICAgICAgZS50YXJnZXQuZ2V0QXR0cmlidXRlKFwidGFyZ2V0XCIpLnRvTG93ZXJDYXNlKCkgPT09IFwiX2JsYW5rXCI7XG4gICAgY29uc3QgaXNUYXJnZXROYW1lZFRhYiA9XG4gICAgICBlLnRhcmdldC5oYXNBdHRyaWJ1dGUoXCJ0YXJnZXRcIikgJiZcbiAgICAgICFlLnRhcmdldC5nZXRBdHRyaWJ1dGUoXCJ0YXJnZXRcIikuc3RhcnRzV2l0aChcIl9cIik7XG4gICAgcmV0dXJuIHdhbnRzTmV3VGFiIHx8IGlzVGFyZ2V0QmxhbmsgfHwgaXNEb3dubG9hZCB8fCBpc1RhcmdldE5hbWVkVGFiO1xuICB9LFxuXG4gIGlzVW5sb2FkYWJsZUZvcm1TdWJtaXQoZSkge1xuICAgIC8vIElnbm9yZSBmb3JtIHN1Ym1pc3Npb25zIGludGVuZGVkIHRvIGNsb3NlIGEgbmF0aXZlIDxkaWFsb2c+IGVsZW1lbnRcbiAgICAvLyBodHRwczovL2RldmVsb3Blci5tb3ppbGxhLm9yZy9lbi1VUy9kb2NzL1dlYi9IVE1ML0VsZW1lbnQvZGlhbG9nI3VzYWdlX25vdGVzXG4gICAgY29uc3QgaXNEaWFsb2dTdWJtaXQgPVxuICAgICAgKGUudGFyZ2V0ICYmIGUudGFyZ2V0LmdldEF0dHJpYnV0ZShcIm1ldGhvZFwiKSA9PT0gXCJkaWFsb2dcIikgfHxcbiAgICAgIChlLnN1Ym1pdHRlciAmJiBlLnN1Ym1pdHRlci5nZXRBdHRyaWJ1dGUoXCJmb3JtbWV0aG9kXCIpID09PSBcImRpYWxvZ1wiKTtcblxuICAgIGlmIChpc0RpYWxvZ1N1Ym1pdCkge1xuICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH0gZWxzZSB7XG4gICAgICByZXR1cm4gIWUuZGVmYXVsdFByZXZlbnRlZCAmJiAhdGhpcy53YW50c05ld1RhYihlKTtcbiAgICB9XG4gIH0sXG5cbiAgaXNOZXdQYWdlQ2xpY2soZSwgY3VycmVudExvY2F0aW9uKSB7XG4gICAgY29uc3QgaHJlZiA9XG4gICAgICBlLnRhcmdldCBpbnN0YW5jZW9mIEhUTUxBbmNob3JFbGVtZW50XG4gICAgICAgID8gZS50YXJnZXQuZ2V0QXR0cmlidXRlKFwiaHJlZlwiKVxuICAgICAgICA6IG51bGw7XG4gICAgbGV0IHVybDtcblxuICAgIGlmIChlLmRlZmF1bHRQcmV2ZW50ZWQgfHwgaHJlZiA9PT0gbnVsbCB8fCB0aGlzLndhbnRzTmV3VGFiKGUpKSB7XG4gICAgICByZXR1cm4gZmFsc2U7XG4gICAgfVxuICAgIGlmIChocmVmLnN0YXJ0c1dpdGgoXCJtYWlsdG86XCIpIHx8IGhyZWYuc3RhcnRzV2l0aChcInRlbDpcIikpIHtcbiAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9XG4gICAgaWYgKGUudGFyZ2V0LmlzQ29udGVudEVkaXRhYmxlKSB7XG4gICAgICByZXR1cm4gZmFsc2U7XG4gICAgfVxuXG4gICAgdHJ5IHtcbiAgICAgIHVybCA9IG5ldyBVUkwoaHJlZik7XG4gICAgfSBjYXRjaCB7XG4gICAgICB0cnkge1xuICAgICAgICB1cmwgPSBuZXcgVVJMKGhyZWYsIGN1cnJlbnRMb2NhdGlvbik7XG4gICAgICB9IGNhdGNoIHtcbiAgICAgICAgLy8gYmFkIFVSTCwgZmFsbGJhY2sgdG8gbGV0IGJyb3dzZXIgdHJ5IGl0IGFzIGV4dGVybmFsXG4gICAgICAgIHJldHVybiB0cnVlO1xuICAgICAgfVxuICAgIH1cblxuICAgIGlmIChcbiAgICAgIHVybC5ob3N0ID09PSBjdXJyZW50TG9jYXRpb24uaG9zdCAmJlxuICAgICAgdXJsLnByb3RvY29sID09PSBjdXJyZW50TG9jYXRpb24ucHJvdG9jb2xcbiAgICApIHtcbiAgICAgIGlmIChcbiAgICAgICAgdXJsLnBhdGhuYW1lID09PSBjdXJyZW50TG9jYXRpb24ucGF0aG5hbWUgJiZcbiAgICAgICAgdXJsLnNlYXJjaCA9PT0gY3VycmVudExvY2F0aW9uLnNlYXJjaFxuICAgICAgKSB7XG4gICAgICAgIHJldHVybiB1cmwuaGFzaCA9PT0gXCJcIiAmJiAhdXJsLmhyZWYuZW5kc1dpdGgoXCIjXCIpO1xuICAgICAgfVxuICAgIH1cbiAgICByZXR1cm4gdXJsLnByb3RvY29sLnN0YXJ0c1dpdGgoXCJodHRwXCIpO1xuICB9LFxuXG4gIG1hcmtQaHhDaGlsZERlc3Ryb3llZChlbCkge1xuICAgIGlmICh0aGlzLmlzUGh4Q2hpbGQoZWwpKSB7XG4gICAgICBlbC5zZXRBdHRyaWJ1dGUoUEhYX1NFU1NJT04sIFwiXCIpO1xuICAgIH1cbiAgICB0aGlzLnB1dFByaXZhdGUoZWwsIFwiZGVzdHJveWVkXCIsIHRydWUpO1xuICB9LFxuXG4gIGZpbmRQaHhDaGlsZHJlbkluRnJhZ21lbnQoaHRtbCwgcGFyZW50SWQpIHtcbiAgICBjb25zdCB0ZW1wbGF0ZSA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoXCJ0ZW1wbGF0ZVwiKTtcbiAgICB0ZW1wbGF0ZS5pbm5lckhUTUwgPSBodG1sO1xuICAgIHJldHVybiB0aGlzLmZpbmRQaHhDaGlsZHJlbih0ZW1wbGF0ZS5jb250ZW50LCBwYXJlbnRJZCk7XG4gIH0sXG5cbiAgaXNJZ25vcmVkKGVsLCBwaHhVcGRhdGUpIHtcbiAgICByZXR1cm4gKFxuICAgICAgKGVsLmdldEF0dHJpYnV0ZShwaHhVcGRhdGUpIHx8IGVsLmdldEF0dHJpYnV0ZShcImRhdGEtcGh4LXVwZGF0ZVwiKSkgPT09XG4gICAgICBcImlnbm9yZVwiXG4gICAgKTtcbiAgfSxcblxuICBpc1BoeFVwZGF0ZShlbCwgcGh4VXBkYXRlLCB1cGRhdGVUeXBlcykge1xuICAgIHJldHVybiAoXG4gICAgICBlbC5nZXRBdHRyaWJ1dGUgJiYgdXBkYXRlVHlwZXMuaW5kZXhPZihlbC5nZXRBdHRyaWJ1dGUocGh4VXBkYXRlKSkgPj0gMFxuICAgICk7XG4gIH0sXG5cbiAgZmluZFBoeFN0aWNreShlbCkge1xuICAgIHJldHVybiB0aGlzLmFsbChlbCwgYFske1BIWF9TVElDS1l9XWApO1xuICB9LFxuXG4gIGZpbmRQaHhDaGlsZHJlbihlbCwgcGFyZW50SWQpIHtcbiAgICByZXR1cm4gdGhpcy5hbGwoZWwsIGAke1BIWF9WSUVXX1NFTEVDVE9SfVske1BIWF9QQVJFTlRfSUR9PVwiJHtwYXJlbnRJZH1cIl1gKTtcbiAgfSxcblxuICBmaW5kRXhpc3RpbmdQYXJlbnRDSURzKHZpZXdJZCwgY2lkcykge1xuICAgIC8vIHdlIG9ubHkgd2FudCB0byBmaW5kIHBhcmVudHMgdGhhdCBleGlzdCBvbiB0aGUgcGFnZVxuICAgIC8vIGlmIGEgY2lkIGlzIG5vdCBvbiB0aGUgcGFnZSwgdGhlIG9ubHkgd2F5IGl0IGNhbiBiZSBhZGRlZCBiYWNrIHRvIHRoZSBwYWdlXG4gICAgLy8gaXMgaWYgYSBwYXJlbnQgYWRkcyBpdCBiYWNrLCB0aGVyZWZvcmUgaWYgYSBjaWQgZG9lcyBub3QgZXhpc3Qgb24gdGhlIHBhZ2UsXG4gICAgLy8gd2Ugc2hvdWxkIG5vdCB0cnkgdG8gcmVuZGVyIGl0IGJ5IGl0c2VsZiAoYmVjYXVzZSBpdCB3b3VsZCBiZSByZW5kZXJlZCB0d2ljZSxcbiAgICAvLyBvbmUgYnkgdGhlIHBhcmVudCwgYW5kIGEgc2Vjb25kIHRpbWUgYnkgaXRzZWxmKVxuICAgIGNvbnN0IHBhcmVudENpZHMgPSBuZXcgU2V0KCk7XG4gICAgY29uc3QgY2hpbGRyZW5DaWRzID0gbmV3IFNldCgpO1xuXG4gICAgY2lkcy5mb3JFYWNoKChjaWQpID0+IHtcbiAgICAgIHRoaXMuYWxsKFxuICAgICAgICBkb2N1bWVudCxcbiAgICAgICAgYFske1BIWF9WSUVXX1JFRn09XCIke3ZpZXdJZH1cIl1bJHtQSFhfQ09NUE9ORU5UfT1cIiR7Y2lkfVwiXWAsXG4gICAgICApLmZvckVhY2goKHBhcmVudCkgPT4ge1xuICAgICAgICBwYXJlbnRDaWRzLmFkZChjaWQpO1xuICAgICAgICB0aGlzLmFsbChwYXJlbnQsIGBbJHtQSFhfVklFV19SRUZ9PVwiJHt2aWV3SWR9XCJdWyR7UEhYX0NPTVBPTkVOVH1dYClcbiAgICAgICAgICAubWFwKChlbCkgPT4gcGFyc2VJbnQoZWwuZ2V0QXR0cmlidXRlKFBIWF9DT01QT05FTlQpKSlcbiAgICAgICAgICAuZm9yRWFjaCgoY2hpbGRDSUQpID0+IGNoaWxkcmVuQ2lkcy5hZGQoY2hpbGRDSUQpKTtcbiAgICAgIH0pO1xuICAgIH0pO1xuXG4gICAgY2hpbGRyZW5DaWRzLmZvckVhY2goKGNoaWxkQ2lkKSA9PiBwYXJlbnRDaWRzLmRlbGV0ZShjaGlsZENpZCkpO1xuXG4gICAgcmV0dXJuIHBhcmVudENpZHM7XG4gIH0sXG5cbiAgcHJpdmF0ZShlbCwga2V5KSB7XG4gICAgcmV0dXJuIGVsW1BIWF9QUklWQVRFXSAmJiBlbFtQSFhfUFJJVkFURV1ba2V5XTtcbiAgfSxcblxuICBkZWxldGVQcml2YXRlKGVsLCBrZXkpIHtcbiAgICBlbFtQSFhfUFJJVkFURV0gJiYgZGVsZXRlIGVsW1BIWF9QUklWQVRFXVtrZXldO1xuICB9LFxuXG4gIHB1dFByaXZhdGUoZWwsIGtleSwgdmFsdWUpIHtcbiAgICBpZiAoIWVsW1BIWF9QUklWQVRFXSkge1xuICAgICAgZWxbUEhYX1BSSVZBVEVdID0ge307XG4gICAgfVxuICAgIGVsW1BIWF9QUklWQVRFXVtrZXldID0gdmFsdWU7XG4gIH0sXG5cbiAgdXBkYXRlUHJpdmF0ZShlbCwga2V5LCBkZWZhdWx0VmFsLCB1cGRhdGVGdW5jKSB7XG4gICAgY29uc3QgZXhpc3RpbmcgPSB0aGlzLnByaXZhdGUoZWwsIGtleSk7XG4gICAgaWYgKGV4aXN0aW5nID09PSB1bmRlZmluZWQpIHtcbiAgICAgIHRoaXMucHV0UHJpdmF0ZShlbCwga2V5LCB1cGRhdGVGdW5jKGRlZmF1bHRWYWwpKTtcbiAgICB9IGVsc2Uge1xuICAgICAgdGhpcy5wdXRQcml2YXRlKGVsLCBrZXksIHVwZGF0ZUZ1bmMoZXhpc3RpbmcpKTtcbiAgICB9XG4gIH0sXG5cbiAgc3luY1BlbmRpbmdBdHRycyhmcm9tRWwsIHRvRWwpIHtcbiAgICBpZiAoIWZyb21FbC5oYXNBdHRyaWJ1dGUoUEhYX1JFRl9TUkMpKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIFBIWF9FVkVOVF9DTEFTU0VTLmZvckVhY2goKGNsYXNzTmFtZSkgPT4ge1xuICAgICAgZnJvbUVsLmNsYXNzTGlzdC5jb250YWlucyhjbGFzc05hbWUpICYmIHRvRWwuY2xhc3NMaXN0LmFkZChjbGFzc05hbWUpO1xuICAgIH0pO1xuICAgIFBIWF9QRU5ESU5HX0FUVFJTLmZpbHRlcigoYXR0cikgPT4gZnJvbUVsLmhhc0F0dHJpYnV0ZShhdHRyKSkuZm9yRWFjaChcbiAgICAgIChhdHRyKSA9PiB7XG4gICAgICAgIHRvRWwuc2V0QXR0cmlidXRlKGF0dHIsIGZyb21FbC5nZXRBdHRyaWJ1dGUoYXR0cikpO1xuICAgICAgfSxcbiAgICApO1xuICB9LFxuXG4gIGNvcHlQcml2YXRlcyh0YXJnZXQsIHNvdXJjZSkge1xuICAgIGlmIChzb3VyY2VbUEhYX1BSSVZBVEVdKSB7XG4gICAgICB0YXJnZXRbUEhYX1BSSVZBVEVdID0gc291cmNlW1BIWF9QUklWQVRFXTtcbiAgICB9XG4gIH0sXG5cbiAgcHV0VGl0bGUoc3RyKSB7XG4gICAgY29uc3QgdGl0bGVFbCA9IGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3IoXCJ0aXRsZVwiKTtcbiAgICBpZiAodGl0bGVFbCkge1xuICAgICAgY29uc3QgeyBwcmVmaXgsIHN1ZmZpeCwgZGVmYXVsdDogZGVmYXVsdFRpdGxlIH0gPSB0aXRsZUVsLmRhdGFzZXQ7XG4gICAgICBjb25zdCBpc0VtcHR5ID0gdHlwZW9mIHN0ciAhPT0gXCJzdHJpbmdcIiB8fCBzdHIudHJpbSgpID09PSBcIlwiO1xuICAgICAgaWYgKGlzRW1wdHkgJiYgdHlwZW9mIGRlZmF1bHRUaXRsZSAhPT0gXCJzdHJpbmdcIikge1xuICAgICAgICByZXR1cm47XG4gICAgICB9XG5cbiAgICAgIGNvbnN0IGlubmVyID0gaXNFbXB0eSA/IGRlZmF1bHRUaXRsZSA6IHN0cjtcbiAgICAgIGRvY3VtZW50LnRpdGxlID0gYCR7cHJlZml4IHx8IFwiXCJ9JHtpbm5lciB8fCBcIlwifSR7c3VmZml4IHx8IFwiXCJ9YDtcbiAgICB9IGVsc2Uge1xuICAgICAgZG9jdW1lbnQudGl0bGUgPSBzdHI7XG4gICAgfVxuICB9LFxuXG4gIGRlYm91bmNlKFxuICAgIGVsLFxuICAgIGV2ZW50LFxuICAgIHBoeERlYm91bmNlLFxuICAgIGRlZmF1bHREZWJvdW5jZSxcbiAgICBwaHhUaHJvdHRsZSxcbiAgICBkZWZhdWx0VGhyb3R0bGUsXG4gICAgYXN5bmNGaWx0ZXIsXG4gICAgY2FsbGJhY2ssXG4gICkge1xuICAgIGxldCBkZWJvdW5jZSA9IGVsLmdldEF0dHJpYnV0ZShwaHhEZWJvdW5jZSk7XG4gICAgbGV0IHRocm90dGxlID0gZWwuZ2V0QXR0cmlidXRlKHBoeFRocm90dGxlKTtcblxuICAgIGlmIChkZWJvdW5jZSA9PT0gXCJcIikge1xuICAgICAgZGVib3VuY2UgPSBkZWZhdWx0RGVib3VuY2U7XG4gICAgfVxuICAgIGlmICh0aHJvdHRsZSA9PT0gXCJcIikge1xuICAgICAgdGhyb3R0bGUgPSBkZWZhdWx0VGhyb3R0bGU7XG4gICAgfVxuICAgIGNvbnN0IHZhbHVlID0gZGVib3VuY2UgfHwgdGhyb3R0bGU7XG4gICAgc3dpdGNoICh2YWx1ZSkge1xuICAgICAgY2FzZSBudWxsOlxuICAgICAgICByZXR1cm4gY2FsbGJhY2soKTtcblxuICAgICAgY2FzZSBcImJsdXJcIjpcbiAgICAgICAgdGhpcy5pbmNDeWNsZShlbCwgXCJkZWJvdW5jZS1ibHVyLWN5Y2xlXCIsICgpID0+IHtcbiAgICAgICAgICBpZiAoYXN5bmNGaWx0ZXIoKSkge1xuICAgICAgICAgICAgY2FsbGJhY2soKTtcbiAgICAgICAgICB9XG4gICAgICAgIH0pO1xuICAgICAgICBpZiAodGhpcy5vbmNlKGVsLCBcImRlYm91bmNlLWJsdXJcIikpIHtcbiAgICAgICAgICBlbC5hZGRFdmVudExpc3RlbmVyKFwiYmx1clwiLCAoKSA9PlxuICAgICAgICAgICAgdGhpcy50cmlnZ2VyQ3ljbGUoZWwsIFwiZGVib3VuY2UtYmx1ci1jeWNsZVwiKSxcbiAgICAgICAgICApO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybjtcblxuICAgICAgZGVmYXVsdDpcbiAgICAgICAgY29uc3QgdGltZW91dCA9IHBhcnNlSW50KHZhbHVlKTtcbiAgICAgICAgY29uc3QgdHJpZ2dlciA9ICgpID0+XG4gICAgICAgICAgdGhyb3R0bGUgPyB0aGlzLmRlbGV0ZVByaXZhdGUoZWwsIFRIUk9UVExFRCkgOiBjYWxsYmFjaygpO1xuICAgICAgICBjb25zdCBjdXJyZW50Q3ljbGUgPSB0aGlzLmluY0N5Y2xlKGVsLCBERUJPVU5DRV9UUklHR0VSLCB0cmlnZ2VyKTtcbiAgICAgICAgaWYgKGlzTmFOKHRpbWVvdXQpKSB7XG4gICAgICAgICAgcmV0dXJuIGxvZ0Vycm9yKGBpbnZhbGlkIHRocm90dGxlL2RlYm91bmNlIHZhbHVlOiAke3ZhbHVlfWApO1xuICAgICAgICB9XG4gICAgICAgIGlmICh0aHJvdHRsZSkge1xuICAgICAgICAgIGxldCBuZXdLZXlEb3duID0gZmFsc2U7XG4gICAgICAgICAgaWYgKGV2ZW50LnR5cGUgPT09IFwia2V5ZG93blwiKSB7XG4gICAgICAgICAgICBjb25zdCBwcmV2S2V5ID0gdGhpcy5wcml2YXRlKGVsLCBERUJPVU5DRV9QUkVWX0tFWSk7XG4gICAgICAgICAgICB0aGlzLnB1dFByaXZhdGUoZWwsIERFQk9VTkNFX1BSRVZfS0VZLCBldmVudC5rZXkpO1xuICAgICAgICAgICAgbmV3S2V5RG93biA9IHByZXZLZXkgIT09IGV2ZW50LmtleTtcbiAgICAgICAgICB9XG5cbiAgICAgICAgICBpZiAoIW5ld0tleURvd24gJiYgdGhpcy5wcml2YXRlKGVsLCBUSFJPVFRMRUQpKSB7XG4gICAgICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIGNhbGxiYWNrKCk7XG4gICAgICAgICAgICBjb25zdCB0ID0gc2V0VGltZW91dCgoKSA9PiB7XG4gICAgICAgICAgICAgIGlmIChhc3luY0ZpbHRlcigpKSB7XG4gICAgICAgICAgICAgICAgdGhpcy50cmlnZ2VyQ3ljbGUoZWwsIERFQk9VTkNFX1RSSUdHRVIpO1xuICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9LCB0aW1lb3V0KTtcbiAgICAgICAgICAgIHRoaXMucHV0UHJpdmF0ZShlbCwgVEhST1RUTEVELCB0KTtcbiAgICAgICAgICB9XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgc2V0VGltZW91dCgoKSA9PiB7XG4gICAgICAgICAgICBpZiAoYXN5bmNGaWx0ZXIoKSkge1xuICAgICAgICAgICAgICB0aGlzLnRyaWdnZXJDeWNsZShlbCwgREVCT1VOQ0VfVFJJR0dFUiwgY3VycmVudEN5Y2xlKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9LCB0aW1lb3V0KTtcbiAgICAgICAgfVxuXG4gICAgICAgIGNvbnN0IGZvcm0gPSBlbC5mb3JtO1xuICAgICAgICBpZiAoZm9ybSAmJiB0aGlzLm9uY2UoZm9ybSwgXCJiaW5kLWRlYm91bmNlXCIpKSB7XG4gICAgICAgICAgZm9ybS5hZGRFdmVudExpc3RlbmVyKFwic3VibWl0XCIsICgpID0+IHtcbiAgICAgICAgICAgIEFycmF5LmZyb20obmV3IEZvcm1EYXRhKGZvcm0pLmVudHJpZXMoKSwgKFtuYW1lXSkgPT4ge1xuICAgICAgICAgICAgICBjb25zdCBpbnB1dCA9IGZvcm0ucXVlcnlTZWxlY3RvcihgW25hbWU9XCIke25hbWV9XCJdYCk7XG4gICAgICAgICAgICAgIHRoaXMuaW5jQ3ljbGUoaW5wdXQsIERFQk9VTkNFX1RSSUdHRVIpO1xuICAgICAgICAgICAgICB0aGlzLmRlbGV0ZVByaXZhdGUoaW5wdXQsIFRIUk9UVExFRCk7XG4gICAgICAgICAgICB9KTtcbiAgICAgICAgICB9KTtcbiAgICAgICAgfVxuICAgICAgICBpZiAodGhpcy5vbmNlKGVsLCBcImJpbmQtZGVib3VuY2VcIikpIHtcbiAgICAgICAgICBlbC5hZGRFdmVudExpc3RlbmVyKFwiYmx1clwiLCAoKSA9PiB7XG4gICAgICAgICAgICAvLyBiZWNhdXNlIHdlIHRyaWdnZXIgdGhlIGNhbGxiYWNrIGhlcmUsXG4gICAgICAgICAgICAvLyB3ZSBhbHNvIGNsZWFyIHRoZSB0aHJvdHRsZSB0aW1lb3V0IHRvIHByZXZlbnQgdGhlIGNhbGxiYWNrXG4gICAgICAgICAgICAvLyBmcm9tIGJlaW5nIGNhbGxlZCBhZ2FpbiBhZnRlciB0aGUgdGltZW91dCBmaXJlc1xuICAgICAgICAgICAgY2xlYXJUaW1lb3V0KHRoaXMucHJpdmF0ZShlbCwgVEhST1RUTEVEKSk7XG4gICAgICAgICAgICB0aGlzLnRyaWdnZXJDeWNsZShlbCwgREVCT1VOQ0VfVFJJR0dFUik7XG4gICAgICAgICAgfSk7XG4gICAgICAgIH1cbiAgICB9XG4gIH0sXG5cbiAgdHJpZ2dlckN5Y2xlKGVsLCBrZXksIGN1cnJlbnRDeWNsZSkge1xuICAgIGNvbnN0IFtjeWNsZSwgdHJpZ2dlcl0gPSB0aGlzLnByaXZhdGUoZWwsIGtleSk7XG4gICAgaWYgKCFjdXJyZW50Q3ljbGUpIHtcbiAgICAgIGN1cnJlbnRDeWNsZSA9IGN5Y2xlO1xuICAgIH1cbiAgICBpZiAoY3VycmVudEN5Y2xlID09PSBjeWNsZSkge1xuICAgICAgdGhpcy5pbmNDeWNsZShlbCwga2V5KTtcbiAgICAgIHRyaWdnZXIoKTtcbiAgICB9XG4gIH0sXG5cbiAgb25jZShlbCwga2V5KSB7XG4gICAgaWYgKHRoaXMucHJpdmF0ZShlbCwga2V5KSA9PT0gdHJ1ZSkge1xuICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH1cbiAgICB0aGlzLnB1dFByaXZhdGUoZWwsIGtleSwgdHJ1ZSk7XG4gICAgcmV0dXJuIHRydWU7XG4gIH0sXG5cbiAgaW5jQ3ljbGUoZWwsIGtleSwgdHJpZ2dlciA9IGZ1bmN0aW9uICgpIHt9KSB7XG4gICAgbGV0IFtjdXJyZW50Q3ljbGVdID0gdGhpcy5wcml2YXRlKGVsLCBrZXkpIHx8IFswLCB0cmlnZ2VyXTtcbiAgICBjdXJyZW50Q3ljbGUrKztcbiAgICB0aGlzLnB1dFByaXZhdGUoZWwsIGtleSwgW2N1cnJlbnRDeWNsZSwgdHJpZ2dlcl0pO1xuICAgIHJldHVybiBjdXJyZW50Q3ljbGU7XG4gIH0sXG5cbiAgLy8gbWFpbnRhaW5zIG9yIGFkZHMgcHJpdmF0ZWx5IHVzZWQgaG9vayBpbmZvcm1hdGlvblxuICAvLyBmcm9tRWwgYW5kIHRvRWwgY2FuIGJlIHRoZSBzYW1lIGVsZW1lbnQgaW4gdGhlIGNhc2Ugb2YgYSBuZXdseSBhZGRlZCBub2RlXG4gIC8vIGZyb21FbCBhbmQgdG9FbCBjYW4gYmUgYW55IEhUTUwgbm9kZSB0eXBlLCBzbyB3ZSBuZWVkIHRvIGNoZWNrIGlmIGl0J3MgYW4gZWxlbWVudCBub2RlXG4gIG1haW50YWluUHJpdmF0ZUhvb2tzKGZyb21FbCwgdG9FbCwgcGh4Vmlld3BvcnRUb3AsIHBoeFZpZXdwb3J0Qm90dG9tKSB7XG4gICAgLy8gbWFpbnRhaW4gdGhlIGhvb2tzIGNyZWF0ZWQgd2l0aCBjcmVhdGVIb29rXG4gICAgaWYgKFxuICAgICAgZnJvbUVsLmhhc0F0dHJpYnV0ZSAmJlxuICAgICAgZnJvbUVsLmhhc0F0dHJpYnV0ZShcImRhdGEtcGh4LWhvb2tcIikgJiZcbiAgICAgICF0b0VsLmhhc0F0dHJpYnV0ZShcImRhdGEtcGh4LWhvb2tcIilcbiAgICApIHtcbiAgICAgIHRvRWwuc2V0QXR0cmlidXRlKFwiZGF0YS1waHgtaG9va1wiLCBmcm9tRWwuZ2V0QXR0cmlidXRlKFwiZGF0YS1waHgtaG9va1wiKSk7XG4gICAgfVxuICAgIC8vIGFkZCBob29rcyB0byBlbGVtZW50cyB3aXRoIHZpZXdwb3J0IGF0dHJpYnV0ZXNcbiAgICBpZiAoXG4gICAgICB0b0VsLmhhc0F0dHJpYnV0ZSAmJlxuICAgICAgKHRvRWwuaGFzQXR0cmlidXRlKHBoeFZpZXdwb3J0VG9wKSB8fFxuICAgICAgICB0b0VsLmhhc0F0dHJpYnV0ZShwaHhWaWV3cG9ydEJvdHRvbSkpXG4gICAgKSB7XG4gICAgICB0b0VsLnNldEF0dHJpYnV0ZShcImRhdGEtcGh4LWhvb2tcIiwgXCJQaG9lbml4LkluZmluaXRlU2Nyb2xsXCIpO1xuICAgIH1cbiAgfSxcblxuICBwdXRDdXN0b21FbEhvb2soZWwsIGhvb2spIHtcbiAgICBpZiAoZWwuaXNDb25uZWN0ZWQpIHtcbiAgICAgIGVsLnNldEF0dHJpYnV0ZShcImRhdGEtcGh4LWhvb2tcIiwgXCJcIik7XG4gICAgfSBlbHNlIHtcbiAgICAgIGNvbnNvbGUuZXJyb3IoYFxuICAgICAgICBob29rIGF0dGFjaGVkIHRvIG5vbi1jb25uZWN0ZWQgRE9NIGVsZW1lbnRcbiAgICAgICAgZW5zdXJlIHlvdSBhcmUgY2FsbGluZyBjcmVhdGVIb29rIHdpdGhpbiB5b3VyIGNvbm5lY3RlZENhbGxiYWNrLiAke2VsLm91dGVySFRNTH1cbiAgICAgIGApO1xuICAgIH1cbiAgICB0aGlzLnB1dFByaXZhdGUoZWwsIFwiY3VzdG9tLWVsLWhvb2tcIiwgaG9vayk7XG4gIH0sXG5cbiAgZ2V0Q3VzdG9tRWxIb29rKGVsKSB7XG4gICAgcmV0dXJuIHRoaXMucHJpdmF0ZShlbCwgXCJjdXN0b20tZWwtaG9va1wiKTtcbiAgfSxcblxuICBpc1VzZWRJbnB1dChlbCkge1xuICAgIHJldHVybiAoXG4gICAgICBlbC5ub2RlVHlwZSA9PT0gTm9kZS5FTEVNRU5UX05PREUgJiZcbiAgICAgICh0aGlzLnByaXZhdGUoZWwsIFBIWF9IQVNfRk9DVVNFRCkgfHwgdGhpcy5wcml2YXRlKGVsLCBQSFhfSEFTX1NVQk1JVFRFRCkpXG4gICAgKTtcbiAgfSxcblxuICByZXNldEZvcm0oZm9ybSkge1xuICAgIEFycmF5LmZyb20oZm9ybS5lbGVtZW50cykuZm9yRWFjaCgoaW5wdXQpID0+IHtcbiAgICAgIHRoaXMuZGVsZXRlUHJpdmF0ZShpbnB1dCwgUEhYX0hBU19GT0NVU0VEKTtcbiAgICAgIHRoaXMuZGVsZXRlUHJpdmF0ZShpbnB1dCwgUEhYX0hBU19TVUJNSVRURUQpO1xuICAgIH0pO1xuICB9LFxuXG4gIGlzUGh4Q2hpbGQobm9kZSkge1xuICAgIHJldHVybiBub2RlLmdldEF0dHJpYnV0ZSAmJiBub2RlLmdldEF0dHJpYnV0ZShQSFhfUEFSRU5UX0lEKTtcbiAgfSxcblxuICBpc1BoeFN0aWNreShub2RlKSB7XG4gICAgcmV0dXJuIG5vZGUuZ2V0QXR0cmlidXRlICYmIG5vZGUuZ2V0QXR0cmlidXRlKFBIWF9TVElDS1kpICE9PSBudWxsO1xuICB9LFxuXG4gIGlzQ2hpbGRPZkFueShlbCwgcGFyZW50cykge1xuICAgIHJldHVybiAhIXBhcmVudHMuZmluZCgocGFyZW50KSA9PiBwYXJlbnQuY29udGFpbnMoZWwpKTtcbiAgfSxcblxuICBmaXJzdFBoeENoaWxkKGVsKSB7XG4gICAgcmV0dXJuIHRoaXMuaXNQaHhDaGlsZChlbCkgPyBlbCA6IHRoaXMuYWxsKGVsLCBgWyR7UEhYX1BBUkVOVF9JRH1dYClbMF07XG4gIH0sXG5cbiAgaXNQb3J0YWxUZW1wbGF0ZShlbCkge1xuICAgIHJldHVybiBlbC50YWdOYW1lID09PSBcIlRFTVBMQVRFXCIgJiYgZWwuaGFzQXR0cmlidXRlKFBIWF9QT1JUQUwpO1xuICB9LFxuXG4gIGNsb3Nlc3RWaWV3RWwoZWwpIHtcbiAgICAvLyBmaW5kIHRoZSBjbG9zZXN0IHBvcnRhbCBvciB2aWV3IGVsZW1lbnQsIHdoaWNoZXZlciBjb21lcyBmaXJzdFxuICAgIGNvbnN0IHBvcnRhbE9yVmlld0VsID0gZWwuY2xvc2VzdChcbiAgICAgIGBbJHtQSFhfVEVMRVBPUlRFRF9SRUZ9XSwke1BIWF9WSUVXX1NFTEVDVE9SfWAsXG4gICAgKTtcbiAgICBpZiAoIXBvcnRhbE9yVmlld0VsKSB7XG4gICAgICByZXR1cm4gbnVsbDtcbiAgICB9XG4gICAgaWYgKHBvcnRhbE9yVmlld0VsLmhhc0F0dHJpYnV0ZShQSFhfVEVMRVBPUlRFRF9SRUYpKSB7XG4gICAgICAvLyBQSFhfVEVMRVBPUlRFRF9SRUYgaXMgc2V0IHRvIHRoZSBpZCBvZiB0aGUgdmlldyB0aGF0IG93bnMgdGhlIHBvcnRhbCBlbGVtZW50XG4gICAgICByZXR1cm4gdGhpcy5ieUlkKHBvcnRhbE9yVmlld0VsLmdldEF0dHJpYnV0ZShQSFhfVEVMRVBPUlRFRF9SRUYpKTtcbiAgICB9IGVsc2UgaWYgKHBvcnRhbE9yVmlld0VsLmhhc0F0dHJpYnV0ZShQSFhfU0VTU0lPTikpIHtcbiAgICAgIHJldHVybiBwb3J0YWxPclZpZXdFbDtcbiAgICB9XG4gICAgcmV0dXJuIG51bGw7XG4gIH0sXG5cbiAgZGlzcGF0Y2hFdmVudCh0YXJnZXQsIG5hbWUsIG9wdHMgPSB7fSkge1xuICAgIGxldCBkZWZhdWx0QnViYmxlID0gdHJ1ZTtcbiAgICBjb25zdCBpc1VwbG9hZFRhcmdldCA9XG4gICAgICB0YXJnZXQubm9kZU5hbWUgPT09IFwiSU5QVVRcIiAmJiB0YXJnZXQudHlwZSA9PT0gXCJmaWxlXCI7XG4gICAgaWYgKGlzVXBsb2FkVGFyZ2V0ICYmIG5hbWUgPT09IFwiY2xpY2tcIikge1xuICAgICAgZGVmYXVsdEJ1YmJsZSA9IGZhbHNlO1xuICAgIH1cbiAgICBjb25zdCBidWJibGVzID0gb3B0cy5idWJibGVzID09PSB1bmRlZmluZWQgPyBkZWZhdWx0QnViYmxlIDogISFvcHRzLmJ1YmJsZXM7XG4gICAgY29uc3QgZXZlbnRPcHRzID0ge1xuICAgICAgYnViYmxlczogYnViYmxlcyxcbiAgICAgIGNhbmNlbGFibGU6IHRydWUsXG4gICAgICBkZXRhaWw6IG9wdHMuZGV0YWlsIHx8IHt9LFxuICAgIH07XG4gICAgY29uc3QgZXZlbnQgPVxuICAgICAgbmFtZSA9PT0gXCJjbGlja1wiXG4gICAgICAgID8gbmV3IE1vdXNlRXZlbnQoXCJjbGlja1wiLCBldmVudE9wdHMpXG4gICAgICAgIDogbmV3IEN1c3RvbUV2ZW50KG5hbWUsIGV2ZW50T3B0cyk7XG4gICAgdGFyZ2V0LmRpc3BhdGNoRXZlbnQoZXZlbnQpO1xuICB9LFxuXG4gIGNsb25lTm9kZShub2RlLCBodG1sKSB7XG4gICAgaWYgKHR5cGVvZiBodG1sID09PSBcInVuZGVmaW5lZFwiKSB7XG4gICAgICByZXR1cm4gbm9kZS5jbG9uZU5vZGUodHJ1ZSk7XG4gICAgfSBlbHNlIHtcbiAgICAgIGNvbnN0IGNsb25lZCA9IG5vZGUuY2xvbmVOb2RlKGZhbHNlKTtcbiAgICAgIGNsb25lZC5pbm5lckhUTUwgPSBodG1sO1xuICAgICAgcmV0dXJuIGNsb25lZDtcbiAgICB9XG4gIH0sXG5cbiAgLy8gbWVyZ2UgYXR0cmlidXRlcyBmcm9tIHNvdXJjZSB0byB0YXJnZXRcbiAgLy8gaWYgYW4gZWxlbWVudCBpcyBpZ25vcmVkLCB3ZSBvbmx5IG1lcmdlIGRhdGEgYXR0cmlidXRlc1xuICAvLyBpbmNsdWRpbmcgcmVtb3ZpbmcgZGF0YSBhdHRyaWJ1dGVzIHRoYXQgYXJlIG5vIGxvbmdlciBpbiB0aGUgc291cmNlXG4gIG1lcmdlQXR0cnModGFyZ2V0LCBzb3VyY2UsIG9wdHMgPSB7fSkge1xuICAgIGNvbnN0IGV4Y2x1ZGUgPSBuZXcgU2V0KG9wdHMuZXhjbHVkZSB8fCBbXSk7XG4gICAgY29uc3QgaXNJZ25vcmVkID0gb3B0cy5pc0lnbm9yZWQ7XG4gICAgY29uc3Qgc291cmNlQXR0cnMgPSBzb3VyY2UuYXR0cmlidXRlcztcbiAgICBmb3IgKGxldCBpID0gc291cmNlQXR0cnMubGVuZ3RoIC0gMTsgaSA+PSAwOyBpLS0pIHtcbiAgICAgIGNvbnN0IG5hbWUgPSBzb3VyY2VBdHRyc1tpXS5uYW1lO1xuICAgICAgaWYgKCFleGNsdWRlLmhhcyhuYW1lKSkge1xuICAgICAgICBjb25zdCBzb3VyY2VWYWx1ZSA9IHNvdXJjZS5nZXRBdHRyaWJ1dGUobmFtZSk7XG4gICAgICAgIGlmIChcbiAgICAgICAgICB0YXJnZXQuZ2V0QXR0cmlidXRlKG5hbWUpICE9PSBzb3VyY2VWYWx1ZSAmJlxuICAgICAgICAgICghaXNJZ25vcmVkIHx8IChpc0lnbm9yZWQgJiYgbmFtZS5zdGFydHNXaXRoKFwiZGF0YS1cIikpKVxuICAgICAgICApIHtcbiAgICAgICAgICB0YXJnZXQuc2V0QXR0cmlidXRlKG5hbWUsIHNvdXJjZVZhbHVlKTtcbiAgICAgICAgfVxuICAgICAgfSBlbHNlIHtcbiAgICAgICAgLy8gV2UgZXhjbHVkZSB0aGUgdmFsdWUgZnJvbSBiZWluZyBtZXJnZWQgb24gZm9jdXNlZCBpbnB1dHMsIGJlY2F1c2UgdGhlXG4gICAgICAgIC8vIHVzZXIncyBpbnB1dCBzaG91bGQgYWx3YXlzIHdpbi5cbiAgICAgICAgLy8gV2UgY2FuIHN0aWxsIGFzc2lnbiBpdCBhcyBsb25nIGFzIHRoZSB2YWx1ZSBwcm9wZXJ0eSBpcyB0aGUgc2FtZSwgdGhvdWdoLlxuICAgICAgICAvLyBUaGlzIHByZXZlbnRzIGEgc2l0dWF0aW9uIHdoZXJlIHRoZSB1cGRhdGVkIGhvb2sgaXMgbm90IGJlaW5nIHRyaWdnZXJlZFxuICAgICAgICAvLyB3aGVuIGFuIGlucHV0IGlzIGJhY2sgaW4gaXRzIFwib3JpZ2luYWwgc3RhdGVcIiwgYmVjYXVzZSB0aGUgYXR0cmlidXRlXG4gICAgICAgIC8vIHdhcyBuZXZlciBjaGFuZ2VkLCBzZWU6XG4gICAgICAgIC8vIGh0dHBzOi8vZ2l0aHViLmNvbS9waG9lbml4ZnJhbWV3b3JrL3Bob2VuaXhfbGl2ZV92aWV3L2lzc3Vlcy8yMTYzXG4gICAgICAgIGlmIChuYW1lID09PSBcInZhbHVlXCIpIHtcbiAgICAgICAgICBjb25zdCBzb3VyY2VWYWx1ZSA9IHNvdXJjZS52YWx1ZSA/PyBzb3VyY2UuZ2V0QXR0cmlidXRlKG5hbWUpO1xuICAgICAgICAgIGlmICh0YXJnZXQudmFsdWUgPT09IHNvdXJjZVZhbHVlKSB7XG4gICAgICAgICAgICAvLyBhY3R1YWxseSBzZXQgdGhlIHZhbHVlIGF0dHJpYnV0ZSB0byBzeW5jIGl0IHdpdGggdGhlIHZhbHVlIHByb3BlcnR5XG4gICAgICAgICAgICB0YXJnZXQuc2V0QXR0cmlidXRlKFwidmFsdWVcIiwgc291cmNlLmdldEF0dHJpYnV0ZShuYW1lKSk7XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICB9XG4gICAgfVxuXG4gICAgY29uc3QgdGFyZ2V0QXR0cnMgPSB0YXJnZXQuYXR0cmlidXRlcztcbiAgICBmb3IgKGxldCBpID0gdGFyZ2V0QXR0cnMubGVuZ3RoIC0gMTsgaSA+PSAwOyBpLS0pIHtcbiAgICAgIGNvbnN0IG5hbWUgPSB0YXJnZXRBdHRyc1tpXS5uYW1lO1xuICAgICAgaWYgKGlzSWdub3JlZCkge1xuICAgICAgICBpZiAoXG4gICAgICAgICAgbmFtZS5zdGFydHNXaXRoKFwiZGF0YS1cIikgJiZcbiAgICAgICAgICAhc291cmNlLmhhc0F0dHJpYnV0ZShuYW1lKSAmJlxuICAgICAgICAgICFQSFhfUEVORElOR19BVFRSUy5pbmNsdWRlcyhuYW1lKVxuICAgICAgICApIHtcbiAgICAgICAgICB0YXJnZXQucmVtb3ZlQXR0cmlidXRlKG5hbWUpO1xuICAgICAgICB9XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBpZiAoIXNvdXJjZS5oYXNBdHRyaWJ1dGUobmFtZSkpIHtcbiAgICAgICAgICB0YXJnZXQucmVtb3ZlQXR0cmlidXRlKG5hbWUpO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfVxuICB9LFxuXG4gIG1lcmdlRm9jdXNlZElucHV0KHRhcmdldCwgc291cmNlKSB7XG4gICAgLy8gc2tpcCBzZWxlY3RzIGJlY2F1c2UgRkYgd2lsbCByZXNldCBoaWdobGlnaHRlZCBpbmRleCBmb3IgYW55IHNldEF0dHJpYnV0ZVxuICAgIGlmICghKHRhcmdldCBpbnN0YW5jZW9mIEhUTUxTZWxlY3RFbGVtZW50KSkge1xuICAgICAgRE9NLm1lcmdlQXR0cnModGFyZ2V0LCBzb3VyY2UsIHsgZXhjbHVkZTogW1widmFsdWVcIl0gfSk7XG4gICAgfVxuXG4gICAgaWYgKHNvdXJjZS5yZWFkT25seSkge1xuICAgICAgdGFyZ2V0LnNldEF0dHJpYnV0ZShcInJlYWRvbmx5XCIsIHRydWUpO1xuICAgIH0gZWxzZSB7XG4gICAgICB0YXJnZXQucmVtb3ZlQXR0cmlidXRlKFwicmVhZG9ubHlcIik7XG4gICAgfVxuICB9LFxuXG4gIGhhc1NlbGVjdGlvblJhbmdlKGVsKSB7XG4gICAgcmV0dXJuIChcbiAgICAgIGVsLnNldFNlbGVjdGlvblJhbmdlICYmIChlbC50eXBlID09PSBcInRleHRcIiB8fCBlbC50eXBlID09PSBcInRleHRhcmVhXCIpXG4gICAgKTtcbiAgfSxcblxuICByZXN0b3JlRm9jdXMoZm9jdXNlZCwgc2VsZWN0aW9uU3RhcnQsIHNlbGVjdGlvbkVuZCkge1xuICAgIGlmIChmb2N1c2VkIGluc3RhbmNlb2YgSFRNTFNlbGVjdEVsZW1lbnQpIHtcbiAgICAgIGZvY3VzZWQuZm9jdXMoKTtcbiAgICB9XG4gICAgaWYgKCFET00uaXNUZXh0dWFsSW5wdXQoZm9jdXNlZCkpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICBjb25zdCB3YXNGb2N1c2VkID0gZm9jdXNlZC5tYXRjaGVzKFwiOmZvY3VzXCIpO1xuICAgIGlmICghd2FzRm9jdXNlZCkge1xuICAgICAgZm9jdXNlZC5mb2N1cygpO1xuICAgIH1cbiAgICBpZiAodGhpcy5oYXNTZWxlY3Rpb25SYW5nZShmb2N1c2VkKSkge1xuICAgICAgZm9jdXNlZC5zZXRTZWxlY3Rpb25SYW5nZShzZWxlY3Rpb25TdGFydCwgc2VsZWN0aW9uRW5kKTtcbiAgICB9XG4gIH0sXG5cbiAgaXNGb3JtSW5wdXQoZWwpIHtcbiAgICBpZiAoZWwubG9jYWxOYW1lICYmIGN1c3RvbUVsZW1lbnRzLmdldChlbC5sb2NhbE5hbWUpKSB7XG4gICAgICAvLyBDdXN0b20gRWxlbWVudHMgbWF5IGJlIGZvcm0gYXNzb2NpYXRlZC4gVGhpcyBhbGxvd3MgdGhlbVxuICAgICAgLy8gdG8gcGFydGljaXBhdGUgd2l0aGluIGEgZm9ybSdzIGxpZmVjeWNsZSwgaW5jbHVkaW5nIGZvcm1cbiAgICAgIC8vIHZhbGlkaXR5IGFuZCBmb3JtIHN1Ym1pc3Npb25zLlxuICAgICAgLy8gVGhlIHNwZWMgZm9yIEZvcm0gQXNzb2NpYXRlZCBjdXN0b20gZWxlbWVudHMgcmVxdWlyZXMgdGhlXG4gICAgICAvLyBjdXN0b20gZWxlbWVudCdzIGNsYXNzIHRvIGNvbnRhaW4gYSBzdGF0aWMgYm9vbGVhbiB2YWx1ZSBvZiBgZm9ybUFzc29jaWF0ZWRgXG4gICAgICAvLyB3aGljaCBpZGVudGlmaWVzIHRoaXMgY2xhc3MgYXMgYWxsb3dlZCB0byBhc3NvY2lhdGUgdG8gYSBmb3JtLlxuICAgICAgLy8gU2VlIGh0dHBzOi8vaHRtbC5zcGVjLndoYXR3Zy5vcmcvZGV2L2N1c3RvbS1lbGVtZW50cy5odG1sI2N1c3RvbS1lbGVtZW50cy1mYWNlLWV4YW1wbGVcbiAgICAgIC8vIGZvciBkZXRhaWxzLlxuICAgICAgcmV0dXJuIGN1c3RvbUVsZW1lbnRzLmdldChlbC5sb2NhbE5hbWUpW2Bmb3JtQXNzb2NpYXRlZGBdO1xuICAgIH1cblxuICAgIHJldHVybiAoXG4gICAgICAvXig/OmlucHV0fHNlbGVjdHx0ZXh0YXJlYSkkL2kudGVzdChlbC50YWdOYW1lKSAmJiBlbC50eXBlICE9PSBcImJ1dHRvblwiXG4gICAgKTtcbiAgfSxcblxuICBzeW5jQXR0cnNUb1Byb3BzKGVsKSB7XG4gICAgaWYgKFxuICAgICAgZWwgaW5zdGFuY2VvZiBIVE1MSW5wdXRFbGVtZW50ICYmXG4gICAgICBDSEVDS0FCTEVfSU5QVVRTLmluZGV4T2YoZWwudHlwZS50b0xvY2FsZUxvd2VyQ2FzZSgpKSA+PSAwXG4gICAgKSB7XG4gICAgICBlbC5jaGVja2VkID0gZWwuZ2V0QXR0cmlidXRlKFwiY2hlY2tlZFwiKSAhPT0gbnVsbDtcbiAgICB9XG4gIH0sXG5cbiAgaXNUZXh0dWFsSW5wdXQoZWwpIHtcbiAgICByZXR1cm4gRk9DVVNBQkxFX0lOUFVUUy5pbmRleE9mKGVsLnR5cGUpID49IDA7XG4gIH0sXG5cbiAgaXNOb3dUcmlnZ2VyRm9ybUV4dGVybmFsKGVsLCBwaHhUcmlnZ2VyRXh0ZXJuYWwpIHtcbiAgICByZXR1cm4gKFxuICAgICAgZWwuZ2V0QXR0cmlidXRlICYmXG4gICAgICBlbC5nZXRBdHRyaWJ1dGUocGh4VHJpZ2dlckV4dGVybmFsKSAhPT0gbnVsbCAmJlxuICAgICAgZG9jdW1lbnQuYm9keS5jb250YWlucyhlbClcbiAgICApO1xuICB9LFxuXG4gIGNsZWFuQ2hpbGROb2Rlcyhjb250YWluZXIsIHBoeFVwZGF0ZSkge1xuICAgIGlmIChcbiAgICAgIERPTS5pc1BoeFVwZGF0ZShjb250YWluZXIsIHBoeFVwZGF0ZSwgW1wiYXBwZW5kXCIsIFwicHJlcGVuZFwiLCBQSFhfU1RSRUFNXSlcbiAgICApIHtcbiAgICAgIGNvbnN0IHRvUmVtb3ZlID0gW107XG4gICAgICBjb250YWluZXIuY2hpbGROb2Rlcy5mb3JFYWNoKChjaGlsZE5vZGUpID0+IHtcbiAgICAgICAgaWYgKCFjaGlsZE5vZGUuaWQpIHtcbiAgICAgICAgICAvLyBTa2lwIHdhcm5pbmcgaWYgaXQncyBhbiBlbXB0eSB0ZXh0IG5vZGUgKGUuZy4gYSBuZXctbGluZSlcbiAgICAgICAgICBjb25zdCBpc0VtcHR5VGV4dE5vZGUgPVxuICAgICAgICAgICAgY2hpbGROb2RlLm5vZGVUeXBlID09PSBOb2RlLlRFWFRfTk9ERSAmJlxuICAgICAgICAgICAgY2hpbGROb2RlLm5vZGVWYWx1ZS50cmltKCkgPT09IFwiXCI7XG4gICAgICAgICAgaWYgKCFpc0VtcHR5VGV4dE5vZGUgJiYgY2hpbGROb2RlLm5vZGVUeXBlICE9PSBOb2RlLkNPTU1FTlRfTk9ERSkge1xuICAgICAgICAgICAgbG9nRXJyb3IoXG4gICAgICAgICAgICAgIFwib25seSBIVE1MIGVsZW1lbnQgdGFncyB3aXRoIGFuIGlkIGFyZSBhbGxvd2VkIGluc2lkZSBjb250YWluZXJzIHdpdGggcGh4LXVwZGF0ZS5cXG5cXG5cIiArXG4gICAgICAgICAgICAgICAgYHJlbW92aW5nIGlsbGVnYWwgbm9kZTogXCIkeyhjaGlsZE5vZGUub3V0ZXJIVE1MIHx8IGNoaWxkTm9kZS5ub2RlVmFsdWUpLnRyaW0oKX1cIlxcblxcbmAsXG4gICAgICAgICAgICApO1xuICAgICAgICAgIH1cbiAgICAgICAgICB0b1JlbW92ZS5wdXNoKGNoaWxkTm9kZSk7XG4gICAgICAgIH1cbiAgICAgIH0pO1xuICAgICAgdG9SZW1vdmUuZm9yRWFjaCgoY2hpbGROb2RlKSA9PiBjaGlsZE5vZGUucmVtb3ZlKCkpO1xuICAgIH1cbiAgfSxcblxuICByZXBsYWNlUm9vdENvbnRhaW5lcihjb250YWluZXIsIHRhZ05hbWUsIGF0dHJzKSB7XG4gICAgY29uc3QgcmV0YWluZWRBdHRycyA9IG5ldyBTZXQoW1xuICAgICAgXCJpZFwiLFxuICAgICAgUEhYX1NFU1NJT04sXG4gICAgICBQSFhfU1RBVElDLFxuICAgICAgUEhYX01BSU4sXG4gICAgICBQSFhfUk9PVF9JRCxcbiAgICBdKTtcbiAgICBpZiAoY29udGFpbmVyLnRhZ05hbWUudG9Mb3dlckNhc2UoKSA9PT0gdGFnTmFtZS50b0xvd2VyQ2FzZSgpKSB7XG4gICAgICBBcnJheS5mcm9tKGNvbnRhaW5lci5hdHRyaWJ1dGVzKVxuICAgICAgICAuZmlsdGVyKChhdHRyKSA9PiAhcmV0YWluZWRBdHRycy5oYXMoYXR0ci5uYW1lLnRvTG93ZXJDYXNlKCkpKVxuICAgICAgICAuZm9yRWFjaCgoYXR0cikgPT4gY29udGFpbmVyLnJlbW92ZUF0dHJpYnV0ZShhdHRyLm5hbWUpKTtcblxuICAgICAgT2JqZWN0LmtleXMoYXR0cnMpXG4gICAgICAgIC5maWx0ZXIoKG5hbWUpID0+ICFyZXRhaW5lZEF0dHJzLmhhcyhuYW1lLnRvTG93ZXJDYXNlKCkpKVxuICAgICAgICAuZm9yRWFjaCgoYXR0cikgPT4gY29udGFpbmVyLnNldEF0dHJpYnV0ZShhdHRyLCBhdHRyc1thdHRyXSkpO1xuXG4gICAgICByZXR1cm4gY29udGFpbmVyO1xuICAgIH0gZWxzZSB7XG4gICAgICBjb25zdCBuZXdDb250YWluZXIgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KHRhZ05hbWUpO1xuICAgICAgT2JqZWN0LmtleXMoYXR0cnMpLmZvckVhY2goKGF0dHIpID0+XG4gICAgICAgIG5ld0NvbnRhaW5lci5zZXRBdHRyaWJ1dGUoYXR0ciwgYXR0cnNbYXR0cl0pLFxuICAgICAgKTtcbiAgICAgIHJldGFpbmVkQXR0cnMuZm9yRWFjaCgoYXR0cikgPT5cbiAgICAgICAgbmV3Q29udGFpbmVyLnNldEF0dHJpYnV0ZShhdHRyLCBjb250YWluZXIuZ2V0QXR0cmlidXRlKGF0dHIpKSxcbiAgICAgICk7XG4gICAgICBuZXdDb250YWluZXIuaW5uZXJIVE1MID0gY29udGFpbmVyLmlubmVySFRNTDtcbiAgICAgIGNvbnRhaW5lci5yZXBsYWNlV2l0aChuZXdDb250YWluZXIpO1xuICAgICAgcmV0dXJuIG5ld0NvbnRhaW5lcjtcbiAgICB9XG4gIH0sXG5cbiAgZ2V0U3RpY2t5KGVsLCBuYW1lLCBkZWZhdWx0VmFsKSB7XG4gICAgY29uc3Qgb3AgPSAoRE9NLnByaXZhdGUoZWwsIFwic3RpY2t5XCIpIHx8IFtdKS5maW5kKFxuICAgICAgKFtleGlzdGluZ05hbWVdKSA9PiBuYW1lID09PSBleGlzdGluZ05hbWUsXG4gICAgKTtcbiAgICBpZiAob3ApIHtcbiAgICAgIGNvbnN0IFtfbmFtZSwgX29wLCBzdGFzaGVkUmVzdWx0XSA9IG9wO1xuICAgICAgcmV0dXJuIHN0YXNoZWRSZXN1bHQ7XG4gICAgfSBlbHNlIHtcbiAgICAgIHJldHVybiB0eXBlb2YgZGVmYXVsdFZhbCA9PT0gXCJmdW5jdGlvblwiID8gZGVmYXVsdFZhbCgpIDogZGVmYXVsdFZhbDtcbiAgICB9XG4gIH0sXG5cbiAgZGVsZXRlU3RpY2t5KGVsLCBuYW1lKSB7XG4gICAgdGhpcy51cGRhdGVQcml2YXRlKGVsLCBcInN0aWNreVwiLCBbXSwgKG9wcykgPT4ge1xuICAgICAgcmV0dXJuIG9wcy5maWx0ZXIoKFtleGlzdGluZ05hbWUsIF9dKSA9PiBleGlzdGluZ05hbWUgIT09IG5hbWUpO1xuICAgIH0pO1xuICB9LFxuXG4gIHB1dFN0aWNreShlbCwgbmFtZSwgb3ApIHtcbiAgICBjb25zdCBzdGFzaGVkUmVzdWx0ID0gb3AoZWwpO1xuICAgIHRoaXMudXBkYXRlUHJpdmF0ZShlbCwgXCJzdGlja3lcIiwgW10sIChvcHMpID0+IHtcbiAgICAgIGNvbnN0IGV4aXN0aW5nSW5kZXggPSBvcHMuZmluZEluZGV4KFxuICAgICAgICAoW2V4aXN0aW5nTmFtZV0pID0+IG5hbWUgPT09IGV4aXN0aW5nTmFtZSxcbiAgICAgICk7XG4gICAgICBpZiAoZXhpc3RpbmdJbmRleCA+PSAwKSB7XG4gICAgICAgIG9wc1tleGlzdGluZ0luZGV4XSA9IFtuYW1lLCBvcCwgc3Rhc2hlZFJlc3VsdF07XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBvcHMucHVzaChbbmFtZSwgb3AsIHN0YXNoZWRSZXN1bHRdKTtcbiAgICAgIH1cbiAgICAgIHJldHVybiBvcHM7XG4gICAgfSk7XG4gIH0sXG5cbiAgYXBwbHlTdGlja3lPcGVyYXRpb25zKGVsKSB7XG4gICAgY29uc3Qgb3BzID0gRE9NLnByaXZhdGUoZWwsIFwic3RpY2t5XCIpO1xuICAgIGlmICghb3BzKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgb3BzLmZvckVhY2goKFtuYW1lLCBvcCwgX3N0YXNoZWRdKSA9PiB0aGlzLnB1dFN0aWNreShlbCwgbmFtZSwgb3ApKTtcbiAgfSxcblxuICBpc0xvY2tlZChlbCkge1xuICAgIHJldHVybiBlbC5oYXNBdHRyaWJ1dGUgJiYgZWwuaGFzQXR0cmlidXRlKFBIWF9SRUZfTE9DSyk7XG4gIH0sXG59O1xuXG5leHBvcnQgZGVmYXVsdCBET007XG4iLCAiaW1wb3J0IHtcbiAgUEhYX0FDVElWRV9FTlRSWV9SRUZTLFxuICBQSFhfTElWRV9GSUxFX1VQREFURUQsXG4gIFBIWF9QUkVGTElHSFRFRF9SRUZTLFxufSBmcm9tIFwiLi9jb25zdGFudHNcIjtcblxuaW1wb3J0IHsgY2hhbm5lbFVwbG9hZGVyLCBsb2dFcnJvciB9IGZyb20gXCIuL3V0aWxzXCI7XG5cbmltcG9ydCBMaXZlVXBsb2FkZXIgZnJvbSBcIi4vbGl2ZV91cGxvYWRlclwiO1xuXG5leHBvcnQgZGVmYXVsdCBjbGFzcyBVcGxvYWRFbnRyeSB7XG4gIHN0YXRpYyBpc0FjdGl2ZShmaWxlRWwsIGZpbGUpIHtcbiAgICBjb25zdCBpc05ldyA9IGZpbGUuX3BoeFJlZiA9PT0gdW5kZWZpbmVkO1xuICAgIGNvbnN0IGFjdGl2ZVJlZnMgPSBmaWxlRWwuZ2V0QXR0cmlidXRlKFBIWF9BQ1RJVkVfRU5UUllfUkVGUykuc3BsaXQoXCIsXCIpO1xuICAgIGNvbnN0IGlzQWN0aXZlID0gYWN0aXZlUmVmcy5pbmRleE9mKExpdmVVcGxvYWRlci5nZW5GaWxlUmVmKGZpbGUpKSA+PSAwO1xuICAgIHJldHVybiBmaWxlLnNpemUgPiAwICYmIChpc05ldyB8fCBpc0FjdGl2ZSk7XG4gIH1cblxuICBzdGF0aWMgaXNQcmVmbGlnaHRlZChmaWxlRWwsIGZpbGUpIHtcbiAgICBjb25zdCBwcmVmbGlnaHRlZFJlZnMgPSBmaWxlRWxcbiAgICAgIC5nZXRBdHRyaWJ1dGUoUEhYX1BSRUZMSUdIVEVEX1JFRlMpXG4gICAgICAuc3BsaXQoXCIsXCIpO1xuICAgIGNvbnN0IGlzUHJlZmxpZ2h0ZWQgPVxuICAgICAgcHJlZmxpZ2h0ZWRSZWZzLmluZGV4T2YoTGl2ZVVwbG9hZGVyLmdlbkZpbGVSZWYoZmlsZSkpID49IDA7XG4gICAgcmV0dXJuIGlzUHJlZmxpZ2h0ZWQgJiYgdGhpcy5pc0FjdGl2ZShmaWxlRWwsIGZpbGUpO1xuICB9XG5cbiAgc3RhdGljIGlzUHJlZmxpZ2h0SW5Qcm9ncmVzcyhmaWxlKSB7XG4gICAgcmV0dXJuIGZpbGUuX3ByZWZsaWdodEluUHJvZ3Jlc3MgPT09IHRydWU7XG4gIH1cblxuICBzdGF0aWMgbWFya1ByZWZsaWdodEluUHJvZ3Jlc3MoZmlsZSkge1xuICAgIGZpbGUuX3ByZWZsaWdodEluUHJvZ3Jlc3MgPSB0cnVlO1xuICB9XG5cbiAgY29uc3RydWN0b3IoZmlsZUVsLCBmaWxlLCB2aWV3LCBhdXRvVXBsb2FkKSB7XG4gICAgdGhpcy5yZWYgPSBMaXZlVXBsb2FkZXIuZ2VuRmlsZVJlZihmaWxlKTtcbiAgICB0aGlzLmZpbGVFbCA9IGZpbGVFbDtcbiAgICB0aGlzLmZpbGUgPSBmaWxlO1xuICAgIHRoaXMudmlldyA9IHZpZXc7XG4gICAgdGhpcy5tZXRhID0gbnVsbDtcbiAgICB0aGlzLl9pc0NhbmNlbGxlZCA9IGZhbHNlO1xuICAgIHRoaXMuX2lzRG9uZSA9IGZhbHNlO1xuICAgIHRoaXMuX3Byb2dyZXNzID0gMDtcbiAgICB0aGlzLl9sYXN0UHJvZ3Jlc3NTZW50ID0gLTE7XG4gICAgdGhpcy5fb25Eb25lID0gZnVuY3Rpb24gKCkge307XG4gICAgdGhpcy5fb25FbFVwZGF0ZWQgPSB0aGlzLm9uRWxVcGRhdGVkLmJpbmQodGhpcyk7XG4gICAgdGhpcy5maWxlRWwuYWRkRXZlbnRMaXN0ZW5lcihQSFhfTElWRV9GSUxFX1VQREFURUQsIHRoaXMuX29uRWxVcGRhdGVkKTtcbiAgICB0aGlzLmF1dG9VcGxvYWQgPSBhdXRvVXBsb2FkO1xuICB9XG5cbiAgbWV0YWRhdGEoKSB7XG4gICAgcmV0dXJuIHRoaXMubWV0YTtcbiAgfVxuXG4gIHByb2dyZXNzKHByb2dyZXNzKSB7XG4gICAgdGhpcy5fcHJvZ3Jlc3MgPSBNYXRoLmZsb29yKHByb2dyZXNzKTtcbiAgICBpZiAodGhpcy5fcHJvZ3Jlc3MgPiB0aGlzLl9sYXN0UHJvZ3Jlc3NTZW50KSB7XG4gICAgICBpZiAodGhpcy5fcHJvZ3Jlc3MgPj0gMTAwKSB7XG4gICAgICAgIHRoaXMuX3Byb2dyZXNzID0gMTAwO1xuICAgICAgICB0aGlzLl9sYXN0UHJvZ3Jlc3NTZW50ID0gMTAwO1xuICAgICAgICB0aGlzLl9pc0RvbmUgPSB0cnVlO1xuICAgICAgICB0aGlzLnZpZXcucHVzaEZpbGVQcm9ncmVzcyh0aGlzLmZpbGVFbCwgdGhpcy5yZWYsIDEwMCwgKCkgPT4ge1xuICAgICAgICAgIExpdmVVcGxvYWRlci51bnRyYWNrRmlsZSh0aGlzLmZpbGVFbCwgdGhpcy5maWxlKTtcbiAgICAgICAgICB0aGlzLl9vbkRvbmUoKTtcbiAgICAgICAgfSk7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICB0aGlzLl9sYXN0UHJvZ3Jlc3NTZW50ID0gdGhpcy5fcHJvZ3Jlc3M7XG4gICAgICAgIHRoaXMudmlldy5wdXNoRmlsZVByb2dyZXNzKHRoaXMuZmlsZUVsLCB0aGlzLnJlZiwgdGhpcy5fcHJvZ3Jlc3MpO1xuICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIGlzQ2FuY2VsbGVkKCkge1xuICAgIHJldHVybiB0aGlzLl9pc0NhbmNlbGxlZDtcbiAgfVxuXG4gIGNhbmNlbCgpIHtcbiAgICB0aGlzLmZpbGUuX3ByZWZsaWdodEluUHJvZ3Jlc3MgPSBmYWxzZTtcbiAgICB0aGlzLl9pc0NhbmNlbGxlZCA9IHRydWU7XG4gICAgdGhpcy5faXNEb25lID0gdHJ1ZTtcbiAgICB0aGlzLl9vbkRvbmUoKTtcbiAgfVxuXG4gIGlzRG9uZSgpIHtcbiAgICByZXR1cm4gdGhpcy5faXNEb25lO1xuICB9XG5cbiAgZXJyb3IocmVhc29uID0gXCJmYWlsZWRcIikge1xuICAgIHRoaXMuZmlsZUVsLnJlbW92ZUV2ZW50TGlzdGVuZXIoUEhYX0xJVkVfRklMRV9VUERBVEVELCB0aGlzLl9vbkVsVXBkYXRlZCk7XG4gICAgdGhpcy52aWV3LnB1c2hGaWxlUHJvZ3Jlc3ModGhpcy5maWxlRWwsIHRoaXMucmVmLCB7IGVycm9yOiByZWFzb24gfSk7XG4gICAgaWYgKCF0aGlzLmlzQXV0b1VwbG9hZCgpKSB7XG4gICAgICBMaXZlVXBsb2FkZXIuY2xlYXJGaWxlcyh0aGlzLmZpbGVFbCk7XG4gICAgfVxuICB9XG5cbiAgaXNBdXRvVXBsb2FkKCkge1xuICAgIHJldHVybiB0aGlzLmF1dG9VcGxvYWQ7XG4gIH1cblxuICAvL3ByaXZhdGVcblxuICBvbkRvbmUoY2FsbGJhY2spIHtcbiAgICB0aGlzLl9vbkRvbmUgPSAoKSA9PiB7XG4gICAgICB0aGlzLmZpbGVFbC5yZW1vdmVFdmVudExpc3RlbmVyKFBIWF9MSVZFX0ZJTEVfVVBEQVRFRCwgdGhpcy5fb25FbFVwZGF0ZWQpO1xuICAgICAgY2FsbGJhY2soKTtcbiAgICB9O1xuICB9XG5cbiAgb25FbFVwZGF0ZWQoKSB7XG4gICAgY29uc3QgYWN0aXZlUmVmcyA9IHRoaXMuZmlsZUVsXG4gICAgICAuZ2V0QXR0cmlidXRlKFBIWF9BQ1RJVkVfRU5UUllfUkVGUylcbiAgICAgIC5zcGxpdChcIixcIik7XG4gICAgaWYgKGFjdGl2ZVJlZnMuaW5kZXhPZih0aGlzLnJlZikgPT09IC0xKSB7XG4gICAgICBMaXZlVXBsb2FkZXIudW50cmFja0ZpbGUodGhpcy5maWxlRWwsIHRoaXMuZmlsZSk7XG4gICAgICB0aGlzLmNhbmNlbCgpO1xuICAgIH1cbiAgfVxuXG4gIHRvUHJlZmxpZ2h0UGF5bG9hZCgpIHtcbiAgICByZXR1cm4ge1xuICAgICAgbGFzdF9tb2RpZmllZDogdGhpcy5maWxlLmxhc3RNb2RpZmllZCxcbiAgICAgIG5hbWU6IHRoaXMuZmlsZS5uYW1lLFxuICAgICAgcmVsYXRpdmVfcGF0aDogdGhpcy5maWxlLndlYmtpdFJlbGF0aXZlUGF0aCxcbiAgICAgIHNpemU6IHRoaXMuZmlsZS5zaXplLFxuICAgICAgdHlwZTogdGhpcy5maWxlLnR5cGUsXG4gICAgICByZWY6IHRoaXMucmVmLFxuICAgICAgbWV0YTogdHlwZW9mIHRoaXMuZmlsZS5tZXRhID09PSBcImZ1bmN0aW9uXCIgPyB0aGlzLmZpbGUubWV0YSgpIDogdW5kZWZpbmVkLFxuICAgIH07XG4gIH1cblxuICB1cGxvYWRlcih1cGxvYWRlcnMpIHtcbiAgICBpZiAodGhpcy5tZXRhLnVwbG9hZGVyKSB7XG4gICAgICBjb25zdCBjYWxsYmFjayA9XG4gICAgICAgIHVwbG9hZGVyc1t0aGlzLm1ldGEudXBsb2FkZXJdIHx8XG4gICAgICAgIGxvZ0Vycm9yKGBubyB1cGxvYWRlciBjb25maWd1cmVkIGZvciAke3RoaXMubWV0YS51cGxvYWRlcn1gKTtcbiAgICAgIHJldHVybiB7IG5hbWU6IHRoaXMubWV0YS51cGxvYWRlciwgY2FsbGJhY2s6IGNhbGxiYWNrIH07XG4gICAgfSBlbHNlIHtcbiAgICAgIHJldHVybiB7IG5hbWU6IFwiY2hhbm5lbFwiLCBjYWxsYmFjazogY2hhbm5lbFVwbG9hZGVyIH07XG4gICAgfVxuICB9XG5cbiAgemlwUG9zdEZsaWdodChyZXNwKSB7XG4gICAgdGhpcy5tZXRhID0gcmVzcC5lbnRyaWVzW3RoaXMucmVmXTtcbiAgICBpZiAoIXRoaXMubWV0YSkge1xuICAgICAgbG9nRXJyb3IoYG5vIHByZWZsaWdodCB1cGxvYWQgcmVzcG9uc2UgcmV0dXJuZWQgd2l0aCByZWYgJHt0aGlzLnJlZn1gLCB7XG4gICAgICAgIGlucHV0OiB0aGlzLmZpbGVFbCxcbiAgICAgICAgcmVzcG9uc2U6IHJlc3AsXG4gICAgICB9KTtcbiAgICB9XG4gIH1cbn1cbiIsICJpbXBvcnQge1xuICBQSFhfRE9ORV9SRUZTLFxuICBQSFhfUFJFRkxJR0hURURfUkVGUyxcbiAgUEhYX1VQTE9BRF9SRUYsXG59IGZyb20gXCIuL2NvbnN0YW50c1wiO1xuXG5pbXBvcnQge30gZnJvbSBcIi4vdXRpbHNcIjtcblxuaW1wb3J0IERPTSBmcm9tIFwiLi9kb21cIjtcbmltcG9ydCBVcGxvYWRFbnRyeSBmcm9tIFwiLi91cGxvYWRfZW50cnlcIjtcblxubGV0IGxpdmVVcGxvYWRlckZpbGVSZWYgPSAwO1xuXG5leHBvcnQgZGVmYXVsdCBjbGFzcyBMaXZlVXBsb2FkZXIge1xuICBzdGF0aWMgZ2VuRmlsZVJlZihmaWxlKSB7XG4gICAgY29uc3QgcmVmID0gZmlsZS5fcGh4UmVmO1xuICAgIGlmIChyZWYgIT09IHVuZGVmaW5lZCkge1xuICAgICAgcmV0dXJuIHJlZjtcbiAgICB9IGVsc2Uge1xuICAgICAgZmlsZS5fcGh4UmVmID0gKGxpdmVVcGxvYWRlckZpbGVSZWYrKykudG9TdHJpbmcoKTtcbiAgICAgIHJldHVybiBmaWxlLl9waHhSZWY7XG4gICAgfVxuICB9XG5cbiAgc3RhdGljIGdldEVudHJ5RGF0YVVSTChpbnB1dEVsLCByZWYsIGNhbGxiYWNrKSB7XG4gICAgY29uc3QgZmlsZSA9IHRoaXMuYWN0aXZlRmlsZXMoaW5wdXRFbCkuZmluZChcbiAgICAgIChmaWxlKSA9PiB0aGlzLmdlbkZpbGVSZWYoZmlsZSkgPT09IHJlZixcbiAgICApO1xuICAgIGNhbGxiYWNrKFVSTC5jcmVhdGVPYmplY3RVUkwoZmlsZSkpO1xuICB9XG5cbiAgc3RhdGljIGhhc1VwbG9hZHNJblByb2dyZXNzKGZvcm1FbCkge1xuICAgIGxldCBhY3RpdmUgPSAwO1xuICAgIERPTS5maW5kVXBsb2FkSW5wdXRzKGZvcm1FbCkuZm9yRWFjaCgoaW5wdXQpID0+IHtcbiAgICAgIGlmIChcbiAgICAgICAgaW5wdXQuZ2V0QXR0cmlidXRlKFBIWF9QUkVGTElHSFRFRF9SRUZTKSAhPT1cbiAgICAgICAgaW5wdXQuZ2V0QXR0cmlidXRlKFBIWF9ET05FX1JFRlMpXG4gICAgICApIHtcbiAgICAgICAgYWN0aXZlKys7XG4gICAgICB9XG4gICAgfSk7XG4gICAgcmV0dXJuIGFjdGl2ZSA+IDA7XG4gIH1cblxuICBzdGF0aWMgc2VyaWFsaXplVXBsb2FkcyhpbnB1dEVsKSB7XG4gICAgY29uc3QgZmlsZXMgPSB0aGlzLmFjdGl2ZUZpbGVzKGlucHV0RWwpO1xuICAgIGNvbnN0IGZpbGVEYXRhID0ge307XG4gICAgZmlsZXMuZm9yRWFjaCgoZmlsZSkgPT4ge1xuICAgICAgY29uc3QgZW50cnkgPSB7IHBhdGg6IGlucHV0RWwubmFtZSB9O1xuICAgICAgY29uc3QgdXBsb2FkUmVmID0gaW5wdXRFbC5nZXRBdHRyaWJ1dGUoUEhYX1VQTE9BRF9SRUYpO1xuICAgICAgZmlsZURhdGFbdXBsb2FkUmVmXSA9IGZpbGVEYXRhW3VwbG9hZFJlZl0gfHwgW107XG4gICAgICBlbnRyeS5yZWYgPSB0aGlzLmdlbkZpbGVSZWYoZmlsZSk7XG4gICAgICBlbnRyeS5sYXN0X21vZGlmaWVkID0gZmlsZS5sYXN0TW9kaWZpZWQ7XG4gICAgICBlbnRyeS5uYW1lID0gZmlsZS5uYW1lIHx8IGVudHJ5LnJlZjtcbiAgICAgIGVudHJ5LnJlbGF0aXZlX3BhdGggPSBmaWxlLndlYmtpdFJlbGF0aXZlUGF0aDtcbiAgICAgIGVudHJ5LnR5cGUgPSBmaWxlLnR5cGU7XG4gICAgICBlbnRyeS5zaXplID0gZmlsZS5zaXplO1xuICAgICAgaWYgKHR5cGVvZiBmaWxlLm1ldGEgPT09IFwiZnVuY3Rpb25cIikge1xuICAgICAgICBlbnRyeS5tZXRhID0gZmlsZS5tZXRhKCk7XG4gICAgICB9XG4gICAgICBmaWxlRGF0YVt1cGxvYWRSZWZdLnB1c2goZW50cnkpO1xuICAgIH0pO1xuICAgIHJldHVybiBmaWxlRGF0YTtcbiAgfVxuXG4gIHN0YXRpYyBjbGVhckZpbGVzKGlucHV0RWwpIHtcbiAgICBpbnB1dEVsLnZhbHVlID0gbnVsbDtcbiAgICBpbnB1dEVsLnJlbW92ZUF0dHJpYnV0ZShQSFhfVVBMT0FEX1JFRik7XG4gICAgRE9NLnB1dFByaXZhdGUoaW5wdXRFbCwgXCJmaWxlc1wiLCBbXSk7XG4gIH1cblxuICBzdGF0aWMgdW50cmFja0ZpbGUoaW5wdXRFbCwgZmlsZSkge1xuICAgIERPTS5wdXRQcml2YXRlKFxuICAgICAgaW5wdXRFbCxcbiAgICAgIFwiZmlsZXNcIixcbiAgICAgIERPTS5wcml2YXRlKGlucHV0RWwsIFwiZmlsZXNcIikuZmlsdGVyKChmKSA9PiAhT2JqZWN0LmlzKGYsIGZpbGUpKSxcbiAgICApO1xuICB9XG5cbiAgLyoqXG4gICAqIEBwYXJhbSB7SFRNTElucHV0RWxlbWVudH0gaW5wdXRFbFxuICAgKiBAcGFyYW0ge0FycmF5PEZpbGV8QmxvYj59IGZpbGVzXG4gICAqIEBwYXJhbSB7RGF0YVRyYW5zZmVyfSBbZGF0YVRyYW5zZmVyXVxuICAgKi9cbiAgc3RhdGljIHRyYWNrRmlsZXMoaW5wdXRFbCwgZmlsZXMsIGRhdGFUcmFuc2Zlcikge1xuICAgIGlmIChpbnB1dEVsLmdldEF0dHJpYnV0ZShcIm11bHRpcGxlXCIpICE9PSBudWxsKSB7XG4gICAgICBjb25zdCBuZXdGaWxlcyA9IGZpbGVzLmZpbHRlcihcbiAgICAgICAgKGZpbGUpID0+ICF0aGlzLmFjdGl2ZUZpbGVzKGlucHV0RWwpLmZpbmQoKGYpID0+IE9iamVjdC5pcyhmLCBmaWxlKSksXG4gICAgICApO1xuICAgICAgRE9NLnVwZGF0ZVByaXZhdGUoaW5wdXRFbCwgXCJmaWxlc1wiLCBbXSwgKGV4aXN0aW5nKSA9PlxuICAgICAgICBleGlzdGluZy5jb25jYXQobmV3RmlsZXMpLFxuICAgICAgKTtcbiAgICAgIGlucHV0RWwudmFsdWUgPSBudWxsO1xuICAgIH0gZWxzZSB7XG4gICAgICAvLyBSZXNldCBpbnB1dEVsIGZpbGVzIHRvIGFsaWduIG91dHB1dCB3aXRoIHByb2dyYW1tYXRpYyBjaGFuZ2VzIChpLmUuIGRyYWcgYW5kIGRyb3ApXG4gICAgICBpZiAoZGF0YVRyYW5zZmVyICYmIGRhdGFUcmFuc2Zlci5maWxlcy5sZW5ndGggPiAwKSB7XG4gICAgICAgIGlucHV0RWwuZmlsZXMgPSBkYXRhVHJhbnNmZXIuZmlsZXM7XG4gICAgICB9XG4gICAgICBET00ucHV0UHJpdmF0ZShpbnB1dEVsLCBcImZpbGVzXCIsIGZpbGVzKTtcbiAgICB9XG4gIH1cblxuICBzdGF0aWMgYWN0aXZlRmlsZUlucHV0cyhmb3JtRWwpIHtcbiAgICBjb25zdCBmaWxlSW5wdXRzID0gRE9NLmZpbmRVcGxvYWRJbnB1dHMoZm9ybUVsKTtcbiAgICByZXR1cm4gQXJyYXkuZnJvbShmaWxlSW5wdXRzKS5maWx0ZXIoXG4gICAgICAoZWwpID0+IGVsLmZpbGVzICYmIHRoaXMuYWN0aXZlRmlsZXMoZWwpLmxlbmd0aCA+IDAsXG4gICAgKTtcbiAgfVxuXG4gIHN0YXRpYyBhY3RpdmVGaWxlcyhpbnB1dCkge1xuICAgIHJldHVybiAoRE9NLnByaXZhdGUoaW5wdXQsIFwiZmlsZXNcIikgfHwgW10pLmZpbHRlcigoZikgPT5cbiAgICAgIFVwbG9hZEVudHJ5LmlzQWN0aXZlKGlucHV0LCBmKSxcbiAgICApO1xuICB9XG5cbiAgc3RhdGljIGlucHV0c0F3YWl0aW5nUHJlZmxpZ2h0KGZvcm1FbCkge1xuICAgIGNvbnN0IGZpbGVJbnB1dHMgPSBET00uZmluZFVwbG9hZElucHV0cyhmb3JtRWwpO1xuICAgIHJldHVybiBBcnJheS5mcm9tKGZpbGVJbnB1dHMpLmZpbHRlcihcbiAgICAgIChpbnB1dCkgPT4gdGhpcy5maWxlc0F3YWl0aW5nUHJlZmxpZ2h0KGlucHV0KS5sZW5ndGggPiAwLFxuICAgICk7XG4gIH1cblxuICBzdGF0aWMgZmlsZXNBd2FpdGluZ1ByZWZsaWdodChpbnB1dCkge1xuICAgIHJldHVybiB0aGlzLmFjdGl2ZUZpbGVzKGlucHV0KS5maWx0ZXIoXG4gICAgICAoZikgPT5cbiAgICAgICAgIVVwbG9hZEVudHJ5LmlzUHJlZmxpZ2h0ZWQoaW5wdXQsIGYpICYmXG4gICAgICAgICFVcGxvYWRFbnRyeS5pc1ByZWZsaWdodEluUHJvZ3Jlc3MoZiksXG4gICAgKTtcbiAgfVxuXG4gIHN0YXRpYyBtYXJrUHJlZmxpZ2h0SW5Qcm9ncmVzcyhlbnRyaWVzKSB7XG4gICAgZW50cmllcy5mb3JFYWNoKChlbnRyeSkgPT4gVXBsb2FkRW50cnkubWFya1ByZWZsaWdodEluUHJvZ3Jlc3MoZW50cnkuZmlsZSkpO1xuICB9XG5cbiAgY29uc3RydWN0b3IoaW5wdXRFbCwgdmlldywgb25Db21wbGV0ZSkge1xuICAgIHRoaXMuYXV0b1VwbG9hZCA9IERPTS5pc0F1dG9VcGxvYWQoaW5wdXRFbCk7XG4gICAgdGhpcy52aWV3ID0gdmlldztcbiAgICB0aGlzLm9uQ29tcGxldGUgPSBvbkNvbXBsZXRlO1xuICAgIHRoaXMuX2VudHJpZXMgPSBBcnJheS5mcm9tKFxuICAgICAgTGl2ZVVwbG9hZGVyLmZpbGVzQXdhaXRpbmdQcmVmbGlnaHQoaW5wdXRFbCkgfHwgW10sXG4gICAgKS5tYXAoKGZpbGUpID0+IG5ldyBVcGxvYWRFbnRyeShpbnB1dEVsLCBmaWxlLCB2aWV3LCB0aGlzLmF1dG9VcGxvYWQpKTtcblxuICAgIC8vIHByZXZlbnQgc2VuZGluZyBkdXBsaWNhdGUgcHJlZmxpZ2h0IHJlcXVlc3RzXG4gICAgTGl2ZVVwbG9hZGVyLm1hcmtQcmVmbGlnaHRJblByb2dyZXNzKHRoaXMuX2VudHJpZXMpO1xuXG4gICAgdGhpcy5udW1FbnRyaWVzSW5Qcm9ncmVzcyA9IHRoaXMuX2VudHJpZXMubGVuZ3RoO1xuICB9XG5cbiAgaXNBdXRvVXBsb2FkKCkge1xuICAgIHJldHVybiB0aGlzLmF1dG9VcGxvYWQ7XG4gIH1cblxuICBlbnRyaWVzKCkge1xuICAgIHJldHVybiB0aGlzLl9lbnRyaWVzO1xuICB9XG5cbiAgaW5pdEFkYXB0ZXJVcGxvYWQocmVzcCwgb25FcnJvciwgbGl2ZVNvY2tldCkge1xuICAgIHRoaXMuX2VudHJpZXMgPSB0aGlzLl9lbnRyaWVzLm1hcCgoZW50cnkpID0+IHtcbiAgICAgIGlmIChlbnRyeS5pc0NhbmNlbGxlZCgpKSB7XG4gICAgICAgIHRoaXMubnVtRW50cmllc0luUHJvZ3Jlc3MtLTtcbiAgICAgICAgaWYgKHRoaXMubnVtRW50cmllc0luUHJvZ3Jlc3MgPT09IDApIHtcbiAgICAgICAgICB0aGlzLm9uQ29tcGxldGUoKTtcbiAgICAgICAgfVxuICAgICAgfSBlbHNlIHtcbiAgICAgICAgZW50cnkuemlwUG9zdEZsaWdodChyZXNwKTtcbiAgICAgICAgZW50cnkub25Eb25lKCgpID0+IHtcbiAgICAgICAgICB0aGlzLm51bUVudHJpZXNJblByb2dyZXNzLS07XG4gICAgICAgICAgaWYgKHRoaXMubnVtRW50cmllc0luUHJvZ3Jlc3MgPT09IDApIHtcbiAgICAgICAgICAgIHRoaXMub25Db21wbGV0ZSgpO1xuICAgICAgICAgIH1cbiAgICAgICAgfSk7XG4gICAgICB9XG4gICAgICByZXR1cm4gZW50cnk7XG4gICAgfSk7XG5cbiAgICBjb25zdCBncm91cGVkRW50cmllcyA9IHRoaXMuX2VudHJpZXMucmVkdWNlKChhY2MsIGVudHJ5KSA9PiB7XG4gICAgICBpZiAoIWVudHJ5Lm1ldGEpIHtcbiAgICAgICAgcmV0dXJuIGFjYztcbiAgICAgIH1cbiAgICAgIGNvbnN0IHsgbmFtZSwgY2FsbGJhY2sgfSA9IGVudHJ5LnVwbG9hZGVyKGxpdmVTb2NrZXQudXBsb2FkZXJzKTtcbiAgICAgIGFjY1tuYW1lXSA9IGFjY1tuYW1lXSB8fCB7IGNhbGxiYWNrOiBjYWxsYmFjaywgZW50cmllczogW10gfTtcbiAgICAgIGFjY1tuYW1lXS5lbnRyaWVzLnB1c2goZW50cnkpO1xuICAgICAgcmV0dXJuIGFjYztcbiAgICB9LCB7fSk7XG5cbiAgICBmb3IgKGNvbnN0IG5hbWUgaW4gZ3JvdXBlZEVudHJpZXMpIHtcbiAgICAgIGNvbnN0IHsgY2FsbGJhY2ssIGVudHJpZXMgfSA9IGdyb3VwZWRFbnRyaWVzW25hbWVdO1xuICAgICAgY2FsbGJhY2soZW50cmllcywgb25FcnJvciwgcmVzcCwgbGl2ZVNvY2tldCk7XG4gICAgfVxuICB9XG59XG4iLCAiY29uc3QgQVJJQSA9IHtcbiAgYW55T2YoaW5zdGFuY2UsIGNsYXNzZXMpIHtcbiAgICByZXR1cm4gY2xhc3Nlcy5maW5kKChuYW1lKSA9PiBpbnN0YW5jZSBpbnN0YW5jZW9mIG5hbWUpO1xuICB9LFxuXG4gIGlzRm9jdXNhYmxlKGVsLCBpbnRlcmFjdGl2ZU9ubHkpIHtcbiAgICByZXR1cm4gKFxuICAgICAgKGVsIGluc3RhbmNlb2YgSFRNTEFuY2hvckVsZW1lbnQgJiYgZWwucmVsICE9PSBcImlnbm9yZVwiKSB8fFxuICAgICAgKGVsIGluc3RhbmNlb2YgSFRNTEFyZWFFbGVtZW50ICYmIGVsLmhyZWYgIT09IHVuZGVmaW5lZCkgfHxcbiAgICAgICghZWwuZGlzYWJsZWQgJiZcbiAgICAgICAgdGhpcy5hbnlPZihlbCwgW1xuICAgICAgICAgIEhUTUxJbnB1dEVsZW1lbnQsXG4gICAgICAgICAgSFRNTFNlbGVjdEVsZW1lbnQsXG4gICAgICAgICAgSFRNTFRleHRBcmVhRWxlbWVudCxcbiAgICAgICAgICBIVE1MQnV0dG9uRWxlbWVudCxcbiAgICAgICAgXSkpIHx8XG4gICAgICBlbCBpbnN0YW5jZW9mIEhUTUxJRnJhbWVFbGVtZW50IHx8XG4gICAgICAoZWwudGFiSW5kZXggPj0gMCAmJiBlbC5nZXRBdHRyaWJ1dGUoXCJhcmlhLWhpZGRlblwiKSAhPT0gXCJ0cnVlXCIpIHx8XG4gICAgICAoIWludGVyYWN0aXZlT25seSAmJlxuICAgICAgICBlbC5nZXRBdHRyaWJ1dGUoXCJ0YWJpbmRleFwiKSAhPT0gbnVsbCAmJlxuICAgICAgICBlbC5nZXRBdHRyaWJ1dGUoXCJhcmlhLWhpZGRlblwiKSAhPT0gXCJ0cnVlXCIpXG4gICAgKTtcbiAgfSxcblxuICBhdHRlbXB0Rm9jdXMoZWwsIGludGVyYWN0aXZlT25seSkge1xuICAgIGlmICh0aGlzLmlzRm9jdXNhYmxlKGVsLCBpbnRlcmFjdGl2ZU9ubHkpKSB7XG4gICAgICB0cnkge1xuICAgICAgICBlbC5mb2N1cygpO1xuICAgICAgfSBjYXRjaCB7XG4gICAgICAgIC8vIHRoYXQncyBmaW5lXG4gICAgICB9XG4gICAgfVxuICAgIHJldHVybiAhIWRvY3VtZW50LmFjdGl2ZUVsZW1lbnQgJiYgZG9jdW1lbnQuYWN0aXZlRWxlbWVudC5pc1NhbWVOb2RlKGVsKTtcbiAgfSxcblxuICBmb2N1c0ZpcnN0SW50ZXJhY3RpdmUoZWwpIHtcbiAgICBsZXQgY2hpbGQgPSBlbC5maXJzdEVsZW1lbnRDaGlsZDtcbiAgICB3aGlsZSAoY2hpbGQpIHtcbiAgICAgIGlmICh0aGlzLmF0dGVtcHRGb2N1cyhjaGlsZCwgdHJ1ZSkgfHwgdGhpcy5mb2N1c0ZpcnN0SW50ZXJhY3RpdmUoY2hpbGQpKSB7XG4gICAgICAgIHJldHVybiB0cnVlO1xuICAgICAgfVxuICAgICAgY2hpbGQgPSBjaGlsZC5uZXh0RWxlbWVudFNpYmxpbmc7XG4gICAgfVxuICB9LFxuXG4gIGZvY3VzRmlyc3QoZWwpIHtcbiAgICBsZXQgY2hpbGQgPSBlbC5maXJzdEVsZW1lbnRDaGlsZDtcbiAgICB3aGlsZSAoY2hpbGQpIHtcbiAgICAgIGlmICh0aGlzLmF0dGVtcHRGb2N1cyhjaGlsZCkgfHwgdGhpcy5mb2N1c0ZpcnN0KGNoaWxkKSkge1xuICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICAgIH1cbiAgICAgIGNoaWxkID0gY2hpbGQubmV4dEVsZW1lbnRTaWJsaW5nO1xuICAgIH1cbiAgfSxcblxuICBmb2N1c0xhc3QoZWwpIHtcbiAgICBsZXQgY2hpbGQgPSBlbC5sYXN0RWxlbWVudENoaWxkO1xuICAgIHdoaWxlIChjaGlsZCkge1xuICAgICAgaWYgKHRoaXMuYXR0ZW1wdEZvY3VzKGNoaWxkKSB8fCB0aGlzLmZvY3VzTGFzdChjaGlsZCkpIHtcbiAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgICB9XG4gICAgICBjaGlsZCA9IGNoaWxkLnByZXZpb3VzRWxlbWVudFNpYmxpbmc7XG4gICAgfVxuICB9LFxufTtcbmV4cG9ydCBkZWZhdWx0IEFSSUE7XG4iLCAiaW1wb3J0IHtcbiAgUEhYX0FDVElWRV9FTlRSWV9SRUZTLFxuICBQSFhfTElWRV9GSUxFX1VQREFURUQsXG4gIFBIWF9QUkVGTElHSFRFRF9SRUZTLFxuICBQSFhfVVBMT0FEX1JFRixcbn0gZnJvbSBcIi4vY29uc3RhbnRzXCI7XG5cbmltcG9ydCBMaXZlVXBsb2FkZXIgZnJvbSBcIi4vbGl2ZV91cGxvYWRlclwiO1xuaW1wb3J0IEFSSUEgZnJvbSBcIi4vYXJpYVwiO1xuXG5jb25zdCBIb29rcyA9IHtcbiAgTGl2ZUZpbGVVcGxvYWQ6IHtcbiAgICBhY3RpdmVSZWZzKCkge1xuICAgICAgcmV0dXJuIHRoaXMuZWwuZ2V0QXR0cmlidXRlKFBIWF9BQ1RJVkVfRU5UUllfUkVGUyk7XG4gICAgfSxcblxuICAgIHByZWZsaWdodGVkUmVmcygpIHtcbiAgICAgIHJldHVybiB0aGlzLmVsLmdldEF0dHJpYnV0ZShQSFhfUFJFRkxJR0hURURfUkVGUyk7XG4gICAgfSxcblxuICAgIG1vdW50ZWQoKSB7XG4gICAgICB0aGlzLnByZWZsaWdodGVkV2FzID0gdGhpcy5wcmVmbGlnaHRlZFJlZnMoKTtcbiAgICB9LFxuXG4gICAgdXBkYXRlZCgpIHtcbiAgICAgIGNvbnN0IG5ld1ByZWZsaWdodHMgPSB0aGlzLnByZWZsaWdodGVkUmVmcygpO1xuICAgICAgaWYgKHRoaXMucHJlZmxpZ2h0ZWRXYXMgIT09IG5ld1ByZWZsaWdodHMpIHtcbiAgICAgICAgdGhpcy5wcmVmbGlnaHRlZFdhcyA9IG5ld1ByZWZsaWdodHM7XG4gICAgICAgIGlmIChuZXdQcmVmbGlnaHRzID09PSBcIlwiKSB7XG4gICAgICAgICAgdGhpcy5fX3ZpZXcoKS5jYW5jZWxTdWJtaXQodGhpcy5lbC5mb3JtKTtcbiAgICAgICAgfVxuICAgICAgfVxuXG4gICAgICBpZiAodGhpcy5hY3RpdmVSZWZzKCkgPT09IFwiXCIpIHtcbiAgICAgICAgdGhpcy5lbC52YWx1ZSA9IG51bGw7XG4gICAgICB9XG4gICAgICB0aGlzLmVsLmRpc3BhdGNoRXZlbnQobmV3IEN1c3RvbUV2ZW50KFBIWF9MSVZFX0ZJTEVfVVBEQVRFRCkpO1xuICAgIH0sXG4gIH0sXG5cbiAgTGl2ZUltZ1ByZXZpZXc6IHtcbiAgICBtb3VudGVkKCkge1xuICAgICAgdGhpcy5yZWYgPSB0aGlzLmVsLmdldEF0dHJpYnV0ZShcImRhdGEtcGh4LWVudHJ5LXJlZlwiKTtcbiAgICAgIHRoaXMuaW5wdXRFbCA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKFxuICAgICAgICB0aGlzLmVsLmdldEF0dHJpYnV0ZShQSFhfVVBMT0FEX1JFRiksXG4gICAgICApO1xuICAgICAgTGl2ZVVwbG9hZGVyLmdldEVudHJ5RGF0YVVSTCh0aGlzLmlucHV0RWwsIHRoaXMucmVmLCAodXJsKSA9PiB7XG4gICAgICAgIHRoaXMudXJsID0gdXJsO1xuICAgICAgICB0aGlzLmVsLnNyYyA9IHVybDtcbiAgICAgIH0pO1xuICAgIH0sXG4gICAgZGVzdHJveWVkKCkge1xuICAgICAgVVJMLnJldm9rZU9iamVjdFVSTCh0aGlzLnVybCk7XG4gICAgfSxcbiAgfSxcbiAgRm9jdXNXcmFwOiB7XG4gICAgbW91bnRlZCgpIHtcbiAgICAgIHRoaXMuZm9jdXNTdGFydCA9IHRoaXMuZWwuZmlyc3RFbGVtZW50Q2hpbGQ7XG4gICAgICB0aGlzLmZvY3VzRW5kID0gdGhpcy5lbC5sYXN0RWxlbWVudENoaWxkO1xuICAgICAgdGhpcy5mb2N1c1N0YXJ0LmFkZEV2ZW50TGlzdGVuZXIoXCJmb2N1c1wiLCAoZSkgPT4ge1xuICAgICAgICBpZiAoIWUucmVsYXRlZFRhcmdldCB8fCAhdGhpcy5lbC5jb250YWlucyhlLnJlbGF0ZWRUYXJnZXQpKSB7XG4gICAgICAgICAgLy8gSGFuZGxlIGZvY3VzIGVudGVyaW5nIGZyb20gb3V0c2lkZSAoZS5nLiBUYWIgd2hlbiBib2R5IGlzIGZvY3VzZWQpXG4gICAgICAgICAgLy8gaHR0cHM6Ly9naXRodWIuY29tL3Bob2VuaXhmcmFtZXdvcmsvcGhvZW5peF9saXZlX3ZpZXcvaXNzdWVzLzM2MzZcbiAgICAgICAgICBjb25zdCBuZXh0Rm9jdXMgPSBlLnRhcmdldC5uZXh0RWxlbWVudFNpYmxpbmc7XG4gICAgICAgICAgQVJJQS5hdHRlbXB0Rm9jdXMobmV4dEZvY3VzKSB8fCBBUklBLmZvY3VzRmlyc3QobmV4dEZvY3VzKTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICBBUklBLmZvY3VzTGFzdCh0aGlzLmVsKTtcbiAgICAgICAgfVxuICAgICAgfSk7XG4gICAgICB0aGlzLmZvY3VzRW5kLmFkZEV2ZW50TGlzdGVuZXIoXCJmb2N1c1wiLCAoZSkgPT4ge1xuICAgICAgICBpZiAoIWUucmVsYXRlZFRhcmdldCB8fCAhdGhpcy5lbC5jb250YWlucyhlLnJlbGF0ZWRUYXJnZXQpKSB7XG4gICAgICAgICAgLy8gSGFuZGxlIGZvY3VzIGVudGVyaW5nIGZyb20gb3V0c2lkZSAoZS5nLiBTaGlmdCtUYWIgd2hlbiBib2R5IGlzIGZvY3VzZWQpXG4gICAgICAgICAgLy8gaHR0cHM6Ly9naXRodWIuY29tL3Bob2VuaXhmcmFtZXdvcmsvcGhvZW5peF9saXZlX3ZpZXcvaXNzdWVzLzM2MzZcbiAgICAgICAgICBjb25zdCBuZXh0Rm9jdXMgPSBlLnRhcmdldC5wcmV2aW91c0VsZW1lbnRTaWJsaW5nO1xuICAgICAgICAgIEFSSUEuYXR0ZW1wdEZvY3VzKG5leHRGb2N1cykgfHwgQVJJQS5mb2N1c0xhc3QobmV4dEZvY3VzKTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICBBUklBLmZvY3VzRmlyc3QodGhpcy5lbCk7XG4gICAgICAgIH1cbiAgICAgIH0pO1xuICAgICAgLy8gb25seSB0cnkgdG8gY2hhbmdlIHRoZSBmb2N1cyBpZiBpdCBpcyBub3QgYWxyZWFkeSBpbnNpZGVcbiAgICAgIGlmICghdGhpcy5lbC5jb250YWlucyhkb2N1bWVudC5hY3RpdmVFbGVtZW50KSkge1xuICAgICAgICB0aGlzLmVsLmFkZEV2ZW50TGlzdGVuZXIoXCJwaHg6c2hvdy1lbmRcIiwgKCkgPT4gdGhpcy5lbC5mb2N1cygpKTtcbiAgICAgICAgaWYgKHdpbmRvdy5nZXRDb21wdXRlZFN0eWxlKHRoaXMuZWwpLmRpc3BsYXkgIT09IFwibm9uZVwiKSB7XG4gICAgICAgICAgQVJJQS5mb2N1c0ZpcnN0KHRoaXMuZWwpO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfSxcbiAgfSxcbn07XG5cbmNvbnN0IGZpbmRTY3JvbGxDb250YWluZXIgPSAoZWwpID0+IHtcbiAgLy8gdGhlIHNjcm9sbCBldmVudCB3b24ndCBiZSBmaXJlZCBvbiB0aGUgaHRtbC9ib2R5IGVsZW1lbnQgZXZlbiBpZiBvdmVyZmxvdyBpcyBzZXRcbiAgLy8gdGhlcmVmb3JlIHdlIHJldHVybiBudWxsIHRvIGluc3RlYWQgbGlzdGVuIGZvciBzY3JvbGwgZXZlbnRzIG9uIGRvY3VtZW50XG4gIGlmIChbXCJIVE1MXCIsIFwiQk9EWVwiXS5pbmRleE9mKGVsLm5vZGVOYW1lLnRvVXBwZXJDYXNlKCkpID49IDApIHJldHVybiBudWxsO1xuICBpZiAoW1wic2Nyb2xsXCIsIFwiYXV0b1wiXS5pbmRleE9mKGdldENvbXB1dGVkU3R5bGUoZWwpLm92ZXJmbG93WSkgPj0gMClcbiAgICByZXR1cm4gZWw7XG4gIHJldHVybiBmaW5kU2Nyb2xsQ29udGFpbmVyKGVsLnBhcmVudEVsZW1lbnQpO1xufTtcblxuY29uc3Qgc2Nyb2xsVG9wID0gKHNjcm9sbENvbnRhaW5lcikgPT4ge1xuICBpZiAoc2Nyb2xsQ29udGFpbmVyKSB7XG4gICAgcmV0dXJuIHNjcm9sbENvbnRhaW5lci5zY3JvbGxUb3A7XG4gIH0gZWxzZSB7XG4gICAgcmV0dXJuIGRvY3VtZW50LmRvY3VtZW50RWxlbWVudC5zY3JvbGxUb3AgfHwgZG9jdW1lbnQuYm9keS5zY3JvbGxUb3A7XG4gIH1cbn07XG5cbmNvbnN0IGJvdHRvbSA9IChzY3JvbGxDb250YWluZXIpID0+IHtcbiAgaWYgKHNjcm9sbENvbnRhaW5lcikge1xuICAgIHJldHVybiBzY3JvbGxDb250YWluZXIuZ2V0Qm91bmRpbmdDbGllbnRSZWN0KCkuYm90dG9tO1xuICB9IGVsc2Uge1xuICAgIC8vIHdoZW4gd2UgaGF2ZSBubyBjb250YWluZXIsIHRoZSB3aG9sZSBwYWdlIHNjcm9sbHMsXG4gICAgLy8gdGhlcmVmb3JlIHRoZSBib3R0b20gY29vcmRpbmF0ZSBpcyB0aGUgdmlld3BvcnQgaGVpZ2h0XG4gICAgcmV0dXJuIHdpbmRvdy5pbm5lckhlaWdodCB8fCBkb2N1bWVudC5kb2N1bWVudEVsZW1lbnQuY2xpZW50SGVpZ2h0O1xuICB9XG59O1xuXG5jb25zdCB0b3AgPSAoc2Nyb2xsQ29udGFpbmVyKSA9PiB7XG4gIGlmIChzY3JvbGxDb250YWluZXIpIHtcbiAgICByZXR1cm4gc2Nyb2xsQ29udGFpbmVyLmdldEJvdW5kaW5nQ2xpZW50UmVjdCgpLnRvcDtcbiAgfSBlbHNlIHtcbiAgICAvLyB3aGVuIHdlIGhhdmUgbm8gY29udGFpbmVyIHRoZSB3aG9sZSBwYWdlIHNjcm9sbHMsXG4gICAgLy8gdGhlcmVmb3JlIHRoZSB0b3AgY29vcmRpbmF0ZSBpcyAwXG4gICAgcmV0dXJuIDA7XG4gIH1cbn07XG5cbmNvbnN0IGlzQXRWaWV3cG9ydFRvcCA9IChlbCwgc2Nyb2xsQ29udGFpbmVyKSA9PiB7XG4gIGNvbnN0IHJlY3QgPSBlbC5nZXRCb3VuZGluZ0NsaWVudFJlY3QoKTtcbiAgcmV0dXJuIChcbiAgICBNYXRoLmNlaWwocmVjdC50b3ApID49IHRvcChzY3JvbGxDb250YWluZXIpICYmXG4gICAgTWF0aC5jZWlsKHJlY3QubGVmdCkgPj0gMCAmJlxuICAgIE1hdGguZmxvb3IocmVjdC50b3ApIDw9IGJvdHRvbShzY3JvbGxDb250YWluZXIpXG4gICk7XG59O1xuXG5jb25zdCBpc0F0Vmlld3BvcnRCb3R0b20gPSAoZWwsIHNjcm9sbENvbnRhaW5lcikgPT4ge1xuICBjb25zdCByZWN0ID0gZWwuZ2V0Qm91bmRpbmdDbGllbnRSZWN0KCk7XG4gIHJldHVybiAoXG4gICAgTWF0aC5jZWlsKHJlY3QuYm90dG9tKSA+PSB0b3Aoc2Nyb2xsQ29udGFpbmVyKSAmJlxuICAgIE1hdGguY2VpbChyZWN0LmxlZnQpID49IDAgJiZcbiAgICBNYXRoLmZsb29yKHJlY3QuYm90dG9tKSA8PSBib3R0b20oc2Nyb2xsQ29udGFpbmVyKVxuICApO1xufTtcblxuY29uc3QgaXNXaXRoaW5WaWV3cG9ydCA9IChlbCwgc2Nyb2xsQ29udGFpbmVyKSA9PiB7XG4gIGNvbnN0IHJlY3QgPSBlbC5nZXRCb3VuZGluZ0NsaWVudFJlY3QoKTtcbiAgcmV0dXJuIChcbiAgICBNYXRoLmNlaWwocmVjdC50b3ApID49IHRvcChzY3JvbGxDb250YWluZXIpICYmXG4gICAgTWF0aC5jZWlsKHJlY3QubGVmdCkgPj0gMCAmJlxuICAgIE1hdGguZmxvb3IocmVjdC50b3ApIDw9IGJvdHRvbShzY3JvbGxDb250YWluZXIpXG4gICk7XG59O1xuXG5Ib29rcy5JbmZpbml0ZVNjcm9sbCA9IHtcbiAgbW91bnRlZCgpIHtcbiAgICB0aGlzLnNjcm9sbENvbnRhaW5lciA9IGZpbmRTY3JvbGxDb250YWluZXIodGhpcy5lbCk7XG4gICAgbGV0IHNjcm9sbEJlZm9yZSA9IHNjcm9sbFRvcCh0aGlzLnNjcm9sbENvbnRhaW5lcik7XG4gICAgbGV0IHRvcE92ZXJyYW4gPSBmYWxzZTtcbiAgICBjb25zdCB0aHJvdHRsZUludGVydmFsID0gNTAwO1xuICAgIGxldCBwZW5kaW5nT3AgPSBudWxsO1xuXG4gICAgY29uc3Qgb25Ub3BPdmVycnVuID0gdGhpcy50aHJvdHRsZShcbiAgICAgIHRocm90dGxlSW50ZXJ2YWwsXG4gICAgICAodG9wRXZlbnQsIGZpcnN0Q2hpbGQpID0+IHtcbiAgICAgICAgcGVuZGluZ09wID0gKCkgPT4gdHJ1ZTtcbiAgICAgICAgdGhpcy5saXZlU29ja2V0LmpzKCkucHVzaCh0aGlzLmVsLCB0b3BFdmVudCwge1xuICAgICAgICAgIHZhbHVlOiB7IGlkOiBmaXJzdENoaWxkLmlkLCBfb3ZlcnJhbjogdHJ1ZSB9LFxuICAgICAgICAgIGNhbGxiYWNrOiAoKSA9PiB7XG4gICAgICAgICAgICBwZW5kaW5nT3AgPSBudWxsO1xuICAgICAgICAgIH0sXG4gICAgICAgIH0pO1xuICAgICAgfSxcbiAgICApO1xuXG4gICAgY29uc3Qgb25GaXJzdENoaWxkQXRUb3AgPSB0aGlzLnRocm90dGxlKFxuICAgICAgdGhyb3R0bGVJbnRlcnZhbCxcbiAgICAgICh0b3BFdmVudCwgZmlyc3RDaGlsZCkgPT4ge1xuICAgICAgICBwZW5kaW5nT3AgPSAoKSA9PiBmaXJzdENoaWxkLnNjcm9sbEludG9WaWV3KHsgYmxvY2s6IFwic3RhcnRcIiB9KTtcbiAgICAgICAgdGhpcy5saXZlU29ja2V0LmpzKCkucHVzaCh0aGlzLmVsLCB0b3BFdmVudCwge1xuICAgICAgICAgIHZhbHVlOiB7IGlkOiBmaXJzdENoaWxkLmlkIH0sXG4gICAgICAgICAgY2FsbGJhY2s6ICgpID0+IHtcbiAgICAgICAgICAgIHBlbmRpbmdPcCA9IG51bGw7XG4gICAgICAgICAgICAvLyBtYWtlIHN1cmUgdGhhdCB0aGUgRE9NIGlzIHBhdGNoZWQgYnkgd2FpdGluZyBmb3IgdGhlIG5leHQgdGlja1xuICAgICAgICAgICAgd2luZG93LnJlcXVlc3RBbmltYXRpb25GcmFtZSgoKSA9PiB7XG4gICAgICAgICAgICAgIGlmICghaXNXaXRoaW5WaWV3cG9ydChmaXJzdENoaWxkLCB0aGlzLnNjcm9sbENvbnRhaW5lcikpIHtcbiAgICAgICAgICAgICAgICBmaXJzdENoaWxkLnNjcm9sbEludG9WaWV3KHsgYmxvY2s6IFwic3RhcnRcIiB9KTtcbiAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfSk7XG4gICAgICAgICAgfSxcbiAgICAgICAgfSk7XG4gICAgICB9LFxuICAgICk7XG5cbiAgICBjb25zdCBvbkxhc3RDaGlsZEF0Qm90dG9tID0gdGhpcy50aHJvdHRsZShcbiAgICAgIHRocm90dGxlSW50ZXJ2YWwsXG4gICAgICAoYm90dG9tRXZlbnQsIGxhc3RDaGlsZCkgPT4ge1xuICAgICAgICBwZW5kaW5nT3AgPSAoKSA9PiBsYXN0Q2hpbGQuc2Nyb2xsSW50b1ZpZXcoeyBibG9jazogXCJlbmRcIiB9KTtcbiAgICAgICAgdGhpcy5saXZlU29ja2V0LmpzKCkucHVzaCh0aGlzLmVsLCBib3R0b21FdmVudCwge1xuICAgICAgICAgIHZhbHVlOiB7IGlkOiBsYXN0Q2hpbGQuaWQgfSxcbiAgICAgICAgICBjYWxsYmFjazogKCkgPT4ge1xuICAgICAgICAgICAgcGVuZGluZ09wID0gbnVsbDtcbiAgICAgICAgICAgIC8vIG1ha2Ugc3VyZSB0aGF0IHRoZSBET00gaXMgcGF0Y2hlZCBieSB3YWl0aW5nIGZvciB0aGUgbmV4dCB0aWNrXG4gICAgICAgICAgICB3aW5kb3cucmVxdWVzdEFuaW1hdGlvbkZyYW1lKCgpID0+IHtcbiAgICAgICAgICAgICAgaWYgKCFpc1dpdGhpblZpZXdwb3J0KGxhc3RDaGlsZCwgdGhpcy5zY3JvbGxDb250YWluZXIpKSB7XG4gICAgICAgICAgICAgICAgbGFzdENoaWxkLnNjcm9sbEludG9WaWV3KHsgYmxvY2s6IFwiZW5kXCIgfSk7XG4gICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH0pO1xuICAgICAgICAgIH0sXG4gICAgICAgIH0pO1xuICAgICAgfSxcbiAgICApO1xuXG4gICAgdGhpcy5vblNjcm9sbCA9IChfZSkgPT4ge1xuICAgICAgY29uc3Qgc2Nyb2xsTm93ID0gc2Nyb2xsVG9wKHRoaXMuc2Nyb2xsQ29udGFpbmVyKTtcblxuICAgICAgaWYgKHBlbmRpbmdPcCkge1xuICAgICAgICBzY3JvbGxCZWZvcmUgPSBzY3JvbGxOb3c7XG4gICAgICAgIHJldHVybiBwZW5kaW5nT3AoKTtcbiAgICAgIH1cbiAgICAgIGNvbnN0IHJlY3QgPSB0aGlzLmVsLmdldEJvdW5kaW5nQ2xpZW50UmVjdCgpO1xuICAgICAgY29uc3QgdG9wRXZlbnQgPSB0aGlzLmVsLmdldEF0dHJpYnV0ZShcbiAgICAgICAgdGhpcy5saXZlU29ja2V0LmJpbmRpbmcoXCJ2aWV3cG9ydC10b3BcIiksXG4gICAgICApO1xuICAgICAgY29uc3QgYm90dG9tRXZlbnQgPSB0aGlzLmVsLmdldEF0dHJpYnV0ZShcbiAgICAgICAgdGhpcy5saXZlU29ja2V0LmJpbmRpbmcoXCJ2aWV3cG9ydC1ib3R0b21cIiksXG4gICAgICApO1xuICAgICAgY29uc3QgbGFzdENoaWxkID0gdGhpcy5lbC5sYXN0RWxlbWVudENoaWxkO1xuICAgICAgY29uc3QgZmlyc3RDaGlsZCA9IHRoaXMuZWwuZmlyc3RFbGVtZW50Q2hpbGQ7XG4gICAgICBjb25zdCBpc1Njcm9sbGluZ1VwID0gc2Nyb2xsTm93IDwgc2Nyb2xsQmVmb3JlO1xuICAgICAgY29uc3QgaXNTY3JvbGxpbmdEb3duID0gc2Nyb2xsTm93ID4gc2Nyb2xsQmVmb3JlO1xuXG4gICAgICAvLyBlbCBvdmVycmFuIHdoaWxlIHNjcm9sbGluZyB1cFxuICAgICAgaWYgKGlzU2Nyb2xsaW5nVXAgJiYgdG9wRXZlbnQgJiYgIXRvcE92ZXJyYW4gJiYgcmVjdC50b3AgPj0gMCkge1xuICAgICAgICB0b3BPdmVycmFuID0gdHJ1ZTtcbiAgICAgICAgb25Ub3BPdmVycnVuKHRvcEV2ZW50LCBmaXJzdENoaWxkKTtcbiAgICAgIH0gZWxzZSBpZiAoaXNTY3JvbGxpbmdEb3duICYmIHRvcE92ZXJyYW4gJiYgcmVjdC50b3AgPD0gMCkge1xuICAgICAgICB0b3BPdmVycmFuID0gZmFsc2U7XG4gICAgICB9XG5cbiAgICAgIGlmIChcbiAgICAgICAgdG9wRXZlbnQgJiZcbiAgICAgICAgaXNTY3JvbGxpbmdVcCAmJlxuICAgICAgICBpc0F0Vmlld3BvcnRUb3AoZmlyc3RDaGlsZCwgdGhpcy5zY3JvbGxDb250YWluZXIpXG4gICAgICApIHtcbiAgICAgICAgb25GaXJzdENoaWxkQXRUb3AodG9wRXZlbnQsIGZpcnN0Q2hpbGQpO1xuICAgICAgfSBlbHNlIGlmIChcbiAgICAgICAgYm90dG9tRXZlbnQgJiZcbiAgICAgICAgaXNTY3JvbGxpbmdEb3duICYmXG4gICAgICAgIGlzQXRWaWV3cG9ydEJvdHRvbShsYXN0Q2hpbGQsIHRoaXMuc2Nyb2xsQ29udGFpbmVyKVxuICAgICAgKSB7XG4gICAgICAgIG9uTGFzdENoaWxkQXRCb3R0b20oYm90dG9tRXZlbnQsIGxhc3RDaGlsZCk7XG4gICAgICB9XG4gICAgICBzY3JvbGxCZWZvcmUgPSBzY3JvbGxOb3c7XG4gICAgfTtcblxuICAgIGlmICh0aGlzLnNjcm9sbENvbnRhaW5lcikge1xuICAgICAgdGhpcy5zY3JvbGxDb250YWluZXIuYWRkRXZlbnRMaXN0ZW5lcihcInNjcm9sbFwiLCB0aGlzLm9uU2Nyb2xsKTtcbiAgICB9IGVsc2Uge1xuICAgICAgd2luZG93LmFkZEV2ZW50TGlzdGVuZXIoXCJzY3JvbGxcIiwgdGhpcy5vblNjcm9sbCk7XG4gICAgfVxuICB9LFxuXG4gIGRlc3Ryb3llZCgpIHtcbiAgICBpZiAodGhpcy5zY3JvbGxDb250YWluZXIpIHtcbiAgICAgIHRoaXMuc2Nyb2xsQ29udGFpbmVyLnJlbW92ZUV2ZW50TGlzdGVuZXIoXCJzY3JvbGxcIiwgdGhpcy5vblNjcm9sbCk7XG4gICAgfSBlbHNlIHtcbiAgICAgIHdpbmRvdy5yZW1vdmVFdmVudExpc3RlbmVyKFwic2Nyb2xsXCIsIHRoaXMub25TY3JvbGwpO1xuICAgIH1cbiAgfSxcblxuICB0aHJvdHRsZShpbnRlcnZhbCwgY2FsbGJhY2spIHtcbiAgICBsZXQgbGFzdENhbGxBdCA9IDA7XG4gICAgbGV0IHRpbWVyO1xuXG4gICAgcmV0dXJuICguLi5hcmdzKSA9PiB7XG4gICAgICBjb25zdCBub3cgPSBEYXRlLm5vdygpO1xuICAgICAgY29uc3QgcmVtYWluaW5nVGltZSA9IGludGVydmFsIC0gKG5vdyAtIGxhc3RDYWxsQXQpO1xuXG4gICAgICBpZiAocmVtYWluaW5nVGltZSA8PSAwIHx8IHJlbWFpbmluZ1RpbWUgPiBpbnRlcnZhbCkge1xuICAgICAgICBpZiAodGltZXIpIHtcbiAgICAgICAgICBjbGVhclRpbWVvdXQodGltZXIpO1xuICAgICAgICAgIHRpbWVyID0gbnVsbDtcbiAgICAgICAgfVxuICAgICAgICBsYXN0Q2FsbEF0ID0gbm93O1xuICAgICAgICBjYWxsYmFjayguLi5hcmdzKTtcbiAgICAgIH0gZWxzZSBpZiAoIXRpbWVyKSB7XG4gICAgICAgIHRpbWVyID0gc2V0VGltZW91dCgoKSA9PiB7XG4gICAgICAgICAgbGFzdENhbGxBdCA9IERhdGUubm93KCk7XG4gICAgICAgICAgdGltZXIgPSBudWxsO1xuICAgICAgICAgIGNhbGxiYWNrKC4uLmFyZ3MpO1xuICAgICAgICB9LCByZW1haW5pbmdUaW1lKTtcbiAgICAgIH1cbiAgICB9O1xuICB9LFxufTtcbmV4cG9ydCBkZWZhdWx0IEhvb2tzO1xuIiwgImltcG9ydCB7XG4gIFBIWF9SRUZfTE9BRElORyxcbiAgUEhYX1JFRl9MT0NLLFxuICBQSFhfUkVGX1NSQyxcbiAgUEhYX1BFTkRJTkdfUkVGUyxcbiAgUEhYX0VWRU5UX0NMQVNTRVMsXG4gIFBIWF9ESVNBQkxFRCxcbiAgUEhYX1JFQURPTkxZLFxuICBQSFhfRElTQUJMRV9XSVRIX1JFU1RPUkUsXG59IGZyb20gXCIuL2NvbnN0YW50c1wiO1xuXG5pbXBvcnQgRE9NIGZyb20gXCIuL2RvbVwiO1xuXG5leHBvcnQgZGVmYXVsdCBjbGFzcyBFbGVtZW50UmVmIHtcbiAgc3RhdGljIG9uVW5sb2NrKGVsLCBjYWxsYmFjaykge1xuICAgIGlmICghRE9NLmlzTG9ja2VkKGVsKSAmJiAhZWwuY2xvc2VzdChgWyR7UEhYX1JFRl9MT0NLfV1gKSkge1xuICAgICAgcmV0dXJuIGNhbGxiYWNrKCk7XG4gICAgfVxuICAgIGNvbnN0IGNsb3Nlc3RMb2NrID0gZWwuY2xvc2VzdChgWyR7UEhYX1JFRl9MT0NLfV1gKTtcbiAgICBjb25zdCByZWYgPSBjbG9zZXN0TG9ja1xuICAgICAgLmNsb3Nlc3QoYFske1BIWF9SRUZfTE9DS31dYClcbiAgICAgIC5nZXRBdHRyaWJ1dGUoUEhYX1JFRl9MT0NLKTtcbiAgICBjbG9zZXN0TG9jay5hZGRFdmVudExpc3RlbmVyKFxuICAgICAgYHBoeDp1bmRvLWxvY2s6JHtyZWZ9YCxcbiAgICAgICgpID0+IHtcbiAgICAgICAgY2FsbGJhY2soKTtcbiAgICAgIH0sXG4gICAgICB7IG9uY2U6IHRydWUgfSxcbiAgICApO1xuICB9XG5cbiAgY29uc3RydWN0b3IoZWwpIHtcbiAgICB0aGlzLmVsID0gZWw7XG4gICAgdGhpcy5sb2FkaW5nUmVmID0gZWwuaGFzQXR0cmlidXRlKFBIWF9SRUZfTE9BRElORylcbiAgICAgID8gcGFyc2VJbnQoZWwuZ2V0QXR0cmlidXRlKFBIWF9SRUZfTE9BRElORyksIDEwKVxuICAgICAgOiBudWxsO1xuICAgIHRoaXMubG9ja1JlZiA9IGVsLmhhc0F0dHJpYnV0ZShQSFhfUkVGX0xPQ0spXG4gICAgICA/IHBhcnNlSW50KGVsLmdldEF0dHJpYnV0ZShQSFhfUkVGX0xPQ0spLCAxMClcbiAgICAgIDogbnVsbDtcbiAgfVxuXG4gIC8vIHB1YmxpY1xuXG4gIG1heWJlVW5kbyhyZWYsIHBoeEV2ZW50LCBlYWNoQ2xvbmVDYWxsYmFjaykge1xuICAgIGlmICghdGhpcy5pc1dpdGhpbihyZWYpKSB7XG4gICAgICAvLyB3ZSBjYW5ub3QgdW5kbyB0aGUgbG9jayAvIGxvYWRpbmcgbm93LCBhcyB0aGVyZSBpcyBhIG5ld2VyIG9uZSBhbHJlYWR5IHNldDtcbiAgICAgIC8vIHdlIG5lZWQgdG8gc3RvcmUgdGhlIG9yaWdpbmFsIHJlZiB3ZSB0cmllZCB0byBzZW5kIHRoZSB1bmRvIGV2ZW50IGxhdGVyXG4gICAgICBET00udXBkYXRlUHJpdmF0ZSh0aGlzLmVsLCBQSFhfUEVORElOR19SRUZTLCBbXSwgKHBlbmRpbmdSZWZzKSA9PiB7XG4gICAgICAgIHBlbmRpbmdSZWZzLnB1c2gocmVmKTtcbiAgICAgICAgcmV0dXJuIHBlbmRpbmdSZWZzO1xuICAgICAgfSk7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgLy8gdW5kbyBsb2NrcyBhbmQgYXBwbHkgY2xvbmVzXG4gICAgdGhpcy51bmRvTG9ja3MocmVmLCBwaHhFdmVudCwgZWFjaENsb25lQ2FsbGJhY2spO1xuXG4gICAgLy8gdW5kbyBsb2FkaW5nIHN0YXRlc1xuICAgIHRoaXMudW5kb0xvYWRpbmcocmVmLCBwaHhFdmVudCk7XG5cbiAgICAvLyBlbnN1cmUgdW5kbyBldmVudHMgYXJlIGZpcmVkIGZvciBwZW5kaW5nIHJlZnMgdGhhdFxuICAgIC8vIGFyZSByZXNvbHZlZCBieSB0aGUgY3VycmVudCByZWYsIG90aGVyd2lzZSB3ZSdkIGxlYWsgZXZlbnQgbGlzdGVuZXJzXG4gICAgRE9NLnVwZGF0ZVByaXZhdGUodGhpcy5lbCwgUEhYX1BFTkRJTkdfUkVGUywgW10sIChwZW5kaW5nUmVmcykgPT4ge1xuICAgICAgcmV0dXJuIHBlbmRpbmdSZWZzLmZpbHRlcigocGVuZGluZ1JlZikgPT4ge1xuICAgICAgICBsZXQgb3B0cyA9IHtcbiAgICAgICAgICBkZXRhaWw6IHsgcmVmOiBwZW5kaW5nUmVmLCBldmVudDogcGh4RXZlbnQgfSxcbiAgICAgICAgICBidWJibGVzOiB0cnVlLFxuICAgICAgICAgIGNhbmNlbGFibGU6IGZhbHNlLFxuICAgICAgICB9O1xuICAgICAgICBpZiAodGhpcy5sb2FkaW5nUmVmICYmIHRoaXMubG9hZGluZ1JlZiA+IHBlbmRpbmdSZWYpIHtcbiAgICAgICAgICB0aGlzLmVsLmRpc3BhdGNoRXZlbnQoXG4gICAgICAgICAgICBuZXcgQ3VzdG9tRXZlbnQoYHBoeDp1bmRvLWxvYWRpbmc6JHtwZW5kaW5nUmVmfWAsIG9wdHMpLFxuICAgICAgICAgICk7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKHRoaXMubG9ja1JlZiAmJiB0aGlzLmxvY2tSZWYgPiBwZW5kaW5nUmVmKSB7XG4gICAgICAgICAgdGhpcy5lbC5kaXNwYXRjaEV2ZW50KFxuICAgICAgICAgICAgbmV3IEN1c3RvbUV2ZW50KGBwaHg6dW5kby1sb2NrOiR7cGVuZGluZ1JlZn1gLCBvcHRzKSxcbiAgICAgICAgICApO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBwZW5kaW5nUmVmID4gcmVmO1xuICAgICAgfSk7XG4gICAgfSk7XG5cbiAgICAvLyBjbGVhbiB1cCBpZiBmdWxseSByZXNvbHZlZFxuICAgIGlmICh0aGlzLmlzRnVsbHlSZXNvbHZlZEJ5KHJlZikpIHtcbiAgICAgIHRoaXMuZWwucmVtb3ZlQXR0cmlidXRlKFBIWF9SRUZfU1JDKTtcbiAgICB9XG4gIH1cblxuICAvLyBwcml2YXRlXG5cbiAgaXNXaXRoaW4ocmVmKSB7XG4gICAgcmV0dXJuICEoXG4gICAgICB0aGlzLmxvYWRpbmdSZWYgIT09IG51bGwgJiZcbiAgICAgIHRoaXMubG9hZGluZ1JlZiA+IHJlZiAmJlxuICAgICAgdGhpcy5sb2NrUmVmICE9PSBudWxsICYmXG4gICAgICB0aGlzLmxvY2tSZWYgPiByZWZcbiAgICApO1xuICB9XG5cbiAgLy8gQ2hlY2sgZm9yIGNsb25lZCBQSFhfUkVGX0xPQ0sgZWxlbWVudCB0aGF0IGhhcyBiZWVuIG1vcnBoZWQgYmVoaW5kXG4gIC8vIHRoZSBzY2VuZXMgd2hpbGUgdGhpcyBlbGVtZW50IHdhcyBsb2NrZWQgaW4gdGhlIERPTS5cbiAgLy8gV2hlbiB3ZSBhcHBseSB0aGUgY2xvbmVkIHRyZWUgdG8gdGhlIGFjdGl2ZSBET00gZWxlbWVudCwgd2UgbXVzdFxuICAvL1xuICAvLyAgIDEuIGV4ZWN1dGUgcGVuZGluZyBtb3VudGVkIGhvb2tzIGZvciBub2RlcyBub3cgaW4gdGhlIERPTVxuICAvLyAgIDIuIHVuZG8gYW55IHJlZiBpbnNpZGUgdGhlIGNsb25lZCB0cmVlIHRoYXQgaGFzIHNpbmNlIGJlZW4gYWNrJ2RcbiAgdW5kb0xvY2tzKHJlZiwgcGh4RXZlbnQsIGVhY2hDbG9uZUNhbGxiYWNrKSB7XG4gICAgaWYgKCF0aGlzLmlzTG9ja1VuZG9uZUJ5KHJlZikpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICBjb25zdCBjbG9uZWRUcmVlID0gRE9NLnByaXZhdGUodGhpcy5lbCwgUEhYX1JFRl9MT0NLKTtcbiAgICBpZiAoY2xvbmVkVHJlZSkge1xuICAgICAgZWFjaENsb25lQ2FsbGJhY2soY2xvbmVkVHJlZSk7XG4gICAgICBET00uZGVsZXRlUHJpdmF0ZSh0aGlzLmVsLCBQSFhfUkVGX0xPQ0spO1xuICAgIH1cbiAgICB0aGlzLmVsLnJlbW92ZUF0dHJpYnV0ZShQSFhfUkVGX0xPQ0spO1xuXG4gICAgY29uc3Qgb3B0cyA9IHtcbiAgICAgIGRldGFpbDogeyByZWY6IHJlZiwgZXZlbnQ6IHBoeEV2ZW50IH0sXG4gICAgICBidWJibGVzOiB0cnVlLFxuICAgICAgY2FuY2VsYWJsZTogZmFsc2UsXG4gICAgfTtcbiAgICB0aGlzLmVsLmRpc3BhdGNoRXZlbnQoXG4gICAgICBuZXcgQ3VzdG9tRXZlbnQoYHBoeDp1bmRvLWxvY2s6JHt0aGlzLmxvY2tSZWZ9YCwgb3B0cyksXG4gICAgKTtcbiAgfVxuXG4gIHVuZG9Mb2FkaW5nKHJlZiwgcGh4RXZlbnQpIHtcbiAgICBpZiAoIXRoaXMuaXNMb2FkaW5nVW5kb25lQnkocmVmKSkge1xuICAgICAgaWYgKFxuICAgICAgICB0aGlzLmNhblVuZG9Mb2FkaW5nKHJlZikgJiZcbiAgICAgICAgdGhpcy5lbC5jbGFzc0xpc3QuY29udGFpbnMoXCJwaHgtc3VibWl0LWxvYWRpbmdcIilcbiAgICAgICkge1xuICAgICAgICB0aGlzLmVsLmNsYXNzTGlzdC5yZW1vdmUoXCJwaHgtY2hhbmdlLWxvYWRpbmdcIik7XG4gICAgICB9XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgaWYgKHRoaXMuY2FuVW5kb0xvYWRpbmcocmVmKSkge1xuICAgICAgdGhpcy5lbC5yZW1vdmVBdHRyaWJ1dGUoUEhYX1JFRl9MT0FESU5HKTtcbiAgICAgIGNvbnN0IGRpc2FibGVkVmFsID0gdGhpcy5lbC5nZXRBdHRyaWJ1dGUoUEhYX0RJU0FCTEVEKTtcbiAgICAgIGNvbnN0IHJlYWRPbmx5VmFsID0gdGhpcy5lbC5nZXRBdHRyaWJ1dGUoUEhYX1JFQURPTkxZKTtcbiAgICAgIC8vIHJlc3RvcmUgaW5wdXRzXG4gICAgICBpZiAocmVhZE9ubHlWYWwgIT09IG51bGwpIHtcbiAgICAgICAgdGhpcy5lbC5yZWFkT25seSA9IHJlYWRPbmx5VmFsID09PSBcInRydWVcIiA/IHRydWUgOiBmYWxzZTtcbiAgICAgICAgdGhpcy5lbC5yZW1vdmVBdHRyaWJ1dGUoUEhYX1JFQURPTkxZKTtcbiAgICAgIH1cbiAgICAgIGlmIChkaXNhYmxlZFZhbCAhPT0gbnVsbCkge1xuICAgICAgICB0aGlzLmVsLmRpc2FibGVkID0gZGlzYWJsZWRWYWwgPT09IFwidHJ1ZVwiID8gdHJ1ZSA6IGZhbHNlO1xuICAgICAgICB0aGlzLmVsLnJlbW92ZUF0dHJpYnV0ZShQSFhfRElTQUJMRUQpO1xuICAgICAgfVxuICAgICAgLy8gcmVzdG9yZSBkaXNhYmxlc1xuICAgICAgY29uc3QgZGlzYWJsZVJlc3RvcmUgPSB0aGlzLmVsLmdldEF0dHJpYnV0ZShQSFhfRElTQUJMRV9XSVRIX1JFU1RPUkUpO1xuICAgICAgaWYgKGRpc2FibGVSZXN0b3JlICE9PSBudWxsKSB7XG4gICAgICAgIHRoaXMuZWwuaW5uZXJUZXh0ID0gZGlzYWJsZVJlc3RvcmU7XG4gICAgICAgIHRoaXMuZWwucmVtb3ZlQXR0cmlidXRlKFBIWF9ESVNBQkxFX1dJVEhfUkVTVE9SRSk7XG4gICAgICB9XG5cbiAgICAgIGNvbnN0IG9wdHMgPSB7XG4gICAgICAgIGRldGFpbDogeyByZWY6IHJlZiwgZXZlbnQ6IHBoeEV2ZW50IH0sXG4gICAgICAgIGJ1YmJsZXM6IHRydWUsXG4gICAgICAgIGNhbmNlbGFibGU6IGZhbHNlLFxuICAgICAgfTtcbiAgICAgIHRoaXMuZWwuZGlzcGF0Y2hFdmVudChcbiAgICAgICAgbmV3IEN1c3RvbUV2ZW50KGBwaHg6dW5kby1sb2FkaW5nOiR7dGhpcy5sb2FkaW5nUmVmfWAsIG9wdHMpLFxuICAgICAgKTtcbiAgICB9XG5cbiAgICAvLyByZW1vdmUgY2xhc3Nlc1xuICAgIFBIWF9FVkVOVF9DTEFTU0VTLmZvckVhY2goKG5hbWUpID0+IHtcbiAgICAgIGlmIChuYW1lICE9PSBcInBoeC1zdWJtaXQtbG9hZGluZ1wiIHx8IHRoaXMuY2FuVW5kb0xvYWRpbmcocmVmKSkge1xuICAgICAgICBET00ucmVtb3ZlQ2xhc3ModGhpcy5lbCwgbmFtZSk7XG4gICAgICB9XG4gICAgfSk7XG4gIH1cblxuICBpc0xvYWRpbmdVbmRvbmVCeShyZWYpIHtcbiAgICByZXR1cm4gdGhpcy5sb2FkaW5nUmVmID09PSBudWxsID8gZmFsc2UgOiB0aGlzLmxvYWRpbmdSZWYgPD0gcmVmO1xuICB9XG4gIGlzTG9ja1VuZG9uZUJ5KHJlZikge1xuICAgIHJldHVybiB0aGlzLmxvY2tSZWYgPT09IG51bGwgPyBmYWxzZSA6IHRoaXMubG9ja1JlZiA8PSByZWY7XG4gIH1cblxuICBpc0Z1bGx5UmVzb2x2ZWRCeShyZWYpIHtcbiAgICByZXR1cm4gKFxuICAgICAgKHRoaXMubG9hZGluZ1JlZiA9PT0gbnVsbCB8fCB0aGlzLmxvYWRpbmdSZWYgPD0gcmVmKSAmJlxuICAgICAgKHRoaXMubG9ja1JlZiA9PT0gbnVsbCB8fCB0aGlzLmxvY2tSZWYgPD0gcmVmKVxuICAgICk7XG4gIH1cblxuICAvLyBvbmx5IHJlbW92ZSB0aGUgcGh4LXN1Ym1pdC1sb2FkaW5nIGNsYXNzIGlmIHdlIGFyZSBub3QgbG9ja2VkXG4gIGNhblVuZG9Mb2FkaW5nKHJlZikge1xuICAgIHJldHVybiB0aGlzLmxvY2tSZWYgPT09IG51bGwgfHwgdGhpcy5sb2NrUmVmIDw9IHJlZjtcbiAgfVxufVxuIiwgImltcG9ydCB7IG1heWJlIH0gZnJvbSBcIi4vdXRpbHNcIjtcblxuaW1wb3J0IERPTSBmcm9tIFwiLi9kb21cIjtcblxuZXhwb3J0IGRlZmF1bHQgY2xhc3MgRE9NUG9zdE1vcnBoUmVzdG9yZXIge1xuICBjb25zdHJ1Y3Rvcihjb250YWluZXJCZWZvcmUsIGNvbnRhaW5lckFmdGVyLCB1cGRhdGVUeXBlKSB7XG4gICAgY29uc3QgaWRzQmVmb3JlID0gbmV3IFNldCgpO1xuICAgIGNvbnN0IGlkc0FmdGVyID0gbmV3IFNldChcbiAgICAgIFsuLi5jb250YWluZXJBZnRlci5jaGlsZHJlbl0ubWFwKChjaGlsZCkgPT4gY2hpbGQuaWQpLFxuICAgICk7XG5cbiAgICBjb25zdCBlbGVtZW50c1RvTW9kaWZ5ID0gW107XG5cbiAgICBBcnJheS5mcm9tKGNvbnRhaW5lckJlZm9yZS5jaGlsZHJlbikuZm9yRWFjaCgoY2hpbGQpID0+IHtcbiAgICAgIGlmIChjaGlsZC5pZCkge1xuICAgICAgICAvLyBhbGwgb2Ygb3VyIGNoaWxkcmVuIHNob3VsZCBiZSBlbGVtZW50cyB3aXRoIGlkc1xuICAgICAgICBpZHNCZWZvcmUuYWRkKGNoaWxkLmlkKTtcbiAgICAgICAgaWYgKGlkc0FmdGVyLmhhcyhjaGlsZC5pZCkpIHtcbiAgICAgICAgICBjb25zdCBwcmV2aW91c0VsZW1lbnRJZCA9XG4gICAgICAgICAgICBjaGlsZC5wcmV2aW91c0VsZW1lbnRTaWJsaW5nICYmIGNoaWxkLnByZXZpb3VzRWxlbWVudFNpYmxpbmcuaWQ7XG4gICAgICAgICAgZWxlbWVudHNUb01vZGlmeS5wdXNoKHtcbiAgICAgICAgICAgIGVsZW1lbnRJZDogY2hpbGQuaWQsXG4gICAgICAgICAgICBwcmV2aW91c0VsZW1lbnRJZDogcHJldmlvdXNFbGVtZW50SWQsXG4gICAgICAgICAgfSk7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9KTtcblxuICAgIHRoaXMuY29udGFpbmVySWQgPSBjb250YWluZXJBZnRlci5pZDtcbiAgICB0aGlzLnVwZGF0ZVR5cGUgPSB1cGRhdGVUeXBlO1xuICAgIHRoaXMuZWxlbWVudHNUb01vZGlmeSA9IGVsZW1lbnRzVG9Nb2RpZnk7XG4gICAgdGhpcy5lbGVtZW50SWRzVG9BZGQgPSBbLi4uaWRzQWZ0ZXJdLmZpbHRlcigoaWQpID0+ICFpZHNCZWZvcmUuaGFzKGlkKSk7XG4gIH1cblxuICAvLyBXZSBkbyB0aGUgZm9sbG93aW5nIHRvIG9wdGltaXplIGFwcGVuZC9wcmVwZW5kIG9wZXJhdGlvbnM6XG4gIC8vICAgMSkgVHJhY2sgaWRzIG9mIG1vZGlmaWVkIGVsZW1lbnRzICYgb2YgbmV3IGVsZW1lbnRzXG4gIC8vICAgMikgQWxsIHRoZSBtb2RpZmllZCBlbGVtZW50cyBhcmUgcHV0IGJhY2sgaW4gdGhlIGNvcnJlY3QgcG9zaXRpb24gaW4gdGhlIERPTSB0cmVlXG4gIC8vICAgICAgYnkgc3RvcmluZyB0aGUgaWQgb2YgdGhlaXIgcHJldmlvdXMgc2libGluZ1xuICAvLyAgIDMpIE5ldyBlbGVtZW50cyBhcmUgZ29pbmcgdG8gYmUgcHV0IGluIHRoZSByaWdodCBwbGFjZSBieSBtb3JwaGRvbSBkdXJpbmcgYXBwZW5kLlxuICAvLyAgICAgIEZvciBwcmVwZW5kLCB3ZSBtb3ZlIHRoZW0gdG8gdGhlIGZpcnN0IHBvc2l0aW9uIGluIHRoZSBjb250YWluZXJcbiAgcGVyZm9ybSgpIHtcbiAgICBjb25zdCBjb250YWluZXIgPSBET00uYnlJZCh0aGlzLmNvbnRhaW5lcklkKTtcbiAgICBpZiAoIWNvbnRhaW5lcikge1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICB0aGlzLmVsZW1lbnRzVG9Nb2RpZnkuZm9yRWFjaCgoZWxlbWVudFRvTW9kaWZ5KSA9PiB7XG4gICAgICBpZiAoZWxlbWVudFRvTW9kaWZ5LnByZXZpb3VzRWxlbWVudElkKSB7XG4gICAgICAgIG1heWJlKFxuICAgICAgICAgIGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKGVsZW1lbnRUb01vZGlmeS5wcmV2aW91c0VsZW1lbnRJZCksXG4gICAgICAgICAgKHByZXZpb3VzRWxlbSkgPT4ge1xuICAgICAgICAgICAgbWF5YmUoXG4gICAgICAgICAgICAgIGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKGVsZW1lbnRUb01vZGlmeS5lbGVtZW50SWQpLFxuICAgICAgICAgICAgICAoZWxlbSkgPT4ge1xuICAgICAgICAgICAgICAgIGNvbnN0IGlzSW5SaWdodFBsYWNlID1cbiAgICAgICAgICAgICAgICAgIGVsZW0ucHJldmlvdXNFbGVtZW50U2libGluZyAmJlxuICAgICAgICAgICAgICAgICAgZWxlbS5wcmV2aW91c0VsZW1lbnRTaWJsaW5nLmlkID09IHByZXZpb3VzRWxlbS5pZDtcbiAgICAgICAgICAgICAgICBpZiAoIWlzSW5SaWdodFBsYWNlKSB7XG4gICAgICAgICAgICAgICAgICBwcmV2aW91c0VsZW0uaW5zZXJ0QWRqYWNlbnRFbGVtZW50KFwiYWZ0ZXJlbmRcIiwgZWxlbSk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgKTtcbiAgICAgICAgICB9LFxuICAgICAgICApO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgLy8gVGhpcyBpcyB0aGUgZmlyc3QgZWxlbWVudCBpbiB0aGUgY29udGFpbmVyXG4gICAgICAgIG1heWJlKGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKGVsZW1lbnRUb01vZGlmeS5lbGVtZW50SWQpLCAoZWxlbSkgPT4ge1xuICAgICAgICAgIGNvbnN0IGlzSW5SaWdodFBsYWNlID0gZWxlbS5wcmV2aW91c0VsZW1lbnRTaWJsaW5nID09IG51bGw7XG4gICAgICAgICAgaWYgKCFpc0luUmlnaHRQbGFjZSkge1xuICAgICAgICAgICAgY29udGFpbmVyLmluc2VydEFkamFjZW50RWxlbWVudChcImFmdGVyYmVnaW5cIiwgZWxlbSk7XG4gICAgICAgICAgfVxuICAgICAgICB9KTtcbiAgICAgIH1cbiAgICB9KTtcblxuICAgIGlmICh0aGlzLnVwZGF0ZVR5cGUgPT0gXCJwcmVwZW5kXCIpIHtcbiAgICAgIHRoaXMuZWxlbWVudElkc1RvQWRkLnJldmVyc2UoKS5mb3JFYWNoKChlbGVtSWQpID0+IHtcbiAgICAgICAgbWF5YmUoZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoZWxlbUlkKSwgKGVsZW0pID0+XG4gICAgICAgICAgY29udGFpbmVyLmluc2VydEFkamFjZW50RWxlbWVudChcImFmdGVyYmVnaW5cIiwgZWxlbSksXG4gICAgICAgICk7XG4gICAgICB9KTtcbiAgICB9XG4gIH1cbn1cbiIsICJ2YXIgRE9DVU1FTlRfRlJBR01FTlRfTk9ERSA9IDExO1xuXG5mdW5jdGlvbiBtb3JwaEF0dHJzKGZyb21Ob2RlLCB0b05vZGUpIHtcbiAgICB2YXIgdG9Ob2RlQXR0cnMgPSB0b05vZGUuYXR0cmlidXRlcztcbiAgICB2YXIgYXR0cjtcbiAgICB2YXIgYXR0ck5hbWU7XG4gICAgdmFyIGF0dHJOYW1lc3BhY2VVUkk7XG4gICAgdmFyIGF0dHJWYWx1ZTtcbiAgICB2YXIgZnJvbVZhbHVlO1xuXG4gICAgLy8gZG9jdW1lbnQtZnJhZ21lbnRzIGRvbnQgaGF2ZSBhdHRyaWJ1dGVzIHNvIGxldHMgbm90IGRvIGFueXRoaW5nXG4gICAgaWYgKHRvTm9kZS5ub2RlVHlwZSA9PT0gRE9DVU1FTlRfRlJBR01FTlRfTk9ERSB8fCBmcm9tTm9kZS5ub2RlVHlwZSA9PT0gRE9DVU1FTlRfRlJBR01FTlRfTk9ERSkge1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIC8vIHVwZGF0ZSBhdHRyaWJ1dGVzIG9uIG9yaWdpbmFsIERPTSBlbGVtZW50XG4gICAgZm9yICh2YXIgaSA9IHRvTm9kZUF0dHJzLmxlbmd0aCAtIDE7IGkgPj0gMDsgaS0tKSB7XG4gICAgICAgIGF0dHIgPSB0b05vZGVBdHRyc1tpXTtcbiAgICAgICAgYXR0ck5hbWUgPSBhdHRyLm5hbWU7XG4gICAgICAgIGF0dHJOYW1lc3BhY2VVUkkgPSBhdHRyLm5hbWVzcGFjZVVSSTtcbiAgICAgICAgYXR0clZhbHVlID0gYXR0ci52YWx1ZTtcblxuICAgICAgICBpZiAoYXR0ck5hbWVzcGFjZVVSSSkge1xuICAgICAgICAgICAgYXR0ck5hbWUgPSBhdHRyLmxvY2FsTmFtZSB8fCBhdHRyTmFtZTtcbiAgICAgICAgICAgIGZyb21WYWx1ZSA9IGZyb21Ob2RlLmdldEF0dHJpYnV0ZU5TKGF0dHJOYW1lc3BhY2VVUkksIGF0dHJOYW1lKTtcblxuICAgICAgICAgICAgaWYgKGZyb21WYWx1ZSAhPT0gYXR0clZhbHVlKSB7XG4gICAgICAgICAgICAgICAgaWYgKGF0dHIucHJlZml4ID09PSAneG1sbnMnKXtcbiAgICAgICAgICAgICAgICAgICAgYXR0ck5hbWUgPSBhdHRyLm5hbWU7IC8vIEl0J3Mgbm90IGFsbG93ZWQgdG8gc2V0IGFuIGF0dHJpYnV0ZSB3aXRoIHRoZSBYTUxOUyBuYW1lc3BhY2Ugd2l0aG91dCBzcGVjaWZ5aW5nIHRoZSBgeG1sbnNgIHByZWZpeFxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBmcm9tTm9kZS5zZXRBdHRyaWJ1dGVOUyhhdHRyTmFtZXNwYWNlVVJJLCBhdHRyTmFtZSwgYXR0clZhbHVlKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIGZyb21WYWx1ZSA9IGZyb21Ob2RlLmdldEF0dHJpYnV0ZShhdHRyTmFtZSk7XG5cbiAgICAgICAgICAgIGlmIChmcm9tVmFsdWUgIT09IGF0dHJWYWx1ZSkge1xuICAgICAgICAgICAgICAgIGZyb21Ob2RlLnNldEF0dHJpYnV0ZShhdHRyTmFtZSwgYXR0clZhbHVlKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgIH1cblxuICAgIC8vIFJlbW92ZSBhbnkgZXh0cmEgYXR0cmlidXRlcyBmb3VuZCBvbiB0aGUgb3JpZ2luYWwgRE9NIGVsZW1lbnQgdGhhdFxuICAgIC8vIHdlcmVuJ3QgZm91bmQgb24gdGhlIHRhcmdldCBlbGVtZW50LlxuICAgIHZhciBmcm9tTm9kZUF0dHJzID0gZnJvbU5vZGUuYXR0cmlidXRlcztcblxuICAgIGZvciAodmFyIGQgPSBmcm9tTm9kZUF0dHJzLmxlbmd0aCAtIDE7IGQgPj0gMDsgZC0tKSB7XG4gICAgICAgIGF0dHIgPSBmcm9tTm9kZUF0dHJzW2RdO1xuICAgICAgICBhdHRyTmFtZSA9IGF0dHIubmFtZTtcbiAgICAgICAgYXR0ck5hbWVzcGFjZVVSSSA9IGF0dHIubmFtZXNwYWNlVVJJO1xuXG4gICAgICAgIGlmIChhdHRyTmFtZXNwYWNlVVJJKSB7XG4gICAgICAgICAgICBhdHRyTmFtZSA9IGF0dHIubG9jYWxOYW1lIHx8IGF0dHJOYW1lO1xuXG4gICAgICAgICAgICBpZiAoIXRvTm9kZS5oYXNBdHRyaWJ1dGVOUyhhdHRyTmFtZXNwYWNlVVJJLCBhdHRyTmFtZSkpIHtcbiAgICAgICAgICAgICAgICBmcm9tTm9kZS5yZW1vdmVBdHRyaWJ1dGVOUyhhdHRyTmFtZXNwYWNlVVJJLCBhdHRyTmFtZSk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICBpZiAoIXRvTm9kZS5oYXNBdHRyaWJ1dGUoYXR0ck5hbWUpKSB7XG4gICAgICAgICAgICAgICAgZnJvbU5vZGUucmVtb3ZlQXR0cmlidXRlKGF0dHJOYW1lKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgIH1cbn1cblxudmFyIHJhbmdlOyAvLyBDcmVhdGUgYSByYW5nZSBvYmplY3QgZm9yIGVmZmljZW50bHkgcmVuZGVyaW5nIHN0cmluZ3MgdG8gZWxlbWVudHMuXG52YXIgTlNfWEhUTUwgPSAnaHR0cDovL3d3dy53My5vcmcvMTk5OS94aHRtbCc7XG5cbnZhciBkb2MgPSB0eXBlb2YgZG9jdW1lbnQgPT09ICd1bmRlZmluZWQnID8gdW5kZWZpbmVkIDogZG9jdW1lbnQ7XG52YXIgSEFTX1RFTVBMQVRFX1NVUFBPUlQgPSAhIWRvYyAmJiAnY29udGVudCcgaW4gZG9jLmNyZWF0ZUVsZW1lbnQoJ3RlbXBsYXRlJyk7XG52YXIgSEFTX1JBTkdFX1NVUFBPUlQgPSAhIWRvYyAmJiBkb2MuY3JlYXRlUmFuZ2UgJiYgJ2NyZWF0ZUNvbnRleHR1YWxGcmFnbWVudCcgaW4gZG9jLmNyZWF0ZVJhbmdlKCk7XG5cbmZ1bmN0aW9uIGNyZWF0ZUZyYWdtZW50RnJvbVRlbXBsYXRlKHN0cikge1xuICAgIHZhciB0ZW1wbGF0ZSA9IGRvYy5jcmVhdGVFbGVtZW50KCd0ZW1wbGF0ZScpO1xuICAgIHRlbXBsYXRlLmlubmVySFRNTCA9IHN0cjtcbiAgICByZXR1cm4gdGVtcGxhdGUuY29udGVudC5jaGlsZE5vZGVzWzBdO1xufVxuXG5mdW5jdGlvbiBjcmVhdGVGcmFnbWVudEZyb21SYW5nZShzdHIpIHtcbiAgICBpZiAoIXJhbmdlKSB7XG4gICAgICAgIHJhbmdlID0gZG9jLmNyZWF0ZVJhbmdlKCk7XG4gICAgICAgIHJhbmdlLnNlbGVjdE5vZGUoZG9jLmJvZHkpO1xuICAgIH1cblxuICAgIHZhciBmcmFnbWVudCA9IHJhbmdlLmNyZWF0ZUNvbnRleHR1YWxGcmFnbWVudChzdHIpO1xuICAgIHJldHVybiBmcmFnbWVudC5jaGlsZE5vZGVzWzBdO1xufVxuXG5mdW5jdGlvbiBjcmVhdGVGcmFnbWVudEZyb21XcmFwKHN0cikge1xuICAgIHZhciBmcmFnbWVudCA9IGRvYy5jcmVhdGVFbGVtZW50KCdib2R5Jyk7XG4gICAgZnJhZ21lbnQuaW5uZXJIVE1MID0gc3RyO1xuICAgIHJldHVybiBmcmFnbWVudC5jaGlsZE5vZGVzWzBdO1xufVxuXG4vKipcbiAqIFRoaXMgaXMgYWJvdXQgdGhlIHNhbWVcbiAqIHZhciBodG1sID0gbmV3IERPTVBhcnNlcigpLnBhcnNlRnJvbVN0cmluZyhzdHIsICd0ZXh0L2h0bWwnKTtcbiAqIHJldHVybiBodG1sLmJvZHkuZmlyc3RDaGlsZDtcbiAqXG4gKiBAbWV0aG9kIHRvRWxlbWVudFxuICogQHBhcmFtIHtTdHJpbmd9IHN0clxuICovXG5mdW5jdGlvbiB0b0VsZW1lbnQoc3RyKSB7XG4gICAgc3RyID0gc3RyLnRyaW0oKTtcbiAgICBpZiAoSEFTX1RFTVBMQVRFX1NVUFBPUlQpIHtcbiAgICAgIC8vIGF2b2lkIHJlc3RyaWN0aW9ucyBvbiBjb250ZW50IGZvciB0aGluZ3MgbGlrZSBgPHRyPjx0aD5IaTwvdGg+PC90cj5gIHdoaWNoXG4gICAgICAvLyBjcmVhdGVDb250ZXh0dWFsRnJhZ21lbnQgZG9lc24ndCBzdXBwb3J0XG4gICAgICAvLyA8dGVtcGxhdGU+IHN1cHBvcnQgbm90IGF2YWlsYWJsZSBpbiBJRVxuICAgICAgcmV0dXJuIGNyZWF0ZUZyYWdtZW50RnJvbVRlbXBsYXRlKHN0cik7XG4gICAgfSBlbHNlIGlmIChIQVNfUkFOR0VfU1VQUE9SVCkge1xuICAgICAgcmV0dXJuIGNyZWF0ZUZyYWdtZW50RnJvbVJhbmdlKHN0cik7XG4gICAgfVxuXG4gICAgcmV0dXJuIGNyZWF0ZUZyYWdtZW50RnJvbVdyYXAoc3RyKTtcbn1cblxuLyoqXG4gKiBSZXR1cm5zIHRydWUgaWYgdHdvIG5vZGUncyBuYW1lcyBhcmUgdGhlIHNhbWUuXG4gKlxuICogTk9URTogV2UgZG9uJ3QgYm90aGVyIGNoZWNraW5nIGBuYW1lc3BhY2VVUklgIGJlY2F1c2UgeW91IHdpbGwgbmV2ZXIgZmluZCB0d28gSFRNTCBlbGVtZW50cyB3aXRoIHRoZSBzYW1lXG4gKiAgICAgICBub2RlTmFtZSBhbmQgZGlmZmVyZW50IG5hbWVzcGFjZSBVUklzLlxuICpcbiAqIEBwYXJhbSB7RWxlbWVudH0gYVxuICogQHBhcmFtIHtFbGVtZW50fSBiIFRoZSB0YXJnZXQgZWxlbWVudFxuICogQHJldHVybiB7Ym9vbGVhbn1cbiAqL1xuZnVuY3Rpb24gY29tcGFyZU5vZGVOYW1lcyhmcm9tRWwsIHRvRWwpIHtcbiAgICB2YXIgZnJvbU5vZGVOYW1lID0gZnJvbUVsLm5vZGVOYW1lO1xuICAgIHZhciB0b05vZGVOYW1lID0gdG9FbC5ub2RlTmFtZTtcbiAgICB2YXIgZnJvbUNvZGVTdGFydCwgdG9Db2RlU3RhcnQ7XG5cbiAgICBpZiAoZnJvbU5vZGVOYW1lID09PSB0b05vZGVOYW1lKSB7XG4gICAgICAgIHJldHVybiB0cnVlO1xuICAgIH1cblxuICAgIGZyb21Db2RlU3RhcnQgPSBmcm9tTm9kZU5hbWUuY2hhckNvZGVBdCgwKTtcbiAgICB0b0NvZGVTdGFydCA9IHRvTm9kZU5hbWUuY2hhckNvZGVBdCgwKTtcblxuICAgIC8vIElmIHRoZSB0YXJnZXQgZWxlbWVudCBpcyBhIHZpcnR1YWwgRE9NIG5vZGUgb3IgU1ZHIG5vZGUgdGhlbiB3ZSBtYXlcbiAgICAvLyBuZWVkIHRvIG5vcm1hbGl6ZSB0aGUgdGFnIG5hbWUgYmVmb3JlIGNvbXBhcmluZy4gTm9ybWFsIEhUTUwgZWxlbWVudHMgdGhhdCBhcmVcbiAgICAvLyBpbiB0aGUgXCJodHRwOi8vd3d3LnczLm9yZy8xOTk5L3hodG1sXCJcbiAgICAvLyBhcmUgY29udmVydGVkIHRvIHVwcGVyIGNhc2VcbiAgICBpZiAoZnJvbUNvZGVTdGFydCA8PSA5MCAmJiB0b0NvZGVTdGFydCA+PSA5NykgeyAvLyBmcm9tIGlzIHVwcGVyIGFuZCB0byBpcyBsb3dlclxuICAgICAgICByZXR1cm4gZnJvbU5vZGVOYW1lID09PSB0b05vZGVOYW1lLnRvVXBwZXJDYXNlKCk7XG4gICAgfSBlbHNlIGlmICh0b0NvZGVTdGFydCA8PSA5MCAmJiBmcm9tQ29kZVN0YXJ0ID49IDk3KSB7IC8vIHRvIGlzIHVwcGVyIGFuZCBmcm9tIGlzIGxvd2VyXG4gICAgICAgIHJldHVybiB0b05vZGVOYW1lID09PSBmcm9tTm9kZU5hbWUudG9VcHBlckNhc2UoKTtcbiAgICB9IGVsc2Uge1xuICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgfVxufVxuXG4vKipcbiAqIENyZWF0ZSBhbiBlbGVtZW50LCBvcHRpb25hbGx5IHdpdGggYSBrbm93biBuYW1lc3BhY2UgVVJJLlxuICpcbiAqIEBwYXJhbSB7c3RyaW5nfSBuYW1lIHRoZSBlbGVtZW50IG5hbWUsIGUuZy4gJ2Rpdicgb3IgJ3N2ZydcbiAqIEBwYXJhbSB7c3RyaW5nfSBbbmFtZXNwYWNlVVJJXSB0aGUgZWxlbWVudCdzIG5hbWVzcGFjZSBVUkksIGkuZS4gdGhlIHZhbHVlIG9mXG4gKiBpdHMgYHhtbG5zYCBhdHRyaWJ1dGUgb3IgaXRzIGluZmVycmVkIG5hbWVzcGFjZS5cbiAqXG4gKiBAcmV0dXJuIHtFbGVtZW50fVxuICovXG5mdW5jdGlvbiBjcmVhdGVFbGVtZW50TlMobmFtZSwgbmFtZXNwYWNlVVJJKSB7XG4gICAgcmV0dXJuICFuYW1lc3BhY2VVUkkgfHwgbmFtZXNwYWNlVVJJID09PSBOU19YSFRNTCA/XG4gICAgICAgIGRvYy5jcmVhdGVFbGVtZW50KG5hbWUpIDpcbiAgICAgICAgZG9jLmNyZWF0ZUVsZW1lbnROUyhuYW1lc3BhY2VVUkksIG5hbWUpO1xufVxuXG4vKipcbiAqIENvcGllcyB0aGUgY2hpbGRyZW4gb2Ygb25lIERPTSBlbGVtZW50IHRvIGFub3RoZXIgRE9NIGVsZW1lbnRcbiAqL1xuZnVuY3Rpb24gbW92ZUNoaWxkcmVuKGZyb21FbCwgdG9FbCkge1xuICAgIHZhciBjdXJDaGlsZCA9IGZyb21FbC5maXJzdENoaWxkO1xuICAgIHdoaWxlIChjdXJDaGlsZCkge1xuICAgICAgICB2YXIgbmV4dENoaWxkID0gY3VyQ2hpbGQubmV4dFNpYmxpbmc7XG4gICAgICAgIHRvRWwuYXBwZW5kQ2hpbGQoY3VyQ2hpbGQpO1xuICAgICAgICBjdXJDaGlsZCA9IG5leHRDaGlsZDtcbiAgICB9XG4gICAgcmV0dXJuIHRvRWw7XG59XG5cbmZ1bmN0aW9uIHN5bmNCb29sZWFuQXR0clByb3AoZnJvbUVsLCB0b0VsLCBuYW1lKSB7XG4gICAgaWYgKGZyb21FbFtuYW1lXSAhPT0gdG9FbFtuYW1lXSkge1xuICAgICAgICBmcm9tRWxbbmFtZV0gPSB0b0VsW25hbWVdO1xuICAgICAgICBpZiAoZnJvbUVsW25hbWVdKSB7XG4gICAgICAgICAgICBmcm9tRWwuc2V0QXR0cmlidXRlKG5hbWUsICcnKTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIGZyb21FbC5yZW1vdmVBdHRyaWJ1dGUobmFtZSk7XG4gICAgICAgIH1cbiAgICB9XG59XG5cbnZhciBzcGVjaWFsRWxIYW5kbGVycyA9IHtcbiAgICBPUFRJT046IGZ1bmN0aW9uKGZyb21FbCwgdG9FbCkge1xuICAgICAgICB2YXIgcGFyZW50Tm9kZSA9IGZyb21FbC5wYXJlbnROb2RlO1xuICAgICAgICBpZiAocGFyZW50Tm9kZSkge1xuICAgICAgICAgICAgdmFyIHBhcmVudE5hbWUgPSBwYXJlbnROb2RlLm5vZGVOYW1lLnRvVXBwZXJDYXNlKCk7XG4gICAgICAgICAgICBpZiAocGFyZW50TmFtZSA9PT0gJ09QVEdST1VQJykge1xuICAgICAgICAgICAgICAgIHBhcmVudE5vZGUgPSBwYXJlbnROb2RlLnBhcmVudE5vZGU7XG4gICAgICAgICAgICAgICAgcGFyZW50TmFtZSA9IHBhcmVudE5vZGUgJiYgcGFyZW50Tm9kZS5ub2RlTmFtZS50b1VwcGVyQ2FzZSgpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgaWYgKHBhcmVudE5hbWUgPT09ICdTRUxFQ1QnICYmICFwYXJlbnROb2RlLmhhc0F0dHJpYnV0ZSgnbXVsdGlwbGUnKSkge1xuICAgICAgICAgICAgICAgIGlmIChmcm9tRWwuaGFzQXR0cmlidXRlKCdzZWxlY3RlZCcpICYmICF0b0VsLnNlbGVjdGVkKSB7XG4gICAgICAgICAgICAgICAgICAgIC8vIFdvcmthcm91bmQgZm9yIE1TIEVkZ2UgYnVnIHdoZXJlIHRoZSAnc2VsZWN0ZWQnIGF0dHJpYnV0ZSBjYW4gb25seSBiZVxuICAgICAgICAgICAgICAgICAgICAvLyByZW1vdmVkIGlmIHNldCB0byBhIG5vbi1lbXB0eSB2YWx1ZTpcbiAgICAgICAgICAgICAgICAgICAgLy8gaHR0cHM6Ly9kZXZlbG9wZXIubWljcm9zb2Z0LmNvbS9lbi11cy9taWNyb3NvZnQtZWRnZS9wbGF0Zm9ybS9pc3N1ZXMvMTIwODc2NzkvXG4gICAgICAgICAgICAgICAgICAgIGZyb21FbC5zZXRBdHRyaWJ1dGUoJ3NlbGVjdGVkJywgJ3NlbGVjdGVkJyk7XG4gICAgICAgICAgICAgICAgICAgIGZyb21FbC5yZW1vdmVBdHRyaWJ1dGUoJ3NlbGVjdGVkJyk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIC8vIFdlIGhhdmUgdG8gcmVzZXQgc2VsZWN0IGVsZW1lbnQncyBzZWxlY3RlZEluZGV4IHRvIC0xLCBvdGhlcndpc2Ugc2V0dGluZ1xuICAgICAgICAgICAgICAgIC8vIGZyb21FbC5zZWxlY3RlZCB1c2luZyB0aGUgc3luY0Jvb2xlYW5BdHRyUHJvcCBiZWxvdyBoYXMgbm8gZWZmZWN0LlxuICAgICAgICAgICAgICAgIC8vIFRoZSBjb3JyZWN0IHNlbGVjdGVkSW5kZXggd2lsbCBiZSBzZXQgaW4gdGhlIFNFTEVDVCBzcGVjaWFsIGhhbmRsZXIgYmVsb3cuXG4gICAgICAgICAgICAgICAgcGFyZW50Tm9kZS5zZWxlY3RlZEluZGV4ID0gLTE7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgc3luY0Jvb2xlYW5BdHRyUHJvcChmcm9tRWwsIHRvRWwsICdzZWxlY3RlZCcpO1xuICAgIH0sXG4gICAgLyoqXG4gICAgICogVGhlIFwidmFsdWVcIiBhdHRyaWJ1dGUgaXMgc3BlY2lhbCBmb3IgdGhlIDxpbnB1dD4gZWxlbWVudCBzaW5jZSBpdCBzZXRzXG4gICAgICogdGhlIGluaXRpYWwgdmFsdWUuIENoYW5naW5nIHRoZSBcInZhbHVlXCIgYXR0cmlidXRlIHdpdGhvdXQgY2hhbmdpbmcgdGhlXG4gICAgICogXCJ2YWx1ZVwiIHByb3BlcnR5IHdpbGwgaGF2ZSBubyBlZmZlY3Qgc2luY2UgaXQgaXMgb25seSB1c2VkIHRvIHRoZSBzZXQgdGhlXG4gICAgICogaW5pdGlhbCB2YWx1ZS4gIFNpbWlsYXIgZm9yIHRoZSBcImNoZWNrZWRcIiBhdHRyaWJ1dGUsIGFuZCBcImRpc2FibGVkXCIuXG4gICAgICovXG4gICAgSU5QVVQ6IGZ1bmN0aW9uKGZyb21FbCwgdG9FbCkge1xuICAgICAgICBzeW5jQm9vbGVhbkF0dHJQcm9wKGZyb21FbCwgdG9FbCwgJ2NoZWNrZWQnKTtcbiAgICAgICAgc3luY0Jvb2xlYW5BdHRyUHJvcChmcm9tRWwsIHRvRWwsICdkaXNhYmxlZCcpO1xuXG4gICAgICAgIGlmIChmcm9tRWwudmFsdWUgIT09IHRvRWwudmFsdWUpIHtcbiAgICAgICAgICAgIGZyb21FbC52YWx1ZSA9IHRvRWwudmFsdWU7XG4gICAgICAgIH1cblxuICAgICAgICBpZiAoIXRvRWwuaGFzQXR0cmlidXRlKCd2YWx1ZScpKSB7XG4gICAgICAgICAgICBmcm9tRWwucmVtb3ZlQXR0cmlidXRlKCd2YWx1ZScpO1xuICAgICAgICB9XG4gICAgfSxcblxuICAgIFRFWFRBUkVBOiBmdW5jdGlvbihmcm9tRWwsIHRvRWwpIHtcbiAgICAgICAgdmFyIG5ld1ZhbHVlID0gdG9FbC52YWx1ZTtcbiAgICAgICAgaWYgKGZyb21FbC52YWx1ZSAhPT0gbmV3VmFsdWUpIHtcbiAgICAgICAgICAgIGZyb21FbC52YWx1ZSA9IG5ld1ZhbHVlO1xuICAgICAgICB9XG5cbiAgICAgICAgdmFyIGZpcnN0Q2hpbGQgPSBmcm9tRWwuZmlyc3RDaGlsZDtcbiAgICAgICAgaWYgKGZpcnN0Q2hpbGQpIHtcbiAgICAgICAgICAgIC8vIE5lZWRlZCBmb3IgSUUuIEFwcGFyZW50bHkgSUUgc2V0cyB0aGUgcGxhY2Vob2xkZXIgYXMgdGhlXG4gICAgICAgICAgICAvLyBub2RlIHZhbHVlIGFuZCB2aXNlIHZlcnNhLiBUaGlzIGlnbm9yZXMgYW4gZW1wdHkgdXBkYXRlLlxuICAgICAgICAgICAgdmFyIG9sZFZhbHVlID0gZmlyc3RDaGlsZC5ub2RlVmFsdWU7XG5cbiAgICAgICAgICAgIGlmIChvbGRWYWx1ZSA9PSBuZXdWYWx1ZSB8fCAoIW5ld1ZhbHVlICYmIG9sZFZhbHVlID09IGZyb21FbC5wbGFjZWhvbGRlcikpIHtcbiAgICAgICAgICAgICAgICByZXR1cm47XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIGZpcnN0Q2hpbGQubm9kZVZhbHVlID0gbmV3VmFsdWU7XG4gICAgICAgIH1cbiAgICB9LFxuICAgIFNFTEVDVDogZnVuY3Rpb24oZnJvbUVsLCB0b0VsKSB7XG4gICAgICAgIGlmICghdG9FbC5oYXNBdHRyaWJ1dGUoJ211bHRpcGxlJykpIHtcbiAgICAgICAgICAgIHZhciBzZWxlY3RlZEluZGV4ID0gLTE7XG4gICAgICAgICAgICB2YXIgaSA9IDA7XG4gICAgICAgICAgICAvLyBXZSBoYXZlIHRvIGxvb3AgdGhyb3VnaCBjaGlsZHJlbiBvZiBmcm9tRWwsIG5vdCB0b0VsIHNpbmNlIG5vZGVzIGNhbiBiZSBtb3ZlZFxuICAgICAgICAgICAgLy8gZnJvbSB0b0VsIHRvIGZyb21FbCBkaXJlY3RseSB3aGVuIG1vcnBoaW5nLlxuICAgICAgICAgICAgLy8gQXQgdGhlIHRpbWUgdGhpcyBzcGVjaWFsIGhhbmRsZXIgaXMgaW52b2tlZCwgYWxsIGNoaWxkcmVuIGhhdmUgYWxyZWFkeSBiZWVuIG1vcnBoZWRcbiAgICAgICAgICAgIC8vIGFuZCBhcHBlbmRlZCB0byAvIHJlbW92ZWQgZnJvbSBmcm9tRWwsIHNvIHVzaW5nIGZyb21FbCBoZXJlIGlzIHNhZmUgYW5kIGNvcnJlY3QuXG4gICAgICAgICAgICB2YXIgY3VyQ2hpbGQgPSBmcm9tRWwuZmlyc3RDaGlsZDtcbiAgICAgICAgICAgIHZhciBvcHRncm91cDtcbiAgICAgICAgICAgIHZhciBub2RlTmFtZTtcbiAgICAgICAgICAgIHdoaWxlKGN1ckNoaWxkKSB7XG4gICAgICAgICAgICAgICAgbm9kZU5hbWUgPSBjdXJDaGlsZC5ub2RlTmFtZSAmJiBjdXJDaGlsZC5ub2RlTmFtZS50b1VwcGVyQ2FzZSgpO1xuICAgICAgICAgICAgICAgIGlmIChub2RlTmFtZSA9PT0gJ09QVEdST1VQJykge1xuICAgICAgICAgICAgICAgICAgICBvcHRncm91cCA9IGN1ckNoaWxkO1xuICAgICAgICAgICAgICAgICAgICBjdXJDaGlsZCA9IG9wdGdyb3VwLmZpcnN0Q2hpbGQ7XG4gICAgICAgICAgICAgICAgICAgIC8vIGhhbmRsZSBlbXB0eSBvcHRncm91cHNcbiAgICAgICAgICAgICAgICAgICAgaWYgKCFjdXJDaGlsZCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgY3VyQ2hpbGQgPSBvcHRncm91cC5uZXh0U2libGluZztcbiAgICAgICAgICAgICAgICAgICAgICAgIG9wdGdyb3VwID0gbnVsbDtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgIGlmIChub2RlTmFtZSA9PT0gJ09QVElPTicpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGlmIChjdXJDaGlsZC5oYXNBdHRyaWJ1dGUoJ3NlbGVjdGVkJykpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZWxlY3RlZEluZGV4ID0gaTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgIGkrKztcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICBjdXJDaGlsZCA9IGN1ckNoaWxkLm5leHRTaWJsaW5nO1xuICAgICAgICAgICAgICAgICAgICBpZiAoIWN1ckNoaWxkICYmIG9wdGdyb3VwKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBjdXJDaGlsZCA9IG9wdGdyb3VwLm5leHRTaWJsaW5nO1xuICAgICAgICAgICAgICAgICAgICAgICAgb3B0Z3JvdXAgPSBudWxsO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBmcm9tRWwuc2VsZWN0ZWRJbmRleCA9IHNlbGVjdGVkSW5kZXg7XG4gICAgICAgIH1cbiAgICB9XG59O1xuXG52YXIgRUxFTUVOVF9OT0RFID0gMTtcbnZhciBET0NVTUVOVF9GUkFHTUVOVF9OT0RFJDEgPSAxMTtcbnZhciBURVhUX05PREUgPSAzO1xudmFyIENPTU1FTlRfTk9ERSA9IDg7XG5cbmZ1bmN0aW9uIG5vb3AoKSB7fVxuXG5mdW5jdGlvbiBkZWZhdWx0R2V0Tm9kZUtleShub2RlKSB7XG4gIGlmIChub2RlKSB7XG4gICAgcmV0dXJuIChub2RlLmdldEF0dHJpYnV0ZSAmJiBub2RlLmdldEF0dHJpYnV0ZSgnaWQnKSkgfHwgbm9kZS5pZDtcbiAgfVxufVxuXG5mdW5jdGlvbiBtb3JwaGRvbUZhY3RvcnkobW9ycGhBdHRycykge1xuXG4gIHJldHVybiBmdW5jdGlvbiBtb3JwaGRvbShmcm9tTm9kZSwgdG9Ob2RlLCBvcHRpb25zKSB7XG4gICAgaWYgKCFvcHRpb25zKSB7XG4gICAgICBvcHRpb25zID0ge307XG4gICAgfVxuXG4gICAgaWYgKHR5cGVvZiB0b05vZGUgPT09ICdzdHJpbmcnKSB7XG4gICAgICBpZiAoZnJvbU5vZGUubm9kZU5hbWUgPT09ICcjZG9jdW1lbnQnIHx8IGZyb21Ob2RlLm5vZGVOYW1lID09PSAnSFRNTCcgfHwgZnJvbU5vZGUubm9kZU5hbWUgPT09ICdCT0RZJykge1xuICAgICAgICB2YXIgdG9Ob2RlSHRtbCA9IHRvTm9kZTtcbiAgICAgICAgdG9Ob2RlID0gZG9jLmNyZWF0ZUVsZW1lbnQoJ2h0bWwnKTtcbiAgICAgICAgdG9Ob2RlLmlubmVySFRNTCA9IHRvTm9kZUh0bWw7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICB0b05vZGUgPSB0b0VsZW1lbnQodG9Ob2RlKTtcbiAgICAgIH1cbiAgICB9IGVsc2UgaWYgKHRvTm9kZS5ub2RlVHlwZSA9PT0gRE9DVU1FTlRfRlJBR01FTlRfTk9ERSQxKSB7XG4gICAgICB0b05vZGUgPSB0b05vZGUuZmlyc3RFbGVtZW50Q2hpbGQ7XG4gICAgfVxuXG4gICAgdmFyIGdldE5vZGVLZXkgPSBvcHRpb25zLmdldE5vZGVLZXkgfHwgZGVmYXVsdEdldE5vZGVLZXk7XG4gICAgdmFyIG9uQmVmb3JlTm9kZUFkZGVkID0gb3B0aW9ucy5vbkJlZm9yZU5vZGVBZGRlZCB8fCBub29wO1xuICAgIHZhciBvbk5vZGVBZGRlZCA9IG9wdGlvbnMub25Ob2RlQWRkZWQgfHwgbm9vcDtcbiAgICB2YXIgb25CZWZvcmVFbFVwZGF0ZWQgPSBvcHRpb25zLm9uQmVmb3JlRWxVcGRhdGVkIHx8IG5vb3A7XG4gICAgdmFyIG9uRWxVcGRhdGVkID0gb3B0aW9ucy5vbkVsVXBkYXRlZCB8fCBub29wO1xuICAgIHZhciBvbkJlZm9yZU5vZGVEaXNjYXJkZWQgPSBvcHRpb25zLm9uQmVmb3JlTm9kZURpc2NhcmRlZCB8fCBub29wO1xuICAgIHZhciBvbk5vZGVEaXNjYXJkZWQgPSBvcHRpb25zLm9uTm9kZURpc2NhcmRlZCB8fCBub29wO1xuICAgIHZhciBvbkJlZm9yZUVsQ2hpbGRyZW5VcGRhdGVkID0gb3B0aW9ucy5vbkJlZm9yZUVsQ2hpbGRyZW5VcGRhdGVkIHx8IG5vb3A7XG4gICAgdmFyIHNraXBGcm9tQ2hpbGRyZW4gPSBvcHRpb25zLnNraXBGcm9tQ2hpbGRyZW4gfHwgbm9vcDtcbiAgICB2YXIgYWRkQ2hpbGQgPSBvcHRpb25zLmFkZENoaWxkIHx8IGZ1bmN0aW9uKHBhcmVudCwgY2hpbGQpeyByZXR1cm4gcGFyZW50LmFwcGVuZENoaWxkKGNoaWxkKTsgfTtcbiAgICB2YXIgY2hpbGRyZW5Pbmx5ID0gb3B0aW9ucy5jaGlsZHJlbk9ubHkgPT09IHRydWU7XG5cbiAgICAvLyBUaGlzIG9iamVjdCBpcyB1c2VkIGFzIGEgbG9va3VwIHRvIHF1aWNrbHkgZmluZCBhbGwga2V5ZWQgZWxlbWVudHMgaW4gdGhlIG9yaWdpbmFsIERPTSB0cmVlLlxuICAgIHZhciBmcm9tTm9kZXNMb29rdXAgPSBPYmplY3QuY3JlYXRlKG51bGwpO1xuICAgIHZhciBrZXllZFJlbW92YWxMaXN0ID0gW107XG5cbiAgICBmdW5jdGlvbiBhZGRLZXllZFJlbW92YWwoa2V5KSB7XG4gICAgICBrZXllZFJlbW92YWxMaXN0LnB1c2goa2V5KTtcbiAgICB9XG5cbiAgICBmdW5jdGlvbiB3YWxrRGlzY2FyZGVkQ2hpbGROb2Rlcyhub2RlLCBza2lwS2V5ZWROb2Rlcykge1xuICAgICAgaWYgKG5vZGUubm9kZVR5cGUgPT09IEVMRU1FTlRfTk9ERSkge1xuICAgICAgICB2YXIgY3VyQ2hpbGQgPSBub2RlLmZpcnN0Q2hpbGQ7XG4gICAgICAgIHdoaWxlIChjdXJDaGlsZCkge1xuXG4gICAgICAgICAgdmFyIGtleSA9IHVuZGVmaW5lZDtcblxuICAgICAgICAgIGlmIChza2lwS2V5ZWROb2RlcyAmJiAoa2V5ID0gZ2V0Tm9kZUtleShjdXJDaGlsZCkpKSB7XG4gICAgICAgICAgICAvLyBJZiB3ZSBhcmUgc2tpcHBpbmcga2V5ZWQgbm9kZXMgdGhlbiB3ZSBhZGQgdGhlIGtleVxuICAgICAgICAgICAgLy8gdG8gYSBsaXN0IHNvIHRoYXQgaXQgY2FuIGJlIGhhbmRsZWQgYXQgdGhlIHZlcnkgZW5kLlxuICAgICAgICAgICAgYWRkS2V5ZWRSZW1vdmFsKGtleSk7XG4gICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIC8vIE9ubHkgcmVwb3J0IHRoZSBub2RlIGFzIGRpc2NhcmRlZCBpZiBpdCBpcyBub3Qga2V5ZWQuIFdlIGRvIHRoaXMgYmVjYXVzZVxuICAgICAgICAgICAgLy8gYXQgdGhlIGVuZCB3ZSBsb29wIHRocm91Z2ggYWxsIGtleWVkIGVsZW1lbnRzIHRoYXQgd2VyZSB1bm1hdGNoZWRcbiAgICAgICAgICAgIC8vIGFuZCB0aGVuIGRpc2NhcmQgdGhlbSBpbiBvbmUgZmluYWwgcGFzcy5cbiAgICAgICAgICAgIG9uTm9kZURpc2NhcmRlZChjdXJDaGlsZCk7XG4gICAgICAgICAgICBpZiAoY3VyQ2hpbGQuZmlyc3RDaGlsZCkge1xuICAgICAgICAgICAgICB3YWxrRGlzY2FyZGVkQ2hpbGROb2RlcyhjdXJDaGlsZCwgc2tpcEtleWVkTm9kZXMpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgIH1cblxuICAgICAgICAgIGN1ckNoaWxkID0gY3VyQ2hpbGQubmV4dFNpYmxpbmc7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9XG5cbiAgICAvKipcbiAgICAqIFJlbW92ZXMgYSBET00gbm9kZSBvdXQgb2YgdGhlIG9yaWdpbmFsIERPTVxuICAgICpcbiAgICAqIEBwYXJhbSAge05vZGV9IG5vZGUgVGhlIG5vZGUgdG8gcmVtb3ZlXG4gICAgKiBAcGFyYW0gIHtOb2RlfSBwYXJlbnROb2RlIFRoZSBub2RlcyBwYXJlbnRcbiAgICAqIEBwYXJhbSAge0Jvb2xlYW59IHNraXBLZXllZE5vZGVzIElmIHRydWUgdGhlbiBlbGVtZW50cyB3aXRoIGtleXMgd2lsbCBiZSBza2lwcGVkIGFuZCBub3QgZGlzY2FyZGVkLlxuICAgICogQHJldHVybiB7dW5kZWZpbmVkfVxuICAgICovXG4gICAgZnVuY3Rpb24gcmVtb3ZlTm9kZShub2RlLCBwYXJlbnROb2RlLCBza2lwS2V5ZWROb2Rlcykge1xuICAgICAgaWYgKG9uQmVmb3JlTm9kZURpc2NhcmRlZChub2RlKSA9PT0gZmFsc2UpIHtcbiAgICAgICAgcmV0dXJuO1xuICAgICAgfVxuXG4gICAgICBpZiAocGFyZW50Tm9kZSkge1xuICAgICAgICBwYXJlbnROb2RlLnJlbW92ZUNoaWxkKG5vZGUpO1xuICAgICAgfVxuXG4gICAgICBvbk5vZGVEaXNjYXJkZWQobm9kZSk7XG4gICAgICB3YWxrRGlzY2FyZGVkQ2hpbGROb2Rlcyhub2RlLCBza2lwS2V5ZWROb2Rlcyk7XG4gICAgfVxuXG4gICAgLy8gLy8gVHJlZVdhbGtlciBpbXBsZW1lbnRhdGlvbiBpcyBubyBmYXN0ZXIsIGJ1dCBrZWVwaW5nIHRoaXMgYXJvdW5kIGluIGNhc2UgdGhpcyBjaGFuZ2VzIGluIHRoZSBmdXR1cmVcbiAgICAvLyBmdW5jdGlvbiBpbmRleFRyZWUocm9vdCkge1xuICAgIC8vICAgICB2YXIgdHJlZVdhbGtlciA9IGRvY3VtZW50LmNyZWF0ZVRyZWVXYWxrZXIoXG4gICAgLy8gICAgICAgICByb290LFxuICAgIC8vICAgICAgICAgTm9kZUZpbHRlci5TSE9XX0VMRU1FTlQpO1xuICAgIC8vXG4gICAgLy8gICAgIHZhciBlbDtcbiAgICAvLyAgICAgd2hpbGUoKGVsID0gdHJlZVdhbGtlci5uZXh0Tm9kZSgpKSkge1xuICAgIC8vICAgICAgICAgdmFyIGtleSA9IGdldE5vZGVLZXkoZWwpO1xuICAgIC8vICAgICAgICAgaWYgKGtleSkge1xuICAgIC8vICAgICAgICAgICAgIGZyb21Ob2Rlc0xvb2t1cFtrZXldID0gZWw7XG4gICAgLy8gICAgICAgICB9XG4gICAgLy8gICAgIH1cbiAgICAvLyB9XG5cbiAgICAvLyAvLyBOb2RlSXRlcmF0b3IgaW1wbGVtZW50YXRpb24gaXMgbm8gZmFzdGVyLCBidXQga2VlcGluZyB0aGlzIGFyb3VuZCBpbiBjYXNlIHRoaXMgY2hhbmdlcyBpbiB0aGUgZnV0dXJlXG4gICAgLy9cbiAgICAvLyBmdW5jdGlvbiBpbmRleFRyZWUobm9kZSkge1xuICAgIC8vICAgICB2YXIgbm9kZUl0ZXJhdG9yID0gZG9jdW1lbnQuY3JlYXRlTm9kZUl0ZXJhdG9yKG5vZGUsIE5vZGVGaWx0ZXIuU0hPV19FTEVNRU5UKTtcbiAgICAvLyAgICAgdmFyIGVsO1xuICAgIC8vICAgICB3aGlsZSgoZWwgPSBub2RlSXRlcmF0b3IubmV4dE5vZGUoKSkpIHtcbiAgICAvLyAgICAgICAgIHZhciBrZXkgPSBnZXROb2RlS2V5KGVsKTtcbiAgICAvLyAgICAgICAgIGlmIChrZXkpIHtcbiAgICAvLyAgICAgICAgICAgICBmcm9tTm9kZXNMb29rdXBba2V5XSA9IGVsO1xuICAgIC8vICAgICAgICAgfVxuICAgIC8vICAgICB9XG4gICAgLy8gfVxuXG4gICAgZnVuY3Rpb24gaW5kZXhUcmVlKG5vZGUpIHtcbiAgICAgIGlmIChub2RlLm5vZGVUeXBlID09PSBFTEVNRU5UX05PREUgfHwgbm9kZS5ub2RlVHlwZSA9PT0gRE9DVU1FTlRfRlJBR01FTlRfTk9ERSQxKSB7XG4gICAgICAgIHZhciBjdXJDaGlsZCA9IG5vZGUuZmlyc3RDaGlsZDtcbiAgICAgICAgd2hpbGUgKGN1ckNoaWxkKSB7XG4gICAgICAgICAgdmFyIGtleSA9IGdldE5vZGVLZXkoY3VyQ2hpbGQpO1xuICAgICAgICAgIGlmIChrZXkpIHtcbiAgICAgICAgICAgIGZyb21Ob2Rlc0xvb2t1cFtrZXldID0gY3VyQ2hpbGQ7XG4gICAgICAgICAgfVxuXG4gICAgICAgICAgLy8gV2FsayByZWN1cnNpdmVseVxuICAgICAgICAgIGluZGV4VHJlZShjdXJDaGlsZCk7XG5cbiAgICAgICAgICBjdXJDaGlsZCA9IGN1ckNoaWxkLm5leHRTaWJsaW5nO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfVxuXG4gICAgaW5kZXhUcmVlKGZyb21Ob2RlKTtcblxuICAgIGZ1bmN0aW9uIGhhbmRsZU5vZGVBZGRlZChlbCkge1xuICAgICAgb25Ob2RlQWRkZWQoZWwpO1xuXG4gICAgICB2YXIgY3VyQ2hpbGQgPSBlbC5maXJzdENoaWxkO1xuICAgICAgd2hpbGUgKGN1ckNoaWxkKSB7XG4gICAgICAgIHZhciBuZXh0U2libGluZyA9IGN1ckNoaWxkLm5leHRTaWJsaW5nO1xuXG4gICAgICAgIHZhciBrZXkgPSBnZXROb2RlS2V5KGN1ckNoaWxkKTtcbiAgICAgICAgaWYgKGtleSkge1xuICAgICAgICAgIHZhciB1bm1hdGNoZWRGcm9tRWwgPSBmcm9tTm9kZXNMb29rdXBba2V5XTtcbiAgICAgICAgICAvLyBpZiB3ZSBmaW5kIGEgZHVwbGljYXRlICNpZCBub2RlIGluIGNhY2hlLCByZXBsYWNlIGBlbGAgd2l0aCBjYWNoZSB2YWx1ZVxuICAgICAgICAgIC8vIGFuZCBtb3JwaCBpdCB0byB0aGUgY2hpbGQgbm9kZS5cbiAgICAgICAgICBpZiAodW5tYXRjaGVkRnJvbUVsICYmIGNvbXBhcmVOb2RlTmFtZXMoY3VyQ2hpbGQsIHVubWF0Y2hlZEZyb21FbCkpIHtcbiAgICAgICAgICAgIGN1ckNoaWxkLnBhcmVudE5vZGUucmVwbGFjZUNoaWxkKHVubWF0Y2hlZEZyb21FbCwgY3VyQ2hpbGQpO1xuICAgICAgICAgICAgbW9ycGhFbCh1bm1hdGNoZWRGcm9tRWwsIGN1ckNoaWxkKTtcbiAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgaGFuZGxlTm9kZUFkZGVkKGN1ckNoaWxkKTtcbiAgICAgICAgICB9XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgLy8gcmVjdXJzaXZlbHkgY2FsbCBmb3IgY3VyQ2hpbGQgYW5kIGl0J3MgY2hpbGRyZW4gdG8gc2VlIGlmIHdlIGZpbmQgc29tZXRoaW5nIGluXG4gICAgICAgICAgLy8gZnJvbU5vZGVzTG9va3VwXG4gICAgICAgICAgaGFuZGxlTm9kZUFkZGVkKGN1ckNoaWxkKTtcbiAgICAgICAgfVxuXG4gICAgICAgIGN1ckNoaWxkID0gbmV4dFNpYmxpbmc7XG4gICAgICB9XG4gICAgfVxuXG4gICAgZnVuY3Rpb24gY2xlYW51cEZyb21FbChmcm9tRWwsIGN1ckZyb21Ob2RlQ2hpbGQsIGN1ckZyb21Ob2RlS2V5KSB7XG4gICAgICAvLyBXZSBoYXZlIHByb2Nlc3NlZCBhbGwgb2YgdGhlIFwidG8gbm9kZXNcIi4gSWYgY3VyRnJvbU5vZGVDaGlsZCBpc1xuICAgICAgLy8gbm9uLW51bGwgdGhlbiB3ZSBzdGlsbCBoYXZlIHNvbWUgZnJvbSBub2RlcyBsZWZ0IG92ZXIgdGhhdCBuZWVkXG4gICAgICAvLyB0byBiZSByZW1vdmVkXG4gICAgICB3aGlsZSAoY3VyRnJvbU5vZGVDaGlsZCkge1xuICAgICAgICB2YXIgZnJvbU5leHRTaWJsaW5nID0gY3VyRnJvbU5vZGVDaGlsZC5uZXh0U2libGluZztcbiAgICAgICAgaWYgKChjdXJGcm9tTm9kZUtleSA9IGdldE5vZGVLZXkoY3VyRnJvbU5vZGVDaGlsZCkpKSB7XG4gICAgICAgICAgLy8gU2luY2UgdGhlIG5vZGUgaXMga2V5ZWQgaXQgbWlnaHQgYmUgbWF0Y2hlZCB1cCBsYXRlciBzbyB3ZSBkZWZlclxuICAgICAgICAgIC8vIHRoZSBhY3R1YWwgcmVtb3ZhbCB0byBsYXRlclxuICAgICAgICAgIGFkZEtleWVkUmVtb3ZhbChjdXJGcm9tTm9kZUtleSk7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgLy8gTk9URTogd2Ugc2tpcCBuZXN0ZWQga2V5ZWQgbm9kZXMgZnJvbSBiZWluZyByZW1vdmVkIHNpbmNlIHRoZXJlIGlzXG4gICAgICAgICAgLy8gICAgICAgc3RpbGwgYSBjaGFuY2UgdGhleSB3aWxsIGJlIG1hdGNoZWQgdXAgbGF0ZXJcbiAgICAgICAgICByZW1vdmVOb2RlKGN1ckZyb21Ob2RlQ2hpbGQsIGZyb21FbCwgdHJ1ZSAvKiBza2lwIGtleWVkIG5vZGVzICovKTtcbiAgICAgICAgfVxuICAgICAgICBjdXJGcm9tTm9kZUNoaWxkID0gZnJvbU5leHRTaWJsaW5nO1xuICAgICAgfVxuICAgIH1cblxuICAgIGZ1bmN0aW9uIG1vcnBoRWwoZnJvbUVsLCB0b0VsLCBjaGlsZHJlbk9ubHkpIHtcbiAgICAgIHZhciB0b0VsS2V5ID0gZ2V0Tm9kZUtleSh0b0VsKTtcblxuICAgICAgaWYgKHRvRWxLZXkpIHtcbiAgICAgICAgLy8gSWYgYW4gZWxlbWVudCB3aXRoIGFuIElEIGlzIGJlaW5nIG1vcnBoZWQgdGhlbiBpdCB3aWxsIGJlIGluIHRoZSBmaW5hbFxuICAgICAgICAvLyBET00gc28gY2xlYXIgaXQgb3V0IG9mIHRoZSBzYXZlZCBlbGVtZW50cyBjb2xsZWN0aW9uXG4gICAgICAgIGRlbGV0ZSBmcm9tTm9kZXNMb29rdXBbdG9FbEtleV07XG4gICAgICB9XG5cbiAgICAgIGlmICghY2hpbGRyZW5Pbmx5KSB7XG4gICAgICAgIC8vIG9wdGlvbmFsXG4gICAgICAgIHZhciBiZWZvcmVVcGRhdGVSZXN1bHQgPSBvbkJlZm9yZUVsVXBkYXRlZChmcm9tRWwsIHRvRWwpO1xuICAgICAgICBpZiAoYmVmb3JlVXBkYXRlUmVzdWx0ID09PSBmYWxzZSkge1xuICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfSBlbHNlIGlmIChiZWZvcmVVcGRhdGVSZXN1bHQgaW5zdGFuY2VvZiBIVE1MRWxlbWVudCkge1xuICAgICAgICAgIGZyb21FbCA9IGJlZm9yZVVwZGF0ZVJlc3VsdDtcbiAgICAgICAgICAvLyByZWluZGV4IHRoZSBuZXcgZnJvbUVsIGluIGNhc2UgaXQncyBub3QgaW4gdGhlIHNhbWVcbiAgICAgICAgICAvLyB0cmVlIGFzIHRoZSBvcmlnaW5hbCBmcm9tRWxcbiAgICAgICAgICAvLyAoUGhvZW5peCBMaXZlVmlldyBzb21ldGltZXMgcmV0dXJucyBhIGNsb25lZCB0cmVlLFxuICAgICAgICAgIC8vICBidXQga2V5ZWQgbG9va3VwcyB3b3VsZCBzdGlsbCBwb2ludCB0byB0aGUgb3JpZ2luYWwgdHJlZSlcbiAgICAgICAgICBpbmRleFRyZWUoZnJvbUVsKTtcbiAgICAgICAgfVxuXG4gICAgICAgIC8vIHVwZGF0ZSBhdHRyaWJ1dGVzIG9uIG9yaWdpbmFsIERPTSBlbGVtZW50IGZpcnN0XG4gICAgICAgIG1vcnBoQXR0cnMoZnJvbUVsLCB0b0VsKTtcbiAgICAgICAgLy8gb3B0aW9uYWxcbiAgICAgICAgb25FbFVwZGF0ZWQoZnJvbUVsKTtcblxuICAgICAgICBpZiAob25CZWZvcmVFbENoaWxkcmVuVXBkYXRlZChmcm9tRWwsIHRvRWwpID09PSBmYWxzZSkge1xuICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuICAgICAgfVxuXG4gICAgICBpZiAoZnJvbUVsLm5vZGVOYW1lICE9PSAnVEVYVEFSRUEnKSB7XG4gICAgICAgIG1vcnBoQ2hpbGRyZW4oZnJvbUVsLCB0b0VsKTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHNwZWNpYWxFbEhhbmRsZXJzLlRFWFRBUkVBKGZyb21FbCwgdG9FbCk7XG4gICAgICB9XG4gICAgfVxuXG4gICAgZnVuY3Rpb24gbW9ycGhDaGlsZHJlbihmcm9tRWwsIHRvRWwpIHtcbiAgICAgIHZhciBza2lwRnJvbSA9IHNraXBGcm9tQ2hpbGRyZW4oZnJvbUVsLCB0b0VsKTtcbiAgICAgIHZhciBjdXJUb05vZGVDaGlsZCA9IHRvRWwuZmlyc3RDaGlsZDtcbiAgICAgIHZhciBjdXJGcm9tTm9kZUNoaWxkID0gZnJvbUVsLmZpcnN0Q2hpbGQ7XG4gICAgICB2YXIgY3VyVG9Ob2RlS2V5O1xuICAgICAgdmFyIGN1ckZyb21Ob2RlS2V5O1xuXG4gICAgICB2YXIgZnJvbU5leHRTaWJsaW5nO1xuICAgICAgdmFyIHRvTmV4dFNpYmxpbmc7XG4gICAgICB2YXIgbWF0Y2hpbmdGcm9tRWw7XG5cbiAgICAgIC8vIHdhbGsgdGhlIGNoaWxkcmVuXG4gICAgICBvdXRlcjogd2hpbGUgKGN1clRvTm9kZUNoaWxkKSB7XG4gICAgICAgIHRvTmV4dFNpYmxpbmcgPSBjdXJUb05vZGVDaGlsZC5uZXh0U2libGluZztcbiAgICAgICAgY3VyVG9Ob2RlS2V5ID0gZ2V0Tm9kZUtleShjdXJUb05vZGVDaGlsZCk7XG5cbiAgICAgICAgLy8gd2FsayB0aGUgZnJvbU5vZGUgY2hpbGRyZW4gYWxsIHRoZSB3YXkgdGhyb3VnaFxuICAgICAgICB3aGlsZSAoIXNraXBGcm9tICYmIGN1ckZyb21Ob2RlQ2hpbGQpIHtcbiAgICAgICAgICBmcm9tTmV4dFNpYmxpbmcgPSBjdXJGcm9tTm9kZUNoaWxkLm5leHRTaWJsaW5nO1xuXG4gICAgICAgICAgaWYgKGN1clRvTm9kZUNoaWxkLmlzU2FtZU5vZGUgJiYgY3VyVG9Ob2RlQ2hpbGQuaXNTYW1lTm9kZShjdXJGcm9tTm9kZUNoaWxkKSkge1xuICAgICAgICAgICAgY3VyVG9Ob2RlQ2hpbGQgPSB0b05leHRTaWJsaW5nO1xuICAgICAgICAgICAgY3VyRnJvbU5vZGVDaGlsZCA9IGZyb21OZXh0U2libGluZztcbiAgICAgICAgICAgIGNvbnRpbnVlIG91dGVyO1xuICAgICAgICAgIH1cblxuICAgICAgICAgIGN1ckZyb21Ob2RlS2V5ID0gZ2V0Tm9kZUtleShjdXJGcm9tTm9kZUNoaWxkKTtcblxuICAgICAgICAgIHZhciBjdXJGcm9tTm9kZVR5cGUgPSBjdXJGcm9tTm9kZUNoaWxkLm5vZGVUeXBlO1xuXG4gICAgICAgICAgLy8gdGhpcyBtZWFucyBpZiB0aGUgY3VyRnJvbU5vZGVDaGlsZCBkb2VzbnQgaGF2ZSBhIG1hdGNoIHdpdGggdGhlIGN1clRvTm9kZUNoaWxkXG4gICAgICAgICAgdmFyIGlzQ29tcGF0aWJsZSA9IHVuZGVmaW5lZDtcblxuICAgICAgICAgIGlmIChjdXJGcm9tTm9kZVR5cGUgPT09IGN1clRvTm9kZUNoaWxkLm5vZGVUeXBlKSB7XG4gICAgICAgICAgICBpZiAoY3VyRnJvbU5vZGVUeXBlID09PSBFTEVNRU5UX05PREUpIHtcbiAgICAgICAgICAgICAgLy8gQm90aCBub2RlcyBiZWluZyBjb21wYXJlZCBhcmUgRWxlbWVudCBub2Rlc1xuXG4gICAgICAgICAgICAgIGlmIChjdXJUb05vZGVLZXkpIHtcbiAgICAgICAgICAgICAgICAvLyBUaGUgdGFyZ2V0IG5vZGUgaGFzIGEga2V5IHNvIHdlIHdhbnQgdG8gbWF0Y2ggaXQgdXAgd2l0aCB0aGUgY29ycmVjdCBlbGVtZW50XG4gICAgICAgICAgICAgICAgLy8gaW4gdGhlIG9yaWdpbmFsIERPTSB0cmVlXG4gICAgICAgICAgICAgICAgaWYgKGN1clRvTm9kZUtleSAhPT0gY3VyRnJvbU5vZGVLZXkpIHtcbiAgICAgICAgICAgICAgICAgIC8vIFRoZSBjdXJyZW50IGVsZW1lbnQgaW4gdGhlIG9yaWdpbmFsIERPTSB0cmVlIGRvZXMgbm90IGhhdmUgYSBtYXRjaGluZyBrZXkgc29cbiAgICAgICAgICAgICAgICAgIC8vIGxldCdzIGNoZWNrIG91ciBsb29rdXAgdG8gc2VlIGlmIHRoZXJlIGlzIGEgbWF0Y2hpbmcgZWxlbWVudCBpbiB0aGUgb3JpZ2luYWxcbiAgICAgICAgICAgICAgICAgIC8vIERPTSB0cmVlXG4gICAgICAgICAgICAgICAgICBpZiAoKG1hdGNoaW5nRnJvbUVsID0gZnJvbU5vZGVzTG9va3VwW2N1clRvTm9kZUtleV0pKSB7XG4gICAgICAgICAgICAgICAgICAgIGlmIChmcm9tTmV4dFNpYmxpbmcgPT09IG1hdGNoaW5nRnJvbUVsKSB7XG4gICAgICAgICAgICAgICAgICAgICAgLy8gU3BlY2lhbCBjYXNlIGZvciBzaW5nbGUgZWxlbWVudCByZW1vdmFscy4gVG8gYXZvaWQgcmVtb3ZpbmcgdGhlIG9yaWdpbmFsXG4gICAgICAgICAgICAgICAgICAgICAgLy8gRE9NIG5vZGUgb3V0IG9mIHRoZSB0cmVlIChzaW5jZSB0aGF0IGNhbiBicmVhayBDU1MgdHJhbnNpdGlvbnMsIGV0Yy4pLFxuICAgICAgICAgICAgICAgICAgICAgIC8vIHdlIHdpbGwgaW5zdGVhZCBkaXNjYXJkIHRoZSBjdXJyZW50IG5vZGUgYW5kIHdhaXQgdW50aWwgdGhlIG5leHRcbiAgICAgICAgICAgICAgICAgICAgICAvLyBpdGVyYXRpb24gdG8gcHJvcGVybHkgbWF0Y2ggdXAgdGhlIGtleWVkIHRhcmdldCBlbGVtZW50IHdpdGggaXRzIG1hdGNoaW5nXG4gICAgICAgICAgICAgICAgICAgICAgLy8gZWxlbWVudCBpbiB0aGUgb3JpZ2luYWwgdHJlZVxuICAgICAgICAgICAgICAgICAgICAgIGlzQ29tcGF0aWJsZSA9IGZhbHNlO1xuICAgICAgICAgICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICAgIC8vIFdlIGZvdW5kIGEgbWF0Y2hpbmcga2V5ZWQgZWxlbWVudCBzb21ld2hlcmUgaW4gdGhlIG9yaWdpbmFsIERPTSB0cmVlLlxuICAgICAgICAgICAgICAgICAgICAgIC8vIExldCdzIG1vdmUgdGhlIG9yaWdpbmFsIERPTSBub2RlIGludG8gdGhlIGN1cnJlbnQgcG9zaXRpb24gYW5kIG1vcnBoXG4gICAgICAgICAgICAgICAgICAgICAgLy8gaXQuXG5cbiAgICAgICAgICAgICAgICAgICAgICAvLyBOT1RFOiBXZSB1c2UgaW5zZXJ0QmVmb3JlIGluc3RlYWQgb2YgcmVwbGFjZUNoaWxkIGJlY2F1c2Ugd2Ugd2FudCB0byBnbyB0aHJvdWdoXG4gICAgICAgICAgICAgICAgICAgICAgLy8gdGhlIGByZW1vdmVOb2RlKClgIGZ1bmN0aW9uIGZvciB0aGUgbm9kZSB0aGF0IGlzIGJlaW5nIGRpc2NhcmRlZCBzbyB0aGF0XG4gICAgICAgICAgICAgICAgICAgICAgLy8gYWxsIGxpZmVjeWNsZSBob29rcyBhcmUgY29ycmVjdGx5IGludm9rZWRcbiAgICAgICAgICAgICAgICAgICAgICBmcm9tRWwuaW5zZXJ0QmVmb3JlKG1hdGNoaW5nRnJvbUVsLCBjdXJGcm9tTm9kZUNoaWxkKTtcblxuICAgICAgICAgICAgICAgICAgICAgIC8vIGZyb21OZXh0U2libGluZyA9IGN1ckZyb21Ob2RlQ2hpbGQubmV4dFNpYmxpbmc7XG5cbiAgICAgICAgICAgICAgICAgICAgICBpZiAoY3VyRnJvbU5vZGVLZXkpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIC8vIFNpbmNlIHRoZSBub2RlIGlzIGtleWVkIGl0IG1pZ2h0IGJlIG1hdGNoZWQgdXAgbGF0ZXIgc28gd2UgZGVmZXJcbiAgICAgICAgICAgICAgICAgICAgICAgIC8vIHRoZSBhY3R1YWwgcmVtb3ZhbCB0byBsYXRlclxuICAgICAgICAgICAgICAgICAgICAgICAgYWRkS2V5ZWRSZW1vdmFsKGN1ckZyb21Ob2RlS2V5KTtcbiAgICAgICAgICAgICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICAgICAgLy8gTk9URTogd2Ugc2tpcCBuZXN0ZWQga2V5ZWQgbm9kZXMgZnJvbSBiZWluZyByZW1vdmVkIHNpbmNlIHRoZXJlIGlzXG4gICAgICAgICAgICAgICAgICAgICAgICAvLyAgICAgICBzdGlsbCBhIGNoYW5jZSB0aGV5IHdpbGwgYmUgbWF0Y2hlZCB1cCBsYXRlclxuICAgICAgICAgICAgICAgICAgICAgICAgcmVtb3ZlTm9kZShjdXJGcm9tTm9kZUNoaWxkLCBmcm9tRWwsIHRydWUgLyogc2tpcCBrZXllZCBub2RlcyAqLyk7XG4gICAgICAgICAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgICAgICAgICAgY3VyRnJvbU5vZGVDaGlsZCA9IG1hdGNoaW5nRnJvbUVsO1xuICAgICAgICAgICAgICAgICAgICAgIGN1ckZyb21Ob2RlS2V5ID0gZ2V0Tm9kZUtleShjdXJGcm9tTm9kZUNoaWxkKTtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgLy8gVGhlIG5vZGVzIGFyZSBub3QgY29tcGF0aWJsZSBzaW5jZSB0aGUgXCJ0b1wiIG5vZGUgaGFzIGEga2V5IGFuZCB0aGVyZVxuICAgICAgICAgICAgICAgICAgICAvLyBpcyBubyBtYXRjaGluZyBrZXllZCBub2RlIGluIHRoZSBzb3VyY2UgdHJlZVxuICAgICAgICAgICAgICAgICAgICBpc0NvbXBhdGlibGUgPSBmYWxzZTtcbiAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgIH0gZWxzZSBpZiAoY3VyRnJvbU5vZGVLZXkpIHtcbiAgICAgICAgICAgICAgICAvLyBUaGUgb3JpZ2luYWwgaGFzIGEga2V5XG4gICAgICAgICAgICAgICAgaXNDb21wYXRpYmxlID0gZmFsc2U7XG4gICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICBpc0NvbXBhdGlibGUgPSBpc0NvbXBhdGlibGUgIT09IGZhbHNlICYmIGNvbXBhcmVOb2RlTmFtZXMoY3VyRnJvbU5vZGVDaGlsZCwgY3VyVG9Ob2RlQ2hpbGQpO1xuICAgICAgICAgICAgICBpZiAoaXNDb21wYXRpYmxlKSB7XG4gICAgICAgICAgICAgICAgLy8gV2UgZm91bmQgY29tcGF0aWJsZSBET00gZWxlbWVudHMgc28gdHJhbnNmb3JtXG4gICAgICAgICAgICAgICAgLy8gdGhlIGN1cnJlbnQgXCJmcm9tXCIgbm9kZSB0byBtYXRjaCB0aGUgY3VycmVudFxuICAgICAgICAgICAgICAgIC8vIHRhcmdldCBET00gbm9kZS5cbiAgICAgICAgICAgICAgICAvLyBNT1JQSFxuICAgICAgICAgICAgICAgIG1vcnBoRWwoY3VyRnJvbU5vZGVDaGlsZCwgY3VyVG9Ob2RlQ2hpbGQpO1xuICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIH0gZWxzZSBpZiAoY3VyRnJvbU5vZGVUeXBlID09PSBURVhUX05PREUgfHwgY3VyRnJvbU5vZGVUeXBlID09IENPTU1FTlRfTk9ERSkge1xuICAgICAgICAgICAgICAvLyBCb3RoIG5vZGVzIGJlaW5nIGNvbXBhcmVkIGFyZSBUZXh0IG9yIENvbW1lbnQgbm9kZXNcbiAgICAgICAgICAgICAgaXNDb21wYXRpYmxlID0gdHJ1ZTtcbiAgICAgICAgICAgICAgLy8gU2ltcGx5IHVwZGF0ZSBub2RlVmFsdWUgb24gdGhlIG9yaWdpbmFsIG5vZGUgdG9cbiAgICAgICAgICAgICAgLy8gY2hhbmdlIHRoZSB0ZXh0IHZhbHVlXG4gICAgICAgICAgICAgIGlmIChjdXJGcm9tTm9kZUNoaWxkLm5vZGVWYWx1ZSAhPT0gY3VyVG9Ob2RlQ2hpbGQubm9kZVZhbHVlKSB7XG4gICAgICAgICAgICAgICAgY3VyRnJvbU5vZGVDaGlsZC5ub2RlVmFsdWUgPSBjdXJUb05vZGVDaGlsZC5ub2RlVmFsdWU7XG4gICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgfVxuICAgICAgICAgIH1cblxuICAgICAgICAgIGlmIChpc0NvbXBhdGlibGUpIHtcbiAgICAgICAgICAgIC8vIEFkdmFuY2UgYm90aCB0aGUgXCJ0b1wiIGNoaWxkIGFuZCB0aGUgXCJmcm9tXCIgY2hpbGQgc2luY2Ugd2UgZm91bmQgYSBtYXRjaFxuICAgICAgICAgICAgLy8gTm90aGluZyBlbHNlIHRvIGRvIGFzIHdlIGFscmVhZHkgcmVjdXJzaXZlbHkgY2FsbGVkIG1vcnBoQ2hpbGRyZW4gYWJvdmVcbiAgICAgICAgICAgIGN1clRvTm9kZUNoaWxkID0gdG9OZXh0U2libGluZztcbiAgICAgICAgICAgIGN1ckZyb21Ob2RlQ2hpbGQgPSBmcm9tTmV4dFNpYmxpbmc7XG4gICAgICAgICAgICBjb250aW51ZSBvdXRlcjtcbiAgICAgICAgICB9XG5cbiAgICAgICAgICAvLyBObyBjb21wYXRpYmxlIG1hdGNoIHNvIHJlbW92ZSB0aGUgb2xkIG5vZGUgZnJvbSB0aGUgRE9NIGFuZCBjb250aW51ZSB0cnlpbmcgdG8gZmluZCBhXG4gICAgICAgICAgLy8gbWF0Y2ggaW4gdGhlIG9yaWdpbmFsIERPTS4gSG93ZXZlciwgd2Ugb25seSBkbyB0aGlzIGlmIHRoZSBmcm9tIG5vZGUgaXMgbm90IGtleWVkXG4gICAgICAgICAgLy8gc2luY2UgaXQgaXMgcG9zc2libGUgdGhhdCBhIGtleWVkIG5vZGUgbWlnaHQgbWF0Y2ggdXAgd2l0aCBhIG5vZGUgc29tZXdoZXJlIGVsc2UgaW4gdGhlXG4gICAgICAgICAgLy8gdGFyZ2V0IHRyZWUgYW5kIHdlIGRvbid0IHdhbnQgdG8gZGlzY2FyZCBpdCBqdXN0IHlldCBzaW5jZSBpdCBzdGlsbCBtaWdodCBmaW5kIGFcbiAgICAgICAgICAvLyBob21lIGluIHRoZSBmaW5hbCBET00gdHJlZS4gQWZ0ZXIgZXZlcnl0aGluZyBpcyBkb25lIHdlIHdpbGwgcmVtb3ZlIGFueSBrZXllZCBub2Rlc1xuICAgICAgICAgIC8vIHRoYXQgZGlkbid0IGZpbmQgYSBob21lXG4gICAgICAgICAgaWYgKGN1ckZyb21Ob2RlS2V5KSB7XG4gICAgICAgICAgICAvLyBTaW5jZSB0aGUgbm9kZSBpcyBrZXllZCBpdCBtaWdodCBiZSBtYXRjaGVkIHVwIGxhdGVyIHNvIHdlIGRlZmVyXG4gICAgICAgICAgICAvLyB0aGUgYWN0dWFsIHJlbW92YWwgdG8gbGF0ZXJcbiAgICAgICAgICAgIGFkZEtleWVkUmVtb3ZhbChjdXJGcm9tTm9kZUtleSk7XG4gICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIC8vIE5PVEU6IHdlIHNraXAgbmVzdGVkIGtleWVkIG5vZGVzIGZyb20gYmVpbmcgcmVtb3ZlZCBzaW5jZSB0aGVyZSBpc1xuICAgICAgICAgICAgLy8gICAgICAgc3RpbGwgYSBjaGFuY2UgdGhleSB3aWxsIGJlIG1hdGNoZWQgdXAgbGF0ZXJcbiAgICAgICAgICAgIHJlbW92ZU5vZGUoY3VyRnJvbU5vZGVDaGlsZCwgZnJvbUVsLCB0cnVlIC8qIHNraXAga2V5ZWQgbm9kZXMgKi8pO1xuICAgICAgICAgIH1cblxuICAgICAgICAgIGN1ckZyb21Ob2RlQ2hpbGQgPSBmcm9tTmV4dFNpYmxpbmc7XG4gICAgICAgIH0gLy8gRU5EOiB3aGlsZShjdXJGcm9tTm9kZUNoaWxkKSB7fVxuXG4gICAgICAgIC8vIElmIHdlIGdvdCB0aGlzIGZhciB0aGVuIHdlIGRpZCBub3QgZmluZCBhIGNhbmRpZGF0ZSBtYXRjaCBmb3JcbiAgICAgICAgLy8gb3VyIFwidG8gbm9kZVwiIGFuZCB3ZSBleGhhdXN0ZWQgYWxsIG9mIHRoZSBjaGlsZHJlbiBcImZyb21cIlxuICAgICAgICAvLyBub2Rlcy4gVGhlcmVmb3JlLCB3ZSB3aWxsIGp1c3QgYXBwZW5kIHRoZSBjdXJyZW50IFwidG9cIiBub2RlXG4gICAgICAgIC8vIHRvIHRoZSBlbmRcbiAgICAgICAgaWYgKGN1clRvTm9kZUtleSAmJiAobWF0Y2hpbmdGcm9tRWwgPSBmcm9tTm9kZXNMb29rdXBbY3VyVG9Ob2RlS2V5XSkgJiYgY29tcGFyZU5vZGVOYW1lcyhtYXRjaGluZ0Zyb21FbCwgY3VyVG9Ob2RlQ2hpbGQpKSB7XG4gICAgICAgICAgLy8gTU9SUEhcbiAgICAgICAgICBpZighc2tpcEZyb20peyBhZGRDaGlsZChmcm9tRWwsIG1hdGNoaW5nRnJvbUVsKTsgfVxuICAgICAgICAgIG1vcnBoRWwobWF0Y2hpbmdGcm9tRWwsIGN1clRvTm9kZUNoaWxkKTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICB2YXIgb25CZWZvcmVOb2RlQWRkZWRSZXN1bHQgPSBvbkJlZm9yZU5vZGVBZGRlZChjdXJUb05vZGVDaGlsZCk7XG4gICAgICAgICAgaWYgKG9uQmVmb3JlTm9kZUFkZGVkUmVzdWx0ICE9PSBmYWxzZSkge1xuICAgICAgICAgICAgaWYgKG9uQmVmb3JlTm9kZUFkZGVkUmVzdWx0KSB7XG4gICAgICAgICAgICAgIGN1clRvTm9kZUNoaWxkID0gb25CZWZvcmVOb2RlQWRkZWRSZXN1bHQ7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIGlmIChjdXJUb05vZGVDaGlsZC5hY3R1YWxpemUpIHtcbiAgICAgICAgICAgICAgY3VyVG9Ob2RlQ2hpbGQgPSBjdXJUb05vZGVDaGlsZC5hY3R1YWxpemUoZnJvbUVsLm93bmVyRG9jdW1lbnQgfHwgZG9jKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGFkZENoaWxkKGZyb21FbCwgY3VyVG9Ob2RlQ2hpbGQpO1xuICAgICAgICAgICAgaGFuZGxlTm9kZUFkZGVkKGN1clRvTm9kZUNoaWxkKTtcbiAgICAgICAgICB9XG4gICAgICAgIH1cblxuICAgICAgICBjdXJUb05vZGVDaGlsZCA9IHRvTmV4dFNpYmxpbmc7XG4gICAgICAgIGN1ckZyb21Ob2RlQ2hpbGQgPSBmcm9tTmV4dFNpYmxpbmc7XG4gICAgICB9XG5cbiAgICAgIGNsZWFudXBGcm9tRWwoZnJvbUVsLCBjdXJGcm9tTm9kZUNoaWxkLCBjdXJGcm9tTm9kZUtleSk7XG5cbiAgICAgIHZhciBzcGVjaWFsRWxIYW5kbGVyID0gc3BlY2lhbEVsSGFuZGxlcnNbZnJvbUVsLm5vZGVOYW1lXTtcbiAgICAgIGlmIChzcGVjaWFsRWxIYW5kbGVyKSB7XG4gICAgICAgIHNwZWNpYWxFbEhhbmRsZXIoZnJvbUVsLCB0b0VsKTtcbiAgICAgIH1cbiAgICB9IC8vIEVORDogbW9ycGhDaGlsZHJlbiguLi4pXG5cbiAgICB2YXIgbW9ycGhlZE5vZGUgPSBmcm9tTm9kZTtcbiAgICB2YXIgbW9ycGhlZE5vZGVUeXBlID0gbW9ycGhlZE5vZGUubm9kZVR5cGU7XG4gICAgdmFyIHRvTm9kZVR5cGUgPSB0b05vZGUubm9kZVR5cGU7XG5cbiAgICBpZiAoIWNoaWxkcmVuT25seSkge1xuICAgICAgLy8gSGFuZGxlIHRoZSBjYXNlIHdoZXJlIHdlIGFyZSBnaXZlbiB0d28gRE9NIG5vZGVzIHRoYXQgYXJlIG5vdFxuICAgICAgLy8gY29tcGF0aWJsZSAoZS5nLiA8ZGl2PiAtLT4gPHNwYW4+IG9yIDxkaXY+IC0tPiBURVhUKVxuICAgICAgaWYgKG1vcnBoZWROb2RlVHlwZSA9PT0gRUxFTUVOVF9OT0RFKSB7XG4gICAgICAgIGlmICh0b05vZGVUeXBlID09PSBFTEVNRU5UX05PREUpIHtcbiAgICAgICAgICBpZiAoIWNvbXBhcmVOb2RlTmFtZXMoZnJvbU5vZGUsIHRvTm9kZSkpIHtcbiAgICAgICAgICAgIG9uTm9kZURpc2NhcmRlZChmcm9tTm9kZSk7XG4gICAgICAgICAgICBtb3JwaGVkTm9kZSA9IG1vdmVDaGlsZHJlbihmcm9tTm9kZSwgY3JlYXRlRWxlbWVudE5TKHRvTm9kZS5ub2RlTmFtZSwgdG9Ob2RlLm5hbWVzcGFjZVVSSSkpO1xuICAgICAgICAgIH1cbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAvLyBHb2luZyBmcm9tIGFuIGVsZW1lbnQgbm9kZSB0byBhIHRleHQgbm9kZVxuICAgICAgICAgIG1vcnBoZWROb2RlID0gdG9Ob2RlO1xuICAgICAgICB9XG4gICAgICB9IGVsc2UgaWYgKG1vcnBoZWROb2RlVHlwZSA9PT0gVEVYVF9OT0RFIHx8IG1vcnBoZWROb2RlVHlwZSA9PT0gQ09NTUVOVF9OT0RFKSB7IC8vIFRleHQgb3IgY29tbWVudCBub2RlXG4gICAgICAgIGlmICh0b05vZGVUeXBlID09PSBtb3JwaGVkTm9kZVR5cGUpIHtcbiAgICAgICAgICBpZiAobW9ycGhlZE5vZGUubm9kZVZhbHVlICE9PSB0b05vZGUubm9kZVZhbHVlKSB7XG4gICAgICAgICAgICBtb3JwaGVkTm9kZS5ub2RlVmFsdWUgPSB0b05vZGUubm9kZVZhbHVlO1xuICAgICAgICAgIH1cblxuICAgICAgICAgIHJldHVybiBtb3JwaGVkTm9kZTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAvLyBUZXh0IG5vZGUgdG8gc29tZXRoaW5nIGVsc2VcbiAgICAgICAgICBtb3JwaGVkTm9kZSA9IHRvTm9kZTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH1cblxuICAgIGlmIChtb3JwaGVkTm9kZSA9PT0gdG9Ob2RlKSB7XG4gICAgICAvLyBUaGUgXCJ0byBub2RlXCIgd2FzIG5vdCBjb21wYXRpYmxlIHdpdGggdGhlIFwiZnJvbSBub2RlXCIgc28gd2UgaGFkIHRvXG4gICAgICAvLyB0b3NzIG91dCB0aGUgXCJmcm9tIG5vZGVcIiBhbmQgdXNlIHRoZSBcInRvIG5vZGVcIlxuICAgICAgb25Ob2RlRGlzY2FyZGVkKGZyb21Ob2RlKTtcbiAgICB9IGVsc2Uge1xuICAgICAgaWYgKHRvTm9kZS5pc1NhbWVOb2RlICYmIHRvTm9kZS5pc1NhbWVOb2RlKG1vcnBoZWROb2RlKSkge1xuICAgICAgICByZXR1cm47XG4gICAgICB9XG5cbiAgICAgIG1vcnBoRWwobW9ycGhlZE5vZGUsIHRvTm9kZSwgY2hpbGRyZW5Pbmx5KTtcblxuICAgICAgLy8gV2Ugbm93IG5lZWQgdG8gbG9vcCBvdmVyIGFueSBrZXllZCBub2RlcyB0aGF0IG1pZ2h0IG5lZWQgdG8gYmVcbiAgICAgIC8vIHJlbW92ZWQuIFdlIG9ubHkgZG8gdGhlIHJlbW92YWwgaWYgd2Uga25vdyB0aGF0IHRoZSBrZXllZCBub2RlXG4gICAgICAvLyBuZXZlciBmb3VuZCBhIG1hdGNoLiBXaGVuIGEga2V5ZWQgbm9kZSBpcyBtYXRjaGVkIHVwIHdlIHJlbW92ZVxuICAgICAgLy8gaXQgb3V0IG9mIGZyb21Ob2Rlc0xvb2t1cCBhbmQgd2UgdXNlIGZyb21Ob2Rlc0xvb2t1cCB0byBkZXRlcm1pbmVcbiAgICAgIC8vIGlmIGEga2V5ZWQgbm9kZSBoYXMgYmVlbiBtYXRjaGVkIHVwIG9yIG5vdFxuICAgICAgaWYgKGtleWVkUmVtb3ZhbExpc3QpIHtcbiAgICAgICAgZm9yICh2YXIgaT0wLCBsZW49a2V5ZWRSZW1vdmFsTGlzdC5sZW5ndGg7IGk8bGVuOyBpKyspIHtcbiAgICAgICAgICB2YXIgZWxUb1JlbW92ZSA9IGZyb21Ob2Rlc0xvb2t1cFtrZXllZFJlbW92YWxMaXN0W2ldXTtcbiAgICAgICAgICBpZiAoZWxUb1JlbW92ZSkge1xuICAgICAgICAgICAgcmVtb3ZlTm9kZShlbFRvUmVtb3ZlLCBlbFRvUmVtb3ZlLnBhcmVudE5vZGUsIGZhbHNlKTtcbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9XG5cbiAgICBpZiAoIWNoaWxkcmVuT25seSAmJiBtb3JwaGVkTm9kZSAhPT0gZnJvbU5vZGUgJiYgZnJvbU5vZGUucGFyZW50Tm9kZSkge1xuICAgICAgaWYgKG1vcnBoZWROb2RlLmFjdHVhbGl6ZSkge1xuICAgICAgICBtb3JwaGVkTm9kZSA9IG1vcnBoZWROb2RlLmFjdHVhbGl6ZShmcm9tTm9kZS5vd25lckRvY3VtZW50IHx8IGRvYyk7XG4gICAgICB9XG4gICAgICAvLyBJZiB3ZSBoYWQgdG8gc3dhcCBvdXQgdGhlIGZyb20gbm9kZSB3aXRoIGEgbmV3IG5vZGUgYmVjYXVzZSB0aGUgb2xkXG4gICAgICAvLyBub2RlIHdhcyBub3QgY29tcGF0aWJsZSB3aXRoIHRoZSB0YXJnZXQgbm9kZSB0aGVuIHdlIG5lZWQgdG9cbiAgICAgIC8vIHJlcGxhY2UgdGhlIG9sZCBET00gbm9kZSBpbiB0aGUgb3JpZ2luYWwgRE9NIHRyZWUuIFRoaXMgaXMgb25seVxuICAgICAgLy8gcG9zc2libGUgaWYgdGhlIG9yaWdpbmFsIERPTSBub2RlIHdhcyBwYXJ0IG9mIGEgRE9NIHRyZWUgd2hpY2hcbiAgICAgIC8vIHdlIGtub3cgaXMgdGhlIGNhc2UgaWYgaXQgaGFzIGEgcGFyZW50IG5vZGUuXG4gICAgICBmcm9tTm9kZS5wYXJlbnROb2RlLnJlcGxhY2VDaGlsZChtb3JwaGVkTm9kZSwgZnJvbU5vZGUpO1xuICAgIH1cblxuICAgIHJldHVybiBtb3JwaGVkTm9kZTtcbiAgfTtcbn1cblxudmFyIG1vcnBoZG9tID0gbW9ycGhkb21GYWN0b3J5KG1vcnBoQXR0cnMpO1xuXG5leHBvcnQgZGVmYXVsdCBtb3JwaGRvbTtcbiIsICJpbXBvcnQge1xuICBQSFhfQ09NUE9ORU5ULFxuICBQSFhfUFJVTkUsXG4gIFBIWF9ST09UX0lELFxuICBQSFhfU0VTU0lPTixcbiAgUEhYX1NLSVAsXG4gIFBIWF9NQUdJQ19JRCxcbiAgUEhYX1NUQVRJQyxcbiAgUEhYX1RSSUdHRVJfQUNUSU9OLFxuICBQSFhfVVBEQVRFLFxuICBQSFhfUkVGX1NSQyxcbiAgUEhYX1JFRl9MT0NLLFxuICBQSFhfU1RSRUFNLFxuICBQSFhfU1RSRUFNX1JFRixcbiAgUEhYX1ZJRVdQT1JUX1RPUCxcbiAgUEhYX1ZJRVdQT1JUX0JPVFRPTSxcbiAgUEhYX1BPUlRBTCxcbiAgUEhYX1RFTEVQT1JURURfUkVGLFxuICBQSFhfVEVMRVBPUlRFRF9TUkMsXG4gIFBIWF9SVU5USU1FX0hPT0ssXG59IGZyb20gXCIuL2NvbnN0YW50c1wiO1xuXG5pbXBvcnQgeyBkZXRlY3REdXBsaWNhdGVJZHMsIGRldGVjdEludmFsaWRTdHJlYW1JbnNlcnRzLCBpc0NpZCB9IGZyb20gXCIuL3V0aWxzXCI7XG5pbXBvcnQgRWxlbWVudFJlZiBmcm9tIFwiLi9lbGVtZW50X3JlZlwiO1xuaW1wb3J0IERPTSBmcm9tIFwiLi9kb21cIjtcbmltcG9ydCBET01Qb3N0TW9ycGhSZXN0b3JlciBmcm9tIFwiLi9kb21fcG9zdF9tb3JwaF9yZXN0b3JlclwiO1xuaW1wb3J0IG1vcnBoZG9tIGZyb20gXCJtb3JwaGRvbVwiO1xuXG5leHBvcnQgZGVmYXVsdCBjbGFzcyBET01QYXRjaCB7XG4gIGNvbnN0cnVjdG9yKHZpZXcsIGNvbnRhaW5lciwgaWQsIGh0bWwsIHN0cmVhbXMsIHRhcmdldENJRCwgb3B0cyA9IHt9KSB7XG4gICAgdGhpcy52aWV3ID0gdmlldztcbiAgICB0aGlzLmxpdmVTb2NrZXQgPSB2aWV3LmxpdmVTb2NrZXQ7XG4gICAgdGhpcy5jb250YWluZXIgPSBjb250YWluZXI7XG4gICAgdGhpcy5pZCA9IGlkO1xuICAgIHRoaXMucm9vdElEID0gdmlldy5yb290LmlkO1xuICAgIHRoaXMuaHRtbCA9IGh0bWw7XG4gICAgdGhpcy5zdHJlYW1zID0gc3RyZWFtcztcbiAgICB0aGlzLnN0cmVhbUluc2VydHMgPSB7fTtcbiAgICB0aGlzLnN0cmVhbUNvbXBvbmVudFJlc3RvcmUgPSB7fTtcbiAgICB0aGlzLnRhcmdldENJRCA9IHRhcmdldENJRDtcbiAgICB0aGlzLmNpZFBhdGNoID0gaXNDaWQodGhpcy50YXJnZXRDSUQpO1xuICAgIHRoaXMucGVuZGluZ1JlbW92ZXMgPSBbXTtcbiAgICB0aGlzLnBoeFJlbW92ZSA9IHRoaXMubGl2ZVNvY2tldC5iaW5kaW5nKFwicmVtb3ZlXCIpO1xuICAgIHRoaXMudGFyZ2V0Q29udGFpbmVyID0gdGhpcy5pc0NJRFBhdGNoKClcbiAgICAgID8gdGhpcy50YXJnZXRDSURDb250YWluZXIoaHRtbClcbiAgICAgIDogY29udGFpbmVyO1xuICAgIHRoaXMuY2FsbGJhY2tzID0ge1xuICAgICAgYmVmb3JlYWRkZWQ6IFtdLFxuICAgICAgYmVmb3JldXBkYXRlZDogW10sXG4gICAgICBiZWZvcmVwaHhDaGlsZEFkZGVkOiBbXSxcbiAgICAgIGFmdGVyYWRkZWQ6IFtdLFxuICAgICAgYWZ0ZXJ1cGRhdGVkOiBbXSxcbiAgICAgIGFmdGVyZGlzY2FyZGVkOiBbXSxcbiAgICAgIGFmdGVycGh4Q2hpbGRBZGRlZDogW10sXG4gICAgICBhZnRlcnRyYW5zaXRpb25zRGlzY2FyZGVkOiBbXSxcbiAgICB9O1xuICAgIHRoaXMud2l0aENoaWxkcmVuID0gb3B0cy53aXRoQ2hpbGRyZW4gfHwgb3B0cy51bmRvUmVmIHx8IGZhbHNlO1xuICAgIHRoaXMudW5kb1JlZiA9IG9wdHMudW5kb1JlZjtcbiAgfVxuXG4gIGJlZm9yZShraW5kLCBjYWxsYmFjaykge1xuICAgIHRoaXMuY2FsbGJhY2tzW2BiZWZvcmUke2tpbmR9YF0ucHVzaChjYWxsYmFjayk7XG4gIH1cbiAgYWZ0ZXIoa2luZCwgY2FsbGJhY2spIHtcbiAgICB0aGlzLmNhbGxiYWNrc1tgYWZ0ZXIke2tpbmR9YF0ucHVzaChjYWxsYmFjayk7XG4gIH1cblxuICB0cmFja0JlZm9yZShraW5kLCAuLi5hcmdzKSB7XG4gICAgdGhpcy5jYWxsYmFja3NbYGJlZm9yZSR7a2luZH1gXS5mb3JFYWNoKChjYWxsYmFjaykgPT4gY2FsbGJhY2soLi4uYXJncykpO1xuICB9XG5cbiAgdHJhY2tBZnRlcihraW5kLCAuLi5hcmdzKSB7XG4gICAgdGhpcy5jYWxsYmFja3NbYGFmdGVyJHtraW5kfWBdLmZvckVhY2goKGNhbGxiYWNrKSA9PiBjYWxsYmFjayguLi5hcmdzKSk7XG4gIH1cblxuICBtYXJrUHJ1bmFibGVDb250ZW50Rm9yUmVtb3ZhbCgpIHtcbiAgICBjb25zdCBwaHhVcGRhdGUgPSB0aGlzLmxpdmVTb2NrZXQuYmluZGluZyhQSFhfVVBEQVRFKTtcbiAgICBET00uYWxsKFxuICAgICAgdGhpcy5jb250YWluZXIsXG4gICAgICBgWyR7cGh4VXBkYXRlfT1hcHBlbmRdID4gKiwgWyR7cGh4VXBkYXRlfT1wcmVwZW5kXSA+ICpgLFxuICAgICAgKGVsKSA9PiB7XG4gICAgICAgIGVsLnNldEF0dHJpYnV0ZShQSFhfUFJVTkUsIFwiXCIpO1xuICAgICAgfSxcbiAgICApO1xuICB9XG5cbiAgcGVyZm9ybShpc0pvaW5QYXRjaCkge1xuICAgIGNvbnN0IHsgdmlldywgbGl2ZVNvY2tldCwgaHRtbCwgY29udGFpbmVyIH0gPSB0aGlzO1xuICAgIGxldCB0YXJnZXRDb250YWluZXIgPSB0aGlzLnRhcmdldENvbnRhaW5lcjtcblxuICAgIGlmICh0aGlzLmlzQ0lEUGF0Y2goKSAmJiAhdGhpcy50YXJnZXRDb250YWluZXIpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICBpZiAodGhpcy5pc0NJRFBhdGNoKCkpIHtcbiAgICAgIC8vIGh0dHBzOi8vZ2l0aHViLmNvbS9waG9lbml4ZnJhbWV3b3JrL3Bob2VuaXhfbGl2ZV92aWV3L3B1bGwvMzk0MlxuICAgICAgLy8gd2UgbmVlZCB0byBlbnN1cmUgdGhhdCBubyBwYXJlbnQgaXMgbG9ja2VkXG4gICAgICBjb25zdCBjbG9zZXN0TG9jayA9IHRhcmdldENvbnRhaW5lci5jbG9zZXN0KGBbJHtQSFhfUkVGX0xPQ0t9XWApO1xuICAgICAgaWYgKGNsb3Nlc3RMb2NrKSB7XG4gICAgICAgIGNvbnN0IGNsb25lZFRyZWUgPSBET00ucHJpdmF0ZShjbG9zZXN0TG9jaywgUEhYX1JFRl9MT0NLKTtcbiAgICAgICAgaWYgKGNsb25lZFRyZWUpIHtcbiAgICAgICAgICAvLyBpZiBhIHBhcmVudCBpcyBsb2NrZWQgd2l0aCBhIGNsb25lZCB0cmVlLCB3ZSBuZWVkIHRvIHBhdGNoIHRoZSBjbG9uZWQgdHJlZSBpbnN0ZWFkXG4gICAgICAgICAgdGFyZ2V0Q29udGFpbmVyID0gY2xvbmVkVHJlZS5xdWVyeVNlbGVjdG9yKFxuICAgICAgICAgICAgYFtkYXRhLXBoeC1jb21wb25lbnQ9XCIke3RoaXMudGFyZ2V0Q0lEfVwiXWAsXG4gICAgICAgICAgKTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH1cblxuICAgIGNvbnN0IGZvY3VzZWQgPSBsaXZlU29ja2V0LmdldEFjdGl2ZUVsZW1lbnQoKTtcbiAgICBjb25zdCB7IHNlbGVjdGlvblN0YXJ0LCBzZWxlY3Rpb25FbmQgfSA9XG4gICAgICBmb2N1c2VkICYmIERPTS5oYXNTZWxlY3Rpb25SYW5nZShmb2N1c2VkKSA/IGZvY3VzZWQgOiB7fTtcbiAgICBjb25zdCBwaHhVcGRhdGUgPSBsaXZlU29ja2V0LmJpbmRpbmcoUEhYX1VQREFURSk7XG4gICAgY29uc3QgcGh4Vmlld3BvcnRUb3AgPSBsaXZlU29ja2V0LmJpbmRpbmcoUEhYX1ZJRVdQT1JUX1RPUCk7XG4gICAgY29uc3QgcGh4Vmlld3BvcnRCb3R0b20gPSBsaXZlU29ja2V0LmJpbmRpbmcoUEhYX1ZJRVdQT1JUX0JPVFRPTSk7XG4gICAgY29uc3QgcGh4VHJpZ2dlckV4dGVybmFsID0gbGl2ZVNvY2tldC5iaW5kaW5nKFBIWF9UUklHR0VSX0FDVElPTik7XG4gICAgY29uc3QgYWRkZWQgPSBbXTtcbiAgICBjb25zdCB1cGRhdGVzID0gW107XG4gICAgY29uc3QgYXBwZW5kUHJlcGVuZFVwZGF0ZXMgPSBbXTtcblxuICAgIC8vIGFzIHRoZSBwb3J0YWwgdGFyZ2V0IGl0c2VsZiBjb3VsZCBiZSBhdCB0aGUgZW5kIG9mIHRoZSBET00sXG4gICAgLy8gaXQgbWF5IG5vdCBiZSBwcmVzZW50IHdoaWxlIG1vcnBoaW5nIHByZXZpb3VzIHBhcnRzO1xuICAgIC8vIHRoZXJlZm9yZSB3ZSBhcHBseSBhbGwgdGVsZXBvcnRzIGFmdGVyIHRoZSBtb3JwaGluZyBpcyBkb25lK1xuICAgIGNvbnN0IHBvcnRhbENhbGxiYWNrcyA9IFtdO1xuXG4gICAgbGV0IGV4dGVybmFsRm9ybVRyaWdnZXJlZCA9IG51bGw7XG5cbiAgICBjb25zdCBtb3JwaCA9IChcbiAgICAgIHRhcmdldENvbnRhaW5lcixcbiAgICAgIHNvdXJjZSxcbiAgICAgIHdpdGhDaGlsZHJlbiA9IHRoaXMud2l0aENoaWxkcmVuLFxuICAgICkgPT4ge1xuICAgICAgY29uc3QgbW9ycGhDYWxsYmFja3MgPSB7XG4gICAgICAgIC8vIG5vcm1hbGx5LCB3ZSBhcmUgcnVubmluZyB3aXRoIGNoaWxkcmVuT25seSwgYXMgdGhlIHBhdGNoIEhUTUwgZm9yIGEgTFZcbiAgICAgICAgLy8gZG9lcyBub3QgaW5jbHVkZSB0aGUgTFYgYXR0cnMgKGRhdGEtcGh4LXNlc3Npb24sIGV0Yy4pXG4gICAgICAgIC8vIHdoZW4gd2UgYXJlIHBhdGNoaW5nIGEgbGl2ZSBjb21wb25lbnQsIHdlIGRvIHdhbnQgdG8gcGF0Y2ggdGhlIHJvb3QgZWxlbWVudCBhcyB3ZWxsO1xuICAgICAgICAvLyBhbm90aGVyIGNhc2UgaXMgdGhlIHJlY3Vyc2l2ZSBwYXRjaCBvZiBhIHN0cmVhbSBpdGVtIHRoYXQgd2FzIGtlcHQgb24gcmVzZXQgKC0+IG9uQmVmb3JlTm9kZUFkZGVkKVxuICAgICAgICBjaGlsZHJlbk9ubHk6XG4gICAgICAgICAgdGFyZ2V0Q29udGFpbmVyLmdldEF0dHJpYnV0ZShQSFhfQ09NUE9ORU5UKSA9PT0gbnVsbCAmJiAhd2l0aENoaWxkcmVuLFxuICAgICAgICBnZXROb2RlS2V5OiAobm9kZSkgPT4ge1xuICAgICAgICAgIGlmIChET00uaXNQaHhEZXN0cm95ZWQobm9kZSkpIHtcbiAgICAgICAgICAgIHJldHVybiBudWxsO1xuICAgICAgICAgIH1cbiAgICAgICAgICAvLyBJZiB3ZSBoYXZlIGEgam9pbiBwYXRjaCwgdGhlbiBieSBkZWZpbml0aW9uIHRoZXJlIHdhcyBubyBQSFhfTUFHSUNfSUQuXG4gICAgICAgICAgLy8gVGhpcyBpcyBpbXBvcnRhbnQgdG8gcmVkdWNlIHRoZSBhbW91bnQgb2YgZWxlbWVudHMgbW9ycGhkb20gZGlzY2FyZHMuXG4gICAgICAgICAgaWYgKGlzSm9pblBhdGNoKSB7XG4gICAgICAgICAgICByZXR1cm4gbm9kZS5pZDtcbiAgICAgICAgICB9XG4gICAgICAgICAgcmV0dXJuIChcbiAgICAgICAgICAgIG5vZGUuaWQgfHwgKG5vZGUuZ2V0QXR0cmlidXRlICYmIG5vZGUuZ2V0QXR0cmlidXRlKFBIWF9NQUdJQ19JRCkpXG4gICAgICAgICAgKTtcbiAgICAgICAgfSxcbiAgICAgICAgLy8gc2tpcCBpbmRleGluZyBmcm9tIGNoaWxkcmVuIHdoZW4gY29udGFpbmVyIGlzIHN0cmVhbVxuICAgICAgICBza2lwRnJvbUNoaWxkcmVuOiAoZnJvbSkgPT4ge1xuICAgICAgICAgIHJldHVybiBmcm9tLmdldEF0dHJpYnV0ZShwaHhVcGRhdGUpID09PSBQSFhfU1RSRUFNO1xuICAgICAgICB9LFxuICAgICAgICAvLyB0ZWxsIG1vcnBoZG9tIGhvdyB0byBhZGQgYSBjaGlsZFxuICAgICAgICBhZGRDaGlsZDogKHBhcmVudCwgY2hpbGQpID0+IHtcbiAgICAgICAgICBjb25zdCB7IHJlZiwgc3RyZWFtQXQgfSA9IHRoaXMuZ2V0U3RyZWFtSW5zZXJ0KGNoaWxkKTtcbiAgICAgICAgICBpZiAocmVmID09PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICAgIHJldHVybiBwYXJlbnQuYXBwZW5kQ2hpbGQoY2hpbGQpO1xuICAgICAgICAgIH1cblxuICAgICAgICAgIHRoaXMuc2V0U3RyZWFtUmVmKGNoaWxkLCByZWYpO1xuXG4gICAgICAgICAgLy8gc3RyZWFtaW5nXG4gICAgICAgICAgaWYgKHN0cmVhbUF0ID09PSAwKSB7XG4gICAgICAgICAgICBwYXJlbnQuaW5zZXJ0QWRqYWNlbnRFbGVtZW50KFwiYWZ0ZXJiZWdpblwiLCBjaGlsZCk7XG4gICAgICAgICAgfSBlbHNlIGlmIChzdHJlYW1BdCA9PT0gLTEpIHtcbiAgICAgICAgICAgIGNvbnN0IGxhc3RDaGlsZCA9IHBhcmVudC5sYXN0RWxlbWVudENoaWxkO1xuICAgICAgICAgICAgaWYgKGxhc3RDaGlsZCAmJiAhbGFzdENoaWxkLmhhc0F0dHJpYnV0ZShQSFhfU1RSRUFNX1JFRikpIHtcbiAgICAgICAgICAgICAgY29uc3Qgbm9uU3RyZWFtQ2hpbGQgPSBBcnJheS5mcm9tKHBhcmVudC5jaGlsZHJlbikuZmluZChcbiAgICAgICAgICAgICAgICAoYykgPT4gIWMuaGFzQXR0cmlidXRlKFBIWF9TVFJFQU1fUkVGKSxcbiAgICAgICAgICAgICAgKTtcbiAgICAgICAgICAgICAgcGFyZW50Lmluc2VydEJlZm9yZShjaGlsZCwgbm9uU3RyZWFtQ2hpbGQpO1xuICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgcGFyZW50LmFwcGVuZENoaWxkKGNoaWxkKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9IGVsc2UgaWYgKHN0cmVhbUF0ID4gMCkge1xuICAgICAgICAgICAgY29uc3Qgc2libGluZyA9IEFycmF5LmZyb20ocGFyZW50LmNoaWxkcmVuKVtzdHJlYW1BdF07XG4gICAgICAgICAgICBwYXJlbnQuaW5zZXJ0QmVmb3JlKGNoaWxkLCBzaWJsaW5nKTtcbiAgICAgICAgICB9XG4gICAgICAgIH0sXG4gICAgICAgIG9uQmVmb3JlTm9kZUFkZGVkOiAoZWwpID0+IHtcbiAgICAgICAgICAvLyBkb24ndCBhZGQgdXBkYXRlX29ubHkgbm9kZXMgaWYgdGhleSBkaWQgbm90IGFscmVhZHkgZXhpc3RcbiAgICAgICAgICBpZiAoXG4gICAgICAgICAgICB0aGlzLmdldFN0cmVhbUluc2VydChlbCk/LnVwZGF0ZU9ubHkgJiZcbiAgICAgICAgICAgICF0aGlzLnN0cmVhbUNvbXBvbmVudFJlc3RvcmVbZWwuaWRdXG4gICAgICAgICAgKSB7XG4gICAgICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICAgICAgfVxuXG4gICAgICAgICAgRE9NLm1haW50YWluUHJpdmF0ZUhvb2tzKGVsLCBlbCwgcGh4Vmlld3BvcnRUb3AsIHBoeFZpZXdwb3J0Qm90dG9tKTtcbiAgICAgICAgICB0aGlzLnRyYWNrQmVmb3JlKFwiYWRkZWRcIiwgZWwpO1xuXG4gICAgICAgICAgbGV0IG1vcnBoZWRFbCA9IGVsO1xuICAgICAgICAgIC8vIHRoaXMgaXMgYSBzdHJlYW0gaXRlbSB0aGF0IHdhcyBrZXB0IG9uIHJlc2V0LCByZWN1cnNpdmVseSBtb3JwaCBpdFxuICAgICAgICAgIGlmICh0aGlzLnN0cmVhbUNvbXBvbmVudFJlc3RvcmVbZWwuaWRdKSB7XG4gICAgICAgICAgICBtb3JwaGVkRWwgPSB0aGlzLnN0cmVhbUNvbXBvbmVudFJlc3RvcmVbZWwuaWRdO1xuICAgICAgICAgICAgZGVsZXRlIHRoaXMuc3RyZWFtQ29tcG9uZW50UmVzdG9yZVtlbC5pZF07XG4gICAgICAgICAgICBtb3JwaChtb3JwaGVkRWwsIGVsLCB0cnVlKTtcbiAgICAgICAgICB9XG5cbiAgICAgICAgICByZXR1cm4gbW9ycGhlZEVsO1xuICAgICAgICB9LFxuICAgICAgICBvbk5vZGVBZGRlZDogKGVsKSA9PiB7XG4gICAgICAgICAgaWYgKGVsLmdldEF0dHJpYnV0ZSkge1xuICAgICAgICAgICAgdGhpcy5tYXliZVJlT3JkZXJTdHJlYW0oZWwsIHRydWUpO1xuICAgICAgICAgIH1cbiAgICAgICAgICAvLyBwaHgtcG9ydGFsIGhhbmRsaW5nXG4gICAgICAgICAgaWYgKERPTS5pc1BvcnRhbFRlbXBsYXRlKGVsKSkge1xuICAgICAgICAgICAgcG9ydGFsQ2FsbGJhY2tzLnB1c2goKCkgPT4gdGhpcy50ZWxlcG9ydChlbCwgbW9ycGgpKTtcbiAgICAgICAgICB9XG5cbiAgICAgICAgICAvLyBoYWNrIHRvIGZpeCBTYWZhcmkgaGFuZGxpbmcgb2YgaW1nIHNyY3NldCBhbmQgdmlkZW8gdGFnc1xuICAgICAgICAgIGlmIChlbCBpbnN0YW5jZW9mIEhUTUxJbWFnZUVsZW1lbnQgJiYgZWwuc3Jjc2V0KSB7XG4gICAgICAgICAgICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgbm8tc2VsZi1hc3NpZ25cbiAgICAgICAgICAgIGVsLnNyY3NldCA9IGVsLnNyY3NldDtcbiAgICAgICAgICB9IGVsc2UgaWYgKGVsIGluc3RhbmNlb2YgSFRNTFZpZGVvRWxlbWVudCAmJiBlbC5hdXRvcGxheSkge1xuICAgICAgICAgICAgZWwucGxheSgpO1xuICAgICAgICAgIH1cbiAgICAgICAgICBpZiAoRE9NLmlzTm93VHJpZ2dlckZvcm1FeHRlcm5hbChlbCwgcGh4VHJpZ2dlckV4dGVybmFsKSkge1xuICAgICAgICAgICAgZXh0ZXJuYWxGb3JtVHJpZ2dlcmVkID0gZWw7XG4gICAgICAgICAgfVxuXG4gICAgICAgICAgLy8gbmVzdGVkIHZpZXcgaGFuZGxpbmdcbiAgICAgICAgICBpZiAoXG4gICAgICAgICAgICAoRE9NLmlzUGh4Q2hpbGQoZWwpICYmIHZpZXcub3duc0VsZW1lbnQoZWwpKSB8fFxuICAgICAgICAgICAgKERPTS5pc1BoeFN0aWNreShlbCkgJiYgdmlldy5vd25zRWxlbWVudChlbC5wYXJlbnROb2RlKSlcbiAgICAgICAgICApIHtcbiAgICAgICAgICAgIHRoaXMudHJhY2tBZnRlcihcInBoeENoaWxkQWRkZWRcIiwgZWwpO1xuICAgICAgICAgIH1cblxuICAgICAgICAgIC8vIGRhdGEtcGh4LXJ1bnRpbWUtaG9va1xuICAgICAgICAgIGlmIChlbC5ub2RlTmFtZSA9PT0gXCJTQ1JJUFRcIiAmJiBlbC5oYXNBdHRyaWJ1dGUoUEhYX1JVTlRJTUVfSE9PSykpIHtcbiAgICAgICAgICAgIHRoaXMuaGFuZGxlUnVudGltZUhvb2soZWwsIHNvdXJjZSk7XG4gICAgICAgICAgfVxuXG4gICAgICAgICAgYWRkZWQucHVzaChlbCk7XG4gICAgICAgIH0sXG4gICAgICAgIG9uTm9kZURpc2NhcmRlZDogKGVsKSA9PiB0aGlzLm9uTm9kZURpc2NhcmRlZChlbCksXG4gICAgICAgIG9uQmVmb3JlTm9kZURpc2NhcmRlZDogKGVsKSA9PiB7XG4gICAgICAgICAgaWYgKGVsLmdldEF0dHJpYnV0ZSAmJiBlbC5nZXRBdHRyaWJ1dGUoUEhYX1BSVU5FKSAhPT0gbnVsbCkge1xuICAgICAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgICAgICAgfVxuICAgICAgICAgIGlmIChcbiAgICAgICAgICAgIGVsLnBhcmVudEVsZW1lbnQgIT09IG51bGwgJiZcbiAgICAgICAgICAgIGVsLmlkICYmXG4gICAgICAgICAgICBET00uaXNQaHhVcGRhdGUoZWwucGFyZW50RWxlbWVudCwgcGh4VXBkYXRlLCBbXG4gICAgICAgICAgICAgIFBIWF9TVFJFQU0sXG4gICAgICAgICAgICAgIFwiYXBwZW5kXCIsXG4gICAgICAgICAgICAgIFwicHJlcGVuZFwiLFxuICAgICAgICAgICAgXSlcbiAgICAgICAgICApIHtcbiAgICAgICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgICAgICB9XG4gICAgICAgICAgLy8gZG9uJ3QgcmVtb3ZlIHRlbGVwb3J0ZWQgZWxlbWVudHNcbiAgICAgICAgICBpZiAoZWwuZ2V0QXR0cmlidXRlICYmIGVsLmdldEF0dHJpYnV0ZShQSFhfVEVMRVBPUlRFRF9SRUYpKSB7XG4gICAgICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICAgICAgfVxuICAgICAgICAgIGlmICh0aGlzLm1heWJlUGVuZGluZ1JlbW92ZShlbCkpIHtcbiAgICAgICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgICAgICB9XG4gICAgICAgICAgaWYgKHRoaXMuc2tpcENJRFNpYmxpbmcoZWwpKSB7XG4gICAgICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICAgICAgfVxuXG4gICAgICAgICAgaWYgKERPTS5pc1BvcnRhbFRlbXBsYXRlKGVsKSkge1xuICAgICAgICAgICAgLy8gaWYgdGhlIHBvcnRhbCB0ZW1wbGF0ZSBpdHNlbGYgaXMgcmVtb3ZlZCwgcmVtb3ZlIHRoZSB0ZWxlcG9ydGVkIGVsZW1lbnQgYXMgd2VsbDtcbiAgICAgICAgICAgIC8vIHdlIGFsc28gcGVyZm9ybSBhIGNoZWNrIGFmdGVyIG1vcnBoZG9tIGlzIGZpbmlzaGVkIHRvIGNhdGNoIHBhcmVudCByZW1vdmFsc1xuICAgICAgICAgICAgY29uc3QgdGVsZXBvcnRlZEVsID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoXG4gICAgICAgICAgICAgIGVsLmNvbnRlbnQuZmlyc3RFbGVtZW50Q2hpbGQuaWQsXG4gICAgICAgICAgICApO1xuICAgICAgICAgICAgaWYgKHRlbGVwb3J0ZWRFbCkge1xuICAgICAgICAgICAgICB0ZWxlcG9ydGVkRWwucmVtb3ZlKCk7XG4gICAgICAgICAgICAgIG1vcnBoQ2FsbGJhY2tzLm9uTm9kZURpc2NhcmRlZCh0ZWxlcG9ydGVkRWwpO1xuICAgICAgICAgICAgICB0aGlzLnZpZXcuZHJvcFBvcnRhbEVsZW1lbnRJZCh0ZWxlcG9ydGVkRWwuaWQpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgIH1cblxuICAgICAgICAgIHJldHVybiB0cnVlO1xuICAgICAgICB9LFxuICAgICAgICBvbkVsVXBkYXRlZDogKGVsKSA9PiB7XG4gICAgICAgICAgaWYgKERPTS5pc05vd1RyaWdnZXJGb3JtRXh0ZXJuYWwoZWwsIHBoeFRyaWdnZXJFeHRlcm5hbCkpIHtcbiAgICAgICAgICAgIGV4dGVybmFsRm9ybVRyaWdnZXJlZCA9IGVsO1xuICAgICAgICAgIH1cbiAgICAgICAgICB1cGRhdGVzLnB1c2goZWwpO1xuICAgICAgICAgIHRoaXMubWF5YmVSZU9yZGVyU3RyZWFtKGVsLCBmYWxzZSk7XG4gICAgICAgIH0sXG4gICAgICAgIG9uQmVmb3JlRWxVcGRhdGVkOiAoZnJvbUVsLCB0b0VsKSA9PiB7XG4gICAgICAgICAgLy8gaWYgd2UgYXJlIHBhdGNoaW5nIHRoZSByb290IHRhcmdldCBjb250YWluZXIgYW5kIHRoZSBpZCBoYXMgY2hhbmdlZCwgdHJlYXQgaXQgYXMgYSBuZXcgbm9kZVxuICAgICAgICAgIC8vIGJ5IHJlcGxhY2luZyB0aGUgZnJvbUVsIHdpdGggdGhlIHRvRWwsIHdoaWNoIGVuc3VyZXMgaG9va3MgYXJlIHRvcm4gZG93biBhbmQgcmUtY3JlYXRlZFxuICAgICAgICAgIGlmIChcbiAgICAgICAgICAgIGZyb21FbC5pZCAmJlxuICAgICAgICAgICAgZnJvbUVsLmlzU2FtZU5vZGUodGFyZ2V0Q29udGFpbmVyKSAmJlxuICAgICAgICAgICAgZnJvbUVsLmlkICE9PSB0b0VsLmlkXG4gICAgICAgICAgKSB7XG4gICAgICAgICAgICBtb3JwaENhbGxiYWNrcy5vbk5vZGVEaXNjYXJkZWQoZnJvbUVsKTtcbiAgICAgICAgICAgIGZyb21FbC5yZXBsYWNlV2l0aCh0b0VsKTtcbiAgICAgICAgICAgIHJldHVybiBtb3JwaENhbGxiYWNrcy5vbk5vZGVBZGRlZCh0b0VsKTtcbiAgICAgICAgICB9XG4gICAgICAgICAgRE9NLnN5bmNQZW5kaW5nQXR0cnMoZnJvbUVsLCB0b0VsKTtcbiAgICAgICAgICBET00ubWFpbnRhaW5Qcml2YXRlSG9va3MoXG4gICAgICAgICAgICBmcm9tRWwsXG4gICAgICAgICAgICB0b0VsLFxuICAgICAgICAgICAgcGh4Vmlld3BvcnRUb3AsXG4gICAgICAgICAgICBwaHhWaWV3cG9ydEJvdHRvbSxcbiAgICAgICAgICApO1xuICAgICAgICAgIERPTS5jbGVhbkNoaWxkTm9kZXModG9FbCwgcGh4VXBkYXRlKTtcbiAgICAgICAgICBpZiAodGhpcy5za2lwQ0lEU2libGluZyh0b0VsKSkge1xuICAgICAgICAgICAgLy8gaWYgdGhpcyBpcyBhIGxpdmUgY29tcG9uZW50IHVzZWQgaW4gYSBzdHJlYW0sIHdlIG1heSBuZWVkIHRvIHJlb3JkZXIgaXRcbiAgICAgICAgICAgIHRoaXMubWF5YmVSZU9yZGVyU3RyZWFtKGZyb21FbCk7XG4gICAgICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICAgICAgfVxuICAgICAgICAgIGlmIChET00uaXNQaHhTdGlja3koZnJvbUVsKSkge1xuICAgICAgICAgICAgW1BIWF9TRVNTSU9OLCBQSFhfU1RBVElDLCBQSFhfUk9PVF9JRF1cbiAgICAgICAgICAgICAgLm1hcCgoYXR0cikgPT4gW1xuICAgICAgICAgICAgICAgIGF0dHIsXG4gICAgICAgICAgICAgICAgZnJvbUVsLmdldEF0dHJpYnV0ZShhdHRyKSxcbiAgICAgICAgICAgICAgICB0b0VsLmdldEF0dHJpYnV0ZShhdHRyKSxcbiAgICAgICAgICAgICAgXSlcbiAgICAgICAgICAgICAgLmZvckVhY2goKFthdHRyLCBmcm9tVmFsLCB0b1ZhbF0pID0+IHtcbiAgICAgICAgICAgICAgICBpZiAodG9WYWwgJiYgZnJvbVZhbCAhPT0gdG9WYWwpIHtcbiAgICAgICAgICAgICAgICAgIGZyb21FbC5zZXRBdHRyaWJ1dGUoYXR0ciwgdG9WYWwpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgfSk7XG5cbiAgICAgICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgICAgICB9XG4gICAgICAgICAgaWYgKFxuICAgICAgICAgICAgRE9NLmlzSWdub3JlZChmcm9tRWwsIHBoeFVwZGF0ZSkgfHxcbiAgICAgICAgICAgIChmcm9tRWwuZm9ybSAmJiBmcm9tRWwuZm9ybS5pc1NhbWVOb2RlKGV4dGVybmFsRm9ybVRyaWdnZXJlZCkpXG4gICAgICAgICAgKSB7XG4gICAgICAgICAgICB0aGlzLnRyYWNrQmVmb3JlKFwidXBkYXRlZFwiLCBmcm9tRWwsIHRvRWwpO1xuICAgICAgICAgICAgRE9NLm1lcmdlQXR0cnMoZnJvbUVsLCB0b0VsLCB7XG4gICAgICAgICAgICAgIGlzSWdub3JlZDogRE9NLmlzSWdub3JlZChmcm9tRWwsIHBoeFVwZGF0ZSksXG4gICAgICAgICAgICB9KTtcbiAgICAgICAgICAgIHVwZGF0ZXMucHVzaChmcm9tRWwpO1xuICAgICAgICAgICAgRE9NLmFwcGx5U3RpY2t5T3BlcmF0aW9ucyhmcm9tRWwpO1xuICAgICAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgICAgIH1cbiAgICAgICAgICBpZiAoXG4gICAgICAgICAgICBmcm9tRWwudHlwZSA9PT0gXCJudW1iZXJcIiAmJlxuICAgICAgICAgICAgZnJvbUVsLnZhbGlkaXR5ICYmXG4gICAgICAgICAgICBmcm9tRWwudmFsaWRpdHkuYmFkSW5wdXRcbiAgICAgICAgICApIHtcbiAgICAgICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgICAgICB9XG4gICAgICAgICAgLy8gSWYgdGhlIGVsZW1lbnQgaGFzIFBIWF9SRUZfU1JDLCBpdCBpcyBsb2FkaW5nIG9yIGxvY2tlZCBhbmQgYXdhaXRpbmcgYW4gYWNrLlxuICAgICAgICAgIC8vIElmIGl0J3MgbG9ja2VkLCB3ZSBjbG9uZSB0aGUgZnJvbUVsIHRyZWUgYW5kIGluc3RydWN0IG1vcnBoZG9tIHRvIHVzZVxuICAgICAgICAgIC8vIHRoZSBjbG9uZWQgdHJlZSBhcyB0aGUgc291cmNlIG9mIHRoZSBtb3JwaCBmb3IgdGhpcyBicmFuY2ggZnJvbSBoZXJlIG9uIG91dC5cbiAgICAgICAgICAvLyBXZSBrZWVwIGEgcmVmZXJlbmNlIHRvIHRoZSBjbG9uZWQgdHJlZSBpbiB0aGUgZWxlbWVudCdzIHByaXZhdGUgZGF0YSwgYW5kXG4gICAgICAgICAgLy8gb24gYWNrICh2aWV3LnVuZG9SZWZzKSwgd2UgbW9ycGggdGhlIGNsb25lZCB0cmVlIHdpdGggdGhlIHRydWUgZnJvbUVsIGluIHRoZSBET00gdG9cbiAgICAgICAgICAvLyBhcHBseSBhbnkgY2hhbmdlcyB0aGF0IGhhcHBlbmVkIHdoaWxlIHRoZSBlbGVtZW50IHdhcyBsb2NrZWQuXG4gICAgICAgICAgY29uc3QgaXNGb2N1c2VkRm9ybUVsID1cbiAgICAgICAgICAgIGZvY3VzZWQgJiYgZnJvbUVsLmlzU2FtZU5vZGUoZm9jdXNlZCkgJiYgRE9NLmlzRm9ybUlucHV0KGZyb21FbCk7XG4gICAgICAgICAgY29uc3QgZm9jdXNlZFNlbGVjdENoYW5nZWQgPVxuICAgICAgICAgICAgaXNGb2N1c2VkRm9ybUVsICYmIHRoaXMuaXNDaGFuZ2VkU2VsZWN0KGZyb21FbCwgdG9FbCk7XG4gICAgICAgICAgaWYgKGZyb21FbC5oYXNBdHRyaWJ1dGUoUEhYX1JFRl9TUkMpKSB7XG4gICAgICAgICAgICBjb25zdCByZWYgPSBuZXcgRWxlbWVudFJlZihmcm9tRWwpO1xuICAgICAgICAgICAgLy8gb25seSBwZXJmb3JtIHRoZSBjbG9uZSBzdGVwIGlmIHRoaXMgaXMgbm90IGEgcGF0Y2ggdGhhdCB1bmxvY2tzXG4gICAgICAgICAgICBpZiAoXG4gICAgICAgICAgICAgIHJlZi5sb2NrUmVmICYmXG4gICAgICAgICAgICAgICghdGhpcy51bmRvUmVmIHx8ICFyZWYuaXNMb2NrVW5kb25lQnkodGhpcy51bmRvUmVmKSlcbiAgICAgICAgICAgICkge1xuICAgICAgICAgICAgICBpZiAoRE9NLmlzVXBsb2FkSW5wdXQoZnJvbUVsKSkge1xuICAgICAgICAgICAgICAgIERPTS5tZXJnZUF0dHJzKGZyb21FbCwgdG9FbCwgeyBpc0lnbm9yZWQ6IHRydWUgfSk7XG4gICAgICAgICAgICAgICAgdGhpcy50cmFja0JlZm9yZShcInVwZGF0ZWRcIiwgZnJvbUVsLCB0b0VsKTtcbiAgICAgICAgICAgICAgICB1cGRhdGVzLnB1c2goZnJvbUVsKTtcbiAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICBET00uYXBwbHlTdGlja3lPcGVyYXRpb25zKGZyb21FbCk7XG4gICAgICAgICAgICAgIGNvbnN0IGlzTG9ja2VkID0gZnJvbUVsLmhhc0F0dHJpYnV0ZShQSFhfUkVGX0xPQ0spO1xuICAgICAgICAgICAgICBjb25zdCBjbG9uZSA9IGlzTG9ja2VkXG4gICAgICAgICAgICAgICAgPyBET00ucHJpdmF0ZShmcm9tRWwsIFBIWF9SRUZfTE9DSykgfHwgZnJvbUVsLmNsb25lTm9kZSh0cnVlKVxuICAgICAgICAgICAgICAgIDogbnVsbDtcbiAgICAgICAgICAgICAgaWYgKGNsb25lKSB7XG4gICAgICAgICAgICAgICAgRE9NLnB1dFByaXZhdGUoZnJvbUVsLCBQSFhfUkVGX0xPQ0ssIGNsb25lKTtcbiAgICAgICAgICAgICAgICBpZiAoIWlzRm9jdXNlZEZvcm1FbCkge1xuICAgICAgICAgICAgICAgICAgZnJvbUVsID0gY2xvbmU7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgICAgfVxuXG4gICAgICAgICAgLy8gbmVzdGVkIHZpZXcgaGFuZGxpbmdcbiAgICAgICAgICBpZiAoRE9NLmlzUGh4Q2hpbGQodG9FbCkpIHtcbiAgICAgICAgICAgIGNvbnN0IHByZXZTZXNzaW9uID0gZnJvbUVsLmdldEF0dHJpYnV0ZShQSFhfU0VTU0lPTik7XG4gICAgICAgICAgICBET00ubWVyZ2VBdHRycyhmcm9tRWwsIHRvRWwsIHsgZXhjbHVkZTogW1BIWF9TVEFUSUNdIH0pO1xuICAgICAgICAgICAgaWYgKHByZXZTZXNzaW9uICE9PSBcIlwiKSB7XG4gICAgICAgICAgICAgIGZyb21FbC5zZXRBdHRyaWJ1dGUoUEhYX1NFU1NJT04sIHByZXZTZXNzaW9uKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGZyb21FbC5zZXRBdHRyaWJ1dGUoUEhYX1JPT1RfSUQsIHRoaXMucm9vdElEKTtcbiAgICAgICAgICAgIERPTS5hcHBseVN0aWNreU9wZXJhdGlvbnMoZnJvbUVsKTtcbiAgICAgICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgICAgICB9XG5cbiAgICAgICAgICAvLyBpZiB3ZSBhcmUgdW5kb2luZyBhIGxvY2ssIGNvcHkgcG90ZW50aWFsbHkgbmVzdGVkIGNsb25lcyBvdmVyXG4gICAgICAgICAgaWYgKHRoaXMudW5kb1JlZiAmJiBET00ucHJpdmF0ZSh0b0VsLCBQSFhfUkVGX0xPQ0spKSB7XG4gICAgICAgICAgICBET00ucHV0UHJpdmF0ZShcbiAgICAgICAgICAgICAgZnJvbUVsLFxuICAgICAgICAgICAgICBQSFhfUkVGX0xPQ0ssXG4gICAgICAgICAgICAgIERPTS5wcml2YXRlKHRvRWwsIFBIWF9SRUZfTE9DSyksXG4gICAgICAgICAgICApO1xuICAgICAgICAgIH1cbiAgICAgICAgICAvLyBub3cgY29weSByZWd1bGFyIERPTS5wcml2YXRlIGRhdGFcbiAgICAgICAgICBET00uY29weVByaXZhdGVzKHRvRWwsIGZyb21FbCk7XG5cbiAgICAgICAgICAvLyBwaHgtcG9ydGFsIGhhbmRsaW5nXG4gICAgICAgICAgaWYgKERPTS5pc1BvcnRhbFRlbXBsYXRlKHRvRWwpKSB7XG4gICAgICAgICAgICBwb3J0YWxDYWxsYmFja3MucHVzaCgoKSA9PiB0aGlzLnRlbGVwb3J0KHRvRWwsIG1vcnBoKSk7XG4gICAgICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICAgICAgfVxuXG4gICAgICAgICAgLy8gc2tpcCBwYXRjaGluZyBmb2N1c2VkIGlucHV0cyB1bmxlc3MgZm9jdXMgaXMgYSBzZWxlY3QgdGhhdCBoYXMgY2hhbmdlZCBvcHRpb25zXG4gICAgICAgICAgaWYgKFxuICAgICAgICAgICAgaXNGb2N1c2VkRm9ybUVsICYmXG4gICAgICAgICAgICBmcm9tRWwudHlwZSAhPT0gXCJoaWRkZW5cIiAmJlxuICAgICAgICAgICAgIWZvY3VzZWRTZWxlY3RDaGFuZ2VkXG4gICAgICAgICAgKSB7XG4gICAgICAgICAgICB0aGlzLnRyYWNrQmVmb3JlKFwidXBkYXRlZFwiLCBmcm9tRWwsIHRvRWwpO1xuICAgICAgICAgICAgRE9NLm1lcmdlRm9jdXNlZElucHV0KGZyb21FbCwgdG9FbCk7XG4gICAgICAgICAgICBET00uc3luY0F0dHJzVG9Qcm9wcyhmcm9tRWwpO1xuICAgICAgICAgICAgdXBkYXRlcy5wdXNoKGZyb21FbCk7XG4gICAgICAgICAgICBET00uYXBwbHlTdGlja3lPcGVyYXRpb25zKGZyb21FbCk7XG4gICAgICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIC8vIGJsdXIgZm9jdXNlZCBzZWxlY3QgaWYgaXQgY2hhbmdlZCBzbyBuYXRpdmUgVUkgaXMgdXBkYXRlZCAoaWUgc2FmYXJpIHdvbid0IHVwZGF0ZSB2aXNpYmxlIG9wdGlvbnMpXG4gICAgICAgICAgICBpZiAoZm9jdXNlZFNlbGVjdENoYW5nZWQpIHtcbiAgICAgICAgICAgICAgZnJvbUVsLmJsdXIoKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGlmIChET00uaXNQaHhVcGRhdGUodG9FbCwgcGh4VXBkYXRlLCBbXCJhcHBlbmRcIiwgXCJwcmVwZW5kXCJdKSkge1xuICAgICAgICAgICAgICBhcHBlbmRQcmVwZW5kVXBkYXRlcy5wdXNoKFxuICAgICAgICAgICAgICAgIG5ldyBET01Qb3N0TW9ycGhSZXN0b3JlcihcbiAgICAgICAgICAgICAgICAgIGZyb21FbCxcbiAgICAgICAgICAgICAgICAgIHRvRWwsXG4gICAgICAgICAgICAgICAgICB0b0VsLmdldEF0dHJpYnV0ZShwaHhVcGRhdGUpLFxuICAgICAgICAgICAgICAgICksXG4gICAgICAgICAgICAgICk7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIERPTS5zeW5jQXR0cnNUb1Byb3BzKHRvRWwpO1xuICAgICAgICAgICAgRE9NLmFwcGx5U3RpY2t5T3BlcmF0aW9ucyh0b0VsKTtcbiAgICAgICAgICAgIHRoaXMudHJhY2tCZWZvcmUoXCJ1cGRhdGVkXCIsIGZyb21FbCwgdG9FbCk7XG4gICAgICAgICAgICByZXR1cm4gZnJvbUVsO1xuICAgICAgICAgIH1cbiAgICAgICAgfSxcbiAgICAgIH07XG5cbiAgICAgIG1vcnBoZG9tKHRhcmdldENvbnRhaW5lciwgc291cmNlLCBtb3JwaENhbGxiYWNrcyk7XG4gICAgfTtcblxuICAgIHRoaXMudHJhY2tCZWZvcmUoXCJhZGRlZFwiLCBjb250YWluZXIpO1xuICAgIHRoaXMudHJhY2tCZWZvcmUoXCJ1cGRhdGVkXCIsIGNvbnRhaW5lciwgY29udGFpbmVyKTtcblxuICAgIGxpdmVTb2NrZXQudGltZShcIm1vcnBoZG9tXCIsICgpID0+IHtcbiAgICAgIHRoaXMuc3RyZWFtcy5mb3JFYWNoKChbcmVmLCBpbnNlcnRzLCBkZWxldGVJZHMsIHJlc2V0XSkgPT4ge1xuICAgICAgICBpbnNlcnRzLmZvckVhY2goKFtrZXksIHN0cmVhbUF0LCBsaW1pdCwgdXBkYXRlT25seV0pID0+IHtcbiAgICAgICAgICB0aGlzLnN0cmVhbUluc2VydHNba2V5XSA9IHsgcmVmLCBzdHJlYW1BdCwgbGltaXQsIHJlc2V0LCB1cGRhdGVPbmx5IH07XG4gICAgICAgIH0pO1xuICAgICAgICBpZiAocmVzZXQgIT09IHVuZGVmaW5lZCkge1xuICAgICAgICAgIERPTS5hbGwoY29udGFpbmVyLCBgWyR7UEhYX1NUUkVBTV9SRUZ9PVwiJHtyZWZ9XCJdYCwgKGNoaWxkKSA9PiB7XG4gICAgICAgICAgICB0aGlzLnJlbW92ZVN0cmVhbUNoaWxkRWxlbWVudChjaGlsZCk7XG4gICAgICAgICAgfSk7XG4gICAgICAgIH1cbiAgICAgICAgZGVsZXRlSWRzLmZvckVhY2goKGlkKSA9PiB7XG4gICAgICAgICAgY29uc3QgY2hpbGQgPSBjb250YWluZXIucXVlcnlTZWxlY3RvcihgW2lkPVwiJHtpZH1cIl1gKTtcbiAgICAgICAgICBpZiAoY2hpbGQpIHtcbiAgICAgICAgICAgIHRoaXMucmVtb3ZlU3RyZWFtQ2hpbGRFbGVtZW50KGNoaWxkKTtcbiAgICAgICAgICB9XG4gICAgICAgIH0pO1xuICAgICAgfSk7XG5cbiAgICAgIC8vIGNsZWFyIHN0cmVhbSBpdGVtcyBmcm9tIHRoZSBkZWFkIHJlbmRlciBpZiB0aGV5IGFyZSBub3QgaW5zZXJ0ZWQgYWdhaW5cbiAgICAgIGlmIChpc0pvaW5QYXRjaCkge1xuICAgICAgICBET00uYWxsKHRoaXMuY29udGFpbmVyLCBgWyR7cGh4VXBkYXRlfT0ke1BIWF9TVFJFQU19XWApXG4gICAgICAgICAgLy8gaXQgaXMgaW1wb3J0YW50IHRvIGZpbHRlciB0aGUgZWxlbWVudCBiZWZvcmUgcmVtb3ZpbmcgdGhlbSwgYXNcbiAgICAgICAgICAvLyBpdCBtYXkgaGFwcGVuIHRoYXQgc3RyZWFtcyBhcmUgbmVzdGVkIGFuZCB0aGUgb3duZXIgY2hlY2sgZmFpbHMgaWZcbiAgICAgICAgICAvLyBhIHBhcmVudCBpcyByZW1vdmVkIGJlZm9yZSBhIGNoaWxkXG4gICAgICAgICAgLmZpbHRlcigoZWwpID0+IHRoaXMudmlldy5vd25zRWxlbWVudChlbCkpXG4gICAgICAgICAgLmZvckVhY2goKGVsKSA9PiB7XG4gICAgICAgICAgICBBcnJheS5mcm9tKGVsLmNoaWxkcmVuKS5mb3JFYWNoKChjaGlsZCkgPT4ge1xuICAgICAgICAgICAgICAvLyB3ZSBhbHJlYWR5IHBlcmZvcm1lZCB0aGUgb3duZXIgY2hlY2ssIGVhY2ggY2hpbGQgaXMgZ3VhcmFudGVlZCB0byBiZSBvd25lZFxuICAgICAgICAgICAgICAvLyBieSB0aGUgdmlldy4gVG8gcHJldmVudCB0aGUgbmVzdGVkIG93bmVyIGNoZWNrIGZyb20gZmFpbGluZyBpbiBjYXNlIG9mIG5lc3RlZFxuICAgICAgICAgICAgICAvLyBzdHJlYW1zIHdoZXJlIHRoZSBwYXJlbnQgaXMgcmVtb3ZlZCBiZWZvcmUgdGhlIGNoaWxkLCB3ZSBmb3JjZSB0aGUgcmVtb3ZhbFxuICAgICAgICAgICAgICB0aGlzLnJlbW92ZVN0cmVhbUNoaWxkRWxlbWVudChjaGlsZCwgdHJ1ZSk7XG4gICAgICAgICAgICB9KTtcbiAgICAgICAgICB9KTtcbiAgICAgIH1cblxuICAgICAgbW9ycGgodGFyZ2V0Q29udGFpbmVyLCBodG1sKTtcbiAgICAgIC8vIG5vcm1hbCBwYXRjaCBjb21wbGV0ZSwgdGVsZXBvcnQgZWxlbWVudHMgbm93XG4gICAgICBwb3J0YWxDYWxsYmFja3MuZm9yRWFjaCgoY2FsbGJhY2spID0+IGNhbGxiYWNrKCkpO1xuICAgICAgLy8gY2hlY2sgZm9yIGFueSB0ZWxlcG9ydGVkIGVsZW1lbnRzIHRoYXQgYXJlIG5vdCBpbiB0aGUgdmlldyBhbnkgbW9yZVxuICAgICAgLy8gYW5kIHJlbW92ZSB0aGVtXG4gICAgICB0aGlzLnZpZXcucG9ydGFsRWxlbWVudElkcy5mb3JFYWNoKChpZCkgPT4ge1xuICAgICAgICBjb25zdCBlbCA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKGlkKTtcbiAgICAgICAgaWYgKGVsKSB7XG4gICAgICAgICAgY29uc3Qgc291cmNlID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoXG4gICAgICAgICAgICBlbC5nZXRBdHRyaWJ1dGUoUEhYX1RFTEVQT1JURURfU1JDKSxcbiAgICAgICAgICApO1xuICAgICAgICAgIGlmICghc291cmNlKSB7XG4gICAgICAgICAgICBlbC5yZW1vdmUoKTtcbiAgICAgICAgICAgIHRoaXMub25Ob2RlRGlzY2FyZGVkKGVsKTtcbiAgICAgICAgICAgIHRoaXMudmlldy5kcm9wUG9ydGFsRWxlbWVudElkKGlkKTtcbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgIH0pO1xuICAgIH0pO1xuXG4gICAgaWYgKGxpdmVTb2NrZXQuaXNEZWJ1Z0VuYWJsZWQoKSkge1xuICAgICAgZGV0ZWN0RHVwbGljYXRlSWRzKCk7XG4gICAgICBkZXRlY3RJbnZhbGlkU3RyZWFtSW5zZXJ0cyh0aGlzLnN0cmVhbUluc2VydHMpO1xuICAgICAgLy8gd2FybiBpZiB0aGVyZSBhcmUgYW55IGlucHV0cyBuYW1lZCBcImlkXCJcbiAgICAgIEFycmF5LmZyb20oZG9jdW1lbnQucXVlcnlTZWxlY3RvckFsbChcImlucHV0W25hbWU9aWRdXCIpKS5mb3JFYWNoKFxuICAgICAgICAobm9kZSkgPT4ge1xuICAgICAgICAgIGlmIChub2RlIGluc3RhbmNlb2YgSFRNTElucHV0RWxlbWVudCAmJiBub2RlLmZvcm0pIHtcbiAgICAgICAgICAgIGNvbnNvbGUuZXJyb3IoXG4gICAgICAgICAgICAgICdEZXRlY3RlZCBhbiBpbnB1dCB3aXRoIG5hbWU9XCJpZFwiIGluc2lkZSBhIGZvcm0hIFRoaXMgd2lsbCBjYXVzZSBwcm9ibGVtcyB3aGVuIHBhdGNoaW5nIHRoZSBET00uXFxuJyxcbiAgICAgICAgICAgICAgbm9kZSxcbiAgICAgICAgICAgICk7XG4gICAgICAgICAgfVxuICAgICAgICB9LFxuICAgICAgKTtcbiAgICB9XG5cbiAgICBpZiAoYXBwZW5kUHJlcGVuZFVwZGF0ZXMubGVuZ3RoID4gMCkge1xuICAgICAgbGl2ZVNvY2tldC50aW1lKFwicG9zdC1tb3JwaCBhcHBlbmQvcHJlcGVuZCByZXN0b3JhdGlvblwiLCAoKSA9PiB7XG4gICAgICAgIGFwcGVuZFByZXBlbmRVcGRhdGVzLmZvckVhY2goKHVwZGF0ZSkgPT4gdXBkYXRlLnBlcmZvcm0oKSk7XG4gICAgICB9KTtcbiAgICB9XG5cbiAgICBsaXZlU29ja2V0LnNpbGVuY2VFdmVudHMoKCkgPT5cbiAgICAgIERPTS5yZXN0b3JlRm9jdXMoZm9jdXNlZCwgc2VsZWN0aW9uU3RhcnQsIHNlbGVjdGlvbkVuZCksXG4gICAgKTtcbiAgICBET00uZGlzcGF0Y2hFdmVudChkb2N1bWVudCwgXCJwaHg6dXBkYXRlXCIpO1xuICAgIGFkZGVkLmZvckVhY2goKGVsKSA9PiB0aGlzLnRyYWNrQWZ0ZXIoXCJhZGRlZFwiLCBlbCkpO1xuICAgIHVwZGF0ZXMuZm9yRWFjaCgoZWwpID0+IHRoaXMudHJhY2tBZnRlcihcInVwZGF0ZWRcIiwgZWwpKTtcblxuICAgIHRoaXMudHJhbnNpdGlvblBlbmRpbmdSZW1vdmVzKCk7XG5cbiAgICBpZiAoZXh0ZXJuYWxGb3JtVHJpZ2dlcmVkKSB7XG4gICAgICBsaXZlU29ja2V0LnVubG9hZCgpO1xuICAgICAgLy8gY2hlY2sgZm9yIHN1Ym1pdHRlciBhbmQgaW5qZWN0IGl0IGFzIGhpZGRlbiBpbnB1dCBmb3IgZXh0ZXJuYWwgc3VibWl0O1xuICAgICAgLy8gSW4gdGhlb3J5LCBpdCBjb3VsZCBoYXBwZW4gdGhhdCB0aGUgc3RvcmVkIHN1Ym1pdHRlciBpcyBvdXRkYXRlZCBhbmQgZG9lc24ndFxuICAgICAgLy8gZXhpc3QgaW4gdGhlIERPTSBhbnkgbW9yZSwgYnV0IHRoaXMgaXMgdW5saWtlbHksIHNvIHdlIGp1c3QgYWNjZXB0IGl0IGZvciBub3cuXG4gICAgICBjb25zdCBzdWJtaXR0ZXIgPSBET00ucHJpdmF0ZShleHRlcm5hbEZvcm1UcmlnZ2VyZWQsIFwic3VibWl0dGVyXCIpO1xuICAgICAgaWYgKHN1Ym1pdHRlciAmJiBzdWJtaXR0ZXIubmFtZSAmJiB0YXJnZXRDb250YWluZXIuY29udGFpbnMoc3VibWl0dGVyKSkge1xuICAgICAgICBjb25zdCBpbnB1dCA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoXCJpbnB1dFwiKTtcbiAgICAgICAgaW5wdXQudHlwZSA9IFwiaGlkZGVuXCI7XG4gICAgICAgIGNvbnN0IGZvcm1JZCA9IHN1Ym1pdHRlci5nZXRBdHRyaWJ1dGUoXCJmb3JtXCIpO1xuICAgICAgICBpZiAoZm9ybUlkKSB7XG4gICAgICAgICAgaW5wdXQuc2V0QXR0cmlidXRlKFwiZm9ybVwiLCBmb3JtSWQpO1xuICAgICAgICB9XG4gICAgICAgIGlucHV0Lm5hbWUgPSBzdWJtaXR0ZXIubmFtZTtcbiAgICAgICAgaW5wdXQudmFsdWUgPSBzdWJtaXR0ZXIudmFsdWU7XG4gICAgICAgIHN1Ym1pdHRlci5wYXJlbnRFbGVtZW50Lmluc2VydEJlZm9yZShpbnB1dCwgc3VibWl0dGVyKTtcbiAgICAgIH1cbiAgICAgIC8vIHVzZSBwcm90b3R5cGUncyBzdWJtaXQgaW4gY2FzZSB0aGVyZSdzIGEgZm9ybSBjb250cm9sIHdpdGggbmFtZSBvciBpZCBvZiBcInN1Ym1pdFwiXG4gICAgICAvLyBodHRwczovL2RldmVsb3Blci5tb3ppbGxhLm9yZy9lbi1VUy9kb2NzL1dlYi9BUEkvSFRNTEZvcm1FbGVtZW50L3N1Ym1pdFxuICAgICAgT2JqZWN0LmdldFByb3RvdHlwZU9mKGV4dGVybmFsRm9ybVRyaWdnZXJlZCkuc3VibWl0LmNhbGwoXG4gICAgICAgIGV4dGVybmFsRm9ybVRyaWdnZXJlZCxcbiAgICAgICk7XG4gICAgfVxuICAgIHJldHVybiB0cnVlO1xuICB9XG5cbiAgb25Ob2RlRGlzY2FyZGVkKGVsKSB7XG4gICAgLy8gbmVzdGVkIHZpZXcgaGFuZGxpbmdcbiAgICBpZiAoRE9NLmlzUGh4Q2hpbGQoZWwpIHx8IERPTS5pc1BoeFN0aWNreShlbCkpIHtcbiAgICAgIHRoaXMubGl2ZVNvY2tldC5kZXN0cm95Vmlld0J5RWwoZWwpO1xuICAgIH1cbiAgICB0aGlzLnRyYWNrQWZ0ZXIoXCJkaXNjYXJkZWRcIiwgZWwpO1xuICB9XG5cbiAgbWF5YmVQZW5kaW5nUmVtb3ZlKG5vZGUpIHtcbiAgICBpZiAobm9kZS5nZXRBdHRyaWJ1dGUgJiYgbm9kZS5nZXRBdHRyaWJ1dGUodGhpcy5waHhSZW1vdmUpICE9PSBudWxsKSB7XG4gICAgICB0aGlzLnBlbmRpbmdSZW1vdmVzLnB1c2gobm9kZSk7XG4gICAgICByZXR1cm4gdHJ1ZTtcbiAgICB9IGVsc2Uge1xuICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH1cbiAgfVxuXG4gIHJlbW92ZVN0cmVhbUNoaWxkRWxlbWVudChjaGlsZCwgZm9yY2UgPSBmYWxzZSkge1xuICAgIC8vIG1ha2Ugc3VyZSB0byBvbmx5IHJlbW92ZSBlbGVtZW50cyBvd25lZCBieSB0aGUgY3VycmVudCB2aWV3XG4gICAgLy8gc2VlIGh0dHBzOi8vZ2l0aHViLmNvbS9waG9lbml4ZnJhbWV3b3JrL3Bob2VuaXhfbGl2ZV92aWV3L2lzc3Vlcy8zMDQ3XG4gICAgLy8gYW5kIGh0dHBzOi8vZ2l0aHViLmNvbS9waG9lbml4ZnJhbWV3b3JrL3Bob2VuaXhfbGl2ZV92aWV3L2lzc3Vlcy8zNjgxXG4gICAgaWYgKCFmb3JjZSAmJiAhdGhpcy52aWV3Lm93bnNFbGVtZW50KGNoaWxkKSkge1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIC8vIHdlIG5lZWQgdG8gc3RvcmUgdGhlIG5vZGUgaWYgaXQgaXMgYWN0dWFsbHkgcmUtYWRkZWQgaW4gdGhlIHNhbWUgcGF0Y2hcbiAgICAvLyB3ZSBkbyBOT1Qgd2FudCB0byBleGVjdXRlIHBoeC1yZW1vdmUsIHdlIGRvIE5PVCB3YW50IHRvIGNhbGwgb25Ob2RlRGlzY2FyZGVkXG4gICAgaWYgKHRoaXMuc3RyZWFtSW5zZXJ0c1tjaGlsZC5pZF0pIHtcbiAgICAgIHRoaXMuc3RyZWFtQ29tcG9uZW50UmVzdG9yZVtjaGlsZC5pZF0gPSBjaGlsZDtcbiAgICAgIGNoaWxkLnJlbW92ZSgpO1xuICAgIH0gZWxzZSB7XG4gICAgICAvLyBvbmx5IHJlbW92ZSB0aGUgZWxlbWVudCBub3cgaWYgaXQgaGFzIG5vIHBoeC1yZW1vdmUgYmluZGluZ1xuICAgICAgaWYgKCF0aGlzLm1heWJlUGVuZGluZ1JlbW92ZShjaGlsZCkpIHtcbiAgICAgICAgY2hpbGQucmVtb3ZlKCk7XG4gICAgICAgIHRoaXMub25Ob2RlRGlzY2FyZGVkKGNoaWxkKTtcbiAgICAgIH1cbiAgICB9XG4gIH1cblxuICBnZXRTdHJlYW1JbnNlcnQoZWwpIHtcbiAgICBjb25zdCBpbnNlcnQgPSBlbC5pZCA/IHRoaXMuc3RyZWFtSW5zZXJ0c1tlbC5pZF0gOiB7fTtcbiAgICByZXR1cm4gaW5zZXJ0IHx8IHt9O1xuICB9XG5cbiAgc2V0U3RyZWFtUmVmKGVsLCByZWYpIHtcbiAgICBET00ucHV0U3RpY2t5KGVsLCBQSFhfU1RSRUFNX1JFRiwgKGVsKSA9PlxuICAgICAgZWwuc2V0QXR0cmlidXRlKFBIWF9TVFJFQU1fUkVGLCByZWYpLFxuICAgICk7XG4gIH1cblxuICBtYXliZVJlT3JkZXJTdHJlYW0oZWwsIGlzTmV3KSB7XG4gICAgY29uc3QgeyByZWYsIHN0cmVhbUF0LCByZXNldCB9ID0gdGhpcy5nZXRTdHJlYW1JbnNlcnQoZWwpO1xuICAgIGlmIChzdHJlYW1BdCA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgLy8gd2UgbmVlZCB0byBzZXQgdGhlIFBIWF9TVFJFQU1fUkVGIGhlcmUgYXMgd2VsbCBhcyBhZGRDaGlsZCBpcyBpbnZva2VkIG9ubHkgZm9yIHBhcmVudHNcbiAgICB0aGlzLnNldFN0cmVhbVJlZihlbCwgcmVmKTtcblxuICAgIGlmICghcmVzZXQgJiYgIWlzTmV3KSB7XG4gICAgICAvLyB3ZSBvbmx5IHJlb3JkZXIgaWYgdGhlIGVsZW1lbnQgaXMgbmV3IG9yIGl0J3MgYSBzdHJlYW0gcmVzZXRcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICAvLyBjaGVjayBpZiB0aGUgZWxlbWVudCBoYXMgYSBwYXJlbnQgZWxlbWVudDtcbiAgICAvLyBpdCBkb2Vzbid0IGlmIHdlIGFyZSBjdXJyZW50bHkgcmVjdXJzaXZlbHkgbW9ycGhpbmcgKHJlc3RvcmluZyBhIHNhdmVkIHN0cmVhbSBjaGlsZClcbiAgICAvLyBiZWNhdXNlIHRoZSBlbGVtZW50IGlzIG5vdCB5ZXQgYWRkZWQgdG8gdGhlIHJlYWwgZG9tO1xuICAgIC8vIHJlb3JkZXJpbmcgZG9lcyBub3QgbWFrZSBzZW5zZSBpbiB0aGF0IGNhc2UgYW55d2F5XG4gICAgaWYgKCFlbC5wYXJlbnRFbGVtZW50KSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgaWYgKHN0cmVhbUF0ID09PSAwKSB7XG4gICAgICBlbC5wYXJlbnRFbGVtZW50Lmluc2VydEJlZm9yZShlbCwgZWwucGFyZW50RWxlbWVudC5maXJzdEVsZW1lbnRDaGlsZCk7XG4gICAgfSBlbHNlIGlmIChzdHJlYW1BdCA+IDApIHtcbiAgICAgIGNvbnN0IGNoaWxkcmVuID0gQXJyYXkuZnJvbShlbC5wYXJlbnRFbGVtZW50LmNoaWxkcmVuKTtcbiAgICAgIGNvbnN0IG9sZEluZGV4ID0gY2hpbGRyZW4uaW5kZXhPZihlbCk7XG4gICAgICBpZiAoc3RyZWFtQXQgPj0gY2hpbGRyZW4ubGVuZ3RoIC0gMSkge1xuICAgICAgICBlbC5wYXJlbnRFbGVtZW50LmFwcGVuZENoaWxkKGVsKTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIGNvbnN0IHNpYmxpbmcgPSBjaGlsZHJlbltzdHJlYW1BdF07XG4gICAgICAgIGlmIChvbGRJbmRleCA+IHN0cmVhbUF0KSB7XG4gICAgICAgICAgZWwucGFyZW50RWxlbWVudC5pbnNlcnRCZWZvcmUoZWwsIHNpYmxpbmcpO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIGVsLnBhcmVudEVsZW1lbnQuaW5zZXJ0QmVmb3JlKGVsLCBzaWJsaW5nLm5leHRFbGVtZW50U2libGluZyk7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9XG5cbiAgICB0aGlzLm1heWJlTGltaXRTdHJlYW0oZWwpO1xuICB9XG5cbiAgbWF5YmVMaW1pdFN0cmVhbShlbCkge1xuICAgIGNvbnN0IHsgbGltaXQgfSA9IHRoaXMuZ2V0U3RyZWFtSW5zZXJ0KGVsKTtcbiAgICBjb25zdCBjaGlsZHJlbiA9IGxpbWl0ICE9PSBudWxsICYmIEFycmF5LmZyb20oZWwucGFyZW50RWxlbWVudC5jaGlsZHJlbik7XG4gICAgaWYgKGxpbWl0ICYmIGxpbWl0IDwgMCAmJiBjaGlsZHJlbi5sZW5ndGggPiBsaW1pdCAqIC0xKSB7XG4gICAgICBjaGlsZHJlblxuICAgICAgICAuc2xpY2UoMCwgY2hpbGRyZW4ubGVuZ3RoICsgbGltaXQpXG4gICAgICAgIC5mb3JFYWNoKChjaGlsZCkgPT4gdGhpcy5yZW1vdmVTdHJlYW1DaGlsZEVsZW1lbnQoY2hpbGQpKTtcbiAgICB9IGVsc2UgaWYgKGxpbWl0ICYmIGxpbWl0ID49IDAgJiYgY2hpbGRyZW4ubGVuZ3RoID4gbGltaXQpIHtcbiAgICAgIGNoaWxkcmVuXG4gICAgICAgIC5zbGljZShsaW1pdClcbiAgICAgICAgLmZvckVhY2goKGNoaWxkKSA9PiB0aGlzLnJlbW92ZVN0cmVhbUNoaWxkRWxlbWVudChjaGlsZCkpO1xuICAgIH1cbiAgfVxuXG4gIHRyYW5zaXRpb25QZW5kaW5nUmVtb3ZlcygpIHtcbiAgICBjb25zdCB7IHBlbmRpbmdSZW1vdmVzLCBsaXZlU29ja2V0IH0gPSB0aGlzO1xuICAgIGlmIChwZW5kaW5nUmVtb3Zlcy5sZW5ndGggPiAwKSB7XG4gICAgICBsaXZlU29ja2V0LnRyYW5zaXRpb25SZW1vdmVzKHBlbmRpbmdSZW1vdmVzLCAoKSA9PiB7XG4gICAgICAgIHBlbmRpbmdSZW1vdmVzLmZvckVhY2goKGVsKSA9PiB7XG4gICAgICAgICAgY29uc3QgY2hpbGQgPSBET00uZmlyc3RQaHhDaGlsZChlbCk7XG4gICAgICAgICAgaWYgKGNoaWxkKSB7XG4gICAgICAgICAgICBsaXZlU29ja2V0LmRlc3Ryb3lWaWV3QnlFbChjaGlsZCk7XG4gICAgICAgICAgfVxuICAgICAgICAgIGVsLnJlbW92ZSgpO1xuICAgICAgICB9KTtcbiAgICAgICAgdGhpcy50cmFja0FmdGVyKFwidHJhbnNpdGlvbnNEaXNjYXJkZWRcIiwgcGVuZGluZ1JlbW92ZXMpO1xuICAgICAgfSk7XG4gICAgfVxuICB9XG5cbiAgaXNDaGFuZ2VkU2VsZWN0KGZyb21FbCwgdG9FbCkge1xuICAgIGlmICghKGZyb21FbCBpbnN0YW5jZW9mIEhUTUxTZWxlY3RFbGVtZW50KSB8fCBmcm9tRWwubXVsdGlwbGUpIHtcbiAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9XG4gICAgaWYgKGZyb21FbC5vcHRpb25zLmxlbmd0aCAhPT0gdG9FbC5vcHRpb25zLmxlbmd0aCkge1xuICAgICAgcmV0dXJuIHRydWU7XG4gICAgfVxuXG4gICAgLy8ga2VlcCB0aGUgY3VycmVudCB2YWx1ZVxuICAgIHRvRWwudmFsdWUgPSBmcm9tRWwudmFsdWU7XG5cbiAgICAvLyBpbiBnZW5lcmFsIHdlIGhhdmUgdG8gYmUgdmVyeSBjYXJlZnVsIHdpdGggdXNpbmcgaXNFcXVhbE5vZGUgYXMgaXQgZG9lcyBub3QgYSByZWxpYWJsZVxuICAgIC8vIERPTSB0cmVlIGVxdWFsaXR5IGNoZWNrLCBidXQgZm9yIHNlbGVjdGlvbiBhdHRyaWJ1dGVzIGFuZCBvcHRpb25zIGl0IHdvcmtzIGZpbmVcbiAgICByZXR1cm4gIWZyb21FbC5pc0VxdWFsTm9kZSh0b0VsKTtcbiAgfVxuXG4gIGlzQ0lEUGF0Y2goKSB7XG4gICAgcmV0dXJuIHRoaXMuY2lkUGF0Y2g7XG4gIH1cblxuICBza2lwQ0lEU2libGluZyhlbCkge1xuICAgIHJldHVybiBlbC5ub2RlVHlwZSA9PT0gTm9kZS5FTEVNRU5UX05PREUgJiYgZWwuaGFzQXR0cmlidXRlKFBIWF9TS0lQKTtcbiAgfVxuXG4gIHRhcmdldENJRENvbnRhaW5lcihodG1sKSB7XG4gICAgaWYgKCF0aGlzLmlzQ0lEUGF0Y2goKSkge1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICBjb25zdCBbZmlyc3QsIC4uLnJlc3RdID0gRE9NLmZpbmRDb21wb25lbnROb2RlTGlzdChcbiAgICAgIHRoaXMudmlldy5pZCxcbiAgICAgIHRoaXMudGFyZ2V0Q0lELFxuICAgICk7XG4gICAgaWYgKHJlc3QubGVuZ3RoID09PSAwICYmIERPTS5jaGlsZE5vZGVMZW5ndGgoaHRtbCkgPT09IDEpIHtcbiAgICAgIHJldHVybiBmaXJzdDtcbiAgICB9IGVsc2Uge1xuICAgICAgcmV0dXJuIGZpcnN0ICYmIGZpcnN0LnBhcmVudE5vZGU7XG4gICAgfVxuICB9XG5cbiAgaW5kZXhPZihwYXJlbnQsIGNoaWxkKSB7XG4gICAgcmV0dXJuIEFycmF5LmZyb20ocGFyZW50LmNoaWxkcmVuKS5pbmRleE9mKGNoaWxkKTtcbiAgfVxuXG4gIHRlbGVwb3J0KGVsLCBtb3JwaCkge1xuICAgIGNvbnN0IHRhcmdldFNlbGVjdG9yID0gZWwuZ2V0QXR0cmlidXRlKFBIWF9QT1JUQUwpO1xuICAgIGNvbnN0IHBvcnRhbENvbnRhaW5lciA9IGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3IodGFyZ2V0U2VsZWN0b3IpO1xuICAgIGlmICghcG9ydGFsQ29udGFpbmVyKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoXG4gICAgICAgIFwicG9ydGFsIHRhcmdldCB3aXRoIHNlbGVjdG9yIFwiICsgdGFyZ2V0U2VsZWN0b3IgKyBcIiBub3QgZm91bmRcIixcbiAgICAgICk7XG4gICAgfVxuICAgIC8vIHBoeC1wb3J0YWwgdGVtcGxhdGVzIG11c3QgaGF2ZSBhIHNpbmdsZSByb290IGVsZW1lbnQsIHNvIHdlIGFzc3VtZSB0aGlzIHRvIGJlXG4gICAgLy8gdGhlIGNhc2UgaGVyZVxuICAgIGNvbnN0IHRvVGVsZXBvcnQgPSBlbC5jb250ZW50LmZpcnN0RWxlbWVudENoaWxkO1xuICAgIC8vIHRoZSBQSFhfU0tJUCBvcHRpbWl6YXRpb24gY2FuIGFsc28gYXBwbHkgaW5zaWRlIG9mIHRoZSA8dGVtcGxhdGU+IGVsZW1lbnRzXG4gICAgaWYgKHRoaXMuc2tpcENJRFNpYmxpbmcodG9UZWxlcG9ydCkpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgaWYgKCF0b1RlbGVwb3J0Py5pZCkge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKFxuICAgICAgICBcInBoeC1wb3J0YWwgdGVtcGxhdGUgbXVzdCBoYXZlIGEgc2luZ2xlIHJvb3QgZWxlbWVudCB3aXRoIElEIVwiLFxuICAgICAgKTtcbiAgICB9XG4gICAgY29uc3QgZXhpc3RpbmcgPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCh0b1RlbGVwb3J0LmlkKTtcbiAgICBsZXQgcG9ydGFsVGFyZ2V0O1xuICAgIGlmIChleGlzdGluZykge1xuICAgICAgLy8gY2hlY2sgaWYgdGhlIGVsZW1lbnQgbmVlZHMgdG8gYmUgbW92ZWQgdG8gYW5vdGhlciB0YXJnZXRcbiAgICAgIGlmICghcG9ydGFsQ29udGFpbmVyLmNvbnRhaW5zKGV4aXN0aW5nKSkge1xuICAgICAgICBwb3J0YWxDb250YWluZXIuYXBwZW5kQ2hpbGQoZXhpc3RpbmcpO1xuICAgICAgfVxuICAgICAgLy8gd2UgYWxyZWFkeSB0ZWxlcG9ydGVkIGluIGEgcHJldmlvdXMgcGF0Y2hcbiAgICAgIHBvcnRhbFRhcmdldCA9IGV4aXN0aW5nO1xuICAgIH0gZWxzZSB7XG4gICAgICAvLyBjcmVhdGUgZW1wdHkgdGFyZ2V0IGFuZCBtb3JwaCBpdCByZWN1cnNpdmVseVxuICAgICAgcG9ydGFsVGFyZ2V0ID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCh0b1RlbGVwb3J0LnRhZ05hbWUpO1xuICAgICAgcG9ydGFsQ29udGFpbmVyLmFwcGVuZENoaWxkKHBvcnRhbFRhcmdldCk7XG4gICAgfVxuICAgIC8vIG1hcmsgdGhlIHRhcmdldCBhcyB0ZWxlcG9ydGVkO1xuICAgIC8vIHRvIHByZXZlbnQgdW5uZWNlc3NhcnkgYXR0cmlidXRlIG1vZGlmaWNhdGlvbnMsIHdlIHNldCB0aGUgYXR0cmlidXRlXG4gICAgLy8gb24gdGhlIHNvdXJjZSBhbmQgcmVtb3ZlIGl0IGFmdGVyIG1vcnBoaW5nICh3ZSBjb3VsZCBhbHNvIGp1c3Qga2VlcCBpdClcbiAgICAvLyBvdGhlcndpc2UgbW9ycGhkb20gd291bGQgcmVtb3ZlIGl0LCBhcyB0aGUgcmVmIGlzIG5vdCBwcmVzZW50IGluIHRoZSBzb3VyY2VcbiAgICAvLyBhbmQgd2UnZCBuZWVkIHRvIHNldCBpdCBiYWNrIGFmdGVyIGVhY2ggbW9ycGhcbiAgICB0b1RlbGVwb3J0LnNldEF0dHJpYnV0ZShQSFhfVEVMRVBPUlRFRF9SRUYsIHRoaXMudmlldy5pZCk7XG4gICAgdG9UZWxlcG9ydC5zZXRBdHRyaWJ1dGUoUEhYX1RFTEVQT1JURURfU1JDLCBlbC5pZCk7XG4gICAgbW9ycGgocG9ydGFsVGFyZ2V0LCB0b1RlbGVwb3J0LCB0cnVlKTtcbiAgICB0b1RlbGVwb3J0LnJlbW92ZUF0dHJpYnV0ZShQSFhfVEVMRVBPUlRFRF9SRUYpO1xuICAgIHRvVGVsZXBvcnQucmVtb3ZlQXR0cmlidXRlKFBIWF9URUxFUE9SVEVEX1NSQyk7XG4gICAgLy8gc3RvcmUgYSByZWZlcmVuY2UgdG8gdGhlIHRlbGVwb3J0ZWQgZWxlbWVudCBpbiB0aGUgdmlld1xuICAgIC8vIHRvIGNsZWFudXAgd2hlbiB0aGUgdmlldyBpcyBkZXN0cm95ZWQsIGluIGNhc2UgdGhlIHBvcnRhbCB0YXJnZXRcbiAgICAvLyBpcyBvdXRzaWRlIHRoZSB2aWV3IGl0c2VsZlxuICAgIHRoaXMudmlldy5wdXNoUG9ydGFsRWxlbWVudElkKHRvVGVsZXBvcnQuaWQpO1xuICB9XG5cbiAgaGFuZGxlUnVudGltZUhvb2soZWwsIHNvdXJjZSkge1xuICAgIC8vIHVzdWFsbHksIHNjcmlwdHMgYXJlIG5vdCBleGVjdXRlZCB3aGVuIG1vcnBoZG9tIGFkZHMgdGhlbSB0byB0aGUgRE9NXG4gICAgLy8gd2Ugc3BlY2lhbCBjYXNlIHJ1bnRpbWUgY29sb2NhdGVkIGhvb2tzXG4gICAgY29uc3QgbmFtZSA9IGVsLmdldEF0dHJpYnV0ZShQSFhfUlVOVElNRV9IT09LKTtcbiAgICBsZXQgbm9uY2UgPSBlbC5oYXNBdHRyaWJ1dGUoXCJub25jZVwiKSA/IGVsLmdldEF0dHJpYnV0ZShcIm5vbmNlXCIpIDogbnVsbDtcbiAgICBpZiAoZWwuaGFzQXR0cmlidXRlKFwibm9uY2VcIikpIHtcbiAgICAgIGNvbnN0IHRlbXBsYXRlID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudChcInRlbXBsYXRlXCIpO1xuICAgICAgdGVtcGxhdGUuaW5uZXJIVE1MID0gc291cmNlO1xuICAgICAgbm9uY2UgPSB0ZW1wbGF0ZS5jb250ZW50XG4gICAgICAgIC5xdWVyeVNlbGVjdG9yKGBzY3JpcHRbJHtQSFhfUlVOVElNRV9IT09LfT1cIiR7Q1NTLmVzY2FwZShuYW1lKX1cIl1gKVxuICAgICAgICAuZ2V0QXR0cmlidXRlKFwibm9uY2VcIik7XG4gICAgfVxuICAgIGNvbnN0IHNjcmlwdCA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoXCJzY3JpcHRcIik7XG4gICAgc2NyaXB0LnRleHRDb250ZW50ID0gZWwudGV4dENvbnRlbnQ7XG4gICAgRE9NLm1lcmdlQXR0cnMoc2NyaXB0LCBlbCwgeyBpc0lnbm9yZWQ6IGZhbHNlIH0pO1xuICAgIGlmIChub25jZSkge1xuICAgICAgc2NyaXB0Lm5vbmNlID0gbm9uY2U7XG4gICAgfVxuICAgIGVsLnJlcGxhY2VXaXRoKHNjcmlwdCk7XG4gICAgZWwgPSBzY3JpcHQ7XG4gIH1cbn1cbiIsICJpbXBvcnQge1xuICBDT01QT05FTlRTLFxuICBURU1QTEFURVMsXG4gIEVWRU5UUyxcbiAgUEhYX0NPTVBPTkVOVCxcbiAgUEhYX1ZJRVdfUkVGLFxuICBQSFhfU0tJUCxcbiAgUEhYX01BR0lDX0lELFxuICBSRVBMWSxcbiAgU1RBVElDLFxuICBUSVRMRSxcbiAgU1RSRUFNLFxuICBST09ULFxuICBLRVlFRCxcbiAgS0VZRURfQ09VTlQsXG59IGZyb20gXCIuL2NvbnN0YW50c1wiO1xuXG5pbXBvcnQgeyBpc09iamVjdCwgbG9nRXJyb3IsIGlzQ2lkIH0gZnJvbSBcIi4vdXRpbHNcIjtcblxuY29uc3QgVk9JRF9UQUdTID0gbmV3IFNldChbXG4gIFwiYXJlYVwiLFxuICBcImJhc2VcIixcbiAgXCJiclwiLFxuICBcImNvbFwiLFxuICBcImNvbW1hbmRcIixcbiAgXCJlbWJlZFwiLFxuICBcImhyXCIsXG4gIFwiaW1nXCIsXG4gIFwiaW5wdXRcIixcbiAgXCJrZXlnZW5cIixcbiAgXCJsaW5rXCIsXG4gIFwibWV0YVwiLFxuICBcInBhcmFtXCIsXG4gIFwic291cmNlXCIsXG4gIFwidHJhY2tcIixcbiAgXCJ3YnJcIixcbl0pO1xuY29uc3QgcXVvdGVDaGFycyA9IG5ldyBTZXQoW1wiJ1wiLCAnXCInXSk7XG5cbmV4cG9ydCBjb25zdCBtb2RpZnlSb290ID0gKGh0bWwsIGF0dHJzLCBjbGVhcklubmVySFRNTCkgPT4ge1xuICBsZXQgaSA9IDA7XG4gIGxldCBpbnNpZGVDb21tZW50ID0gZmFsc2U7XG4gIGxldCBiZWZvcmVUYWcsIGFmdGVyVGFnLCB0YWcsIHRhZ05hbWVFbmRzQXQsIGlkLCBuZXdIVE1MO1xuXG4gIGNvbnN0IGxvb2thaGVhZCA9IGh0bWwubWF0Y2goL14oXFxzKig/OjwhLS0uKj8tLT5cXHMqKSopPChbXlxcc1xcLz5dKykvKTtcbiAgaWYgKGxvb2thaGVhZCA9PT0gbnVsbCkge1xuICAgIHRocm93IG5ldyBFcnJvcihgbWFsZm9ybWVkIGh0bWwgJHtodG1sfWApO1xuICB9XG5cbiAgaSA9IGxvb2thaGVhZFswXS5sZW5ndGg7XG4gIGJlZm9yZVRhZyA9IGxvb2thaGVhZFsxXTtcbiAgdGFnID0gbG9va2FoZWFkWzJdO1xuICB0YWdOYW1lRW5kc0F0ID0gaTtcblxuICAvLyBTY2FuIHRoZSBvcGVuaW5nIHRhZyBmb3IgaWQsIGlmIHRoZXJlIGlzIGFueVxuICBmb3IgKGk7IGkgPCBodG1sLmxlbmd0aDsgaSsrKSB7XG4gICAgaWYgKGh0bWwuY2hhckF0KGkpID09PSBcIj5cIikge1xuICAgICAgYnJlYWs7XG4gICAgfVxuICAgIGlmIChodG1sLmNoYXJBdChpKSA9PT0gXCI9XCIpIHtcbiAgICAgIGNvbnN0IGlzSWQgPSBodG1sLnNsaWNlKGkgLSAzLCBpKSA9PT0gXCIgaWRcIjtcbiAgICAgIGkrKztcbiAgICAgIGNvbnN0IGNoYXIgPSBodG1sLmNoYXJBdChpKTtcbiAgICAgIGlmIChxdW90ZUNoYXJzLmhhcyhjaGFyKSkge1xuICAgICAgICBjb25zdCBhdHRyU3RhcnRzQXQgPSBpO1xuICAgICAgICBpKys7XG4gICAgICAgIGZvciAoaTsgaSA8IGh0bWwubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgICBpZiAoaHRtbC5jaGFyQXQoaSkgPT09IGNoYXIpIHtcbiAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICBpZiAoaXNJZCkge1xuICAgICAgICAgIGlkID0gaHRtbC5zbGljZShhdHRyU3RhcnRzQXQgKyAxLCBpKTtcbiAgICAgICAgICBicmVhaztcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIGxldCBjbG9zZUF0ID0gaHRtbC5sZW5ndGggLSAxO1xuICBpbnNpZGVDb21tZW50ID0gZmFsc2U7XG4gIHdoaWxlIChjbG9zZUF0ID49IGJlZm9yZVRhZy5sZW5ndGggKyB0YWcubGVuZ3RoKSB7XG4gICAgY29uc3QgY2hhciA9IGh0bWwuY2hhckF0KGNsb3NlQXQpO1xuICAgIGlmIChpbnNpZGVDb21tZW50KSB7XG4gICAgICBpZiAoY2hhciA9PT0gXCItXCIgJiYgaHRtbC5zbGljZShjbG9zZUF0IC0gMywgY2xvc2VBdCkgPT09IFwiPCEtXCIpIHtcbiAgICAgICAgaW5zaWRlQ29tbWVudCA9IGZhbHNlO1xuICAgICAgICBjbG9zZUF0IC09IDQ7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBjbG9zZUF0IC09IDE7XG4gICAgICB9XG4gICAgfSBlbHNlIGlmIChjaGFyID09PSBcIj5cIiAmJiBodG1sLnNsaWNlKGNsb3NlQXQgLSAyLCBjbG9zZUF0KSA9PT0gXCItLVwiKSB7XG4gICAgICBpbnNpZGVDb21tZW50ID0gdHJ1ZTtcbiAgICAgIGNsb3NlQXQgLT0gMztcbiAgICB9IGVsc2UgaWYgKGNoYXIgPT09IFwiPlwiKSB7XG4gICAgICBicmVhaztcbiAgICB9IGVsc2Uge1xuICAgICAgY2xvc2VBdCAtPSAxO1xuICAgIH1cbiAgfVxuICBhZnRlclRhZyA9IGh0bWwuc2xpY2UoY2xvc2VBdCArIDEsIGh0bWwubGVuZ3RoKTtcblxuICBjb25zdCBhdHRyc1N0ciA9IE9iamVjdC5rZXlzKGF0dHJzKVxuICAgIC5tYXAoKGF0dHIpID0+IChhdHRyc1thdHRyXSA9PT0gdHJ1ZSA/IGF0dHIgOiBgJHthdHRyfT1cIiR7YXR0cnNbYXR0cl19XCJgKSlcbiAgICAuam9pbihcIiBcIik7XG5cbiAgaWYgKGNsZWFySW5uZXJIVE1MKSB7XG4gICAgLy8gS2VlcCB0aGUgaWQgaWYgYW55XG4gICAgY29uc3QgaWRBdHRyU3RyID0gaWQgPyBgIGlkPVwiJHtpZH1cImAgOiBcIlwiO1xuICAgIGlmIChWT0lEX1RBR1MuaGFzKHRhZykpIHtcbiAgICAgIG5ld0hUTUwgPSBgPCR7dGFnfSR7aWRBdHRyU3RyfSR7YXR0cnNTdHIgPT09IFwiXCIgPyBcIlwiIDogXCIgXCJ9JHthdHRyc1N0cn0vPmA7XG4gICAgfSBlbHNlIHtcbiAgICAgIG5ld0hUTUwgPSBgPCR7dGFnfSR7aWRBdHRyU3RyfSR7YXR0cnNTdHIgPT09IFwiXCIgPyBcIlwiIDogXCIgXCJ9JHthdHRyc1N0cn0+PC8ke3RhZ30+YDtcbiAgICB9XG4gIH0gZWxzZSB7XG4gICAgY29uc3QgcmVzdCA9IGh0bWwuc2xpY2UodGFnTmFtZUVuZHNBdCwgY2xvc2VBdCArIDEpO1xuICAgIG5ld0hUTUwgPSBgPCR7dGFnfSR7YXR0cnNTdHIgPT09IFwiXCIgPyBcIlwiIDogXCIgXCJ9JHthdHRyc1N0cn0ke3Jlc3R9YDtcbiAgfVxuXG4gIHJldHVybiBbbmV3SFRNTCwgYmVmb3JlVGFnLCBhZnRlclRhZ107XG59O1xuXG5leHBvcnQgZGVmYXVsdCBjbGFzcyBSZW5kZXJlZCB7XG4gIHN0YXRpYyBleHRyYWN0KGRpZmYpIHtcbiAgICBjb25zdCB7IFtSRVBMWV06IHJlcGx5LCBbRVZFTlRTXTogZXZlbnRzLCBbVElUTEVdOiB0aXRsZSB9ID0gZGlmZjtcbiAgICBkZWxldGUgZGlmZltSRVBMWV07XG4gICAgZGVsZXRlIGRpZmZbRVZFTlRTXTtcbiAgICBkZWxldGUgZGlmZltUSVRMRV07XG4gICAgcmV0dXJuIHsgZGlmZiwgdGl0bGUsIHJlcGx5OiByZXBseSB8fCBudWxsLCBldmVudHM6IGV2ZW50cyB8fCBbXSB9O1xuICB9XG5cbiAgY29uc3RydWN0b3Iodmlld0lkLCByZW5kZXJlZCkge1xuICAgIHRoaXMudmlld0lkID0gdmlld0lkO1xuICAgIHRoaXMucmVuZGVyZWQgPSB7fTtcbiAgICB0aGlzLm1hZ2ljSWQgPSAwO1xuICAgIHRoaXMubWVyZ2VEaWZmKHJlbmRlcmVkKTtcbiAgfVxuXG4gIHBhcmVudFZpZXdJZCgpIHtcbiAgICByZXR1cm4gdGhpcy52aWV3SWQ7XG4gIH1cblxuICB0b1N0cmluZyhvbmx5Q2lkcykge1xuICAgIGNvbnN0IHsgYnVmZmVyOiBzdHIsIHN0cmVhbXM6IHN0cmVhbXMgfSA9IHRoaXMucmVjdXJzaXZlVG9TdHJpbmcoXG4gICAgICB0aGlzLnJlbmRlcmVkLFxuICAgICAgdGhpcy5yZW5kZXJlZFtDT01QT05FTlRTXSxcbiAgICAgIG9ubHlDaWRzLFxuICAgICAgdHJ1ZSxcbiAgICAgIHt9LFxuICAgICk7XG4gICAgcmV0dXJuIHsgYnVmZmVyOiBzdHIsIHN0cmVhbXM6IHN0cmVhbXMgfTtcbiAgfVxuXG4gIHJlY3Vyc2l2ZVRvU3RyaW5nKFxuICAgIHJlbmRlcmVkLFxuICAgIGNvbXBvbmVudHMgPSByZW5kZXJlZFtDT01QT05FTlRTXSxcbiAgICBvbmx5Q2lkcyxcbiAgICBjaGFuZ2VUcmFja2luZyxcbiAgICByb290QXR0cnMsXG4gICkge1xuICAgIG9ubHlDaWRzID0gb25seUNpZHMgPyBuZXcgU2V0KG9ubHlDaWRzKSA6IG51bGw7XG4gICAgY29uc3Qgb3V0cHV0ID0ge1xuICAgICAgYnVmZmVyOiBcIlwiLFxuICAgICAgY29tcG9uZW50czogY29tcG9uZW50cyxcbiAgICAgIG9ubHlDaWRzOiBvbmx5Q2lkcyxcbiAgICAgIHN0cmVhbXM6IG5ldyBTZXQoKSxcbiAgICB9O1xuICAgIHRoaXMudG9PdXRwdXRCdWZmZXIocmVuZGVyZWQsIG51bGwsIG91dHB1dCwgY2hhbmdlVHJhY2tpbmcsIHJvb3RBdHRycyk7XG4gICAgcmV0dXJuIHsgYnVmZmVyOiBvdXRwdXQuYnVmZmVyLCBzdHJlYW1zOiBvdXRwdXQuc3RyZWFtcyB9O1xuICB9XG5cbiAgY29tcG9uZW50Q0lEcyhkaWZmKSB7XG4gICAgcmV0dXJuIE9iamVjdC5rZXlzKGRpZmZbQ09NUE9ORU5UU10gfHwge30pLm1hcCgoaSkgPT4gcGFyc2VJbnQoaSkpO1xuICB9XG5cbiAgaXNDb21wb25lbnRPbmx5RGlmZihkaWZmKSB7XG4gICAgaWYgKCFkaWZmW0NPTVBPTkVOVFNdKSB7XG4gICAgICByZXR1cm4gZmFsc2U7XG4gICAgfVxuICAgIHJldHVybiBPYmplY3Qua2V5cyhkaWZmKS5sZW5ndGggPT09IDE7XG4gIH1cblxuICBnZXRDb21wb25lbnQoZGlmZiwgY2lkKSB7XG4gICAgcmV0dXJuIGRpZmZbQ09NUE9ORU5UU11bY2lkXTtcbiAgfVxuXG4gIHJlc2V0UmVuZGVyKGNpZCkge1xuICAgIC8vIHdlIGFyZSByYWNpbmcgYSBjb21wb25lbnQgZGVzdHJveSwgaXQgY291bGQgbm90IGV4aXN0LCBzb1xuICAgIC8vIG1ha2Ugc3VyZSB0aGF0IHdlIGRvbid0IHRyeSB0byBzZXQgcmVzZXQgb24gdW5kZWZpbmVkXG4gICAgaWYgKHRoaXMucmVuZGVyZWRbQ09NUE9ORU5UU11bY2lkXSkge1xuICAgICAgdGhpcy5yZW5kZXJlZFtDT01QT05FTlRTXVtjaWRdLnJlc2V0ID0gdHJ1ZTtcbiAgICB9XG4gIH1cblxuICBtZXJnZURpZmYoZGlmZikge1xuICAgIGNvbnN0IG5ld2MgPSBkaWZmW0NPTVBPTkVOVFNdO1xuICAgIGNvbnN0IGNhY2hlID0ge307XG4gICAgZGVsZXRlIGRpZmZbQ09NUE9ORU5UU107XG4gICAgdGhpcy5yZW5kZXJlZCA9IHRoaXMubXV0YWJsZU1lcmdlKHRoaXMucmVuZGVyZWQsIGRpZmYpO1xuICAgIHRoaXMucmVuZGVyZWRbQ09NUE9ORU5UU10gPSB0aGlzLnJlbmRlcmVkW0NPTVBPTkVOVFNdIHx8IHt9O1xuXG4gICAgaWYgKG5ld2MpIHtcbiAgICAgIGNvbnN0IG9sZGMgPSB0aGlzLnJlbmRlcmVkW0NPTVBPTkVOVFNdO1xuXG4gICAgICBmb3IgKGNvbnN0IGNpZCBpbiBuZXdjKSB7XG4gICAgICAgIG5ld2NbY2lkXSA9IHRoaXMuY2FjaGVkRmluZENvbXBvbmVudChjaWQsIG5ld2NbY2lkXSwgb2xkYywgbmV3YywgY2FjaGUpO1xuICAgICAgfVxuXG4gICAgICBmb3IgKGNvbnN0IGNpZCBpbiBuZXdjKSB7XG4gICAgICAgIG9sZGNbY2lkXSA9IG5ld2NbY2lkXTtcbiAgICAgIH1cbiAgICAgIGRpZmZbQ09NUE9ORU5UU10gPSBuZXdjO1xuICAgIH1cbiAgfVxuXG4gIGNhY2hlZEZpbmRDb21wb25lbnQoY2lkLCBjZGlmZiwgb2xkYywgbmV3YywgY2FjaGUpIHtcbiAgICBpZiAoY2FjaGVbY2lkXSkge1xuICAgICAgcmV0dXJuIGNhY2hlW2NpZF07XG4gICAgfSBlbHNlIHtcbiAgICAgIGxldCBuZGlmZixcbiAgICAgICAgc3RhdCxcbiAgICAgICAgc2NpZCA9IGNkaWZmW1NUQVRJQ107XG5cbiAgICAgIGlmIChpc0NpZChzY2lkKSkge1xuICAgICAgICBsZXQgdGRpZmY7XG5cbiAgICAgICAgaWYgKHNjaWQgPiAwKSB7XG4gICAgICAgICAgdGRpZmYgPSB0aGlzLmNhY2hlZEZpbmRDb21wb25lbnQoc2NpZCwgbmV3Y1tzY2lkXSwgb2xkYywgbmV3YywgY2FjaGUpO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIHRkaWZmID0gb2xkY1stc2NpZF07XG4gICAgICAgIH1cblxuICAgICAgICBzdGF0ID0gdGRpZmZbU1RBVElDXTtcbiAgICAgICAgbmRpZmYgPSB0aGlzLmNsb25lTWVyZ2UodGRpZmYsIGNkaWZmLCB0cnVlKTtcbiAgICAgICAgbmRpZmZbU1RBVElDXSA9IHN0YXQ7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBuZGlmZiA9XG4gICAgICAgICAgY2RpZmZbU1RBVElDXSAhPT0gdW5kZWZpbmVkIHx8IG9sZGNbY2lkXSA9PT0gdW5kZWZpbmVkXG4gICAgICAgICAgICA/IGNkaWZmXG4gICAgICAgICAgICA6IHRoaXMuY2xvbmVNZXJnZShvbGRjW2NpZF0sIGNkaWZmLCBmYWxzZSk7XG4gICAgICB9XG5cbiAgICAgIGNhY2hlW2NpZF0gPSBuZGlmZjtcbiAgICAgIHJldHVybiBuZGlmZjtcbiAgICB9XG4gIH1cblxuICBtdXRhYmxlTWVyZ2UodGFyZ2V0LCBzb3VyY2UpIHtcbiAgICBpZiAoc291cmNlW1NUQVRJQ10gIT09IHVuZGVmaW5lZCkge1xuICAgICAgcmV0dXJuIHNvdXJjZTtcbiAgICB9IGVsc2Uge1xuICAgICAgdGhpcy5kb011dGFibGVNZXJnZSh0YXJnZXQsIHNvdXJjZSk7XG4gICAgICByZXR1cm4gdGFyZ2V0O1xuICAgIH1cbiAgfVxuXG4gIGRvTXV0YWJsZU1lcmdlKHRhcmdldCwgc291cmNlKSB7XG4gICAgaWYgKHNvdXJjZVtLRVlFRF0pIHtcbiAgICAgIHRoaXMubWVyZ2VLZXllZCh0YXJnZXQsIHNvdXJjZSk7XG4gICAgfSBlbHNlIHtcbiAgICAgIGZvciAoY29uc3Qga2V5IGluIHNvdXJjZSkge1xuICAgICAgICBjb25zdCB2YWwgPSBzb3VyY2Vba2V5XTtcbiAgICAgICAgY29uc3QgdGFyZ2V0VmFsID0gdGFyZ2V0W2tleV07XG4gICAgICAgIGNvbnN0IGlzT2JqVmFsID0gaXNPYmplY3QodmFsKTtcbiAgICAgICAgaWYgKGlzT2JqVmFsICYmIHZhbFtTVEFUSUNdID09PSB1bmRlZmluZWQgJiYgaXNPYmplY3QodGFyZ2V0VmFsKSkge1xuICAgICAgICAgIHRoaXMuZG9NdXRhYmxlTWVyZ2UodGFyZ2V0VmFsLCB2YWwpO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIHRhcmdldFtrZXldID0gdmFsO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfVxuICAgIGlmICh0YXJnZXRbUk9PVF0pIHtcbiAgICAgIHRhcmdldC5uZXdSZW5kZXIgPSB0cnVlO1xuICAgIH1cbiAgfVxuXG4gIGNsb25lKGRpZmYpIHtcbiAgICBpZiAoXCJzdHJ1Y3R1cmVkQ2xvbmVcIiBpbiB3aW5kb3cpIHtcbiAgICAgIHJldHVybiBzdHJ1Y3R1cmVkQ2xvbmUoZGlmZik7XG4gICAgfSBlbHNlIHtcbiAgICAgIC8vIGZhbGxiYWNrIGZvciBqZXN0XG4gICAgICByZXR1cm4gSlNPTi5wYXJzZShKU09OLnN0cmluZ2lmeShkaWZmKSk7XG4gICAgfVxuICB9XG5cbiAgLy8ga2V5ZWQgY29tcHJlaGVuc2lvbnNcbiAgbWVyZ2VLZXllZCh0YXJnZXQsIHNvdXJjZSkge1xuICAgIC8vIHdlIG5lZWQgdG8gY2xvbmUgdGhlIHRhcmdldCBzaW5jZSBlbGVtZW50cyBjYW4gbW92ZSBhbmQgb3RoZXJ3aXNlXG4gICAgLy8gaXQgY291bGQgaGFwcGVuIHRoYXQgd2UgbW9kaWZ5IGFuIGVsZW1lbnQgdGhhdCB3ZSdsbCBuZWVkIHRvIHJlZmVyIHRvXG4gICAgLy8gbGF0ZXJcbiAgICBjb25zdCBjbG9uZWRUYXJnZXQgPSB0aGlzLmNsb25lKHRhcmdldCk7XG4gICAgT2JqZWN0LmVudHJpZXMoc291cmNlW0tFWUVEXSkuZm9yRWFjaCgoW2ksIGVudHJ5XSkgPT4ge1xuICAgICAgaWYgKGkgPT09IEtFWUVEX0NPVU5UKSB7XG4gICAgICAgIHJldHVybjtcbiAgICAgIH1cbiAgICAgIGlmIChBcnJheS5pc0FycmF5KGVudHJ5KSkge1xuICAgICAgICAvLyBbb2xkX2lkeCwgZGlmZl1cbiAgICAgICAgLy8gbW92ZWQgd2l0aCBkaWZmXG4gICAgICAgIGNvbnN0IFtvbGRfaWR4LCBkaWZmXSA9IGVudHJ5O1xuICAgICAgICB0YXJnZXRbS0VZRURdW2ldID0gY2xvbmVkVGFyZ2V0W0tFWUVEXVtvbGRfaWR4XTtcbiAgICAgICAgdGhpcy5kb011dGFibGVNZXJnZSh0YXJnZXRbS0VZRURdW2ldLCBkaWZmKTtcbiAgICAgIH0gZWxzZSBpZiAodHlwZW9mIGVudHJ5ID09PSBcIm51bWJlclwiKSB7XG4gICAgICAgIC8vIG1vdmVkIHdpdGhvdXQgZGlmZlxuICAgICAgICBjb25zdCBvbGRfaWR4ID0gZW50cnk7XG4gICAgICAgIHRhcmdldFtLRVlFRF1baV0gPSBjbG9uZWRUYXJnZXRbS0VZRURdW29sZF9pZHhdO1xuICAgICAgfSBlbHNlIGlmICh0eXBlb2YgZW50cnkgPT09IFwib2JqZWN0XCIpIHtcbiAgICAgICAgLy8gZGlmZiwgc2FtZSBwb3NpdGlvblxuICAgICAgICBpZiAoIXRhcmdldFtLRVlFRF1baV0pIHtcbiAgICAgICAgICB0YXJnZXRbS0VZRURdW2ldID0ge307XG4gICAgICAgIH1cbiAgICAgICAgdGhpcy5kb011dGFibGVNZXJnZSh0YXJnZXRbS0VZRURdW2ldLCBlbnRyeSk7XG4gICAgICB9XG4gICAgfSk7XG4gICAgLy8gZHJvcCBleHRyYSBlbnRyaWVzXG4gICAgaWYgKHNvdXJjZVtLRVlFRF1bS0VZRURfQ09VTlRdIDwgdGFyZ2V0W0tFWUVEXVtLRVlFRF9DT1VOVF0pIHtcbiAgICAgIGZvciAoXG4gICAgICAgIGxldCBpID0gc291cmNlW0tFWUVEXVtLRVlFRF9DT1VOVF07XG4gICAgICAgIGkgPCB0YXJnZXRbS0VZRURdW0tFWUVEX0NPVU5UXTtcbiAgICAgICAgaSsrXG4gICAgICApIHtcbiAgICAgICAgZGVsZXRlIHRhcmdldFtLRVlFRF1baV07XG4gICAgICB9XG4gICAgfVxuICAgIHRhcmdldFtLRVlFRF1bS0VZRURfQ09VTlRdID0gc291cmNlW0tFWUVEXVtLRVlFRF9DT1VOVF07XG4gICAgaWYgKHNvdXJjZVtTVFJFQU1dKSB7XG4gICAgICB0YXJnZXRbU1RSRUFNXSA9IHNvdXJjZVtTVFJFQU1dO1xuICAgIH1cbiAgICBpZiAoc291cmNlW1RFTVBMQVRFU10pIHtcbiAgICAgIHRhcmdldFtURU1QTEFURVNdID0gc291cmNlW1RFTVBMQVRFU107XG4gICAgfVxuICB9XG5cbiAgLy8gTWVyZ2VzIGNpZCB0cmVlcyB0b2dldGhlciwgY29weWluZyBzdGF0aWNzIGZyb20gc291cmNlIHRyZWUuXG4gIC8vXG4gIC8vIFRoZSBgcHJ1bmVNYWdpY0lkYCBpcyBwYXNzZWQgdG8gY29udHJvbCBwcnVuaW5nIHRoZSBtYWdpY0lkIG9mIHRoZVxuICAvLyB0YXJnZXQuIFdlIG11c3QgYWx3YXlzIHBydW5lIHRoZSBtYWdpY0lkIHdoZW4gd2UgYXJlIHNoYXJpbmcgc3RhdGljc1xuICAvLyBmcm9tIGFub3RoZXIgY29tcG9uZW50LiBJZiBub3QgcHJ1bmluZywgd2UgcmVwbGljYXRlIHRoZSBsb2dpYyBmcm9tXG4gIC8vIG11dGFibGVNZXJnZSwgd2hlcmUgd2Ugc2V0IG5ld1JlbmRlciB0byB0cnVlIGlmIHRoZXJlIGlzIGEgcm9vdFxuICAvLyAoZWZmZWN0aXZlbHkgZm9yY2luZyB0aGUgbmV3IHZlcnNpb24gdG8gYmUgcmVuZGVyZWQgaW5zdGVhZCBvZiBza2lwcGVkKVxuICAvL1xuICBjbG9uZU1lcmdlKHRhcmdldCwgc291cmNlLCBwcnVuZU1hZ2ljSWQpIHtcbiAgICBjb25zdCBtZXJnZWQgPSB7IC4uLnRhcmdldCwgLi4uc291cmNlIH07XG4gICAgZm9yIChjb25zdCBrZXkgaW4gbWVyZ2VkKSB7XG4gICAgICBjb25zdCB2YWwgPSBzb3VyY2Vba2V5XTtcbiAgICAgIGNvbnN0IHRhcmdldFZhbCA9IHRhcmdldFtrZXldO1xuICAgICAgaWYgKGlzT2JqZWN0KHZhbCkgJiYgdmFsW1NUQVRJQ10gPT09IHVuZGVmaW5lZCAmJiBpc09iamVjdCh0YXJnZXRWYWwpKSB7XG4gICAgICAgIG1lcmdlZFtrZXldID0gdGhpcy5jbG9uZU1lcmdlKHRhcmdldFZhbCwgdmFsLCBwcnVuZU1hZ2ljSWQpO1xuICAgICAgfSBlbHNlIGlmICh2YWwgPT09IHVuZGVmaW5lZCAmJiBpc09iamVjdCh0YXJnZXRWYWwpKSB7XG4gICAgICAgIG1lcmdlZFtrZXldID0gdGhpcy5jbG9uZU1lcmdlKHRhcmdldFZhbCwge30sIHBydW5lTWFnaWNJZCk7XG4gICAgICB9XG4gICAgfVxuICAgIGlmIChwcnVuZU1hZ2ljSWQpIHtcbiAgICAgIGRlbGV0ZSBtZXJnZWQubWFnaWNJZDtcbiAgICAgIGRlbGV0ZSBtZXJnZWQubmV3UmVuZGVyO1xuICAgIH0gZWxzZSBpZiAodGFyZ2V0W1JPT1RdKSB7XG4gICAgICBtZXJnZWQubmV3UmVuZGVyID0gdHJ1ZTtcbiAgICB9XG4gICAgcmV0dXJuIG1lcmdlZDtcbiAgfVxuXG4gIGNvbXBvbmVudFRvU3RyaW5nKGNpZCkge1xuICAgIGNvbnN0IHsgYnVmZmVyOiBzdHIsIHN0cmVhbXMgfSA9IHRoaXMucmVjdXJzaXZlQ0lEVG9TdHJpbmcoXG4gICAgICB0aGlzLnJlbmRlcmVkW0NPTVBPTkVOVFNdLFxuICAgICAgY2lkLFxuICAgICAgbnVsbCxcbiAgICApO1xuICAgIGNvbnN0IFtzdHJpcHBlZEhUTUwsIF9iZWZvcmUsIF9hZnRlcl0gPSBtb2RpZnlSb290KHN0ciwge30pO1xuICAgIHJldHVybiB7IGJ1ZmZlcjogc3RyaXBwZWRIVE1MLCBzdHJlYW1zOiBzdHJlYW1zIH07XG4gIH1cblxuICBwcnVuZUNJRHMoY2lkcykge1xuICAgIGNpZHMuZm9yRWFjaCgoY2lkKSA9PiBkZWxldGUgdGhpcy5yZW5kZXJlZFtDT01QT05FTlRTXVtjaWRdKTtcbiAgfVxuXG4gIC8vIHByaXZhdGVcblxuICBnZXQoKSB7XG4gICAgcmV0dXJuIHRoaXMucmVuZGVyZWQ7XG4gIH1cblxuICBpc05ld0ZpbmdlcnByaW50KGRpZmYgPSB7fSkge1xuICAgIHJldHVybiAhIWRpZmZbU1RBVElDXTtcbiAgfVxuXG4gIHRlbXBsYXRlU3RhdGljKHBhcnQsIHRlbXBsYXRlcykge1xuICAgIGlmICh0eXBlb2YgcGFydCA9PT0gXCJudW1iZXJcIikge1xuICAgICAgcmV0dXJuIHRlbXBsYXRlc1twYXJ0XTtcbiAgICB9IGVsc2Uge1xuICAgICAgcmV0dXJuIHBhcnQ7XG4gICAgfVxuICB9XG5cbiAgbmV4dE1hZ2ljSUQoKSB7XG4gICAgdGhpcy5tYWdpY0lkKys7XG4gICAgcmV0dXJuIGBtJHt0aGlzLm1hZ2ljSWR9LSR7dGhpcy5wYXJlbnRWaWV3SWQoKX1gO1xuICB9XG5cbiAgLy8gQ29udmVydHMgcmVuZGVyZWQgdHJlZSB0byBvdXRwdXQgYnVmZmVyLlxuICAvL1xuICAvLyBjaGFuZ2VUcmFja2luZyBjb250cm9scyBpZiB3ZSBjYW4gYXBwbHkgdGhlIFBIWF9TS0lQIG9wdGltaXphdGlvbi5cbiAgdG9PdXRwdXRCdWZmZXIocmVuZGVyZWQsIHRlbXBsYXRlcywgb3V0cHV0LCBjaGFuZ2VUcmFja2luZywgcm9vdEF0dHJzID0ge30pIHtcbiAgICBpZiAocmVuZGVyZWRbS0VZRURdKSB7XG4gICAgICByZXR1cm4gdGhpcy5jb21wcmVoZW5zaW9uVG9CdWZmZXIoXG4gICAgICAgIHJlbmRlcmVkLFxuICAgICAgICB0ZW1wbGF0ZXMsXG4gICAgICAgIG91dHB1dCxcbiAgICAgICAgY2hhbmdlVHJhY2tpbmcsXG4gICAgICApO1xuICAgIH1cblxuICAgIC8vIFRlbXBsYXRlcyBhcmUgYSB3YXkgb2Ygc2hhcmluZyBzdGF0aWNzIGJldHdlZW4gbXVsdGlwbGUgcmVuZGVyZWQgc3RydWN0cy5cbiAgICAvLyBTaW5jZSBMaXZlVmlldyAxLjEsIHRob3NlIGNhbiBhbHNvIGFwcGVhciBhdCB0aGUgcm9vdCAtIGZvciBleGFtcGxlIGlmIG9uZSByZW5kZXJzXG4gICAgLy8gdHdvIGNvbXByZWhlbnNpb25zIHRoYXQgY2FuIHNoYXJlIHN0YXRpY3MuXG4gICAgLy8gV2hlbmV2ZXIgd2UgZmluZCB0ZW1wbGF0ZXMsIHdlIG5lZWQgdG8gdXNlIHRoZW0gcmVjdXJzaXZlbHkuIEFsc28sIHRlbXBsYXRlcyBjYW5cbiAgICAvLyBiZSBzZW50IGZvciBlYWNoIGRpZmYsIG5vdCBvbmx5IGZvciB0aGUgaW5pdGlhbCBvbmUuIFdlIGRvbid0IHdhbnQgdG8gbWVyZ2UgdGhlbVxuICAgIC8vIHRob3VnaCwgc28gd2UgYWx3YXlzIHJlc29sdmUgdGhlbSBhbmQgcmVtb3ZlIHRoZW0gZnJvbSB0aGUgcmVuZGVyZWQgb2JqZWN0LlxuICAgIGlmIChyZW5kZXJlZFtURU1QTEFURVNdKSB7XG4gICAgICB0ZW1wbGF0ZXMgPSByZW5kZXJlZFtURU1QTEFURVNdO1xuICAgICAgZGVsZXRlIHJlbmRlcmVkW1RFTVBMQVRFU107XG4gICAgfVxuXG4gICAgbGV0IHsgW1NUQVRJQ106IHN0YXRpY3MgfSA9IHJlbmRlcmVkO1xuICAgIHN0YXRpY3MgPSB0aGlzLnRlbXBsYXRlU3RhdGljKHN0YXRpY3MsIHRlbXBsYXRlcyk7XG4gICAgcmVuZGVyZWRbU1RBVElDXSA9IHN0YXRpY3M7XG4gICAgY29uc3QgaXNSb290ID0gcmVuZGVyZWRbUk9PVF07XG4gICAgY29uc3QgcHJldkJ1ZmZlciA9IG91dHB1dC5idWZmZXI7XG4gICAgaWYgKGlzUm9vdCkge1xuICAgICAgb3V0cHV0LmJ1ZmZlciA9IFwiXCI7XG4gICAgfVxuXG4gICAgLy8gdGhpcyBjb25kaXRpb24gaXMgY2FsbGVkIHdoZW4gZmlyc3QgcmVuZGVyaW5nIGFuIG9wdGltaXphYmxlIGZ1bmN0aW9uIGNvbXBvbmVudC5cbiAgICAvLyBMQyBoYXZlIHRoZWlyIG1hZ2ljSWQgcHJldmlvdXNseSBzZXRcbiAgICBpZiAoY2hhbmdlVHJhY2tpbmcgJiYgaXNSb290ICYmICFyZW5kZXJlZC5tYWdpY0lkKSB7XG4gICAgICByZW5kZXJlZC5uZXdSZW5kZXIgPSB0cnVlO1xuICAgICAgcmVuZGVyZWQubWFnaWNJZCA9IHRoaXMubmV4dE1hZ2ljSUQoKTtcbiAgICB9XG5cbiAgICBvdXRwdXQuYnVmZmVyICs9IHN0YXRpY3NbMF07XG4gICAgZm9yIChsZXQgaSA9IDE7IGkgPCBzdGF0aWNzLmxlbmd0aDsgaSsrKSB7XG4gICAgICB0aGlzLmR5bmFtaWNUb0J1ZmZlcihyZW5kZXJlZFtpIC0gMV0sIHRlbXBsYXRlcywgb3V0cHV0LCBjaGFuZ2VUcmFja2luZyk7XG4gICAgICBvdXRwdXQuYnVmZmVyICs9IHN0YXRpY3NbaV07XG4gICAgfVxuXG4gICAgLy8gQXBwbGllcyB0aGUgcm9vdCB0YWcgXCJza2lwXCIgb3B0aW1pemF0aW9uIGlmIHN1cHBvcnRlZCwgd2hpY2ggY2xlYXJzXG4gICAgLy8gdGhlIHJvb3QgdGFnIGF0dHJpYnV0ZXMgYW5kIGlubmVySFRNTCwgYW5kIG9ubHkgbWFpbnRhaW5zIHRoZSBtYWdpY0lkLlxuICAgIC8vIFdlIGNhbiBvbmx5IHNraXAgd2hlbiBjaGFuZ2VUcmFja2luZyBpcyBzdXBwb3J0ZWQsXG4gICAgLy8gYW5kIHdoZW4gdGhlIHJvb3QgZWxlbWVudCBoYXNuJ3QgZXhwZXJpZW5jZWQgYW4gdW5yZW5kZXJlZCBtZXJnZSAobmV3UmVuZGVyIHRydWUpLlxuICAgIGlmIChpc1Jvb3QpIHtcbiAgICAgIGxldCBza2lwID0gZmFsc2U7XG4gICAgICBsZXQgYXR0cnM7XG4gICAgICAvLyBXaGVuIGEgTEMgaXMgcmUtYWRkZWQgdG8gdGhlIHBhZ2UsIHdlIG5lZWQgdG8gcmUtcmVuZGVyIHRoZSBlbnRpcmUgTEMgdHJlZSxcbiAgICAgIC8vIHRoZXJlZm9yZSBjaGFuZ2VUcmFja2luZyBpcyBmYWxzZTsgaG93ZXZlciwgd2UgbmVlZCB0byBrZWVwIGFsbCB0aGUgbWFnaWNJZHNcbiAgICAgIC8vIGZyb20gYW55IGZ1bmN0aW9uIGNvbXBvbmVudCBzbyB0aGUgbmV4dCB0aW1lIHRoZSBMQyBpcyB1cGRhdGVkLCB3ZSBjYW4gYXBwbHlcbiAgICAgIC8vIHRoZSBza2lwIG9wdGltaXphdGlvblxuICAgICAgaWYgKGNoYW5nZVRyYWNraW5nIHx8IHJlbmRlcmVkLm1hZ2ljSWQpIHtcbiAgICAgICAgc2tpcCA9IGNoYW5nZVRyYWNraW5nICYmICFyZW5kZXJlZC5uZXdSZW5kZXI7XG4gICAgICAgIGF0dHJzID0geyBbUEhYX01BR0lDX0lEXTogcmVuZGVyZWQubWFnaWNJZCwgLi4ucm9vdEF0dHJzIH07XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBhdHRycyA9IHJvb3RBdHRycztcbiAgICAgIH1cbiAgICAgIGlmIChza2lwKSB7XG4gICAgICAgIGF0dHJzW1BIWF9TS0lQXSA9IHRydWU7XG4gICAgICB9XG4gICAgICBjb25zdCBbbmV3Um9vdCwgY29tbWVudEJlZm9yZSwgY29tbWVudEFmdGVyXSA9IG1vZGlmeVJvb3QoXG4gICAgICAgIG91dHB1dC5idWZmZXIsXG4gICAgICAgIGF0dHJzLFxuICAgICAgICBza2lwLFxuICAgICAgKTtcbiAgICAgIHJlbmRlcmVkLm5ld1JlbmRlciA9IGZhbHNlO1xuICAgICAgb3V0cHV0LmJ1ZmZlciA9IHByZXZCdWZmZXIgKyBjb21tZW50QmVmb3JlICsgbmV3Um9vdCArIGNvbW1lbnRBZnRlcjtcbiAgICB9XG4gIH1cblxuICBjb21wcmVoZW5zaW9uVG9CdWZmZXIocmVuZGVyZWQsIHRlbXBsYXRlcywgb3V0cHV0LCBjaGFuZ2VUcmFja2luZykge1xuICAgIGNvbnN0IGtleWVkVGVtcGxhdGVzID0gdGVtcGxhdGVzIHx8IHJlbmRlcmVkW1RFTVBMQVRFU107XG4gICAgY29uc3Qgc3RhdGljcyA9IHRoaXMudGVtcGxhdGVTdGF0aWMocmVuZGVyZWRbU1RBVElDXSwgdGVtcGxhdGVzKTtcbiAgICByZW5kZXJlZFtTVEFUSUNdID0gc3RhdGljcztcbiAgICBkZWxldGUgcmVuZGVyZWRbVEVNUExBVEVTXTtcbiAgICBmb3IgKGxldCBpID0gMDsgaSA8IHJlbmRlcmVkW0tFWUVEXVtLRVlFRF9DT1VOVF07IGkrKykge1xuICAgICAgb3V0cHV0LmJ1ZmZlciArPSBzdGF0aWNzWzBdO1xuICAgICAgZm9yIChsZXQgaiA9IDE7IGogPCBzdGF0aWNzLmxlbmd0aDsgaisrKSB7XG4gICAgICAgIHRoaXMuZHluYW1pY1RvQnVmZmVyKFxuICAgICAgICAgIHJlbmRlcmVkW0tFWUVEXVtpXVtqIC0gMV0sXG4gICAgICAgICAga2V5ZWRUZW1wbGF0ZXMsXG4gICAgICAgICAgb3V0cHV0LFxuICAgICAgICAgIGNoYW5nZVRyYWNraW5nLFxuICAgICAgICApO1xuICAgICAgICBvdXRwdXQuYnVmZmVyICs9IHN0YXRpY3Nbal07XG4gICAgICB9XG4gICAgfVxuICAgIC8vIHdlIGRvbid0IG5lZWQgdG8gc3RvcmUgdGhlIHJlbmRlcmVkIHRyZWUgZm9yIHN0cmVhbXNcbiAgICBpZiAocmVuZGVyZWRbU1RSRUFNXSkge1xuICAgICAgY29uc3Qgc3RyZWFtID0gcmVuZGVyZWRbU1RSRUFNXTtcbiAgICAgIGNvbnN0IFtfcmVmLCBfaW5zZXJ0cywgZGVsZXRlSWRzLCByZXNldF0gPSBzdHJlYW0gfHwgW251bGwsIHt9LCBbXSwgbnVsbF07XG4gICAgICBpZiAoXG4gICAgICAgIHN0cmVhbSAhPT0gdW5kZWZpbmVkICYmXG4gICAgICAgIChyZW5kZXJlZFtLRVlFRF1bS0VZRURfQ09VTlRdID4gMCB8fCBkZWxldGVJZHMubGVuZ3RoID4gMCB8fCByZXNldClcbiAgICAgICkge1xuICAgICAgICBkZWxldGUgcmVuZGVyZWRbU1RSRUFNXTtcbiAgICAgICAgcmVuZGVyZWRbS0VZRURdID0ge1xuICAgICAgICAgIFtLRVlFRF9DT1VOVF06IDAsXG4gICAgICAgIH07XG4gICAgICAgIG91dHB1dC5zdHJlYW1zLmFkZChzdHJlYW0pO1xuICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIGR5bmFtaWNUb0J1ZmZlcihyZW5kZXJlZCwgdGVtcGxhdGVzLCBvdXRwdXQsIGNoYW5nZVRyYWNraW5nKSB7XG4gICAgaWYgKHR5cGVvZiByZW5kZXJlZCA9PT0gXCJudW1iZXJcIikge1xuICAgICAgY29uc3QgeyBidWZmZXI6IHN0ciwgc3RyZWFtcyB9ID0gdGhpcy5yZWN1cnNpdmVDSURUb1N0cmluZyhcbiAgICAgICAgb3V0cHV0LmNvbXBvbmVudHMsXG4gICAgICAgIHJlbmRlcmVkLFxuICAgICAgICBvdXRwdXQub25seUNpZHMsXG4gICAgICApO1xuICAgICAgb3V0cHV0LmJ1ZmZlciArPSBzdHI7XG4gICAgICBvdXRwdXQuc3RyZWFtcyA9IG5ldyBTZXQoWy4uLm91dHB1dC5zdHJlYW1zLCAuLi5zdHJlYW1zXSk7XG4gICAgfSBlbHNlIGlmIChpc09iamVjdChyZW5kZXJlZCkpIHtcbiAgICAgIHRoaXMudG9PdXRwdXRCdWZmZXIocmVuZGVyZWQsIHRlbXBsYXRlcywgb3V0cHV0LCBjaGFuZ2VUcmFja2luZywge30pO1xuICAgIH0gZWxzZSB7XG4gICAgICBvdXRwdXQuYnVmZmVyICs9IHJlbmRlcmVkO1xuICAgIH1cbiAgfVxuXG4gIHJlY3Vyc2l2ZUNJRFRvU3RyaW5nKGNvbXBvbmVudHMsIGNpZCwgb25seUNpZHMpIHtcbiAgICBjb25zdCBjb21wb25lbnQgPVxuICAgICAgY29tcG9uZW50c1tjaWRdIHx8IGxvZ0Vycm9yKGBubyBjb21wb25lbnQgZm9yIENJRCAke2NpZH1gLCBjb21wb25lbnRzKTtcbiAgICBjb25zdCBhdHRycyA9IHsgW1BIWF9DT01QT05FTlRdOiBjaWQsIFtQSFhfVklFV19SRUZdOiB0aGlzLnZpZXdJZCB9O1xuICAgIGNvbnN0IHNraXAgPSBvbmx5Q2lkcyAmJiAhb25seUNpZHMuaGFzKGNpZCk7XG4gICAgLy8gVHdvIG9wdGltaXphdGlvbiBwYXRocyBhcHBseSBoZXJlOlxuICAgIC8vXG4gICAgLy8gICAxLiBUaGUgb25seUNpZHMgb3B0aW1pemF0aW9uIHdvcmtzIGJ5IHRoZSBzZXJ2ZXIgZGlmZiB0ZWxsaW5nIHVzIG9ubHkgc3BlY2lmaWNcbiAgICAvLyAgICAgY2lkJ3MgaGF2ZSBjaGFuZ2VkLiBUaGlzIGFsbG93cyB1cyB0byBza2lwIHJlbmRlcmluZyBhbnkgY29tcG9uZW50IHRoYXQgaGFzbid0IGNoYW5nZWQsXG4gICAgLy8gICAgIHdoaWNoIHVsdGltYXRlbHkgc2V0cyBQSFhfU0tJUCByb290IGF0dHJpYnV0ZSBhbmQgYXZvaWRzIHJlbmRlcmluZyB0aGUgaW5uZXJIVE1MLlxuICAgIC8vXG4gICAgLy8gICAyLiBUaGUgcm9vdCBQSFhfU0tJUCBvcHRpbWl6YXRpb24gZ2VuZXJhbGl6ZXMgdG8gYWxsIEhFRXggZnVuY3Rpb24gY29tcG9uZW50cywgYW5kXG4gICAgLy8gICAgIHdvcmtzIGluIHRoZSBzYW1lIFBIWF9TS0lQIGF0dHJpYnV0ZSBmYXNoaW9uIGFzIDEsIGJ1dCB0aGUgbmV3UmVuZGVyIHRyYWNraW5nIGlzIGRvbmVcbiAgICAvLyAgICAgYXQgdGhlIGdlbmVyYWwgZGlmZiBtZXJnZSBsZXZlbC4gSWYgd2UgbWVyZ2UgYSBkaWZmIHdpdGggbmV3IGR5bmFtaWNzLCB3ZSBuZWNlc3NhcmlseSBoYXZlXG4gICAgLy8gICAgIGV4cGVyaWVuY2VkIGEgY2hhbmdlIHdoaWNoIG11c3QgYmUgYSBuZXdSZW5kZXIsIGFuZCB0aHVzIHdlIGNhbid0IHNraXAgdGhlIHJlbmRlci5cbiAgICAvL1xuICAgIC8vIEJvdGggb3B0aW1pemF0aW9uIGZsb3dzIGFwcGx5IGhlcmUuIG5ld1JlbmRlciBpcyBzZXQgYmFzZWQgb24gdGhlIG9ubHlDaWRzIG9wdGltaXphdGlvbiwgYW5kXG4gICAgLy8gd2UgdHJhY2sgYSBkZXRlcm1pbmlzdGljIG1hZ2ljSWQgYmFzZWQgb24gdGhlIGNpZC5cbiAgICAvL1xuICAgIC8vIGNoYW5nZVRyYWNraW5nIGlzIGFib3V0IHRoZSBlbnRpcmUgdHJlZVxuICAgIC8vIG5ld1JlbmRlciBpcyBhYm91dCB0aGUgY3VycmVudCByb290IGluIHRoZSB0cmVlXG4gICAgLy9cbiAgICAvLyBCeSBkZWZhdWx0IGNoYW5nZVRyYWNraW5nIGlzIGVuYWJsZWQsIGJ1dCB3ZSBzcGVjaWFsIGNhc2UgdGhlIGZsb3cgd2hlcmUgdGhlIGNsaWVudCBpcyBwcnVuaW5nXG4gICAgLy8gY2lkcyBhbmQgdGhlIHNlcnZlciBhZGRzIHRoZSBjb21wb25lbnQgYmFjay4gSW4gc3VjaCBjYXNlcywgd2UgZXhwbGljaXRseSBkaXNhYmxlIGNoYW5nZVRyYWNraW5nXG4gICAgLy8gd2l0aCByZXNldFJlbmRlciBmb3IgdGhpcyBjaWQsIHRoZW4gcmUtZW5hYmxlIGl0IGFmdGVyIHRoZSByZWN1cnNpdmUgY2FsbCB0byBza2lwIHRoZSBvcHRpbWl6YXRpb25cbiAgICAvLyBmb3IgdGhlIGVudGlyZSBjb21wb25lbnQgdHJlZS5cbiAgICBjb21wb25lbnQubmV3UmVuZGVyID0gIXNraXA7XG4gICAgY29tcG9uZW50Lm1hZ2ljSWQgPSBgYyR7Y2lkfS0ke3RoaXMucGFyZW50Vmlld0lkKCl9YDtcbiAgICAvLyBlbmFibGUgY2hhbmdlIHRyYWNraW5nIGFzIGxvbmcgYXMgdGhlIGNvbXBvbmVudCBoYXNuJ3QgYmVlbiByZXNldFxuICAgIGNvbnN0IGNoYW5nZVRyYWNraW5nID0gIWNvbXBvbmVudC5yZXNldDtcbiAgICBjb25zdCB7IGJ1ZmZlcjogaHRtbCwgc3RyZWFtcyB9ID0gdGhpcy5yZWN1cnNpdmVUb1N0cmluZyhcbiAgICAgIGNvbXBvbmVudCxcbiAgICAgIGNvbXBvbmVudHMsXG4gICAgICBvbmx5Q2lkcyxcbiAgICAgIGNoYW5nZVRyYWNraW5nLFxuICAgICAgYXR0cnMsXG4gICAgKTtcbiAgICAvLyBkaXNhYmxlIHJlc2V0IGFmdGVyIHdlJ3ZlIHJlbmRlcmVkXG4gICAgZGVsZXRlIGNvbXBvbmVudC5yZXNldDtcblxuICAgIHJldHVybiB7IGJ1ZmZlcjogaHRtbCwgc3RyZWFtczogc3RyZWFtcyB9O1xuICB9XG59XG4iLCAiaW1wb3J0IERPTSBmcm9tIFwiLi9kb21cIjtcbmltcG9ydCBBUklBIGZyb20gXCIuL2FyaWFcIjtcblxuY29uc3QgZm9jdXNTdGFjayA9IFtdO1xuY29uc3QgZGVmYXVsdF90cmFuc2l0aW9uX3RpbWUgPSAyMDA7XG5cbmNvbnN0IEpTID0ge1xuICAvLyBwcml2YXRlXG4gIGV4ZWMoZSwgZXZlbnRUeXBlLCBwaHhFdmVudCwgdmlldywgc291cmNlRWwsIGRlZmF1bHRzKSB7XG4gICAgY29uc3QgW2RlZmF1bHRLaW5kLCBkZWZhdWx0QXJnc10gPSBkZWZhdWx0cyB8fCBbXG4gICAgICBudWxsLFxuICAgICAgeyBjYWxsYmFjazogZGVmYXVsdHMgJiYgZGVmYXVsdHMuY2FsbGJhY2sgfSxcbiAgICBdO1xuICAgIGNvbnN0IGNvbW1hbmRzID1cbiAgICAgIHBoeEV2ZW50LmNoYXJBdCgwKSA9PT0gXCJbXCJcbiAgICAgICAgPyBKU09OLnBhcnNlKHBoeEV2ZW50KVxuICAgICAgICA6IFtbZGVmYXVsdEtpbmQsIGRlZmF1bHRBcmdzXV07XG5cbiAgICBjb21tYW5kcy5mb3JFYWNoKChba2luZCwgYXJnc10pID0+IHtcbiAgICAgIGlmIChraW5kID09PSBkZWZhdWx0S2luZCkge1xuICAgICAgICAvLyBhbHdheXMgcHJlZmVyIHRoZSBhcmdzLCBidXQga2VlcCBleGlzdGluZyBrZXlzIGZyb20gdGhlIGRlZmF1bHRBcmdzXG4gICAgICAgIGFyZ3MgPSB7IC4uLmRlZmF1bHRBcmdzLCAuLi5hcmdzIH07XG4gICAgICAgIGFyZ3MuY2FsbGJhY2sgPSBhcmdzLmNhbGxiYWNrIHx8IGRlZmF1bHRBcmdzLmNhbGxiYWNrO1xuICAgICAgfVxuICAgICAgdGhpcy5maWx0ZXJUb0Vscyh2aWV3LmxpdmVTb2NrZXQsIHNvdXJjZUVsLCBhcmdzKS5mb3JFYWNoKChlbCkgPT4ge1xuICAgICAgICB0aGlzW2BleGVjXyR7a2luZH1gXShlLCBldmVudFR5cGUsIHBoeEV2ZW50LCB2aWV3LCBzb3VyY2VFbCwgZWwsIGFyZ3MpO1xuICAgICAgfSk7XG4gICAgfSk7XG4gIH0sXG5cbiAgaXNWaXNpYmxlKGVsKSB7XG4gICAgcmV0dXJuICEhKFxuICAgICAgZWwub2Zmc2V0V2lkdGggfHxcbiAgICAgIGVsLm9mZnNldEhlaWdodCB8fFxuICAgICAgZWwuZ2V0Q2xpZW50UmVjdHMoKS5sZW5ndGggPiAwXG4gICAgKTtcbiAgfSxcblxuICAvLyByZXR1cm5zIHRydWUgaWYgYW55IHBhcnQgb2YgdGhlIGVsZW1lbnQgaXMgaW5zaWRlIHRoZSB2aWV3cG9ydFxuICBpc0luVmlld3BvcnQoZWwpIHtcbiAgICBjb25zdCByZWN0ID0gZWwuZ2V0Qm91bmRpbmdDbGllbnRSZWN0KCk7XG4gICAgY29uc3Qgd2luZG93SGVpZ2h0ID1cbiAgICAgIHdpbmRvdy5pbm5lckhlaWdodCB8fCBkb2N1bWVudC5kb2N1bWVudEVsZW1lbnQuY2xpZW50SGVpZ2h0O1xuICAgIGNvbnN0IHdpbmRvd1dpZHRoID1cbiAgICAgIHdpbmRvdy5pbm5lcldpZHRoIHx8IGRvY3VtZW50LmRvY3VtZW50RWxlbWVudC5jbGllbnRXaWR0aDtcblxuICAgIHJldHVybiAoXG4gICAgICByZWN0LnJpZ2h0ID4gMCAmJlxuICAgICAgcmVjdC5ib3R0b20gPiAwICYmXG4gICAgICByZWN0LmxlZnQgPCB3aW5kb3dXaWR0aCAmJlxuICAgICAgcmVjdC50b3AgPCB3aW5kb3dIZWlnaHRcbiAgICApO1xuICB9LFxuXG4gIC8vIHByaXZhdGVcblxuICAvLyBjb21tYW5kc1xuXG4gIGV4ZWNfZXhlYyhlLCBldmVudFR5cGUsIHBoeEV2ZW50LCB2aWV3LCBzb3VyY2VFbCwgZWwsIHsgYXR0ciwgdG8gfSkge1xuICAgIGNvbnN0IGVuY29kZWRKUyA9IGVsLmdldEF0dHJpYnV0ZShhdHRyKTtcbiAgICBpZiAoIWVuY29kZWRKUykge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKGBleHBlY3RlZCAke2F0dHJ9IHRvIGNvbnRhaW4gSlMgY29tbWFuZCBvbiBcIiR7dG99XCJgKTtcbiAgICB9XG4gICAgdmlldy5saXZlU29ja2V0LmV4ZWNKUyhlbCwgZW5jb2RlZEpTLCBldmVudFR5cGUpO1xuICB9LFxuXG4gIGV4ZWNfZGlzcGF0Y2goXG4gICAgZSxcbiAgICBldmVudFR5cGUsXG4gICAgcGh4RXZlbnQsXG4gICAgdmlldyxcbiAgICBzb3VyY2VFbCxcbiAgICBlbCxcbiAgICB7IGV2ZW50LCBkZXRhaWwsIGJ1YmJsZXMsIGJsb2NraW5nIH0sXG4gICkge1xuICAgIGRldGFpbCA9IGRldGFpbCB8fCB7fTtcbiAgICBkZXRhaWwuZGlzcGF0Y2hlciA9IHNvdXJjZUVsO1xuICAgIGlmIChibG9ja2luZykge1xuICAgICAgY29uc3QgcHJvbWlzZSA9IG5ldyBQcm9taXNlKChyZXNvbHZlLCBfcmVqZWN0KSA9PiB7XG4gICAgICAgIGRldGFpbC5kb25lID0gcmVzb2x2ZTtcbiAgICAgIH0pO1xuICAgICAgdmlldy5saXZlU29ja2V0LmFzeW5jVHJhbnNpdGlvbihwcm9taXNlKTtcbiAgICB9XG4gICAgRE9NLmRpc3BhdGNoRXZlbnQoZWwsIGV2ZW50LCB7IGRldGFpbCwgYnViYmxlcyB9KTtcbiAgfSxcblxuICBleGVjX3B1c2goZSwgZXZlbnRUeXBlLCBwaHhFdmVudCwgdmlldywgc291cmNlRWwsIGVsLCBhcmdzKSB7XG4gICAgY29uc3Qge1xuICAgICAgZXZlbnQsXG4gICAgICBkYXRhLFxuICAgICAgdGFyZ2V0LFxuICAgICAgcGFnZV9sb2FkaW5nLFxuICAgICAgbG9hZGluZyxcbiAgICAgIHZhbHVlLFxuICAgICAgZGlzcGF0Y2hlcixcbiAgICAgIGNhbGxiYWNrLFxuICAgIH0gPSBhcmdzO1xuICAgIGNvbnN0IHB1c2hPcHRzID0ge1xuICAgICAgbG9hZGluZyxcbiAgICAgIHZhbHVlLFxuICAgICAgdGFyZ2V0LFxuICAgICAgcGFnZV9sb2FkaW5nOiAhIXBhZ2VfbG9hZGluZyxcbiAgICAgIG9yaWdpbmFsRXZlbnQ6IGUsXG4gICAgfTtcbiAgICBjb25zdCB0YXJnZXRTcmMgPVxuICAgICAgZXZlbnRUeXBlID09PSBcImNoYW5nZVwiICYmIGRpc3BhdGNoZXIgPyBkaXNwYXRjaGVyIDogc291cmNlRWw7XG4gICAgY29uc3QgcGh4VGFyZ2V0ID1cbiAgICAgIHRhcmdldCB8fCB0YXJnZXRTcmMuZ2V0QXR0cmlidXRlKHZpZXcuYmluZGluZyhcInRhcmdldFwiKSkgfHwgdGFyZ2V0U3JjO1xuICAgIGNvbnN0IGhhbmRsZXIgPSAodGFyZ2V0VmlldywgdGFyZ2V0Q3R4KSA9PiB7XG4gICAgICBpZiAoIXRhcmdldFZpZXcuaXNDb25uZWN0ZWQoKSkge1xuICAgICAgICByZXR1cm47XG4gICAgICB9XG4gICAgICBpZiAoZXZlbnRUeXBlID09PSBcImNoYW5nZVwiKSB7XG4gICAgICAgIGxldCB7IG5ld0NpZCwgX3RhcmdldCB9ID0gYXJncztcbiAgICAgICAgX3RhcmdldCA9XG4gICAgICAgICAgX3RhcmdldCB8fCAoRE9NLmlzRm9ybUlucHV0KHNvdXJjZUVsKSA/IHNvdXJjZUVsLm5hbWUgOiB1bmRlZmluZWQpO1xuICAgICAgICBpZiAoX3RhcmdldCkge1xuICAgICAgICAgIHB1c2hPcHRzLl90YXJnZXQgPSBfdGFyZ2V0O1xuICAgICAgICB9XG4gICAgICAgIHRhcmdldFZpZXcucHVzaElucHV0KFxuICAgICAgICAgIHNvdXJjZUVsLFxuICAgICAgICAgIHRhcmdldEN0eCxcbiAgICAgICAgICBuZXdDaWQsXG4gICAgICAgICAgZXZlbnQgfHwgcGh4RXZlbnQsXG4gICAgICAgICAgcHVzaE9wdHMsXG4gICAgICAgICAgY2FsbGJhY2ssXG4gICAgICAgICk7XG4gICAgICB9IGVsc2UgaWYgKGV2ZW50VHlwZSA9PT0gXCJzdWJtaXRcIikge1xuICAgICAgICBjb25zdCB7IHN1Ym1pdHRlciB9ID0gYXJncztcbiAgICAgICAgdGFyZ2V0Vmlldy5zdWJtaXRGb3JtKFxuICAgICAgICAgIHNvdXJjZUVsLFxuICAgICAgICAgIHRhcmdldEN0eCxcbiAgICAgICAgICBldmVudCB8fCBwaHhFdmVudCxcbiAgICAgICAgICBzdWJtaXR0ZXIsXG4gICAgICAgICAgcHVzaE9wdHMsXG4gICAgICAgICAgY2FsbGJhY2ssXG4gICAgICAgICk7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICB0YXJnZXRWaWV3LnB1c2hFdmVudChcbiAgICAgICAgICBldmVudFR5cGUsXG4gICAgICAgICAgc291cmNlRWwsXG4gICAgICAgICAgdGFyZ2V0Q3R4LFxuICAgICAgICAgIGV2ZW50IHx8IHBoeEV2ZW50LFxuICAgICAgICAgIGRhdGEsXG4gICAgICAgICAgcHVzaE9wdHMsXG4gICAgICAgICAgY2FsbGJhY2ssXG4gICAgICAgICk7XG4gICAgICB9XG4gICAgfTtcbiAgICAvLyBpbiBjYXNlIG9mIGZvcm1SZWNvdmVyeSwgdGFyZ2V0VmlldyBhbmQgdGFyZ2V0Q3R4IGFyZSBwYXNzZWQgYXMgYXJndW1lbnRcbiAgICAvLyBhcyB0aGV5IGFyZSBsb29rZWQgdXAgaW4gYSB0ZW1wbGF0ZSBlbGVtZW50LCBub3QgdGhlIHJlYWwgRE9NXG4gICAgaWYgKGFyZ3MudGFyZ2V0VmlldyAmJiBhcmdzLnRhcmdldEN0eCkge1xuICAgICAgaGFuZGxlcihhcmdzLnRhcmdldFZpZXcsIGFyZ3MudGFyZ2V0Q3R4KTtcbiAgICB9IGVsc2Uge1xuICAgICAgdmlldy53aXRoaW5UYXJnZXRzKHBoeFRhcmdldCwgaGFuZGxlcik7XG4gICAgfVxuICB9LFxuXG4gIGV4ZWNfbmF2aWdhdGUoZSwgZXZlbnRUeXBlLCBwaHhFdmVudCwgdmlldywgc291cmNlRWwsIGVsLCB7IGhyZWYsIHJlcGxhY2UgfSkge1xuICAgIHZpZXcubGl2ZVNvY2tldC5oaXN0b3J5UmVkaXJlY3QoXG4gICAgICBlLFxuICAgICAgaHJlZixcbiAgICAgIHJlcGxhY2UgPyBcInJlcGxhY2VcIiA6IFwicHVzaFwiLFxuICAgICAgbnVsbCxcbiAgICAgIHNvdXJjZUVsLFxuICAgICk7XG4gIH0sXG5cbiAgZXhlY19wYXRjaChlLCBldmVudFR5cGUsIHBoeEV2ZW50LCB2aWV3LCBzb3VyY2VFbCwgZWwsIHsgaHJlZiwgcmVwbGFjZSB9KSB7XG4gICAgdmlldy5saXZlU29ja2V0LnB1c2hIaXN0b3J5UGF0Y2goXG4gICAgICBlLFxuICAgICAgaHJlZixcbiAgICAgIHJlcGxhY2UgPyBcInJlcGxhY2VcIiA6IFwicHVzaFwiLFxuICAgICAgc291cmNlRWwsXG4gICAgKTtcbiAgfSxcblxuICBleGVjX2ZvY3VzKGUsIGV2ZW50VHlwZSwgcGh4RXZlbnQsIHZpZXcsIHNvdXJjZUVsLCBlbCkge1xuICAgIEFSSUEuYXR0ZW1wdEZvY3VzKGVsKTtcbiAgICAvLyBpbiBjYXNlIHRoZSBKUy5mb2N1cyBjb21tYW5kIGlzIGluIGEgSlMuc2hvdy9oaWRlL3RvZ2dsZSBjaGFpbiwgZm9yIHNob3cgd2UgbmVlZFxuICAgIC8vIHRvIHdhaXQgZm9yIEpTLnNob3cgdG8gaGF2ZSB1cGRhdGVkIHRoZSBlbGVtZW50J3MgZGlzcGxheSBwcm9wZXJ0eSAoc2VlIGV4ZWNfdG9nZ2xlKVxuICAgIC8vIGJ1dCB0aGF0IHJ1biBpbiBuZXN0ZWQgYW5pbWF0aW9uIGZyYW1lcywgdGhlcmVmb3JlIHdlIG5lZWQgdG8gdXNlIHRoZW0gaGVyZSBhcyB3ZWxsXG4gICAgd2luZG93LnJlcXVlc3RBbmltYXRpb25GcmFtZSgoKSA9PiB7XG4gICAgICB3aW5kb3cucmVxdWVzdEFuaW1hdGlvbkZyYW1lKCgpID0+IEFSSUEuYXR0ZW1wdEZvY3VzKGVsKSk7XG4gICAgfSk7XG4gIH0sXG5cbiAgZXhlY19mb2N1c19maXJzdChlLCBldmVudFR5cGUsIHBoeEV2ZW50LCB2aWV3LCBzb3VyY2VFbCwgZWwpIHtcbiAgICBBUklBLmZvY3VzRmlyc3RJbnRlcmFjdGl2ZShlbCkgfHwgQVJJQS5mb2N1c0ZpcnN0KGVsKTtcbiAgICAvLyBpZiB5b3Ugd29uZGVyIGFib3V0IHRoZSBuZXN0ZWQgYW5pbWF0aW9uIGZyYW1lcywgc2VlIGV4ZWNfZm9jdXNcbiAgICB3aW5kb3cucmVxdWVzdEFuaW1hdGlvbkZyYW1lKCgpID0+IHtcbiAgICAgIHdpbmRvdy5yZXF1ZXN0QW5pbWF0aW9uRnJhbWUoXG4gICAgICAgICgpID0+IEFSSUEuZm9jdXNGaXJzdEludGVyYWN0aXZlKGVsKSB8fCBBUklBLmZvY3VzRmlyc3QoZWwpLFxuICAgICAgKTtcbiAgICB9KTtcbiAgfSxcblxuICBleGVjX3B1c2hfZm9jdXMoZSwgZXZlbnRUeXBlLCBwaHhFdmVudCwgdmlldywgc291cmNlRWwsIGVsKSB7XG4gICAgZm9jdXNTdGFjay5wdXNoKGVsIHx8IHNvdXJjZUVsKTtcbiAgfSxcblxuICBleGVjX3BvcF9mb2N1cyhfZSwgX2V2ZW50VHlwZSwgX3BoeEV2ZW50LCBfdmlldywgX3NvdXJjZUVsLCBfZWwpIHtcbiAgICBjb25zdCBlbCA9IGZvY3VzU3RhY2sucG9wKCk7XG4gICAgaWYgKGVsKSB7XG4gICAgICBlbC5mb2N1cygpO1xuICAgICAgLy8gaWYgeW91IHdvbmRlciBhYm91dCB0aGUgbmVzdGVkIGFuaW1hdGlvbiBmcmFtZXMsIHNlZSBleGVjX2ZvY3VzXG4gICAgICB3aW5kb3cucmVxdWVzdEFuaW1hdGlvbkZyYW1lKCgpID0+IHtcbiAgICAgICAgd2luZG93LnJlcXVlc3RBbmltYXRpb25GcmFtZSgoKSA9PiBlbC5mb2N1cygpKTtcbiAgICAgIH0pO1xuICAgIH1cbiAgfSxcblxuICBleGVjX2FkZF9jbGFzcyhcbiAgICBlLFxuICAgIGV2ZW50VHlwZSxcbiAgICBwaHhFdmVudCxcbiAgICB2aWV3LFxuICAgIHNvdXJjZUVsLFxuICAgIGVsLFxuICAgIHsgbmFtZXMsIHRyYW5zaXRpb24sIHRpbWUsIGJsb2NraW5nIH0sXG4gICkge1xuICAgIHRoaXMuYWRkT3JSZW1vdmVDbGFzc2VzKGVsLCBuYW1lcywgW10sIHRyYW5zaXRpb24sIHRpbWUsIHZpZXcsIGJsb2NraW5nKTtcbiAgfSxcblxuICBleGVjX3JlbW92ZV9jbGFzcyhcbiAgICBlLFxuICAgIGV2ZW50VHlwZSxcbiAgICBwaHhFdmVudCxcbiAgICB2aWV3LFxuICAgIHNvdXJjZUVsLFxuICAgIGVsLFxuICAgIHsgbmFtZXMsIHRyYW5zaXRpb24sIHRpbWUsIGJsb2NraW5nIH0sXG4gICkge1xuICAgIHRoaXMuYWRkT3JSZW1vdmVDbGFzc2VzKGVsLCBbXSwgbmFtZXMsIHRyYW5zaXRpb24sIHRpbWUsIHZpZXcsIGJsb2NraW5nKTtcbiAgfSxcblxuICBleGVjX3RvZ2dsZV9jbGFzcyhcbiAgICBlLFxuICAgIGV2ZW50VHlwZSxcbiAgICBwaHhFdmVudCxcbiAgICB2aWV3LFxuICAgIHNvdXJjZUVsLFxuICAgIGVsLFxuICAgIHsgbmFtZXMsIHRyYW5zaXRpb24sIHRpbWUsIGJsb2NraW5nIH0sXG4gICkge1xuICAgIHRoaXMudG9nZ2xlQ2xhc3NlcyhlbCwgbmFtZXMsIHRyYW5zaXRpb24sIHRpbWUsIHZpZXcsIGJsb2NraW5nKTtcbiAgfSxcblxuICBleGVjX3RvZ2dsZV9hdHRyKFxuICAgIGUsXG4gICAgZXZlbnRUeXBlLFxuICAgIHBoeEV2ZW50LFxuICAgIHZpZXcsXG4gICAgc291cmNlRWwsXG4gICAgZWwsXG4gICAgeyBhdHRyOiBbYXR0ciwgdmFsMSwgdmFsMl0gfSxcbiAgKSB7XG4gICAgdGhpcy50b2dnbGVBdHRyKGVsLCBhdHRyLCB2YWwxLCB2YWwyKTtcbiAgfSxcblxuICBleGVjX2lnbm9yZV9hdHRycyhlLCBldmVudFR5cGUsIHBoeEV2ZW50LCB2aWV3LCBzb3VyY2VFbCwgZWwsIHsgYXR0cnMgfSkge1xuICAgIHRoaXMuaWdub3JlQXR0cnMoZWwsIGF0dHJzKTtcbiAgfSxcblxuICBleGVjX3RyYW5zaXRpb24oXG4gICAgZSxcbiAgICBldmVudFR5cGUsXG4gICAgcGh4RXZlbnQsXG4gICAgdmlldyxcbiAgICBzb3VyY2VFbCxcbiAgICBlbCxcbiAgICB7IHRpbWUsIHRyYW5zaXRpb24sIGJsb2NraW5nIH0sXG4gICkge1xuICAgIHRoaXMuYWRkT3JSZW1vdmVDbGFzc2VzKGVsLCBbXSwgW10sIHRyYW5zaXRpb24sIHRpbWUsIHZpZXcsIGJsb2NraW5nKTtcbiAgfSxcblxuICBleGVjX3RvZ2dsZShcbiAgICBlLFxuICAgIGV2ZW50VHlwZSxcbiAgICBwaHhFdmVudCxcbiAgICB2aWV3LFxuICAgIHNvdXJjZUVsLFxuICAgIGVsLFxuICAgIHsgZGlzcGxheSwgaW5zLCBvdXRzLCB0aW1lLCBibG9ja2luZyB9LFxuICApIHtcbiAgICB0aGlzLnRvZ2dsZShldmVudFR5cGUsIHZpZXcsIGVsLCBkaXNwbGF5LCBpbnMsIG91dHMsIHRpbWUsIGJsb2NraW5nKTtcbiAgfSxcblxuICBleGVjX3Nob3coXG4gICAgZSxcbiAgICBldmVudFR5cGUsXG4gICAgcGh4RXZlbnQsXG4gICAgdmlldyxcbiAgICBzb3VyY2VFbCxcbiAgICBlbCxcbiAgICB7IGRpc3BsYXksIHRyYW5zaXRpb24sIHRpbWUsIGJsb2NraW5nIH0sXG4gICkge1xuICAgIHRoaXMuc2hvdyhldmVudFR5cGUsIHZpZXcsIGVsLCBkaXNwbGF5LCB0cmFuc2l0aW9uLCB0aW1lLCBibG9ja2luZyk7XG4gIH0sXG5cbiAgZXhlY19oaWRlKFxuICAgIGUsXG4gICAgZXZlbnRUeXBlLFxuICAgIHBoeEV2ZW50LFxuICAgIHZpZXcsXG4gICAgc291cmNlRWwsXG4gICAgZWwsXG4gICAgeyBkaXNwbGF5LCB0cmFuc2l0aW9uLCB0aW1lLCBibG9ja2luZyB9LFxuICApIHtcbiAgICB0aGlzLmhpZGUoZXZlbnRUeXBlLCB2aWV3LCBlbCwgZGlzcGxheSwgdHJhbnNpdGlvbiwgdGltZSwgYmxvY2tpbmcpO1xuICB9LFxuXG4gIGV4ZWNfc2V0X2F0dHIoXG4gICAgZSxcbiAgICBldmVudFR5cGUsXG4gICAgcGh4RXZlbnQsXG4gICAgdmlldyxcbiAgICBzb3VyY2VFbCxcbiAgICBlbCxcbiAgICB7IGF0dHI6IFthdHRyLCB2YWxdIH0sXG4gICkge1xuICAgIHRoaXMuc2V0T3JSZW1vdmVBdHRycyhlbCwgW1thdHRyLCB2YWxdXSwgW10pO1xuICB9LFxuXG4gIGV4ZWNfcmVtb3ZlX2F0dHIoZSwgZXZlbnRUeXBlLCBwaHhFdmVudCwgdmlldywgc291cmNlRWwsIGVsLCB7IGF0dHIgfSkge1xuICAgIHRoaXMuc2V0T3JSZW1vdmVBdHRycyhlbCwgW10sIFthdHRyXSk7XG4gIH0sXG5cbiAgaWdub3JlQXR0cnMoZWwsIGF0dHJzKSB7XG4gICAgRE9NLnB1dFByaXZhdGUoZWwsIFwiSlM6aWdub3JlX2F0dHJzXCIsIHtcbiAgICAgIGFwcGx5OiAoZnJvbUVsLCB0b0VsKSA9PiB7XG4gICAgICAgIEFycmF5LmZyb20oZnJvbUVsLmF0dHJpYnV0ZXMpLmZvckVhY2goKGF0dHIpID0+IHtcbiAgICAgICAgICBpZiAoXG4gICAgICAgICAgICBhdHRycy5zb21lKFxuICAgICAgICAgICAgICAodG9JZ25vcmUpID0+XG4gICAgICAgICAgICAgICAgYXR0ci5uYW1lID09IHRvSWdub3JlIHx8XG4gICAgICAgICAgICAgICAgdG9JZ25vcmUgPT09IFwiKlwiIHx8XG4gICAgICAgICAgICAgICAgKHRvSWdub3JlLmluY2x1ZGVzKFwiKlwiKSAmJiBhdHRyLm5hbWUubWF0Y2godG9JZ25vcmUpICE9IG51bGwpLFxuICAgICAgICAgICAgKVxuICAgICAgICAgICkge1xuICAgICAgICAgICAgdG9FbC5zZXRBdHRyaWJ1dGUoYXR0ci5uYW1lLCBhdHRyLnZhbHVlKTtcbiAgICAgICAgICB9XG4gICAgICAgIH0pO1xuICAgICAgfSxcbiAgICB9KTtcbiAgfSxcblxuICBvbkJlZm9yZUVsVXBkYXRlZChmcm9tRWwsIHRvRWwpIHtcbiAgICBjb25zdCBpZ25vcmVBdHRycyA9IERPTS5wcml2YXRlKGZyb21FbCwgXCJKUzppZ25vcmVfYXR0cnNcIik7XG4gICAgaWYgKGlnbm9yZUF0dHJzKSB7XG4gICAgICBpZ25vcmVBdHRycy5hcHBseShmcm9tRWwsIHRvRWwpO1xuICAgIH1cbiAgfSxcblxuICAvLyB1dGlscyBmb3IgY29tbWFuZHNcblxuICBzaG93KGV2ZW50VHlwZSwgdmlldywgZWwsIGRpc3BsYXksIHRyYW5zaXRpb24sIHRpbWUsIGJsb2NraW5nKSB7XG4gICAgaWYgKCF0aGlzLmlzVmlzaWJsZShlbCkpIHtcbiAgICAgIHRoaXMudG9nZ2xlKFxuICAgICAgICBldmVudFR5cGUsXG4gICAgICAgIHZpZXcsXG4gICAgICAgIGVsLFxuICAgICAgICBkaXNwbGF5LFxuICAgICAgICB0cmFuc2l0aW9uLFxuICAgICAgICBudWxsLFxuICAgICAgICB0aW1lLFxuICAgICAgICBibG9ja2luZyxcbiAgICAgICk7XG4gICAgfVxuICB9LFxuXG4gIGhpZGUoZXZlbnRUeXBlLCB2aWV3LCBlbCwgZGlzcGxheSwgdHJhbnNpdGlvbiwgdGltZSwgYmxvY2tpbmcpIHtcbiAgICBpZiAodGhpcy5pc1Zpc2libGUoZWwpKSB7XG4gICAgICB0aGlzLnRvZ2dsZShcbiAgICAgICAgZXZlbnRUeXBlLFxuICAgICAgICB2aWV3LFxuICAgICAgICBlbCxcbiAgICAgICAgZGlzcGxheSxcbiAgICAgICAgbnVsbCxcbiAgICAgICAgdHJhbnNpdGlvbixcbiAgICAgICAgdGltZSxcbiAgICAgICAgYmxvY2tpbmcsXG4gICAgICApO1xuICAgIH1cbiAgfSxcblxuICB0b2dnbGUoZXZlbnRUeXBlLCB2aWV3LCBlbCwgZGlzcGxheSwgaW5zLCBvdXRzLCB0aW1lLCBibG9ja2luZykge1xuICAgIHRpbWUgPSB0aW1lIHx8IGRlZmF1bHRfdHJhbnNpdGlvbl90aW1lO1xuICAgIGNvbnN0IFtpbkNsYXNzZXMsIGluU3RhcnRDbGFzc2VzLCBpbkVuZENsYXNzZXNdID0gaW5zIHx8IFtbXSwgW10sIFtdXTtcbiAgICBjb25zdCBbb3V0Q2xhc3Nlcywgb3V0U3RhcnRDbGFzc2VzLCBvdXRFbmRDbGFzc2VzXSA9IG91dHMgfHwgW1tdLCBbXSwgW11dO1xuICAgIGlmIChpbkNsYXNzZXMubGVuZ3RoID4gMCB8fCBvdXRDbGFzc2VzLmxlbmd0aCA+IDApIHtcbiAgICAgIGlmICh0aGlzLmlzVmlzaWJsZShlbCkpIHtcbiAgICAgICAgY29uc3Qgb25TdGFydCA9ICgpID0+IHtcbiAgICAgICAgICB0aGlzLmFkZE9yUmVtb3ZlQ2xhc3NlcyhcbiAgICAgICAgICAgIGVsLFxuICAgICAgICAgICAgb3V0U3RhcnRDbGFzc2VzLFxuICAgICAgICAgICAgaW5DbGFzc2VzLmNvbmNhdChpblN0YXJ0Q2xhc3NlcykuY29uY2F0KGluRW5kQ2xhc3NlcyksXG4gICAgICAgICAgKTtcbiAgICAgICAgICB3aW5kb3cucmVxdWVzdEFuaW1hdGlvbkZyYW1lKCgpID0+IHtcbiAgICAgICAgICAgIHRoaXMuYWRkT3JSZW1vdmVDbGFzc2VzKGVsLCBvdXRDbGFzc2VzLCBbXSk7XG4gICAgICAgICAgICB3aW5kb3cucmVxdWVzdEFuaW1hdGlvbkZyYW1lKCgpID0+XG4gICAgICAgICAgICAgIHRoaXMuYWRkT3JSZW1vdmVDbGFzc2VzKGVsLCBvdXRFbmRDbGFzc2VzLCBvdXRTdGFydENsYXNzZXMpLFxuICAgICAgICAgICAgKTtcbiAgICAgICAgICB9KTtcbiAgICAgICAgfTtcbiAgICAgICAgY29uc3Qgb25FbmQgPSAoKSA9PiB7XG4gICAgICAgICAgdGhpcy5hZGRPclJlbW92ZUNsYXNzZXMoZWwsIFtdLCBvdXRDbGFzc2VzLmNvbmNhdChvdXRFbmRDbGFzc2VzKSk7XG4gICAgICAgICAgRE9NLnB1dFN0aWNreShcbiAgICAgICAgICAgIGVsLFxuICAgICAgICAgICAgXCJ0b2dnbGVcIixcbiAgICAgICAgICAgIChjdXJyZW50RWwpID0+IChjdXJyZW50RWwuc3R5bGUuZGlzcGxheSA9IFwibm9uZVwiKSxcbiAgICAgICAgICApO1xuICAgICAgICAgIGVsLmRpc3BhdGNoRXZlbnQobmV3IEV2ZW50KFwicGh4OmhpZGUtZW5kXCIpKTtcbiAgICAgICAgfTtcbiAgICAgICAgZWwuZGlzcGF0Y2hFdmVudChuZXcgRXZlbnQoXCJwaHg6aGlkZS1zdGFydFwiKSk7XG4gICAgICAgIGlmIChibG9ja2luZyA9PT0gZmFsc2UpIHtcbiAgICAgICAgICBvblN0YXJ0KCk7XG4gICAgICAgICAgc2V0VGltZW91dChvbkVuZCwgdGltZSk7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgdmlldy50cmFuc2l0aW9uKHRpbWUsIG9uU3RhcnQsIG9uRW5kKTtcbiAgICAgICAgfVxuICAgICAgfSBlbHNlIHtcbiAgICAgICAgaWYgKGV2ZW50VHlwZSA9PT0gXCJyZW1vdmVcIikge1xuICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuICAgICAgICBjb25zdCBvblN0YXJ0ID0gKCkgPT4ge1xuICAgICAgICAgIHRoaXMuYWRkT3JSZW1vdmVDbGFzc2VzKFxuICAgICAgICAgICAgZWwsXG4gICAgICAgICAgICBpblN0YXJ0Q2xhc3NlcyxcbiAgICAgICAgICAgIG91dENsYXNzZXMuY29uY2F0KG91dFN0YXJ0Q2xhc3NlcykuY29uY2F0KG91dEVuZENsYXNzZXMpLFxuICAgICAgICAgICk7XG4gICAgICAgICAgY29uc3Qgc3RpY2t5RGlzcGxheSA9IGRpc3BsYXkgfHwgdGhpcy5kZWZhdWx0RGlzcGxheShlbCk7XG4gICAgICAgICAgd2luZG93LnJlcXVlc3RBbmltYXRpb25GcmFtZSgoKSA9PiB7XG4gICAgICAgICAgICAvLyBmaXJzdCBhZGQgdGhlIHN0YXJ0aW5nICsgYWN0aXZlIGNsYXNzLCBUSEVOIG1ha2UgdGhlIGVsZW1lbnQgdmlzaWJsZVxuICAgICAgICAgICAgLy8gb3RoZXJ3aXNlIGlmIHdlIHRvZ2dsZWQgdGhlIHZpc2liaWxpdHkgZWFybGllciBjc3MgYW5pbWF0aW9uc1xuICAgICAgICAgICAgLy8gd291bGQgZmxpY2tlciwgYXMgdGhlIGVsZW1lbnQgYmVjb21lcyB2aXNpYmxlIGJlZm9yZSB0aGUgYWN0aXZlIGFuaW1hdGlvblxuICAgICAgICAgICAgLy8gY2xhc3MgaXMgc2V0IChzZWUgaHR0cHM6Ly9naXRodWIuY29tL3Bob2VuaXhmcmFtZXdvcmsvcGhvZW5peF9saXZlX3ZpZXcvaXNzdWVzLzM0NTYpXG4gICAgICAgICAgICB0aGlzLmFkZE9yUmVtb3ZlQ2xhc3NlcyhlbCwgaW5DbGFzc2VzLCBbXSk7XG4gICAgICAgICAgICAvLyBhZGRPclJlbW92ZUNsYXNzZXMgdXNlcyBhIHJlcXVlc3RBbmltYXRpb25GcmFtZSBpdHNlbGYsIHRoZXJlZm9yZSB3ZSBuZWVkIHRvIG1vdmUgdGhlIHB1dFN0aWNreVxuICAgICAgICAgICAgLy8gaW50byB0aGUgbmV4dCByZXF1ZXN0QW5pbWF0aW9uRnJhbWUuLi5cbiAgICAgICAgICAgIHdpbmRvdy5yZXF1ZXN0QW5pbWF0aW9uRnJhbWUoKCkgPT4ge1xuICAgICAgICAgICAgICBET00ucHV0U3RpY2t5KFxuICAgICAgICAgICAgICAgIGVsLFxuICAgICAgICAgICAgICAgIFwidG9nZ2xlXCIsXG4gICAgICAgICAgICAgICAgKGN1cnJlbnRFbCkgPT4gKGN1cnJlbnRFbC5zdHlsZS5kaXNwbGF5ID0gc3RpY2t5RGlzcGxheSksXG4gICAgICAgICAgICAgICk7XG4gICAgICAgICAgICAgIHRoaXMuYWRkT3JSZW1vdmVDbGFzc2VzKGVsLCBpbkVuZENsYXNzZXMsIGluU3RhcnRDbGFzc2VzKTtcbiAgICAgICAgICAgIH0pO1xuICAgICAgICAgIH0pO1xuICAgICAgICB9O1xuICAgICAgICBjb25zdCBvbkVuZCA9ICgpID0+IHtcbiAgICAgICAgICB0aGlzLmFkZE9yUmVtb3ZlQ2xhc3NlcyhlbCwgW10sIGluQ2xhc3Nlcy5jb25jYXQoaW5FbmRDbGFzc2VzKSk7XG4gICAgICAgICAgZWwuZGlzcGF0Y2hFdmVudChuZXcgRXZlbnQoXCJwaHg6c2hvdy1lbmRcIikpO1xuICAgICAgICB9O1xuICAgICAgICBlbC5kaXNwYXRjaEV2ZW50KG5ldyBFdmVudChcInBoeDpzaG93LXN0YXJ0XCIpKTtcbiAgICAgICAgaWYgKGJsb2NraW5nID09PSBmYWxzZSkge1xuICAgICAgICAgIG9uU3RhcnQoKTtcbiAgICAgICAgICBzZXRUaW1lb3V0KG9uRW5kLCB0aW1lKTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICB2aWV3LnRyYW5zaXRpb24odGltZSwgb25TdGFydCwgb25FbmQpO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfSBlbHNlIHtcbiAgICAgIGlmICh0aGlzLmlzVmlzaWJsZShlbCkpIHtcbiAgICAgICAgd2luZG93LnJlcXVlc3RBbmltYXRpb25GcmFtZSgoKSA9PiB7XG4gICAgICAgICAgZWwuZGlzcGF0Y2hFdmVudChuZXcgRXZlbnQoXCJwaHg6aGlkZS1zdGFydFwiKSk7XG4gICAgICAgICAgRE9NLnB1dFN0aWNreShcbiAgICAgICAgICAgIGVsLFxuICAgICAgICAgICAgXCJ0b2dnbGVcIixcbiAgICAgICAgICAgIChjdXJyZW50RWwpID0+IChjdXJyZW50RWwuc3R5bGUuZGlzcGxheSA9IFwibm9uZVwiKSxcbiAgICAgICAgICApO1xuICAgICAgICAgIGVsLmRpc3BhdGNoRXZlbnQobmV3IEV2ZW50KFwicGh4OmhpZGUtZW5kXCIpKTtcbiAgICAgICAgfSk7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICB3aW5kb3cucmVxdWVzdEFuaW1hdGlvbkZyYW1lKCgpID0+IHtcbiAgICAgICAgICBlbC5kaXNwYXRjaEV2ZW50KG5ldyBFdmVudChcInBoeDpzaG93LXN0YXJ0XCIpKTtcbiAgICAgICAgICBjb25zdCBzdGlja3lEaXNwbGF5ID0gZGlzcGxheSB8fCB0aGlzLmRlZmF1bHREaXNwbGF5KGVsKTtcbiAgICAgICAgICBET00ucHV0U3RpY2t5KFxuICAgICAgICAgICAgZWwsXG4gICAgICAgICAgICBcInRvZ2dsZVwiLFxuICAgICAgICAgICAgKGN1cnJlbnRFbCkgPT4gKGN1cnJlbnRFbC5zdHlsZS5kaXNwbGF5ID0gc3RpY2t5RGlzcGxheSksXG4gICAgICAgICAgKTtcbiAgICAgICAgICBlbC5kaXNwYXRjaEV2ZW50KG5ldyBFdmVudChcInBoeDpzaG93LWVuZFwiKSk7XG4gICAgICAgIH0pO1xuICAgICAgfVxuICAgIH1cbiAgfSxcblxuICB0b2dnbGVDbGFzc2VzKGVsLCBjbGFzc2VzLCB0cmFuc2l0aW9uLCB0aW1lLCB2aWV3LCBibG9ja2luZykge1xuICAgIHdpbmRvdy5yZXF1ZXN0QW5pbWF0aW9uRnJhbWUoKCkgPT4ge1xuICAgICAgY29uc3QgW3ByZXZBZGRzLCBwcmV2UmVtb3Zlc10gPSBET00uZ2V0U3RpY2t5KGVsLCBcImNsYXNzZXNcIiwgW1tdLCBbXV0pO1xuICAgICAgY29uc3QgbmV3QWRkcyA9IGNsYXNzZXMuZmlsdGVyKFxuICAgICAgICAobmFtZSkgPT4gcHJldkFkZHMuaW5kZXhPZihuYW1lKSA8IDAgJiYgIWVsLmNsYXNzTGlzdC5jb250YWlucyhuYW1lKSxcbiAgICAgICk7XG4gICAgICBjb25zdCBuZXdSZW1vdmVzID0gY2xhc3Nlcy5maWx0ZXIoXG4gICAgICAgIChuYW1lKSA9PiBwcmV2UmVtb3Zlcy5pbmRleE9mKG5hbWUpIDwgMCAmJiBlbC5jbGFzc0xpc3QuY29udGFpbnMobmFtZSksXG4gICAgICApO1xuICAgICAgdGhpcy5hZGRPclJlbW92ZUNsYXNzZXMoXG4gICAgICAgIGVsLFxuICAgICAgICBuZXdBZGRzLFxuICAgICAgICBuZXdSZW1vdmVzLFxuICAgICAgICB0cmFuc2l0aW9uLFxuICAgICAgICB0aW1lLFxuICAgICAgICB2aWV3LFxuICAgICAgICBibG9ja2luZyxcbiAgICAgICk7XG4gICAgfSk7XG4gIH0sXG5cbiAgdG9nZ2xlQXR0cihlbCwgYXR0ciwgdmFsMSwgdmFsMikge1xuICAgIGlmIChlbC5oYXNBdHRyaWJ1dGUoYXR0cikpIHtcbiAgICAgIGlmICh2YWwyICE9PSB1bmRlZmluZWQpIHtcbiAgICAgICAgLy8gdG9nZ2xlIGJldHdlZW4gdmFsMSBhbmQgdmFsMlxuICAgICAgICBpZiAoZWwuZ2V0QXR0cmlidXRlKGF0dHIpID09PSB2YWwxKSB7XG4gICAgICAgICAgdGhpcy5zZXRPclJlbW92ZUF0dHJzKGVsLCBbW2F0dHIsIHZhbDJdXSwgW10pO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIHRoaXMuc2V0T3JSZW1vdmVBdHRycyhlbCwgW1thdHRyLCB2YWwxXV0sIFtdKTtcbiAgICAgICAgfVxuICAgICAgfSBlbHNlIHtcbiAgICAgICAgLy8gcmVtb3ZlIGF0dHJcbiAgICAgICAgdGhpcy5zZXRPclJlbW92ZUF0dHJzKGVsLCBbXSwgW2F0dHJdKTtcbiAgICAgIH1cbiAgICB9IGVsc2Uge1xuICAgICAgdGhpcy5zZXRPclJlbW92ZUF0dHJzKGVsLCBbW2F0dHIsIHZhbDFdXSwgW10pO1xuICAgIH1cbiAgfSxcblxuICBhZGRPclJlbW92ZUNsYXNzZXMoZWwsIGFkZHMsIHJlbW92ZXMsIHRyYW5zaXRpb24sIHRpbWUsIHZpZXcsIGJsb2NraW5nKSB7XG4gICAgdGltZSA9IHRpbWUgfHwgZGVmYXVsdF90cmFuc2l0aW9uX3RpbWU7XG4gICAgY29uc3QgW3RyYW5zaXRpb25SdW4sIHRyYW5zaXRpb25TdGFydCwgdHJhbnNpdGlvbkVuZF0gPSB0cmFuc2l0aW9uIHx8IFtcbiAgICAgIFtdLFxuICAgICAgW10sXG4gICAgICBbXSxcbiAgICBdO1xuICAgIGlmICh0cmFuc2l0aW9uUnVuLmxlbmd0aCA+IDApIHtcbiAgICAgIGNvbnN0IG9uU3RhcnQgPSAoKSA9PiB7XG4gICAgICAgIHRoaXMuYWRkT3JSZW1vdmVDbGFzc2VzKFxuICAgICAgICAgIGVsLFxuICAgICAgICAgIHRyYW5zaXRpb25TdGFydCxcbiAgICAgICAgICBbXS5jb25jYXQodHJhbnNpdGlvblJ1bikuY29uY2F0KHRyYW5zaXRpb25FbmQpLFxuICAgICAgICApO1xuICAgICAgICB3aW5kb3cucmVxdWVzdEFuaW1hdGlvbkZyYW1lKCgpID0+IHtcbiAgICAgICAgICB0aGlzLmFkZE9yUmVtb3ZlQ2xhc3NlcyhlbCwgdHJhbnNpdGlvblJ1biwgW10pO1xuICAgICAgICAgIHdpbmRvdy5yZXF1ZXN0QW5pbWF0aW9uRnJhbWUoKCkgPT5cbiAgICAgICAgICAgIHRoaXMuYWRkT3JSZW1vdmVDbGFzc2VzKGVsLCB0cmFuc2l0aW9uRW5kLCB0cmFuc2l0aW9uU3RhcnQpLFxuICAgICAgICAgICk7XG4gICAgICAgIH0pO1xuICAgICAgfTtcbiAgICAgIGNvbnN0IG9uRG9uZSA9ICgpID0+XG4gICAgICAgIHRoaXMuYWRkT3JSZW1vdmVDbGFzc2VzKFxuICAgICAgICAgIGVsLFxuICAgICAgICAgIGFkZHMuY29uY2F0KHRyYW5zaXRpb25FbmQpLFxuICAgICAgICAgIHJlbW92ZXMuY29uY2F0KHRyYW5zaXRpb25SdW4pLmNvbmNhdCh0cmFuc2l0aW9uU3RhcnQpLFxuICAgICAgICApO1xuICAgICAgaWYgKGJsb2NraW5nID09PSBmYWxzZSkge1xuICAgICAgICBvblN0YXJ0KCk7XG4gICAgICAgIHNldFRpbWVvdXQob25Eb25lLCB0aW1lKTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHZpZXcudHJhbnNpdGlvbih0aW1lLCBvblN0YXJ0LCBvbkRvbmUpO1xuICAgICAgfVxuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIHdpbmRvdy5yZXF1ZXN0QW5pbWF0aW9uRnJhbWUoKCkgPT4ge1xuICAgICAgY29uc3QgW3ByZXZBZGRzLCBwcmV2UmVtb3Zlc10gPSBET00uZ2V0U3RpY2t5KGVsLCBcImNsYXNzZXNcIiwgW1tdLCBbXV0pO1xuICAgICAgY29uc3Qga2VlcEFkZHMgPSBhZGRzLmZpbHRlcihcbiAgICAgICAgKG5hbWUpID0+IHByZXZBZGRzLmluZGV4T2YobmFtZSkgPCAwICYmICFlbC5jbGFzc0xpc3QuY29udGFpbnMobmFtZSksXG4gICAgICApO1xuICAgICAgY29uc3Qga2VlcFJlbW92ZXMgPSByZW1vdmVzLmZpbHRlcihcbiAgICAgICAgKG5hbWUpID0+IHByZXZSZW1vdmVzLmluZGV4T2YobmFtZSkgPCAwICYmIGVsLmNsYXNzTGlzdC5jb250YWlucyhuYW1lKSxcbiAgICAgICk7XG4gICAgICBjb25zdCBuZXdBZGRzID0gcHJldkFkZHNcbiAgICAgICAgLmZpbHRlcigobmFtZSkgPT4gcmVtb3Zlcy5pbmRleE9mKG5hbWUpIDwgMClcbiAgICAgICAgLmNvbmNhdChrZWVwQWRkcyk7XG4gICAgICBjb25zdCBuZXdSZW1vdmVzID0gcHJldlJlbW92ZXNcbiAgICAgICAgLmZpbHRlcigobmFtZSkgPT4gYWRkcy5pbmRleE9mKG5hbWUpIDwgMClcbiAgICAgICAgLmNvbmNhdChrZWVwUmVtb3Zlcyk7XG5cbiAgICAgIERPTS5wdXRTdGlja3koZWwsIFwiY2xhc3Nlc1wiLCAoY3VycmVudEVsKSA9PiB7XG4gICAgICAgIGN1cnJlbnRFbC5jbGFzc0xpc3QucmVtb3ZlKC4uLm5ld1JlbW92ZXMpO1xuICAgICAgICBjdXJyZW50RWwuY2xhc3NMaXN0LmFkZCguLi5uZXdBZGRzKTtcbiAgICAgICAgcmV0dXJuIFtuZXdBZGRzLCBuZXdSZW1vdmVzXTtcbiAgICAgIH0pO1xuICAgIH0pO1xuICB9LFxuXG4gIHNldE9yUmVtb3ZlQXR0cnMoZWwsIHNldHMsIHJlbW92ZXMpIHtcbiAgICBjb25zdCBbcHJldlNldHMsIHByZXZSZW1vdmVzXSA9IERPTS5nZXRTdGlja3koZWwsIFwiYXR0cnNcIiwgW1tdLCBbXV0pO1xuXG4gICAgY29uc3QgYWx0ZXJlZEF0dHJzID0gc2V0cy5tYXAoKFthdHRyLCBfdmFsXSkgPT4gYXR0cikuY29uY2F0KHJlbW92ZXMpO1xuICAgIGNvbnN0IG5ld1NldHMgPSBwcmV2U2V0c1xuICAgICAgLmZpbHRlcigoW2F0dHIsIF92YWxdKSA9PiAhYWx0ZXJlZEF0dHJzLmluY2x1ZGVzKGF0dHIpKVxuICAgICAgLmNvbmNhdChzZXRzKTtcbiAgICBjb25zdCBuZXdSZW1vdmVzID0gcHJldlJlbW92ZXNcbiAgICAgIC5maWx0ZXIoKGF0dHIpID0+ICFhbHRlcmVkQXR0cnMuaW5jbHVkZXMoYXR0cikpXG4gICAgICAuY29uY2F0KHJlbW92ZXMpO1xuXG4gICAgRE9NLnB1dFN0aWNreShlbCwgXCJhdHRyc1wiLCAoY3VycmVudEVsKSA9PiB7XG4gICAgICBuZXdSZW1vdmVzLmZvckVhY2goKGF0dHIpID0+IGN1cnJlbnRFbC5yZW1vdmVBdHRyaWJ1dGUoYXR0cikpO1xuICAgICAgbmV3U2V0cy5mb3JFYWNoKChbYXR0ciwgdmFsXSkgPT4gY3VycmVudEVsLnNldEF0dHJpYnV0ZShhdHRyLCB2YWwpKTtcbiAgICAgIHJldHVybiBbbmV3U2V0cywgbmV3UmVtb3Zlc107XG4gICAgfSk7XG4gIH0sXG5cbiAgaGFzQWxsQ2xhc3NlcyhlbCwgY2xhc3Nlcykge1xuICAgIHJldHVybiBjbGFzc2VzLmV2ZXJ5KChuYW1lKSA9PiBlbC5jbGFzc0xpc3QuY29udGFpbnMobmFtZSkpO1xuICB9LFxuXG4gIGlzVG9nZ2xlZE91dChlbCwgb3V0Q2xhc3Nlcykge1xuICAgIHJldHVybiAhdGhpcy5pc1Zpc2libGUoZWwpIHx8IHRoaXMuaGFzQWxsQ2xhc3NlcyhlbCwgb3V0Q2xhc3Nlcyk7XG4gIH0sXG5cbiAgZmlsdGVyVG9FbHMobGl2ZVNvY2tldCwgc291cmNlRWwsIHsgdG8gfSkge1xuICAgIGNvbnN0IGRlZmF1bHRRdWVyeSA9ICgpID0+IHtcbiAgICAgIGlmICh0eXBlb2YgdG8gPT09IFwic3RyaW5nXCIpIHtcbiAgICAgICAgcmV0dXJuIGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3JBbGwodG8pO1xuICAgICAgfSBlbHNlIGlmICh0by5jbG9zZXN0KSB7XG4gICAgICAgIGNvbnN0IHRvRWwgPSBzb3VyY2VFbC5jbG9zZXN0KHRvLmNsb3Nlc3QpO1xuICAgICAgICByZXR1cm4gdG9FbCA/IFt0b0VsXSA6IFtdO1xuICAgICAgfSBlbHNlIGlmICh0by5pbm5lcikge1xuICAgICAgICByZXR1cm4gc291cmNlRWwucXVlcnlTZWxlY3RvckFsbCh0by5pbm5lcik7XG4gICAgICB9XG4gICAgfTtcbiAgICByZXR1cm4gdG9cbiAgICAgID8gbGl2ZVNvY2tldC5qc1F1ZXJ5U2VsZWN0b3JBbGwoc291cmNlRWwsIHRvLCBkZWZhdWx0UXVlcnkpXG4gICAgICA6IFtzb3VyY2VFbF07XG4gIH0sXG5cbiAgZGVmYXVsdERpc3BsYXkoZWwpIHtcbiAgICByZXR1cm4gKFxuICAgICAgeyB0cjogXCJ0YWJsZS1yb3dcIiwgdGQ6IFwidGFibGUtY2VsbFwiIH1bZWwudGFnTmFtZS50b0xvd2VyQ2FzZSgpXSB8fCBcImJsb2NrXCJcbiAgICApO1xuICB9LFxuXG4gIHRyYW5zaXRpb25DbGFzc2VzKHZhbCkge1xuICAgIGlmICghdmFsKSB7XG4gICAgICByZXR1cm4gbnVsbDtcbiAgICB9XG5cbiAgICBsZXQgW3RyYW5zLCB0U3RhcnQsIHRFbmRdID0gQXJyYXkuaXNBcnJheSh2YWwpXG4gICAgICA/IHZhbFxuICAgICAgOiBbdmFsLnNwbGl0KFwiIFwiKSwgW10sIFtdXTtcbiAgICB0cmFucyA9IEFycmF5LmlzQXJyYXkodHJhbnMpID8gdHJhbnMgOiB0cmFucy5zcGxpdChcIiBcIik7XG4gICAgdFN0YXJ0ID0gQXJyYXkuaXNBcnJheSh0U3RhcnQpID8gdFN0YXJ0IDogdFN0YXJ0LnNwbGl0KFwiIFwiKTtcbiAgICB0RW5kID0gQXJyYXkuaXNBcnJheSh0RW5kKSA/IHRFbmQgOiB0RW5kLnNwbGl0KFwiIFwiKTtcbiAgICByZXR1cm4gW3RyYW5zLCB0U3RhcnQsIHRFbmRdO1xuICB9LFxufTtcblxuZXhwb3J0IGRlZmF1bHQgSlM7XG4iLCAiaW1wb3J0IEpTIGZyb20gXCIuL2pzXCI7XG5pbXBvcnQgTGl2ZVNvY2tldCBmcm9tIFwiLi9saXZlX3NvY2tldFwiO1xuXG50eXBlIFRyYW5zaXRpb24gPSBzdHJpbmcgfCBzdHJpbmdbXTtcblxuLy8gQmFzZSBvcHRpb25zIGZvciBjb21tYW5kcyBpbnZvbHZpbmcgdHJhbnNpdGlvbnMgYW5kIHRpbWluZ1xudHlwZSBCYXNlT3B0cyA9IHtcbiAgLyoqXG4gICAqIFRoZSBDU1MgdHJhbnNpdGlvbiBjbGFzc2VzIHRvIHNldC5cbiAgICogQWNjZXB0cyBhIHN0cmluZyBvZiBjbGFzc2VzIG9yIGEgMy10dXBsZSBsaWtlOlxuICAgKiBgW1wiZWFzZS1vdXQgZHVyYXRpb24tMzAwXCIsIFwib3BhY2l0eS0wXCIsIFwib3BhY2l0eS0xMDBcIl1gXG4gICAqL1xuICB0cmFuc2l0aW9uPzogVHJhbnNpdGlvbjtcbiAgLyoqIFRoZSB0cmFuc2l0aW9uIGR1cmF0aW9uIGluIG1pbGxpc2Vjb25kcy4gRGVmYXVsdHMgMjAwLiAqL1xuICB0aW1lPzogbnVtYmVyO1xuICAvKiogV2hldGhlciB0byBibG9jayBVSSBkdXJpbmcgdHJhbnNpdGlvbi4gRGVmYXVsdHMgYHRydWVgLiAqL1xuICBibG9ja2luZz86IGJvb2xlYW47XG59O1xuXG50eXBlIFNob3dPcHRzID0gQmFzZU9wdHMgJiB7XG4gIC8qKiBUaGUgQ1NTIGRpc3BsYXkgdmFsdWUgdG8gc2V0LiBEZWZhdWx0cyBcImJsb2NrXCIuICovXG4gIGRpc3BsYXk/OiBzdHJpbmc7XG59O1xuXG50eXBlIFRvZ2dsZU9wdHMgPSB7XG4gIC8qKiBUaGUgQ1NTIGRpc3BsYXkgdmFsdWUgdG8gc2V0LiBEZWZhdWx0cyBcImJsb2NrXCIuICovXG4gIGRpc3BsYXk/OiBzdHJpbmc7XG4gIC8qKlxuICAgKiBUaGUgQ1NTIHRyYW5zaXRpb24gY2xhc3NlcyBmb3Igc2hvd2luZy5cbiAgICogQWNjZXB0cyBlaXRoZXIgdGhlIHN0cmluZyBvZiBjbGFzc2VzIHRvIGFwcGx5IHdoZW4gdG9nZ2xpbmcgaW4sIG9yXG4gICAqIGEgMy10dXBsZSBjb250YWluaW5nIHRoZSB0cmFuc2l0aW9uIGNsYXNzLCB0aGUgY2xhc3MgdG8gYXBwbHlcbiAgICogdG8gc3RhcnQgdGhlIHRyYW5zaXRpb24sIGFuZCB0aGUgZW5kaW5nIHRyYW5zaXRpb24gY2xhc3MsIHN1Y2ggYXM6XG4gICAqIGBbXCJlYXNlLW91dCBkdXJhdGlvbi0zMDBcIiwgXCJvcGFjaXR5LTBcIiwgXCJvcGFjaXR5LTEwMFwiXWBcbiAgICovXG4gIGluPzogVHJhbnNpdGlvbjtcbiAgLyoqXG4gICAqIFRoZSBDU1MgdHJhbnNpdGlvbiBjbGFzc2VzIGZvciBoaWRpbmcuXG4gICAqIEFjY2VwdHMgZWl0aGVyIHN0cmluZyBvZiBjbGFzc2VzIHRvIGFwcGx5IHdoZW4gdG9nZ2xpbmcgb3V0LCBvclxuICAgKiBhIDMtdHVwbGUgY29udGFpbmluZyB0aGUgdHJhbnNpdGlvbiBjbGFzcywgdGhlIGNsYXNzIHRvIGFwcGx5XG4gICAqIHRvIHN0YXJ0IHRoZSB0cmFuc2l0aW9uLCBhbmQgdGhlIGVuZGluZyB0cmFuc2l0aW9uIGNsYXNzLCBzdWNoIGFzOlxuICAgKiBgW1wiZWFzZS1vdXQgZHVyYXRpb24tMzAwXCIsIFwib3BhY2l0eS0xMDBcIiwgXCJvcGFjaXR5LTBcIl1gXG4gICAqL1xuICBvdXQ/OiBUcmFuc2l0aW9uO1xuICAvKiogVGhlIHRyYW5zaXRpb24gZHVyYXRpb24gaW4gbWlsbGlzZWNvbmRzLiAqL1xuICB0aW1lPzogbnVtYmVyO1xuICAvKiogV2hldGhlciB0byBibG9jayBVSSBkdXJpbmcgdHJhbnNpdGlvbi4gRGVmYXVsdHMgYHRydWVgLiAqL1xuICBibG9ja2luZz86IGJvb2xlYW47XG59O1xuXG4vLyBPcHRpb25zIHNwZWNpZmljIHRvIHRoZSAndHJhbnNpdGlvbicgY29tbWFuZFxudHlwZSBUcmFuc2l0aW9uQ29tbWFuZE9wdHMgPSB7XG4gIC8qKiBUaGUgdHJhbnNpdGlvbiBkdXJhdGlvbiBpbiBtaWxsaXNlY29uZHMuICovXG4gIHRpbWU/OiBudW1iZXI7XG4gIC8qKiBXaGV0aGVyIHRvIGJsb2NrIFVJIGR1cmluZyB0cmFuc2l0aW9uLiBEZWZhdWx0cyBgdHJ1ZWAuICovXG4gIGJsb2NraW5nPzogYm9vbGVhbjtcbn07XG5cbnR5cGUgUHVzaE9wdHMgPSB7XG4gIC8qKiBEYXRhIHRvIGJlIG1lcmdlZCBpbnRvIHRoZSBldmVudCBwYXlsb2FkLiAqL1xuICB2YWx1ZT86IGFueTtcbiAgLyoqIEZvciB0YXJnZXRpbmcgYSBMaXZlQ29tcG9uZW50IGJ5IGl0cyBJRCwgYSBjb21wb25lbnQgSUQgKG51bWJlciksIG9yIGEgQ1NTIHNlbGVjdG9yIHN0cmluZy4gKi9cbiAgdGFyZ2V0PzogSFRNTEVsZW1lbnQgfCBudW1iZXIgfCBzdHJpbmc7XG4gIC8qKiBJbmRpY2F0ZXMgaWYgYSBwYWdlIGxvYWRpbmcgc3RhdGUgc2hvdWxkIGJlIHNob3duLiAqL1xuICBwYWdlX2xvYWRpbmc/OiBib29sZWFuO1xuICBba2V5OiBzdHJpbmddOiBhbnk7IC8vIEFsbG93IG90aGVyIHByb3BlcnRpZXMgbGlrZSAnY2lkJywgJ3JlZGlyZWN0JywgZXRjLlxufTtcblxudHlwZSBOYXZpZ2F0aW9uT3B0cyA9IHtcbiAgLyoqIFdoZXRoZXIgdG8gcmVwbGFjZSB0aGUgY3VycmVudCBoaXN0b3J5IGVudHJ5IGluc3RlYWQgb2YgcHVzaGluZyBhIG5ldyBvbmUuICovXG4gIHJlcGxhY2U/OiBib29sZWFuO1xufTtcblxuLyoqXG4gKiBSZXByZXNlbnRzIGFsbCBwb3NzaWJsZSBKUyBjb21tYW5kcyB0aGF0IGNhbiBiZSBnZW5lcmF0ZWQgYnkgdGhlIGZhY3RvcnkuXG4gKiBUaGlzIGlzIHVzZWQgYXMgYSBiYXNlIGZvciBMaXZlU29ja2V0SlNDb21tYW5kcyBhbmQgSG9va0pTQ29tbWFuZHMuXG4gKi9cbmludGVyZmFjZSBBbGxKU0NvbW1hbmRzIHtcbiAgLyoqXG4gICAqIEV4ZWN1dGVzIGVuY29kZWQgSmF2YVNjcmlwdCBpbiB0aGUgY29udGV4dCBvZiB0aGUgZWxlbWVudC5cbiAgICogVGhpcyB2ZXJzaW9uIGlzIGZvciBnZW5lcmFsIHVzZSB2aWEgbGl2ZVNvY2tldC5qcygpLlxuICAgKlxuICAgKiBAcGFyYW0gZWwgLSBUaGUgZWxlbWVudCBpbiB3aG9zZSBjb250ZXh0IHRvIGV4ZWN1dGUgdGhlIEphdmFTY3JpcHQuXG4gICAqIEBwYXJhbSBlbmNvZGVkSlMgLSBUaGUgZW5jb2RlZCBKYXZhU2NyaXB0IHN0cmluZyB0byBleGVjdXRlLlxuICAgKi9cbiAgZXhlYyhlbDogSFRNTEVsZW1lbnQsIGVuY29kZWRKUzogc3RyaW5nKTogdm9pZDtcblxuICAvKipcbiAgICogU2hvd3MgYW4gZWxlbWVudC5cbiAgICpcbiAgICogQHBhcmFtIGVsIC0gVGhlIGVsZW1lbnQgdG8gc2hvdy5cbiAgICogQHBhcmFtIHtTaG93T3B0c30gW29wdHM9e31dIC0gT3B0aW9uYWwgc2V0dGluZ3MuXG4gICAqICAgQWNjZXB0czogYGRpc3BsYXlgLCBgdHJhbnNpdGlvbmAsIGB0aW1lYCwgYW5kIGBibG9ja2luZ2AuXG4gICAqL1xuICBzaG93KGVsOiBIVE1MRWxlbWVudCwgb3B0cz86IFNob3dPcHRzKTogdm9pZDtcblxuICAvKipcbiAgICogSGlkZXMgYW4gZWxlbWVudC5cbiAgICpcbiAgICogQHBhcmFtIGVsIC0gVGhlIGVsZW1lbnQgdG8gaGlkZS5cbiAgICogQHBhcmFtIFtvcHRzPXt9XSAtIE9wdGlvbmFsIHNldHRpbmdzLlxuICAgKiAgIEFjY2VwdHM6IGB0cmFuc2l0aW9uYCwgYHRpbWVgLCBhbmQgYGJsb2NraW5nYC5cbiAgICovXG4gIGhpZGUoZWw6IEhUTUxFbGVtZW50LCBvcHRzPzogQmFzZU9wdHMpOiB2b2lkO1xuXG4gIC8qKlxuICAgKiBUb2dnbGVzIHRoZSB2aXNpYmlsaXR5IG9mIGFuIGVsZW1lbnQuXG4gICAqXG4gICAqIEBwYXJhbSBlbCAtIFRoZSBlbGVtZW50IHRvIHRvZ2dsZS5cbiAgICogQHBhcmFtIFtvcHRzPXt9XSAtIE9wdGlvbmFsIHNldHRpbmdzLlxuICAgKiAgIEFjY2VwdHM6IGBkaXNwbGF5YCwgYGluYCwgYG91dGAsIGB0aW1lYCwgYW5kIGBibG9ja2luZ2AuXG4gICAqL1xuICB0b2dnbGUoZWw6IEhUTUxFbGVtZW50LCBvcHRzPzogVG9nZ2xlT3B0cyk6IHZvaWQ7XG5cbiAgLyoqXG4gICAqIEFkZHMgQ1NTIGNsYXNzZXMgdG8gYW4gZWxlbWVudC5cbiAgICpcbiAgICogQHBhcmFtIGVsIC0gVGhlIGVsZW1lbnQgdG8gYWRkIGNsYXNzZXMgdG8uXG4gICAqIEBwYXJhbSBuYW1lcyAtIFRoZSBjbGFzcyBuYW1lKHMpIHRvIGFkZC5cbiAgICogQHBhcmFtIFtvcHRzPXt9XSAtIE9wdGlvbmFsIHNldHRpbmdzLlxuICAgKiAgIEFjY2VwdHM6IGB0cmFuc2l0aW9uYCwgYHRpbWVgLCBhbmQgYGJsb2NraW5nYC5cbiAgICovXG4gIGFkZENsYXNzKGVsOiBIVE1MRWxlbWVudCwgbmFtZXM6IHN0cmluZyB8IHN0cmluZ1tdLCBvcHRzPzogQmFzZU9wdHMpOiB2b2lkO1xuXG4gIC8qKlxuICAgKiBSZW1vdmVzIENTUyBjbGFzc2VzIGZyb20gYW4gZWxlbWVudC5cbiAgICpcbiAgICogQHBhcmFtIGVsIC0gVGhlIGVsZW1lbnQgdG8gcmVtb3ZlIGNsYXNzZXMgZnJvbS5cbiAgICogQHBhcmFtIG5hbWVzIC0gVGhlIGNsYXNzIG5hbWUocykgdG8gcmVtb3ZlLlxuICAgKiBAcGFyYW0gW29wdHM9e31dIC0gT3B0aW9uYWwgc2V0dGluZ3MuXG4gICAqICAgQWNjZXB0czogYHRyYW5zaXRpb25gLCBgdGltZWAsIGFuZCBgYmxvY2tpbmdgLlxuICAgKi9cbiAgcmVtb3ZlQ2xhc3MoZWw6IEhUTUxFbGVtZW50LCBuYW1lczogc3RyaW5nIHwgc3RyaW5nW10sIG9wdHM/OiBCYXNlT3B0cyk6IHZvaWQ7XG5cbiAgLyoqXG4gICAqIFRvZ2dsZXMgQ1NTIGNsYXNzZXMgb24gYW4gZWxlbWVudC5cbiAgICpcbiAgICogQHBhcmFtIGVsIC0gVGhlIGVsZW1lbnQgdG8gdG9nZ2xlIGNsYXNzZXMgb24uXG4gICAqIEBwYXJhbSBuYW1lcyAtIFRoZSBjbGFzcyBuYW1lKHMpIHRvIHRvZ2dsZS5cbiAgICogQHBhcmFtIFtvcHRzPXt9XSAtIE9wdGlvbmFsIHNldHRpbmdzLlxuICAgKiAgIEFjY2VwdHM6IGB0cmFuc2l0aW9uYCwgYHRpbWVgLCBhbmQgYGJsb2NraW5nYC5cbiAgICovXG4gIHRvZ2dsZUNsYXNzKGVsOiBIVE1MRWxlbWVudCwgbmFtZXM6IHN0cmluZyB8IHN0cmluZ1tdLCBvcHRzPzogQmFzZU9wdHMpOiB2b2lkO1xuXG4gIC8qKlxuICAgKiBBcHBsaWVzIGEgQ1NTIHRyYW5zaXRpb24gdG8gYW4gZWxlbWVudC5cbiAgICpcbiAgICogQHBhcmFtIGVsIC0gVGhlIGVsZW1lbnQgdG8gYXBwbHkgdGhlIHRyYW5zaXRpb24gdG8uXG4gICAqIEBwYXJhbSB0cmFuc2l0aW9uIC0gVGhlIHRyYW5zaXRpb24gY2xhc3MoZXMpIHRvIGFwcGx5LlxuICAgKiAgIEFjY2VwdHMgYSBzdHJpbmcgb2YgY2xhc3NlcyB0byBhcHBseSB3aGVuIHRyYW5zaXRpb25pbmcgb3JcbiAgICogICBhIDMtdHVwbGUgY29udGFpbmluZyB0aGUgdHJhbnNpdGlvbiBjbGFzcywgdGhlIGNsYXNzIHRvIGFwcGx5XG4gICAqICAgdG8gc3RhcnQgdGhlIHRyYW5zaXRpb24sIGFuZCB0aGUgZW5kaW5nIHRyYW5zaXRpb24gY2xhc3MsIHN1Y2ggYXM6XG4gICAqXG4gICAqICAgICAgIFtcImVhc2Utb3V0IGR1cmF0aW9uLTMwMFwiLCBcIm9wYWNpdHktMTAwXCIsIFwib3BhY2l0eS0wXCJdXG4gICAqXG4gICAqIEBwYXJhbSBbb3B0cz17fV0gLSBPcHRpb25hbCBzZXR0aW5ncyBmb3IgdGltaW5nIGFuZCBibG9ja2luZyBiZWhhdmlvci5cbiAgICogICBBY2NlcHRzOiBgdGltZWAgYW5kIGBibG9ja2luZ2AuXG4gICAqL1xuICB0cmFuc2l0aW9uKFxuICAgIGVsOiBIVE1MRWxlbWVudCxcbiAgICB0cmFuc2l0aW9uOiBzdHJpbmcgfCBzdHJpbmdbXSxcbiAgICBvcHRzPzogVHJhbnNpdGlvbkNvbW1hbmRPcHRzLFxuICApOiB2b2lkO1xuXG4gIC8qKlxuICAgKiBTZXRzIGFuIGF0dHJpYnV0ZSBvbiBhbiBlbGVtZW50LlxuICAgKlxuICAgKiBAcGFyYW0gZWwgLSBUaGUgZWxlbWVudCB0byBzZXQgdGhlIGF0dHJpYnV0ZSBvbi5cbiAgICogQHBhcmFtIGF0dHIgLSBUaGUgYXR0cmlidXRlIG5hbWUgdG8gc2V0LlxuICAgKiBAcGFyYW0gdmFsIC0gVGhlIHZhbHVlIHRvIHNldCBmb3IgdGhlIGF0dHJpYnV0ZS5cbiAgICovXG4gIHNldEF0dHJpYnV0ZShlbDogSFRNTEVsZW1lbnQsIGF0dHI6IHN0cmluZywgdmFsOiBzdHJpbmcpOiB2b2lkO1xuXG4gIC8qKlxuICAgKiBSZW1vdmVzIGFuIGF0dHJpYnV0ZSBmcm9tIGFuIGVsZW1lbnQuXG4gICAqXG4gICAqIEBwYXJhbSBlbCAtIFRoZSBlbGVtZW50IHRvIHJlbW92ZSB0aGUgYXR0cmlidXRlIGZyb20uXG4gICAqIEBwYXJhbSBhdHRyIC0gVGhlIGF0dHJpYnV0ZSBuYW1lIHRvIHJlbW92ZS5cbiAgICovXG4gIHJlbW92ZUF0dHJpYnV0ZShlbDogSFRNTEVsZW1lbnQsIGF0dHI6IHN0cmluZyk6IHZvaWQ7XG5cbiAgLyoqXG4gICAqIFRvZ2dsZXMgYW4gYXR0cmlidXRlIG9uIGFuIGVsZW1lbnQgYmV0d2VlbiB0d28gdmFsdWVzLlxuICAgKlxuICAgKiBAcGFyYW0gZWwgLSBUaGUgZWxlbWVudCB0byB0b2dnbGUgdGhlIGF0dHJpYnV0ZSBvbi5cbiAgICogQHBhcmFtIGF0dHIgLSBUaGUgYXR0cmlidXRlIG5hbWUgdG8gdG9nZ2xlLlxuICAgKiBAcGFyYW0gdmFsMSAtIFRoZSBmaXJzdCB2YWx1ZSB0byB0b2dnbGUgYmV0d2Vlbi5cbiAgICogQHBhcmFtIHZhbDIgLSBUaGUgc2Vjb25kIHZhbHVlIHRvIHRvZ2dsZSBiZXR3ZWVuLlxuICAgKi9cbiAgdG9nZ2xlQXR0cmlidXRlKFxuICAgIGVsOiBIVE1MRWxlbWVudCxcbiAgICBhdHRyOiBzdHJpbmcsXG4gICAgdmFsMTogc3RyaW5nLFxuICAgIHZhbDI6IHN0cmluZyxcbiAgKTogdm9pZDtcblxuICAvKipcbiAgICogUHVzaGVzIGFuIGV2ZW50IHRvIHRoZSBzZXJ2ZXIuXG4gICAqXG4gICAqIEBwYXJhbSBlbCAtIEFuIGVsZW1lbnQgdGhhdCBiZWxvbmdzIHRvIHRoZSB0YXJnZXQgTGl2ZVZpZXcgLyBMaXZlQ29tcG9uZW50IG9yIGEgY29tcG9uZW50IElELlxuICAgKiAgIFRvIHRhcmdldCBhIExpdmVDb21wb25lbnQgYnkgaXRzIElELCBwYXNzIGEgc2VwYXJhdGUgYHRhcmdldGAgaW4gdGhlIG9wdGlvbnMuXG4gICAqIEBwYXJhbSB0eXBlIC0gVGhlIGV2ZW50IG5hbWUgdG8gcHVzaC5cbiAgICogQHBhcmFtIFtvcHRzPXt9XSAtIE9wdGlvbmFsIHNldHRpbmdzLlxuICAgKiAgIEFjY2VwdHM6IGB2YWx1ZWAsIGB0YXJnZXRgLCBgcGFnZV9sb2FkaW5nYC5cbiAgICovXG4gIHB1c2goZWw6IEhUTUxFbGVtZW50LCB0eXBlOiBzdHJpbmcsIG9wdHM/OiBQdXNoT3B0cyk6IHZvaWQ7XG5cbiAgLyoqXG4gICAqIFNlbmRzIGEgbmF2aWdhdGlvbiBldmVudCB0byB0aGUgc2VydmVyIGFuZCB1cGRhdGVzIHRoZSBicm93c2VyJ3MgcHVzaFN0YXRlIGhpc3RvcnkuXG4gICAqXG4gICAqIEBwYXJhbSBocmVmIC0gVGhlIFVSTCB0byBuYXZpZ2F0ZSB0by5cbiAgICogQHBhcmFtIFtvcHRzPXt9XSAtIE9wdGlvbmFsIHNldHRpbmdzLlxuICAgKiAgIEFjY2VwdHM6IGByZXBsYWNlYC5cbiAgICovXG4gIG5hdmlnYXRlKGhyZWY6IHN0cmluZywgb3B0cz86IE5hdmlnYXRpb25PcHRzKTogdm9pZDtcblxuICAvKipcbiAgICogU2VuZHMgYSBwYXRjaCBldmVudCB0byB0aGUgc2VydmVyIGFuZCB1cGRhdGVzIHRoZSBicm93c2VyJ3MgcHVzaFN0YXRlIGhpc3RvcnkuXG4gICAqXG4gICAqIEBwYXJhbSBocmVmIC0gVGhlIFVSTCB0byBwYXRjaCB0by5cbiAgICogQHBhcmFtIFtvcHRzPXt9XSAtIE9wdGlvbmFsIHNldHRpbmdzLlxuICAgKiAgIEFjY2VwdHM6IGByZXBsYWNlYC5cbiAgICovXG4gIHBhdGNoKGhyZWY6IHN0cmluZywgb3B0cz86IE5hdmlnYXRpb25PcHRzKTogdm9pZDtcblxuICAvKipcbiAgICogTWFyayBhdHRyaWJ1dGVzIGFzIGlnbm9yZWQsIHNraXBwaW5nIHRoZW0gd2hlbiBwYXRjaGluZyB0aGUgRE9NLlxuICAgKlxuICAgKiBAcGFyYW0gZWwgLSBUaGUgZWxlbWVudCB0byBpZ25vcmUgYXR0cmlidXRlcyBvbi5cbiAgICogQHBhcmFtIGF0dHJzIC0gVGhlIGF0dHJpYnV0ZSBuYW1lIG9yIG5hbWVzIHRvIGlnbm9yZS5cbiAgICovXG4gIGlnbm9yZUF0dHJpYnV0ZXMoZWw6IEhUTUxFbGVtZW50LCBhdHRyczogc3RyaW5nIHwgc3RyaW5nW10pOiB2b2lkO1xufVxuXG5leHBvcnQgZGVmYXVsdCAoXG4gIGxpdmVTb2NrZXQ6IExpdmVTb2NrZXQsXG4gIGV2ZW50VHlwZTogc3RyaW5nIHwgbnVsbCxcbik6IEFsbEpTQ29tbWFuZHMgPT4ge1xuICByZXR1cm4ge1xuICAgIGV4ZWMoZWwsIGVuY29kZWRKUykge1xuICAgICAgbGl2ZVNvY2tldC5leGVjSlMoZWwsIGVuY29kZWRKUywgZXZlbnRUeXBlKTtcbiAgICB9LFxuICAgIHNob3coZWwsIG9wdHMgPSB7fSkge1xuICAgICAgY29uc3Qgb3duZXIgPSBsaXZlU29ja2V0Lm93bmVyKGVsKTtcbiAgICAgIEpTLnNob3coXG4gICAgICAgIGV2ZW50VHlwZSxcbiAgICAgICAgb3duZXIsXG4gICAgICAgIGVsLFxuICAgICAgICBvcHRzLmRpc3BsYXksXG4gICAgICAgIEpTLnRyYW5zaXRpb25DbGFzc2VzKG9wdHMudHJhbnNpdGlvbiksXG4gICAgICAgIG9wdHMudGltZSxcbiAgICAgICAgb3B0cy5ibG9ja2luZyxcbiAgICAgICk7XG4gICAgfSxcbiAgICBoaWRlKGVsLCBvcHRzID0ge30pIHtcbiAgICAgIGNvbnN0IG93bmVyID0gbGl2ZVNvY2tldC5vd25lcihlbCk7XG4gICAgICBKUy5oaWRlKFxuICAgICAgICBldmVudFR5cGUsXG4gICAgICAgIG93bmVyLFxuICAgICAgICBlbCxcbiAgICAgICAgbnVsbCxcbiAgICAgICAgSlMudHJhbnNpdGlvbkNsYXNzZXMob3B0cy50cmFuc2l0aW9uKSxcbiAgICAgICAgb3B0cy50aW1lLFxuICAgICAgICBvcHRzLmJsb2NraW5nLFxuICAgICAgKTtcbiAgICB9LFxuICAgIHRvZ2dsZShlbCwgb3B0cyA9IHt9KSB7XG4gICAgICBjb25zdCBvd25lciA9IGxpdmVTb2NrZXQub3duZXIoZWwpO1xuICAgICAgY29uc3QgaW5UcmFuc2l0aW9uID0gSlMudHJhbnNpdGlvbkNsYXNzZXMob3B0cy5pbik7XG4gICAgICBjb25zdCBvdXRUcmFuc2l0aW9uID0gSlMudHJhbnNpdGlvbkNsYXNzZXMob3B0cy5vdXQpO1xuICAgICAgSlMudG9nZ2xlKFxuICAgICAgICBldmVudFR5cGUsXG4gICAgICAgIG93bmVyLFxuICAgICAgICBlbCxcbiAgICAgICAgb3B0cy5kaXNwbGF5LFxuICAgICAgICBpblRyYW5zaXRpb24sXG4gICAgICAgIG91dFRyYW5zaXRpb24sXG4gICAgICAgIG9wdHMudGltZSxcbiAgICAgICAgb3B0cy5ibG9ja2luZyxcbiAgICAgICk7XG4gICAgfSxcbiAgICBhZGRDbGFzcyhlbCwgbmFtZXMsIG9wdHMgPSB7fSkge1xuICAgICAgY29uc3QgY2xhc3NOYW1lcyA9IEFycmF5LmlzQXJyYXkobmFtZXMpID8gbmFtZXMgOiBuYW1lcy5zcGxpdChcIiBcIik7XG4gICAgICBjb25zdCBvd25lciA9IGxpdmVTb2NrZXQub3duZXIoZWwpO1xuICAgICAgSlMuYWRkT3JSZW1vdmVDbGFzc2VzKFxuICAgICAgICBlbCxcbiAgICAgICAgY2xhc3NOYW1lcyxcbiAgICAgICAgW10sXG4gICAgICAgIEpTLnRyYW5zaXRpb25DbGFzc2VzKG9wdHMudHJhbnNpdGlvbiksXG4gICAgICAgIG9wdHMudGltZSxcbiAgICAgICAgb3duZXIsXG4gICAgICAgIG9wdHMuYmxvY2tpbmcsXG4gICAgICApO1xuICAgIH0sXG4gICAgcmVtb3ZlQ2xhc3MoZWwsIG5hbWVzLCBvcHRzID0ge30pIHtcbiAgICAgIGNvbnN0IGNsYXNzTmFtZXMgPSBBcnJheS5pc0FycmF5KG5hbWVzKSA/IG5hbWVzIDogbmFtZXMuc3BsaXQoXCIgXCIpO1xuICAgICAgY29uc3Qgb3duZXIgPSBsaXZlU29ja2V0Lm93bmVyKGVsKTtcbiAgICAgIEpTLmFkZE9yUmVtb3ZlQ2xhc3NlcyhcbiAgICAgICAgZWwsXG4gICAgICAgIFtdLFxuICAgICAgICBjbGFzc05hbWVzLFxuICAgICAgICBKUy50cmFuc2l0aW9uQ2xhc3NlcyhvcHRzLnRyYW5zaXRpb24pLFxuICAgICAgICBvcHRzLnRpbWUsXG4gICAgICAgIG93bmVyLFxuICAgICAgICBvcHRzLmJsb2NraW5nLFxuICAgICAgKTtcbiAgICB9LFxuICAgIHRvZ2dsZUNsYXNzKGVsLCBuYW1lcywgb3B0cyA9IHt9KSB7XG4gICAgICBjb25zdCBjbGFzc05hbWVzID0gQXJyYXkuaXNBcnJheShuYW1lcykgPyBuYW1lcyA6IG5hbWVzLnNwbGl0KFwiIFwiKTtcbiAgICAgIGNvbnN0IG93bmVyID0gbGl2ZVNvY2tldC5vd25lcihlbCk7XG4gICAgICBKUy50b2dnbGVDbGFzc2VzKFxuICAgICAgICBlbCxcbiAgICAgICAgY2xhc3NOYW1lcyxcbiAgICAgICAgSlMudHJhbnNpdGlvbkNsYXNzZXMob3B0cy50cmFuc2l0aW9uKSxcbiAgICAgICAgb3B0cy50aW1lLFxuICAgICAgICBvd25lcixcbiAgICAgICAgb3B0cy5ibG9ja2luZyxcbiAgICAgICk7XG4gICAgfSxcbiAgICB0cmFuc2l0aW9uKGVsLCB0cmFuc2l0aW9uLCBvcHRzID0ge30pIHtcbiAgICAgIGNvbnN0IG93bmVyID0gbGl2ZVNvY2tldC5vd25lcihlbCk7XG4gICAgICBKUy5hZGRPclJlbW92ZUNsYXNzZXMoXG4gICAgICAgIGVsLFxuICAgICAgICBbXSxcbiAgICAgICAgW10sXG4gICAgICAgIEpTLnRyYW5zaXRpb25DbGFzc2VzKHRyYW5zaXRpb24pLFxuICAgICAgICBvcHRzLnRpbWUsXG4gICAgICAgIG93bmVyLFxuICAgICAgICBvcHRzLmJsb2NraW5nLFxuICAgICAgKTtcbiAgICB9LFxuICAgIHNldEF0dHJpYnV0ZShlbCwgYXR0ciwgdmFsKSB7XG4gICAgICBKUy5zZXRPclJlbW92ZUF0dHJzKGVsLCBbW2F0dHIsIHZhbF1dLCBbXSk7XG4gICAgfSxcbiAgICByZW1vdmVBdHRyaWJ1dGUoZWwsIGF0dHIpIHtcbiAgICAgIEpTLnNldE9yUmVtb3ZlQXR0cnMoZWwsIFtdLCBbYXR0cl0pO1xuICAgIH0sXG4gICAgdG9nZ2xlQXR0cmlidXRlKGVsLCBhdHRyLCB2YWwxLCB2YWwyKSB7XG4gICAgICBKUy50b2dnbGVBdHRyKGVsLCBhdHRyLCB2YWwxLCB2YWwyKTtcbiAgICB9LFxuICAgIHB1c2goZWwsIHR5cGUsIG9wdHMgPSB7fSkge1xuICAgICAgbGl2ZVNvY2tldC53aXRoaW5Pd25lcnMoZWwsICh2aWV3KSA9PiB7XG4gICAgICAgIGNvbnN0IGRhdGEgPSBvcHRzLnZhbHVlIHx8IHt9O1xuICAgICAgICBkZWxldGUgb3B0cy52YWx1ZTtcbiAgICAgICAgbGV0IGUgPSBuZXcgQ3VzdG9tRXZlbnQoXCJwaHg6ZXhlY1wiLCB7IGRldGFpbDogeyBzb3VyY2VFbGVtZW50OiBlbCB9IH0pO1xuICAgICAgICBKUy5leGVjKGUsIGV2ZW50VHlwZSwgdHlwZSwgdmlldywgZWwsIFtcInB1c2hcIiwgeyBkYXRhLCAuLi5vcHRzIH1dKTtcbiAgICAgIH0pO1xuICAgIH0sXG4gICAgbmF2aWdhdGUoaHJlZiwgb3B0cyA9IHt9KSB7XG4gICAgICBjb25zdCBjdXN0b21FdmVudCA9IG5ldyBDdXN0b21FdmVudChcInBoeDpleGVjXCIpO1xuICAgICAgbGl2ZVNvY2tldC5oaXN0b3J5UmVkaXJlY3QoXG4gICAgICAgIGN1c3RvbUV2ZW50LFxuICAgICAgICBocmVmLFxuICAgICAgICBvcHRzLnJlcGxhY2UgPyBcInJlcGxhY2VcIiA6IFwicHVzaFwiLFxuICAgICAgICBudWxsLFxuICAgICAgICBudWxsLFxuICAgICAgKTtcbiAgICB9LFxuICAgIHBhdGNoKGhyZWYsIG9wdHMgPSB7fSkge1xuICAgICAgY29uc3QgY3VzdG9tRXZlbnQgPSBuZXcgQ3VzdG9tRXZlbnQoXCJwaHg6ZXhlY1wiKTtcbiAgICAgIGxpdmVTb2NrZXQucHVzaEhpc3RvcnlQYXRjaChcbiAgICAgICAgY3VzdG9tRXZlbnQsXG4gICAgICAgIGhyZWYsXG4gICAgICAgIG9wdHMucmVwbGFjZSA/IFwicmVwbGFjZVwiIDogXCJwdXNoXCIsXG4gICAgICAgIG51bGwsXG4gICAgICApO1xuICAgIH0sXG4gICAgaWdub3JlQXR0cmlidXRlcyhlbCwgYXR0cnMpIHtcbiAgICAgIEpTLmlnbm9yZUF0dHJzKGVsLCBBcnJheS5pc0FycmF5KGF0dHJzKSA/IGF0dHJzIDogW2F0dHJzXSk7XG4gICAgfSxcbiAgfTtcbn07XG5cbi8qKlxuICogSlNDb21tYW5kcyBmb3IgdXNlIHdpdGggYGxpdmVTb2NrZXQuanMoKWAuXG4gKiBJbmNsdWRlcyB0aGUgZ2VuZXJhbCBgZXhlY2AgY29tbWFuZCB0aGF0IHJlcXVpcmVzIGFuIGVsZW1lbnQuXG4gKi9cbmV4cG9ydCB0eXBlIExpdmVTb2NrZXRKU0NvbW1hbmRzID0gQWxsSlNDb21tYW5kcztcblxuLyoqXG4gKiBKU0NvbW1hbmRzIGZvciB1c2Ugd2l0aGluIGEgSG9vay5cbiAqIFRoZSBgZXhlY2AgY29tbWFuZCBpcyB0YWlsb3JlZCBmb3IgaG9va3MsIG5vdCByZXF1aXJpbmcgYW4gZXhwbGljaXQgZWxlbWVudC5cbiAqL1xuZXhwb3J0IGludGVyZmFjZSBIb29rSlNDb21tYW5kcyBleHRlbmRzIE9taXQ8QWxsSlNDb21tYW5kcywgXCJleGVjXCI+IHtcbiAgLyoqXG4gICAqIEV4ZWN1dGVzIGVuY29kZWQgSmF2YVNjcmlwdCBpbiB0aGUgY29udGV4dCBvZiB0aGUgaG9vaydzIGVsZW1lbnQuXG4gICAqXG4gICAqIEBwYXJhbSB7c3RyaW5nfSBlbmNvZGVkSlMgLSBUaGUgZW5jb2RlZCBKYXZhU2NyaXB0IHN0cmluZyB0byBleGVjdXRlLlxuICAgKi9cbiAgZXhlYyhlbmNvZGVkSlM6IHN0cmluZyk6IHZvaWQ7XG59XG4iLCAiaW1wb3J0IGpzQ29tbWFuZHMsIHsgSG9va0pTQ29tbWFuZHMgfSBmcm9tIFwiLi9qc19jb21tYW5kc1wiO1xuaW1wb3J0IERPTSBmcm9tIFwiLi9kb21cIjtcbmltcG9ydCBMaXZlU29ja2V0IGZyb20gXCIuL2xpdmVfc29ja2V0XCI7XG5pbXBvcnQgVmlldyBmcm9tIFwiLi92aWV3XCI7XG5cbmNvbnN0IEhPT0tfSUQgPSBcImhvb2tJZFwiO1xubGV0IHZpZXdIb29rSUQgPSAxO1xuXG5leHBvcnQgdHlwZSBPblJlcGx5ID0gKHJlcGx5OiBhbnksIHJlZjogbnVtYmVyKSA9PiBhbnk7XG5leHBvcnQgdHlwZSBDYWxsYmFja1JlZiA9IHsgZXZlbnQ6IHN0cmluZzsgY2FsbGJhY2s6IChwYXlsb2FkOiBhbnkpID0+IGFueSB9O1xuXG5leHBvcnQgdHlwZSBQaHhUYXJnZXQgPSBzdHJpbmcgfCBudW1iZXIgfCBIVE1MRWxlbWVudDtcblxuZXhwb3J0IGludGVyZmFjZSBIb29rSW50ZXJmYWNlPEUgZXh0ZW5kcyBIVE1MRWxlbWVudCA9IEhUTUxFbGVtZW50PiB7XG4gIC8qKlxuICAgKiBUaGUgRE9NIGVsZW1lbnQgdGhhdCB0aGUgaG9vayBpcyBhdHRhY2hlZCB0by5cbiAgICovXG4gIGVsOiBFO1xuXG4gIC8qKlxuICAgKiBUaGUgTGl2ZVNvY2tldCBpbnN0YW5jZSB0aGF0IHRoZSBob29rIGlzIGF0dGFjaGVkIHRvLlxuICAgKi9cbiAgbGl2ZVNvY2tldDogTGl2ZVNvY2tldDtcblxuICAvKipcbiAgICogVGhlIG1vdW50ZWQgY2FsbGJhY2suXG4gICAqXG4gICAqIENhbGxlZCB3aGVuIHRoZSBlbGVtZW50IGhhcyBiZWVuIGFkZGVkIHRvIHRoZSBET00gYW5kIGl0cyBzZXJ2ZXIgTGl2ZVZpZXcgaGFzIGZpbmlzaGVkIG1vdW50aW5nLlxuICAgKi9cbiAgbW91bnRlZD86ICgpID0+IHZvaWQ7XG5cbiAgLyoqXG4gICAqIFRoZSBiZWZvcmVVcGRhdGUgY2FsbGJhY2suXG4gICAqXG4gICAqIENhbGxlZCB3aGVuIHRoZSBlbGVtZW50IGlzIGFib3V0IHRvIGJlIHVwZGF0ZWQgaW4gdGhlIERPTS5cbiAgICogTm90ZTogYW55IGNhbGwgaGVyZSBtdXN0IGJlIHN5bmNocm9ub3VzIGFzIHRoZSBvcGVyYXRpb24gY2Fubm90IGJlIGRlZmVycmVkIG9yIGNhbmNlbGxlZC5cbiAgICovXG4gIGJlZm9yZVVwZGF0ZT86ICgpID0+IHZvaWQ7XG5cbiAgLyoqXG4gICAqIFRoZSB1cGRhdGVkIGNhbGxiYWNrLlxuICAgKlxuICAgKiBDYWxsZWQgd2hlbiB0aGUgZWxlbWVudCBoYXMgYmVlbiB1cGRhdGVkIGluIHRoZSBET00gYnkgdGhlIHNlcnZlclxuICAgKi9cbiAgdXBkYXRlZD86ICgpID0+IHZvaWQ7XG5cbiAgLyoqXG4gICAqIFRoZSBkZXN0cm95ZWQgY2FsbGJhY2suXG4gICAqXG4gICAqIENhbGxlZCB3aGVuIHRoZSBlbGVtZW50IGhhcyBiZWVuIHJlbW92ZWQgZnJvbSB0aGUgcGFnZSwgZWl0aGVyIGJ5IGEgcGFyZW50IHVwZGF0ZSwgb3IgYnkgdGhlIHBhcmVudCBiZWluZyByZW1vdmVkIGVudGlyZWx5XG4gICAqL1xuICBkZXN0cm95ZWQ/OiAoKSA9PiB2b2lkO1xuXG4gIC8qKlxuICAgKiBUaGUgZGlzY29ubmVjdGVkIGNhbGxiYWNrLlxuICAgKlxuICAgKiBDYWxsZWQgd2hlbiB0aGUgZWxlbWVudCdzIHBhcmVudCBMaXZlVmlldyBoYXMgZGlzY29ubmVjdGVkIGZyb20gdGhlIHNlcnZlci5cbiAgICovXG4gIGRpc2Nvbm5lY3RlZD86ICgpID0+IHZvaWQ7XG5cbiAgLyoqXG4gICAqIFRoZSByZWNvbm5lY3RlZCBjYWxsYmFjay5cbiAgICpcbiAgICogQ2FsbGVkIHdoZW4gdGhlIGVsZW1lbnQncyBwYXJlbnQgTGl2ZVZpZXcgaGFzIHJlY29ubmVjdGVkIHRvIHRoZSBzZXJ2ZXIuXG4gICAqL1xuICByZWNvbm5lY3RlZD86ICgpID0+IHZvaWQ7XG5cbiAgLyoqXG4gICAqIFJldHVybnMgYW4gb2JqZWN0IHdpdGggbWV0aG9kcyB0byBtYW5pcGx1YXRlIHRoZSBET00gYW5kIGV4ZWN1dGUgSmF2YVNjcmlwdC5cbiAgICogVGhlIGFwcGxpZWQgY2hhbmdlcyBpbnRlZ3JhdGUgd2l0aCBzZXJ2ZXIgRE9NIHBhdGNoaW5nLlxuICAgKi9cbiAganMoKTogSG9va0pTQ29tbWFuZHM7XG5cbiAgLyoqXG4gICAqIFB1c2hlcyBhbiBldmVudCB0byB0aGUgc2VydmVyLlxuICAgKlxuICAgKiBAcGFyYW0gZXZlbnQgLSBUaGUgZXZlbnQgbmFtZS5cbiAgICogQHBhcmFtIFtwYXlsb2FkXSAtIFRoZSBwYXlsb2FkIHRvIHNlbmQgdG8gdGhlIHNlcnZlci4gRGVmYXVsdHMgdG8gYW4gZW1wdHkgb2JqZWN0LlxuICAgKiBAcGFyYW0gW29uUmVwbHldIC0gQSBjYWxsYmFjayB0byBoYW5kbGUgdGhlIHNlcnZlcidzIHJlcGx5LlxuICAgKlxuICAgKiBXaGVuIG9uUmVwbHkgaXMgbm90IHByb3ZpZGVkLCB0aGUgbWV0aG9kIHJldHVybnMgYSBQcm9taXNlIHRoYXRcbiAgICogV2hlbiBvblJlcGx5IGlzIHByb3ZpZGVkLCB0aGUgbWV0aG9kIHJldHVybnMgdm9pZC5cbiAgICovXG4gIHB1c2hFdmVudChldmVudDogc3RyaW5nLCBwYXlsb2FkOiBhbnksIG9uUmVwbHk6IE9uUmVwbHkpOiB2b2lkO1xuICBwdXNoRXZlbnQoZXZlbnQ6IHN0cmluZywgcGF5bG9hZD86IGFueSk6IFByb21pc2U8YW55PjtcblxuICAvKipcbiAgICogUHVzaGVkIGEgdGFyZ2V0ZWQgZXZlbnQgdG8gdGhlIHNlcnZlci5cbiAgICpcbiAgICogSXQgc2VuZHMgdGhlIGV2ZW50IHRvIHRoZSBMaXZlQ29tcG9uZW50IG9yIExpdmVWaWV3IHRoZSBgc2VsZWN0b3JPclRhcmdldGAgaXMgZGVmaW5lZCBpbixcbiAgICogd2hlcmUgaXRzIHZhbHVlIGNhbiBiZSBlaXRoZXIgYSBxdWVyeSBzZWxlY3RvciwgYW4gYWN0dWFsIERPTSBlbGVtZW50LCBvciBhIENJRCAoY29tcG9uZW50IGlkKVxuICAgKiByZXR1cm5lZCBieSB0aGUgYEBteXNlbGZgIGFzc2lnbi5cbiAgICpcbiAgICogSWYgdGhlIHF1ZXJ5IHNlbGVjdG9yIHJldHVybnMgbW9yZSB0aGFuIG9uZSBlbGVtZW50IGl0IHdpbGwgc2VuZCB0aGUgZXZlbnQgdG8gYWxsIG9mIHRoZW0sXG4gICAqIGV2ZW4gaWYgYWxsIHRoZSBlbGVtZW50cyBhcmUgaW4gdGhlIHNhbWUgTGl2ZUNvbXBvbmVudCBvciBMaXZlVmlldy4gQmVjYXVzZSBvZiB0aGlzLFxuICAgKiBpZiBubyBjYWxsYmFjayBpcyBwYXNzZWQsIGEgcHJvbWlzZSBpcyByZXR1cm5lZCB0aGF0IG1hdGNoZXMgdGhlIHJldHVybiB2YWx1ZSBvZlxuICAgKiBbYFByb21pc2UuYWxsU2V0dGxlZCgpYF0oaHR0cHM6Ly9kZXZlbG9wZXIubW96aWxsYS5vcmcvZW4tVVMvZG9jcy9XZWIvSmF2YVNjcmlwdC9SZWZlcmVuY2UvR2xvYmFsX09iamVjdHMvUHJvbWlzZS9hbGxTZXR0bGVkI3JldHVybl92YWx1ZSkuXG4gICAqIEluZGl2aWR1YWwgZnVsZmlsbGVkIHZhbHVlcyBhcmUgb2YgdGhlIGZvcm1hdCBgeyByZXBseSwgcmVmIH1gLCB3aGVyZSBgcmVwbHlgIGlzIHRoZSBzZXJ2ZXIncyByZXBseS5cbiAgICpcbiAgICogQHBhcmFtIHNlbGVjdG9yT3JUYXJnZXQgLSBUaGUgc2VsZWN0b3IsIGVsZW1lbnQsIG9yIENJRCB0byB0YXJnZXQuXG4gICAqIEBwYXJhbSBldmVudCAtIFRoZSBldmVudCBuYW1lLlxuICAgKiBAcGFyYW0gW3BheWxvYWRdIC0gVGhlIHBheWxvYWQgdG8gc2VuZCB0byB0aGUgc2VydmVyLiBEZWZhdWx0cyB0byBhbiBlbXB0eSBvYmplY3QuXG4gICAqIEBwYXJhbSBbb25SZXBseV0gLSBBIGNhbGxiYWNrIHRvIGhhbmRsZSB0aGUgc2VydmVyJ3MgcmVwbHkuXG4gICAqXG4gICAqIFdoZW4gb25SZXBseSBpcyBub3QgcHJvdmlkZWQsIHRoZSBtZXRob2QgcmV0dXJucyBhIFByb21pc2UuXG4gICAqIFdoZW4gb25SZXBseSBpcyBwcm92aWRlZCwgdGhlIG1ldGhvZCByZXR1cm5zIHZvaWQuXG4gICAqL1xuICBwdXNoRXZlbnRUbyhcbiAgICBzZWxlY3Rvck9yVGFyZ2V0OiBQaHhUYXJnZXQsXG4gICAgZXZlbnQ6IHN0cmluZyxcbiAgICBwYXlsb2FkOiBvYmplY3QsXG4gICAgb25SZXBseTogT25SZXBseSxcbiAgKTogdm9pZDtcbiAgcHVzaEV2ZW50VG8oXG4gICAgc2VsZWN0b3JPclRhcmdldDogUGh4VGFyZ2V0LFxuICAgIGV2ZW50OiBzdHJpbmcsXG4gICAgcGF5bG9hZD86IG9iamVjdCxcbiAgKTogUHJvbWlzZTxQcm9taXNlU2V0dGxlZFJlc3VsdDx7IHJlcGx5OiBhbnk7IHJlZjogbnVtYmVyIH0+W10+O1xuXG4gIC8qKlxuICAgKiBBbGxvd3MgdG8gcmVnaXN0ZXIgYSBjYWxsYmFjayB0byBiZSBjYWxsZWQgd2hlbiBhbiBldmVudCBpcyByZWNlaXZlZCBmcm9tIHRoZSBzZXJ2ZXIuXG4gICAqXG4gICAqIFRoaXMgaXMgdXNlZCB0byBoYW5kbGUgYHB1c2hFdmVudGAgY2FsbHMgZnJvbSB0aGUgc2VydmVyLiBUaGUgY2FsbGJhY2sgaXMgY2FsbGVkIHdpdGggdGhlIHBheWxvYWQgZnJvbSB0aGUgc2VydmVyLlxuICAgKlxuICAgKiBAcGFyYW0gZXZlbnQgLSBUaGUgZXZlbnQgbmFtZS5cbiAgICogQHBhcmFtIGNhbGxiYWNrIC0gVGhlIGNhbGxiYWNrIHRvIGNhbGwgd2hlbiB0aGUgZXZlbnQgaXMgcmVjZWl2ZWQuXG4gICAqXG4gICAqIEByZXR1cm5zIEEgcmVmZXJlbmNlIHRvIHRoZSBjYWxsYmFjaywgd2hpY2ggY2FuIGJlIHVzZWQgaW4gYHJlbW92ZUhhbmRsZUV2ZW50YCB0byByZW1vdmUgdGhlIGNhbGxiYWNrLlxuICAgKi9cbiAgaGFuZGxlRXZlbnQoZXZlbnQ6IHN0cmluZywgY2FsbGJhY2s6IChwYXlsb2FkOiBhbnkpID0+IGFueSk6IENhbGxiYWNrUmVmO1xuXG4gIC8qKlxuICAgKiBSZW1vdmVzIGEgY2FsbGJhY2sgcmVnaXN0ZXJlZCB3aXRoIGBoYW5kbGVFdmVudGAuXG4gICAqXG4gICAqIEBwYXJhbSBjYWxsYmFja1JlZiAtIFRoZSByZWZlcmVuY2UgdG8gdGhlIGNhbGxiYWNrIHRvIHJlbW92ZS5cbiAgICovXG4gIHJlbW92ZUhhbmRsZUV2ZW50KHJlZjogQ2FsbGJhY2tSZWYpOiB2b2lkO1xuXG4gIC8qKlxuICAgKiBBbGxvd3MgdG8gdHJpZ2dlciBhIGxpdmUgZmlsZSB1cGxvYWQuXG4gICAqXG4gICAqIEBwYXJhbSBuYW1lIC0gVGhlIHVwbG9hZCBuYW1lIGNvcnJlc3BvbmRpbmcgdG8gdGhlIGBQaG9lbml4LkxpdmVWaWV3LmFsbG93X3VwbG9hZC8zYCBjYWxsLlxuICAgKiBAcGFyYW0gZmlsZXMgLSBUaGUgZmlsZXMgdG8gdXBsb2FkLlxuICAgKi9cbiAgdXBsb2FkKG5hbWU6IGFueSwgZmlsZXM6IGFueSk6IGFueTtcblxuICAvKipcbiAgICogQWxsb3dzIHRvIHRyaWdnZXIgYSBsaXZlIGZpbGUgdXBsb2FkIHRvIGEgc3BlY2lmaWMgdGFyZ2V0LlxuICAgKlxuICAgKiBAcGFyYW0gc2VsZWN0b3JPclRhcmdldCAtIFRoZSB0YXJnZXQgdG8gdXBsb2FkIHRoZSBmaWxlcyB0by5cbiAgICogQHBhcmFtIG5hbWUgLSBUaGUgdXBsb2FkIG5hbWUgY29ycmVzcG9uZGluZyB0byB0aGUgYFBob2VuaXguTGl2ZVZpZXcuYWxsb3dfdXBsb2FkLzNgIGNhbGwuXG4gICAqIEBwYXJhbSBmaWxlcyAtIFRoZSBmaWxlcyB0byB1cGxvYWQuXG4gICAqL1xuICB1cGxvYWRUbyhzZWxlY3Rvck9yVGFyZ2V0OiBQaHhUYXJnZXQsIG5hbWU6IGFueSwgZmlsZXM6IGFueSk6IGFueTtcblxuICAvLyBhbGxvdyB1bmtub3duIG1ldGhvZHMsIGFzIHBlb3BsZSBjYW4gZGVmaW5lIHRoZW0gaW4gdGhlaXIgaG9va3NcbiAgW2tleTogUHJvcGVydHlLZXldOiBhbnk7XG59XG5cbi8vIGJhc2VkIG9uIGh0dHBzOi8vZ2l0aHViLmNvbS9EZWZpbml0ZWx5VHlwZWQvRGVmaW5pdGVseVR5cGVkL2Jsb2IvZmFjMWFhNzVhY2RkZGJmNGYxYTk1ZTk4ZWUyMjk3YjU0Y2U0YjRjOS90eXBlcy9waG9lbml4X2xpdmVfdmlldy9ob29rcy5kLnRzI0wyNlxuLy8gbGljZW5zZWQgdW5kZXIgTUlUXG5leHBvcnQgaW50ZXJmYWNlIEhvb2s8b3V0IFQgPSBvYmplY3QsIEUgZXh0ZW5kcyBIVE1MRWxlbWVudCA9IEhUTUxFbGVtZW50PiB7XG4gIC8qKlxuICAgKiBUaGUgbW91bnRlZCBjYWxsYmFjay5cbiAgICpcbiAgICogQ2FsbGVkIHdoZW4gdGhlIGVsZW1lbnQgaGFzIGJlZW4gYWRkZWQgdG8gdGhlIERPTSBhbmQgaXRzIHNlcnZlciBMaXZlVmlldyBoYXMgZmluaXNoZWQgbW91bnRpbmcuXG4gICAqL1xuICBtb3VudGVkPzogKHRoaXM6IFQgJiBIb29rSW50ZXJmYWNlPEU+KSA9PiB2b2lkO1xuXG4gIC8qKlxuICAgKiBUaGUgYmVmb3JlVXBkYXRlIGNhbGxiYWNrLlxuICAgKlxuICAgKiBDYWxsZWQgd2hlbiB0aGUgZWxlbWVudCBpcyBhYm91dCB0byBiZSB1cGRhdGVkIGluIHRoZSBET00uXG4gICAqIE5vdGU6IGFueSBjYWxsIGhlcmUgbXVzdCBiZSBzeW5jaHJvbm91cyBhcyB0aGUgb3BlcmF0aW9uIGNhbm5vdCBiZSBkZWZlcnJlZCBvciBjYW5jZWxsZWQuXG4gICAqL1xuICBiZWZvcmVVcGRhdGU/OiAodGhpczogVCAmIEhvb2tJbnRlcmZhY2U8RT4pID0+IHZvaWQ7XG5cbiAgLyoqXG4gICAqIFRoZSB1cGRhdGVkIGNhbGxiYWNrLlxuICAgKlxuICAgKiBDYWxsZWQgd2hlbiB0aGUgZWxlbWVudCBoYXMgYmVlbiB1cGRhdGVkIGluIHRoZSBET00gYnkgdGhlIHNlcnZlclxuICAgKi9cbiAgdXBkYXRlZD86ICh0aGlzOiBUICYgSG9va0ludGVyZmFjZTxFPikgPT4gdm9pZDtcblxuICAvKipcbiAgICogVGhlIGRlc3Ryb3llZCBjYWxsYmFjay5cbiAgICpcbiAgICogQ2FsbGVkIHdoZW4gdGhlIGVsZW1lbnQgaGFzIGJlZW4gcmVtb3ZlZCBmcm9tIHRoZSBwYWdlLCBlaXRoZXIgYnkgYSBwYXJlbnQgdXBkYXRlLCBvciBieSB0aGUgcGFyZW50IGJlaW5nIHJlbW92ZWQgZW50aXJlbHlcbiAgICovXG4gIGRlc3Ryb3llZD86ICh0aGlzOiBUICYgSG9va0ludGVyZmFjZTxFPikgPT4gdm9pZDtcblxuICAvKipcbiAgICogVGhlIGRpc2Nvbm5lY3RlZCBjYWxsYmFjay5cbiAgICpcbiAgICogQ2FsbGVkIHdoZW4gdGhlIGVsZW1lbnQncyBwYXJlbnQgTGl2ZVZpZXcgaGFzIGRpc2Nvbm5lY3RlZCBmcm9tIHRoZSBzZXJ2ZXIuXG4gICAqL1xuICBkaXNjb25uZWN0ZWQ/OiAodGhpczogVCAmIEhvb2tJbnRlcmZhY2U8RT4pID0+IHZvaWQ7XG5cbiAgLyoqXG4gICAqIFRoZSByZWNvbm5lY3RlZCBjYWxsYmFjay5cbiAgICpcbiAgICogQ2FsbGVkIHdoZW4gdGhlIGVsZW1lbnQncyBwYXJlbnQgTGl2ZVZpZXcgaGFzIHJlY29ubmVjdGVkIHRvIHRoZSBzZXJ2ZXIuXG4gICAqL1xuICByZWNvbm5lY3RlZD86ICh0aGlzOiBUICYgSG9va0ludGVyZmFjZTxFPikgPT4gdm9pZDtcblxuICAvLyBBbGxvdyBjdXN0b20gbWV0aG9kcyB3aXRoIGFueSBzaWduYXR1cmUgYW5kIGN1c3RvbSBwcm9wZXJ0aWVzXG4gIFtrZXk6IFByb3BlcnR5S2V5XTogYW55O1xufVxuXG4vKipcbiAqIEJhc2UgY2xhc3MgZm9yIExpdmVWaWV3IGhvb2tzLiBVc2VycyBleHRlbmQgdGhpcyBjbGFzcyB0byBkZWZpbmUgdGhlaXIgaG9va3MuXG4gKlxuICogRXhhbXBsZTpcbiAqIGBgYHR5cGVzY3JpcHRcbiAqIGNsYXNzIE15Q3VzdG9tSG9vayBleHRlbmRzIFZpZXdIb29rIHtcbiAqICAgbXlTdGF0ZSA9IFwiaW5pdGlhbFwiO1xuICpcbiAqICAgbW91bnRlZCgpIHtcbiAqICAgICBjb25zb2xlLmxvZyhcIkhvb2sgbW91bnRlZCBvbiBlbGVtZW50OlwiLCB0aGlzLmVsKTtcbiAqICAgICB0aGlzLmVsLmFkZEV2ZW50TGlzdGVuZXIoXCJjbGlja1wiLCAoKSA9PiB7XG4gKiAgICAgICB0aGlzLnB1c2hFdmVudChcImVsZW1lbnQtY2xpY2tlZFwiLCB7IHN0YXRlOiB0aGlzLm15U3RhdGUgfSk7XG4gKiAgICAgfSk7XG4gKiAgIH1cbiAqXG4gKiAgIHVwZGF0ZWQoKSB7XG4gKiAgICAgY29uc29sZS5sb2coXCJIb29rIHVwZGF0ZWRcIiwgdGhpcy5lbC5pZCk7XG4gKiAgIH1cbiAqXG4gKiAgIG15Q3VzdG9tTWV0aG9kKHNvbWVBcmc6IHN0cmluZykge1xuICogICAgIGNvbnNvbGUubG9nKFwibXlDdXN0b21NZXRob2QgY2FsbGVkIHdpdGg6XCIsIHNvbWVBcmcsIFwiQ3VycmVudCBzdGF0ZTpcIiwgdGhpcy5teVN0YXRlKTtcbiAqICAgfVxuICogfVxuICogYGBgXG4gKlxuICogVGhlIGB0aGlzYCBjb250ZXh0IHdpdGhpbiB0aGUgaG9vayBtZXRob2RzIChtb3VudGVkLCB1cGRhdGVkLCBjdXN0b20gbWV0aG9kcywgZXRjLilcbiAqIHdpbGwgcmVmZXIgdG8gdGhlIGhvb2sgaW5zdGFuY2UsIHByb3ZpZGluZyBhY2Nlc3MgdG8gYHRoaXMuZWxgLCBgdGhpcy5saXZlU29ja2V0YCxcbiAqIGB0aGlzLnB1c2hFdmVudCgpYCwgZXRjLiwgYXMgd2VsbCBhcyBhbnkgcHJvcGVydGllcyBvciBtZXRob2RzIGRlZmluZWQgb24gdGhlIHN1YmNsYXNzLlxuICovXG5leHBvcnQgY2xhc3MgVmlld0hvb2s8RSBleHRlbmRzIEhUTUxFbGVtZW50ID0gSFRNTEVsZW1lbnQ+XG4gIGltcGxlbWVudHMgSG9va0ludGVyZmFjZTxFPlxue1xuICBlbDogRTtcbiAgbGl2ZVNvY2tldDogTGl2ZVNvY2tldDtcblxuICBwcml2YXRlIF9fbGlzdGVuZXJzOiBTZXQ8Q2FsbGJhY2tSZWY+O1xuICBwcml2YXRlIF9faXNEaXNjb25uZWN0ZWQ6IGJvb2xlYW47XG4gIHByaXZhdGUgX192aWV3OiAoKSA9PiBWaWV3O1xuXG4gIHN0YXRpYyBtYWtlSUQoKSB7XG4gICAgcmV0dXJuIHZpZXdIb29rSUQrKztcbiAgfVxuICBzdGF0aWMgZWxlbWVudElEKGVsOiBIVE1MRWxlbWVudCkge1xuICAgIHJldHVybiBET00ucHJpdmF0ZShlbCwgSE9PS19JRCk7XG4gIH1cblxuICBjb25zdHJ1Y3Rvcih2aWV3OiBWaWV3IHwgbnVsbCwgZWw6IEUsIGNhbGxiYWNrcz86IEhvb2spIHtcbiAgICB0aGlzLmVsID0gZWw7XG4gICAgdGhpcy5fX2F0dGFjaFZpZXcodmlldyk7XG4gICAgdGhpcy5fX2xpc3RlbmVycyA9IG5ldyBTZXQoKTtcbiAgICB0aGlzLl9faXNEaXNjb25uZWN0ZWQgPSBmYWxzZTtcbiAgICBET00ucHV0UHJpdmF0ZSh0aGlzLmVsLCBIT09LX0lELCBWaWV3SG9vay5tYWtlSUQoKSk7XG5cbiAgICBpZiAoY2FsbGJhY2tzKSB7XG4gICAgICAvLyBUaGlzIGluc3RhbmNlIGlzIGZvciBhbiBvYmplY3QtbGl0ZXJhbCBob29rLiBDb3B5IG1ldGhvZHMvcHJvcGVydGllcy5cbiAgICAgIC8vIFRoZXNlIGFyZSBwcm9wZXJ0aWVzIHRoYXQgc2hvdWxkIE5PVCBiZSBvdmVycmlkZGVuIGJ5IHRoZSBjYWxsYmFja3Mgb2JqZWN0LlxuICAgICAgY29uc3QgcHJvdGVjdGVkUHJvcHMgPSBuZXcgU2V0KFtcbiAgICAgICAgXCJlbFwiLFxuICAgICAgICBcImxpdmVTb2NrZXRcIixcbiAgICAgICAgXCJfX3ZpZXdcIixcbiAgICAgICAgXCJfX2xpc3RlbmVyc1wiLFxuICAgICAgICBcIl9faXNEaXNjb25uZWN0ZWRcIixcbiAgICAgICAgXCJjb25zdHJ1Y3RvclwiLCAvLyBTdGFuZGFyZCBvYmplY3QgcHJvcGVydGllc1xuICAgICAgICAvLyBDb3JlIFZpZXdIb29rIEFQSSBtZXRob2RzXG4gICAgICAgIFwianNcIixcbiAgICAgICAgXCJwdXNoRXZlbnRcIixcbiAgICAgICAgXCJwdXNoRXZlbnRUb1wiLFxuICAgICAgICBcImhhbmRsZUV2ZW50XCIsXG4gICAgICAgIFwicmVtb3ZlSGFuZGxlRXZlbnRcIixcbiAgICAgICAgXCJ1cGxvYWRcIixcbiAgICAgICAgXCJ1cGxvYWRUb1wiLFxuICAgICAgICAvLyBJbnRlcm5hbCBsaWZlY3ljbGUgY2FsbGVyc1xuICAgICAgICBcIl9fbW91bnRlZFwiLFxuICAgICAgICBcIl9fdXBkYXRlZFwiLFxuICAgICAgICBcIl9fYmVmb3JlVXBkYXRlXCIsXG4gICAgICAgIFwiX19kZXN0cm95ZWRcIixcbiAgICAgICAgXCJfX3JlY29ubmVjdGVkXCIsXG4gICAgICAgIFwiX19kaXNjb25uZWN0ZWRcIixcbiAgICAgICAgXCJfX2NsZWFudXBfX1wiLFxuICAgICAgXSk7XG5cbiAgICAgIGZvciAoY29uc3Qga2V5IGluIGNhbGxiYWNrcykge1xuICAgICAgICBpZiAoT2JqZWN0LnByb3RvdHlwZS5oYXNPd25Qcm9wZXJ0eS5jYWxsKGNhbGxiYWNrcywga2V5KSkge1xuICAgICAgICAgICh0aGlzIGFzIGFueSlba2V5XSA9IGNhbGxiYWNrc1trZXldO1xuICAgICAgICAgIC8vIGZvciBiYWNrd2FyZHMgY29tcGF0aWJpbGl0eSwgd2UgYWxsb3cgdGhlIG92ZXJ3cml0ZSwgYnV0IHdlIGxvZyBhIHdhcm5pbmdcbiAgICAgICAgICBpZiAocHJvdGVjdGVkUHJvcHMuaGFzKGtleSkpIHtcbiAgICAgICAgICAgIGNvbnNvbGUud2FybihcbiAgICAgICAgICAgICAgYEhvb2sgb2JqZWN0IGZvciBlbGVtZW50ICMke2VsLmlkfSBvdmVyd3JpdGVzIGNvcmUgcHJvcGVydHkgJyR7a2V5fSchYCxcbiAgICAgICAgICAgICk7XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICB9XG5cbiAgICAgIGNvbnN0IGxpZmVjeWNsZU1ldGhvZHM6IChrZXlvZiBIb29rKVtdID0gW1xuICAgICAgICBcIm1vdW50ZWRcIixcbiAgICAgICAgXCJiZWZvcmVVcGRhdGVcIixcbiAgICAgICAgXCJ1cGRhdGVkXCIsXG4gICAgICAgIFwiZGVzdHJveWVkXCIsXG4gICAgICAgIFwiZGlzY29ubmVjdGVkXCIsXG4gICAgICAgIFwicmVjb25uZWN0ZWRcIixcbiAgICAgIF07XG4gICAgICBsaWZlY3ljbGVNZXRob2RzLmZvckVhY2goKG1ldGhvZE5hbWUpID0+IHtcbiAgICAgICAgaWYgKFxuICAgICAgICAgIGNhbGxiYWNrc1ttZXRob2ROYW1lXSAmJlxuICAgICAgICAgIHR5cGVvZiBjYWxsYmFja3NbbWV0aG9kTmFtZV0gPT09IFwiZnVuY3Rpb25cIlxuICAgICAgICApIHtcbiAgICAgICAgICAodGhpcyBhcyBhbnkpW21ldGhvZE5hbWVdID0gY2FsbGJhY2tzW21ldGhvZE5hbWVdO1xuICAgICAgICB9XG4gICAgICB9KTtcbiAgICB9XG4gICAgLy8gSWYgJ2NhbGxiYWNrcycgaXMgbm90IHByb3ZpZGVkLCB0aGlzIGlzIGFuIGluc3RhbmNlIG9mIGEgdXNlci1kZWZpbmVkIGNsYXNzIChlLmcuLCBNeUhvb2spLlxuICAgIC8vIEl0cyBtZXRob2RzIChtb3VudGVkLCB1cGRhdGVkLCBjdXN0b20pIGFyZSBhbHJlYWR5IHBhcnQgb2YgaXRzIHByb3RvdHlwZSBvciBpbnN0YW5jZSxcbiAgICAvLyBhbmQgd2lsbCBjb3JyZWN0bHkgb3ZlcnJpZGUgdGhlIGRlZmF1bHRzIGZyb20gVmlld0hvb2sucHJvdG90eXBlLlxuICB9XG5cbiAgLyoqIEBpbnRlcm5hbCAqL1xuICBfX2F0dGFjaFZpZXcodmlldzogVmlldyB8IG51bGwpIHtcbiAgICBpZiAodmlldykge1xuICAgICAgdGhpcy5fX3ZpZXcgPSAoKSA9PiB2aWV3O1xuICAgICAgdGhpcy5saXZlU29ja2V0ID0gdmlldy5saXZlU29ja2V0O1xuICAgIH0gZWxzZSB7XG4gICAgICB0aGlzLl9fdmlldyA9ICgpID0+IHtcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKFxuICAgICAgICAgIGBob29rIG5vdCB5ZXQgYXR0YWNoZWQgdG8gYSBsaXZlIHZpZXc6ICR7dGhpcy5lbC5vdXRlckhUTUx9YCxcbiAgICAgICAgKTtcbiAgICAgIH07XG4gICAgICB0aGlzLmxpdmVTb2NrZXQgPSBudWxsO1xuICAgIH1cbiAgfVxuXG4gIC8vIERlZmF1bHQgbGlmZWN5Y2xlIG1ldGhvZHNcbiAgbW91bnRlZCgpOiB2b2lkIHt9XG4gIGJlZm9yZVVwZGF0ZSgpOiB2b2lkIHt9XG4gIHVwZGF0ZWQoKTogdm9pZCB7fVxuICBkZXN0cm95ZWQoKTogdm9pZCB7fVxuICBkaXNjb25uZWN0ZWQoKTogdm9pZCB7fVxuICByZWNvbm5lY3RlZCgpOiB2b2lkIHt9XG5cbiAgLy8gSW50ZXJuYWwgbGlmZWN5Y2xlIGNhbGxlcnMgLSBjYWxsZWQgYnkgdGhlIFZpZXdcblxuICAvKiogQGludGVybmFsICovXG4gIF9fbW91bnRlZCgpIHtcbiAgICB0aGlzLm1vdW50ZWQoKTtcbiAgfVxuICAvKiogQGludGVybmFsICovXG4gIF9fdXBkYXRlZCgpIHtcbiAgICB0aGlzLnVwZGF0ZWQoKTtcbiAgfVxuICAvKiogQGludGVybmFsICovXG4gIF9fYmVmb3JlVXBkYXRlKCkge1xuICAgIHRoaXMuYmVmb3JlVXBkYXRlKCk7XG4gIH1cbiAgLyoqIEBpbnRlcm5hbCAqL1xuICBfX2Rlc3Ryb3llZCgpIHtcbiAgICB0aGlzLmRlc3Ryb3llZCgpO1xuICAgIERPTS5kZWxldGVQcml2YXRlKHRoaXMuZWwsIEhPT0tfSUQpOyAvLyBodHRwczovL2dpdGh1Yi5jb20vcGhvZW5peGZyYW1ld29yay9waG9lbml4X2xpdmVfdmlldy9pc3N1ZXMvMzQ5NlxuICB9XG4gIC8qKiBAaW50ZXJuYWwgKi9cbiAgX19yZWNvbm5lY3RlZCgpIHtcbiAgICBpZiAodGhpcy5fX2lzRGlzY29ubmVjdGVkKSB7XG4gICAgICB0aGlzLl9faXNEaXNjb25uZWN0ZWQgPSBmYWxzZTtcbiAgICAgIHRoaXMucmVjb25uZWN0ZWQoKTtcbiAgICB9XG4gIH1cbiAgLyoqIEBpbnRlcm5hbCAqL1xuICBfX2Rpc2Nvbm5lY3RlZCgpIHtcbiAgICB0aGlzLl9faXNEaXNjb25uZWN0ZWQgPSB0cnVlO1xuICAgIHRoaXMuZGlzY29ubmVjdGVkKCk7XG4gIH1cblxuICBqcygpOiBIb29rSlNDb21tYW5kcyB7XG4gICAgcmV0dXJuIHtcbiAgICAgIC4uLmpzQ29tbWFuZHModGhpcy5fX3ZpZXcoKS5saXZlU29ja2V0LCBcImhvb2tcIiksXG4gICAgICBleGVjOiAoZW5jb2RlZEpTOiBzdHJpbmcpID0+IHtcbiAgICAgICAgdGhpcy5fX3ZpZXcoKS5saXZlU29ja2V0LmV4ZWNKUyh0aGlzLmVsLCBlbmNvZGVkSlMsIFwiaG9va1wiKTtcbiAgICAgIH0sXG4gICAgfTtcbiAgfVxuXG4gIHB1c2hFdmVudChldmVudDogc3RyaW5nLCBwYXlsb2FkPzogYW55LCBvblJlcGx5PzogT25SZXBseSkge1xuICAgIGNvbnN0IHByb21pc2UgPSB0aGlzLl9fdmlldygpLnB1c2hIb29rRXZlbnQoXG4gICAgICB0aGlzLmVsLFxuICAgICAgbnVsbCxcbiAgICAgIGV2ZW50LFxuICAgICAgcGF5bG9hZCB8fCB7fSxcbiAgICApO1xuICAgIGlmIChvblJlcGx5ID09PSB1bmRlZmluZWQpIHtcbiAgICAgIHJldHVybiBwcm9taXNlLnRoZW4oKHsgcmVwbHkgfSkgPT4gcmVwbHkpO1xuICAgIH1cbiAgICBwcm9taXNlLnRoZW4oKHsgcmVwbHksIHJlZiB9KSA9PiBvblJlcGx5KHJlcGx5LCByZWYpKS5jYXRjaCgoKSA9PiB7fSk7XG4gICAgcmV0dXJuO1xuICB9XG5cbiAgcHVzaEV2ZW50VG8oXG4gICAgc2VsZWN0b3JPclRhcmdldDogUGh4VGFyZ2V0LFxuICAgIGV2ZW50OiBzdHJpbmcsXG4gICAgcGF5bG9hZD86IG9iamVjdCxcbiAgICBvblJlcGx5PzogT25SZXBseSxcbiAgKSB7XG4gICAgaWYgKG9uUmVwbHkgPT09IHVuZGVmaW5lZCkge1xuICAgICAgY29uc3QgdGFyZ2V0UGFpcjogeyB2aWV3OiBWaWV3OyB0YXJnZXRDdHg6IGFueSB9W10gPSBbXTtcbiAgICAgIHRoaXMuX192aWV3KCkud2l0aGluVGFyZ2V0cyhzZWxlY3Rvck9yVGFyZ2V0LCAodmlldywgdGFyZ2V0Q3R4KSA9PiB7XG4gICAgICAgIHRhcmdldFBhaXIucHVzaCh7IHZpZXcsIHRhcmdldEN0eCB9KTtcbiAgICAgIH0pO1xuICAgICAgY29uc3QgcHJvbWlzZXMgPSB0YXJnZXRQYWlyLm1hcCgoeyB2aWV3LCB0YXJnZXRDdHggfSkgPT4ge1xuICAgICAgICByZXR1cm4gdmlldy5wdXNoSG9va0V2ZW50KHRoaXMuZWwsIHRhcmdldEN0eCwgZXZlbnQsIHBheWxvYWQgfHwge30pO1xuICAgICAgfSk7XG4gICAgICByZXR1cm4gUHJvbWlzZS5hbGxTZXR0bGVkKHByb21pc2VzKTtcbiAgICB9XG4gICAgdGhpcy5fX3ZpZXcoKS53aXRoaW5UYXJnZXRzKHNlbGVjdG9yT3JUYXJnZXQsICh2aWV3LCB0YXJnZXRDdHgpID0+IHtcbiAgICAgIHZpZXdcbiAgICAgICAgLnB1c2hIb29rRXZlbnQodGhpcy5lbCwgdGFyZ2V0Q3R4LCBldmVudCwgcGF5bG9hZCB8fCB7fSlcbiAgICAgICAgLnRoZW4oKHsgcmVwbHksIHJlZiB9KSA9PiBvblJlcGx5KHJlcGx5LCByZWYpKVxuICAgICAgICAuY2F0Y2goKCkgPT4ge30pO1xuICAgIH0pO1xuICAgIHJldHVybjtcbiAgfVxuXG4gIGhhbmRsZUV2ZW50KGV2ZW50OiBzdHJpbmcsIGNhbGxiYWNrOiAocGF5bG9hZDogYW55KSA9PiBhbnkpOiBDYWxsYmFja1JlZiB7XG4gICAgY29uc3QgY2FsbGJhY2tSZWY6IENhbGxiYWNrUmVmID0ge1xuICAgICAgZXZlbnQsXG4gICAgICBjYWxsYmFjazogKGN1c3RvbUV2ZW50OiBDdXN0b21FdmVudCkgPT4gY2FsbGJhY2soY3VzdG9tRXZlbnQuZGV0YWlsKSxcbiAgICB9O1xuICAgIHdpbmRvdy5hZGRFdmVudExpc3RlbmVyKFxuICAgICAgYHBoeDoke2V2ZW50fWAsXG4gICAgICBjYWxsYmFja1JlZi5jYWxsYmFjayBhcyBFdmVudExpc3RlbmVyLFxuICAgICk7XG4gICAgdGhpcy5fX2xpc3RlbmVycy5hZGQoY2FsbGJhY2tSZWYpO1xuICAgIHJldHVybiBjYWxsYmFja1JlZjtcbiAgfVxuXG4gIHJlbW92ZUhhbmRsZUV2ZW50KHJlZjogQ2FsbGJhY2tSZWYpOiB2b2lkIHtcbiAgICB3aW5kb3cucmVtb3ZlRXZlbnRMaXN0ZW5lcihcbiAgICAgIGBwaHg6JHtyZWYuZXZlbnR9YCxcbiAgICAgIHJlZi5jYWxsYmFjayBhcyBFdmVudExpc3RlbmVyLFxuICAgICk7XG4gICAgdGhpcy5fX2xpc3RlbmVycy5kZWxldGUocmVmKTtcbiAgfVxuXG4gIHVwbG9hZChuYW1lOiBzdHJpbmcsIGZpbGVzOiBGaWxlTGlzdCk6IGFueSB7XG4gICAgcmV0dXJuIHRoaXMuX192aWV3KCkuZGlzcGF0Y2hVcGxvYWRzKG51bGwsIG5hbWUsIGZpbGVzKTtcbiAgfVxuXG4gIHVwbG9hZFRvKHNlbGVjdG9yT3JUYXJnZXQ6IFBoeFRhcmdldCwgbmFtZTogc3RyaW5nLCBmaWxlczogRmlsZUxpc3QpOiBhbnkge1xuICAgIHJldHVybiB0aGlzLl9fdmlldygpLndpdGhpblRhcmdldHMoc2VsZWN0b3JPclRhcmdldCwgKHZpZXcsIHRhcmdldEN0eCkgPT4ge1xuICAgICAgdmlldy5kaXNwYXRjaFVwbG9hZHModGFyZ2V0Q3R4LCBuYW1lLCBmaWxlcyk7XG4gICAgfSk7XG4gIH1cblxuICAvKiogQGludGVybmFsICovXG4gIF9fY2xlYW51cF9fKCkge1xuICAgIHRoaXMuX19saXN0ZW5lcnMuZm9yRWFjaCgoY2FsbGJhY2tSZWYpID0+XG4gICAgICB0aGlzLnJlbW92ZUhhbmRsZUV2ZW50KGNhbGxiYWNrUmVmKSxcbiAgICApO1xuICB9XG59XG5cbmV4cG9ydCB0eXBlIEhvb2tzT3B0aW9ucyA9IFJlY29yZDxzdHJpbmcsIHR5cGVvZiBWaWV3SG9vayB8IEhvb2s+O1xuXG5leHBvcnQgZGVmYXVsdCBWaWV3SG9vaztcbiIsICJpbXBvcnQge1xuICBCRUZPUkVfVU5MT0FEX0xPQURFUl9USU1FT1VULFxuICBDSEVDS0FCTEVfSU5QVVRTLFxuICBDT05TRUNVVElWRV9SRUxPQURTLFxuICBQSFhfQVVUT19SRUNPVkVSLFxuICBQSFhfQ09NUE9ORU5ULFxuICBQSFhfVklFV19SRUYsXG4gIFBIWF9DT05ORUNURURfQ0xBU1MsXG4gIFBIWF9ESVNBQkxFX1dJVEgsXG4gIFBIWF9ESVNBQkxFX1dJVEhfUkVTVE9SRSxcbiAgUEhYX0RJU0FCTEVELFxuICBQSFhfTE9BRElOR19DTEFTUyxcbiAgUEhYX0VSUk9SX0NMQVNTLFxuICBQSFhfQ0xJRU5UX0VSUk9SX0NMQVNTLFxuICBQSFhfU0VSVkVSX0VSUk9SX0NMQVNTLFxuICBQSFhfSEFTX0ZPQ1VTRUQsXG4gIFBIWF9IQVNfU1VCTUlUVEVELFxuICBQSFhfSE9PSyxcbiAgUEhYX1BBUkVOVF9JRCxcbiAgUEhYX1BST0dSRVNTLFxuICBQSFhfUkVBRE9OTFksXG4gIFBIWF9SRUZfTE9BRElORyxcbiAgUEhYX1JFRl9TUkMsXG4gIFBIWF9SRUZfTE9DSyxcbiAgUEhYX1JPT1RfSUQsXG4gIFBIWF9TRVNTSU9OLFxuICBQSFhfU1RBVElDLFxuICBQSFhfU1RJQ0tZLFxuICBQSFhfVFJBQ0tfU1RBVElDLFxuICBQSFhfVFJBQ0tfVVBMT0FEUyxcbiAgUEhYX1VQREFURSxcbiAgUEhYX1VQTE9BRF9SRUYsXG4gIFBIWF9WSUVXX1NFTEVDVE9SLFxuICBQSFhfTUFJTixcbiAgUEhYX01PVU5URUQsXG4gIFBVU0hfVElNRU9VVCxcbiAgUEhYX1ZJRVdQT1JUX1RPUCxcbiAgUEhYX1ZJRVdQT1JUX0JPVFRPTSxcbiAgTUFYX0NISUxEX0pPSU5fQVRURU1QVFMsXG4gIFBIWF9MVl9QSUQsXG4gIFBIWF9QT1JUQUwsXG4gIFBIWF9URUxFUE9SVEVEX1JFRixcbn0gZnJvbSBcIi4vY29uc3RhbnRzXCI7XG5cbmltcG9ydCB7XG4gIGNsb25lLFxuICBjbG9zZXN0UGh4QmluZGluZyxcbiAgaXNFbXB0eSxcbiAgaXNFcXVhbE9iaixcbiAgbG9nRXJyb3IsXG4gIG1heWJlLFxuICBpc0NpZCxcbn0gZnJvbSBcIi4vdXRpbHNcIjtcblxuaW1wb3J0IEJyb3dzZXIgZnJvbSBcIi4vYnJvd3NlclwiO1xuaW1wb3J0IERPTSBmcm9tIFwiLi9kb21cIjtcbmltcG9ydCBFbGVtZW50UmVmIGZyb20gXCIuL2VsZW1lbnRfcmVmXCI7XG5pbXBvcnQgRE9NUGF0Y2ggZnJvbSBcIi4vZG9tX3BhdGNoXCI7XG5pbXBvcnQgTGl2ZVVwbG9hZGVyIGZyb20gXCIuL2xpdmVfdXBsb2FkZXJcIjtcbmltcG9ydCBSZW5kZXJlZCBmcm9tIFwiLi9yZW5kZXJlZFwiO1xuaW1wb3J0IHsgVmlld0hvb2sgfSBmcm9tIFwiLi92aWV3X2hvb2tcIjtcbmltcG9ydCBKUyBmcm9tIFwiLi9qc1wiO1xuXG5pbXBvcnQgbW9ycGhkb20gZnJvbSBcIm1vcnBoZG9tXCI7XG5cbmV4cG9ydCBjb25zdCBwcmVwZW5kRm9ybURhdGFLZXkgPSAoa2V5LCBwcmVmaXgpID0+IHtcbiAgY29uc3QgaXNBcnJheSA9IGtleS5lbmRzV2l0aChcIltdXCIpO1xuICAvLyBSZW1vdmUgdGhlIFwiW11cIiBpZiBpdCdzIGFuIGFycmF5XG4gIGxldCBiYXNlS2V5ID0gaXNBcnJheSA/IGtleS5zbGljZSgwLCAtMikgOiBrZXk7XG4gIC8vIFJlcGxhY2UgbGFzdCBvY2N1cnJlbmNlIG9mIGtleSBiZWZvcmUgYSBjbG9zaW5nIGJyYWNrZXQgb3IgdGhlIGVuZCB3aXRoIGtleSBwbHVzIHN1ZmZpeFxuICBiYXNlS2V5ID0gYmFzZUtleS5yZXBsYWNlKC8oW15cXFtcXF1dKykoXFxdPyQpLywgYCR7cHJlZml4fSQxJDJgKTtcbiAgLy8gQWRkIGJhY2sgdGhlIFwiW11cIiBpZiBpdCB3YXMgYW4gYXJyYXlcbiAgaWYgKGlzQXJyYXkpIHtcbiAgICBiYXNlS2V5ICs9IFwiW11cIjtcbiAgfVxuICByZXR1cm4gYmFzZUtleTtcbn07XG5cbmNvbnN0IHNlcmlhbGl6ZUZvcm0gPSAoZm9ybSwgb3B0cywgb25seU5hbWVzID0gW10pID0+IHtcbiAgY29uc3QgeyBzdWJtaXR0ZXIgfSA9IG9wdHM7XG5cbiAgLy8gV2UgbXVzdCBpbmplY3QgdGhlIHN1Ym1pdHRlciBpbiB0aGUgb3JkZXIgdGhhdCBpdCBleGlzdHMgaW4gdGhlIERPTVxuICAvLyByZWxhdGl2ZSB0byBvdGhlciBpbnB1dHMuIEZvciBleGFtcGxlLCBmb3IgY2hlY2tib3ggZ3JvdXBzLCB0aGUgb3JkZXIgbXVzdCBiZSBtYWludGFpbmVkLlxuICBsZXQgaW5qZWN0ZWRFbGVtZW50O1xuICBpZiAoc3VibWl0dGVyICYmIHN1Ym1pdHRlci5uYW1lKSB7XG4gICAgY29uc3QgaW5wdXQgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KFwiaW5wdXRcIik7XG4gICAgaW5wdXQudHlwZSA9IFwiaGlkZGVuXCI7XG4gICAgLy8gc2V0IHRoZSBmb3JtIGF0dHJpYnV0ZSBpZiB0aGUgc3VibWl0dGVyIGhhcyBvbmU7XG4gICAgLy8gdGhpcyBjYW4gaGFwcGVuIGlmIHRoZSBlbGVtZW50IGlzIG91dHNpZGUgdGhlIGFjdHVhbCBmb3JtIGVsZW1lbnRcbiAgICBjb25zdCBmb3JtSWQgPSBzdWJtaXR0ZXIuZ2V0QXR0cmlidXRlKFwiZm9ybVwiKTtcbiAgICBpZiAoZm9ybUlkKSB7XG4gICAgICBpbnB1dC5zZXRBdHRyaWJ1dGUoXCJmb3JtXCIsIGZvcm1JZCk7XG4gICAgfVxuICAgIGlucHV0Lm5hbWUgPSBzdWJtaXR0ZXIubmFtZTtcbiAgICBpbnB1dC52YWx1ZSA9IHN1Ym1pdHRlci52YWx1ZTtcbiAgICBzdWJtaXR0ZXIucGFyZW50RWxlbWVudC5pbnNlcnRCZWZvcmUoaW5wdXQsIHN1Ym1pdHRlcik7XG4gICAgaW5qZWN0ZWRFbGVtZW50ID0gaW5wdXQ7XG4gIH1cblxuICBjb25zdCBmb3JtRGF0YSA9IG5ldyBGb3JtRGF0YShmb3JtKTtcbiAgY29uc3QgdG9SZW1vdmUgPSBbXTtcblxuICBmb3JtRGF0YS5mb3JFYWNoKCh2YWwsIGtleSwgX2luZGV4KSA9PiB7XG4gICAgaWYgKHZhbCBpbnN0YW5jZW9mIEZpbGUpIHtcbiAgICAgIHRvUmVtb3ZlLnB1c2goa2V5KTtcbiAgICB9XG4gIH0pO1xuXG4gIC8vIENsZWFudXAgYWZ0ZXIgYnVpbGRpbmcgZmlsZURhdGFcbiAgdG9SZW1vdmUuZm9yRWFjaCgoa2V5KSA9PiBmb3JtRGF0YS5kZWxldGUoa2V5KSk7XG5cbiAgY29uc3QgcGFyYW1zID0gbmV3IFVSTFNlYXJjaFBhcmFtcygpO1xuXG4gIGNvbnN0IHsgaW5wdXRzVW51c2VkLCBvbmx5SGlkZGVuSW5wdXRzIH0gPSBBcnJheS5mcm9tKGZvcm0uZWxlbWVudHMpLnJlZHVjZShcbiAgICAoYWNjLCBpbnB1dCkgPT4ge1xuICAgICAgY29uc3QgeyBpbnB1dHNVbnVzZWQsIG9ubHlIaWRkZW5JbnB1dHMgfSA9IGFjYztcbiAgICAgIGNvbnN0IGtleSA9IGlucHV0Lm5hbWU7XG4gICAgICBpZiAoIWtleSkge1xuICAgICAgICByZXR1cm4gYWNjO1xuICAgICAgfVxuXG4gICAgICBpZiAoaW5wdXRzVW51c2VkW2tleV0gPT09IHVuZGVmaW5lZCkge1xuICAgICAgICBpbnB1dHNVbnVzZWRba2V5XSA9IHRydWU7XG4gICAgICB9XG4gICAgICBpZiAob25seUhpZGRlbklucHV0c1trZXldID09PSB1bmRlZmluZWQpIHtcbiAgICAgICAgb25seUhpZGRlbklucHV0c1trZXldID0gdHJ1ZTtcbiAgICAgIH1cblxuICAgICAgY29uc3QgaXNVc2VkID1cbiAgICAgICAgRE9NLnByaXZhdGUoaW5wdXQsIFBIWF9IQVNfRk9DVVNFRCkgfHxcbiAgICAgICAgRE9NLnByaXZhdGUoaW5wdXQsIFBIWF9IQVNfU1VCTUlUVEVEKTtcbiAgICAgIGNvbnN0IGlzSGlkZGVuID0gaW5wdXQudHlwZSA9PT0gXCJoaWRkZW5cIjtcbiAgICAgIGlucHV0c1VudXNlZFtrZXldID0gaW5wdXRzVW51c2VkW2tleV0gJiYgIWlzVXNlZDtcbiAgICAgIG9ubHlIaWRkZW5JbnB1dHNba2V5XSA9IG9ubHlIaWRkZW5JbnB1dHNba2V5XSAmJiBpc0hpZGRlbjtcblxuICAgICAgcmV0dXJuIGFjYztcbiAgICB9LFxuICAgIHsgaW5wdXRzVW51c2VkOiB7fSwgb25seUhpZGRlbklucHV0czoge30gfSxcbiAgKTtcblxuICBmb3IgKGNvbnN0IFtrZXksIHZhbF0gb2YgZm9ybURhdGEuZW50cmllcygpKSB7XG4gICAgaWYgKG9ubHlOYW1lcy5sZW5ndGggPT09IDAgfHwgb25seU5hbWVzLmluZGV4T2Yoa2V5KSA+PSAwKSB7XG4gICAgICBjb25zdCBpc1VudXNlZCA9IGlucHV0c1VudXNlZFtrZXldO1xuICAgICAgY29uc3QgaGlkZGVuID0gb25seUhpZGRlbklucHV0c1trZXldO1xuICAgICAgaWYgKGlzVW51c2VkICYmICEoc3VibWl0dGVyICYmIHN1Ym1pdHRlci5uYW1lID09IGtleSkgJiYgIWhpZGRlbikge1xuICAgICAgICBwYXJhbXMuYXBwZW5kKHByZXBlbmRGb3JtRGF0YUtleShrZXksIFwiX3VudXNlZF9cIiksIFwiXCIpO1xuICAgICAgfVxuICAgICAgaWYgKHR5cGVvZiB2YWwgPT09IFwic3RyaW5nXCIpIHtcbiAgICAgICAgcGFyYW1zLmFwcGVuZChrZXksIHZhbCk7XG4gICAgICB9XG4gICAgfVxuICB9XG5cbiAgLy8gcmVtb3ZlIHRoZSBpbmplY3RlZCBlbGVtZW50IGFnYWluXG4gIC8vIChpdCB3b3VsZCBiZSByZW1vdmVkIGJ5IHRoZSBuZXh0IGRvbSBwYXRjaCBhbnl3YXksIGJ1dCB0aGlzIGlzIGNsZWFuZXIpXG4gIGlmIChzdWJtaXR0ZXIgJiYgaW5qZWN0ZWRFbGVtZW50KSB7XG4gICAgc3VibWl0dGVyLnBhcmVudEVsZW1lbnQucmVtb3ZlQ2hpbGQoaW5qZWN0ZWRFbGVtZW50KTtcbiAgfVxuXG4gIHJldHVybiBwYXJhbXMudG9TdHJpbmcoKTtcbn07XG5cbmV4cG9ydCBkZWZhdWx0IGNsYXNzIFZpZXcge1xuICBzdGF0aWMgY2xvc2VzdFZpZXcoZWwpIHtcbiAgICBjb25zdCBsaXZlVmlld0VsID0gZWwuY2xvc2VzdChQSFhfVklFV19TRUxFQ1RPUik7XG4gICAgcmV0dXJuIGxpdmVWaWV3RWwgPyBET00ucHJpdmF0ZShsaXZlVmlld0VsLCBcInZpZXdcIikgOiBudWxsO1xuICB9XG5cbiAgY29uc3RydWN0b3IoZWwsIGxpdmVTb2NrZXQsIHBhcmVudFZpZXcsIGZsYXNoLCBsaXZlUmVmZXJlcikge1xuICAgIHRoaXMuaXNEZWFkID0gZmFsc2U7XG4gICAgdGhpcy5saXZlU29ja2V0ID0gbGl2ZVNvY2tldDtcbiAgICB0aGlzLmZsYXNoID0gZmxhc2g7XG4gICAgdGhpcy5wYXJlbnQgPSBwYXJlbnRWaWV3O1xuICAgIHRoaXMucm9vdCA9IHBhcmVudFZpZXcgPyBwYXJlbnRWaWV3LnJvb3QgOiB0aGlzO1xuICAgIHRoaXMuZWwgPSBlbDtcbiAgICAvLyBzZWUgaHR0cHM6Ly9naXRodWIuY29tL3Bob2VuaXhmcmFtZXdvcmsvcGhvZW5peF9saXZlX3ZpZXcvcHVsbC8zNzIxXG4gICAgLy8gY2hlY2sgaWYgdGhlIGVsZW1lbnQgaXMgYWxyZWFkeSBib3VuZCB0byBhIHZpZXdcbiAgICBjb25zdCBib3VuZFZpZXcgPSBET00ucHJpdmF0ZSh0aGlzLmVsLCBcInZpZXdcIik7XG4gICAgaWYgKGJvdW5kVmlldyAhPT0gdW5kZWZpbmVkICYmIGJvdW5kVmlldy5pc0RlYWQgIT09IHRydWUpIHtcbiAgICAgIGxvZ0Vycm9yKFxuICAgICAgICBgVGhlIERPTSBlbGVtZW50IGZvciB0aGlzIHZpZXcgaGFzIGFscmVhZHkgYmVlbiBib3VuZCB0byBhIHZpZXcuXG5cbiAgICAgICAgQW4gZWxlbWVudCBjYW4gb25seSBldmVyIGJlIGFzc29jaWF0ZWQgd2l0aCBhIHNpbmdsZSB2aWV3IVxuICAgICAgICBQbGVhc2UgZW5zdXJlIHRoYXQgeW91IGFyZSBub3QgdHJ5aW5nIHRvIGluaXRpYWxpemUgbXVsdGlwbGUgTGl2ZVNvY2tldHMgb24gdGhlIHNhbWUgcGFnZS5cbiAgICAgICAgVGhpcyBjb3VsZCBoYXBwZW4gaWYgeW91J3JlIGFjY2lkZW50YWxseSB0cnlpbmcgdG8gcmVuZGVyIHlvdXIgcm9vdCBsYXlvdXQgbW9yZSB0aGFuIG9uY2UuXG4gICAgICAgIEVuc3VyZSB0aGF0IHRoZSB0ZW1wbGF0ZSBzZXQgb24gdGhlIExpdmVWaWV3IGlzIGRpZmZlcmVudCB0aGFuIHRoZSByb290IGxheW91dC5cbiAgICAgIGAsXG4gICAgICAgIHsgdmlldzogYm91bmRWaWV3IH0sXG4gICAgICApO1xuICAgICAgdGhyb3cgbmV3IEVycm9yKFwiQ2Fubm90IGJpbmQgbXVsdGlwbGUgdmlld3MgdG8gdGhlIHNhbWUgRE9NIGVsZW1lbnQuXCIpO1xuICAgIH1cbiAgICAvLyBiaW5kIHRoZSB2aWV3IHRvIHRoZSBlbGVtZW50XG4gICAgRE9NLnB1dFByaXZhdGUodGhpcy5lbCwgXCJ2aWV3XCIsIHRoaXMpO1xuICAgIHRoaXMuaWQgPSB0aGlzLmVsLmlkO1xuICAgIHRoaXMucmVmID0gMDtcbiAgICB0aGlzLmxhc3RBY2tSZWYgPSBudWxsO1xuICAgIHRoaXMuY2hpbGRKb2lucyA9IDA7XG4gICAgLyoqXG4gICAgICogQHR5cGUge1JldHVyblR5cGU8dHlwZW9mIHNldFRpbWVvdXQ+IHwgbnVsbH1cbiAgICAgKi9cbiAgICB0aGlzLmxvYWRlclRpbWVyID0gbnVsbDtcbiAgICAvKipcbiAgICAgKiBAdHlwZSB7UmV0dXJuVHlwZTx0eXBlb2Ygc2V0VGltZW91dD4gfCBudWxsfVxuICAgICAqL1xuICAgIHRoaXMuZGlzY29ubmVjdGVkVGltZXIgPSBudWxsO1xuICAgIHRoaXMucGVuZGluZ0RpZmZzID0gW107XG4gICAgdGhpcy5wZW5kaW5nRm9ybXMgPSBuZXcgU2V0KCk7XG4gICAgdGhpcy5yZWRpcmVjdCA9IGZhbHNlO1xuICAgIHRoaXMuaHJlZiA9IG51bGw7XG4gICAgdGhpcy5qb2luQ291bnQgPSB0aGlzLnBhcmVudCA/IHRoaXMucGFyZW50LmpvaW5Db3VudCAtIDEgOiAwO1xuICAgIHRoaXMuam9pbkF0dGVtcHRzID0gMDtcbiAgICB0aGlzLmpvaW5QZW5kaW5nID0gdHJ1ZTtcbiAgICB0aGlzLmRlc3Ryb3llZCA9IGZhbHNlO1xuICAgIHRoaXMuam9pbkNhbGxiYWNrID0gZnVuY3Rpb24gKG9uRG9uZSkge1xuICAgICAgb25Eb25lICYmIG9uRG9uZSgpO1xuICAgIH07XG4gICAgdGhpcy5zdG9wQ2FsbGJhY2sgPSBmdW5jdGlvbiAoKSB7fTtcbiAgICAvLyB1c3VhbGx5LCBvbmx5IHRoZSByb290IExpdmVWaWV3IHN0b3JlcyBwZW5kaW5nXG4gICAgLy8gam9pbiBvcGVyYXRpb25zIGZvciBhbGwgY2hpbGRyZW4gKGFuZCBpdHNlbGYpLFxuICAgIC8vIGJ1dCBpbiBjYXNlIG9mIHJlam9pbnMgKGpvaW5Db3VudCA+IDEpIGVhY2ggY2hpbGRcbiAgICAvLyBzdG9yZXMgaXRzIG93biBldmVudHMgaW5zdGVhZFxuICAgIHRoaXMucGVuZGluZ0pvaW5PcHMgPSBbXTtcbiAgICB0aGlzLnZpZXdIb29rcyA9IHt9O1xuICAgIHRoaXMuZm9ybVN1Ym1pdHMgPSBbXTtcbiAgICB0aGlzLmNoaWxkcmVuID0gdGhpcy5wYXJlbnQgPyBudWxsIDoge307XG4gICAgdGhpcy5yb290LmNoaWxkcmVuW3RoaXMuaWRdID0ge307XG4gICAgdGhpcy5mb3Jtc0ZvclJlY292ZXJ5ID0ge307XG4gICAgdGhpcy5jaGFubmVsID0gdGhpcy5saXZlU29ja2V0LmNoYW5uZWwoYGx2OiR7dGhpcy5pZH1gLCAoKSA9PiB7XG4gICAgICBjb25zdCB1cmwgPSB0aGlzLmhyZWYgJiYgdGhpcy5leHBhbmRVUkwodGhpcy5ocmVmKTtcbiAgICAgIHJldHVybiB7XG4gICAgICAgIHJlZGlyZWN0OiB0aGlzLnJlZGlyZWN0ID8gdXJsIDogdW5kZWZpbmVkLFxuICAgICAgICB1cmw6IHRoaXMucmVkaXJlY3QgPyB1bmRlZmluZWQgOiB1cmwgfHwgdW5kZWZpbmVkLFxuICAgICAgICBwYXJhbXM6IHRoaXMuY29ubmVjdFBhcmFtcyhsaXZlUmVmZXJlciksXG4gICAgICAgIHNlc3Npb246IHRoaXMuZ2V0U2Vzc2lvbigpLFxuICAgICAgICBzdGF0aWM6IHRoaXMuZ2V0U3RhdGljKCksXG4gICAgICAgIGZsYXNoOiB0aGlzLmZsYXNoLFxuICAgICAgICBzdGlja3k6IHRoaXMuZWwuaGFzQXR0cmlidXRlKFBIWF9TVElDS1kpLFxuICAgICAgfTtcbiAgICB9KTtcbiAgICB0aGlzLnBvcnRhbEVsZW1lbnRJZHMgPSBuZXcgU2V0KCk7XG4gIH1cblxuICBzZXRIcmVmKGhyZWYpIHtcbiAgICB0aGlzLmhyZWYgPSBocmVmO1xuICB9XG5cbiAgc2V0UmVkaXJlY3QoaHJlZikge1xuICAgIHRoaXMucmVkaXJlY3QgPSB0cnVlO1xuICAgIHRoaXMuaHJlZiA9IGhyZWY7XG4gIH1cblxuICBpc01haW4oKSB7XG4gICAgcmV0dXJuIHRoaXMuZWwuaGFzQXR0cmlidXRlKFBIWF9NQUlOKTtcbiAgfVxuXG4gIGNvbm5lY3RQYXJhbXMobGl2ZVJlZmVyZXIpIHtcbiAgICBjb25zdCBwYXJhbXMgPSB0aGlzLmxpdmVTb2NrZXQucGFyYW1zKHRoaXMuZWwpO1xuICAgIGNvbnN0IG1hbmlmZXN0ID0gRE9NLmFsbChkb2N1bWVudCwgYFske3RoaXMuYmluZGluZyhQSFhfVFJBQ0tfU1RBVElDKX1dYClcbiAgICAgIC5tYXAoKG5vZGUpID0+IG5vZGUuc3JjIHx8IG5vZGUuaHJlZilcbiAgICAgIC5maWx0ZXIoKHVybCkgPT4gdHlwZW9mIHVybCA9PT0gXCJzdHJpbmdcIik7XG5cbiAgICBpZiAobWFuaWZlc3QubGVuZ3RoID4gMCkge1xuICAgICAgcGFyYW1zW1wiX3RyYWNrX3N0YXRpY1wiXSA9IG1hbmlmZXN0O1xuICAgIH1cbiAgICBwYXJhbXNbXCJfbW91bnRzXCJdID0gdGhpcy5qb2luQ291bnQ7XG4gICAgcGFyYW1zW1wiX21vdW50X2F0dGVtcHRzXCJdID0gdGhpcy5qb2luQXR0ZW1wdHM7XG4gICAgcGFyYW1zW1wiX2xpdmVfcmVmZXJlclwiXSA9IGxpdmVSZWZlcmVyO1xuICAgIHRoaXMuam9pbkF0dGVtcHRzKys7XG5cbiAgICByZXR1cm4gcGFyYW1zO1xuICB9XG5cbiAgaXNDb25uZWN0ZWQoKSB7XG4gICAgcmV0dXJuIHRoaXMuY2hhbm5lbC5jYW5QdXNoKCk7XG4gIH1cblxuICBnZXRTZXNzaW9uKCkge1xuICAgIHJldHVybiB0aGlzLmVsLmdldEF0dHJpYnV0ZShQSFhfU0VTU0lPTik7XG4gIH1cblxuICBnZXRTdGF0aWMoKSB7XG4gICAgY29uc3QgdmFsID0gdGhpcy5lbC5nZXRBdHRyaWJ1dGUoUEhYX1NUQVRJQyk7XG4gICAgcmV0dXJuIHZhbCA9PT0gXCJcIiA/IG51bGwgOiB2YWw7XG4gIH1cblxuICBkZXN0cm95KGNhbGxiYWNrID0gZnVuY3Rpb24gKCkge30pIHtcbiAgICB0aGlzLmRlc3Ryb3lBbGxDaGlsZHJlbigpO1xuICAgIHRoaXMuZGVzdHJveVBvcnRhbEVsZW1lbnRzKCk7XG4gICAgdGhpcy5kZXN0cm95ZWQgPSB0cnVlO1xuICAgIERPTS5kZWxldGVQcml2YXRlKHRoaXMuZWwsIFwidmlld1wiKTtcbiAgICBkZWxldGUgdGhpcy5yb290LmNoaWxkcmVuW3RoaXMuaWRdO1xuICAgIGlmICh0aGlzLnBhcmVudCkge1xuICAgICAgZGVsZXRlIHRoaXMucm9vdC5jaGlsZHJlblt0aGlzLnBhcmVudC5pZF1bdGhpcy5pZF07XG4gICAgfVxuICAgIGNsZWFyVGltZW91dCh0aGlzLmxvYWRlclRpbWVyKTtcbiAgICBjb25zdCBvbkZpbmlzaGVkID0gKCkgPT4ge1xuICAgICAgY2FsbGJhY2soKTtcbiAgICAgIGZvciAoY29uc3QgaWQgaW4gdGhpcy52aWV3SG9va3MpIHtcbiAgICAgICAgdGhpcy5kZXN0cm95SG9vayh0aGlzLnZpZXdIb29rc1tpZF0pO1xuICAgICAgfVxuICAgIH07XG5cbiAgICBET00ubWFya1BoeENoaWxkRGVzdHJveWVkKHRoaXMuZWwpO1xuXG4gICAgdGhpcy5sb2coXCJkZXN0cm95ZWRcIiwgKCkgPT4gW1widGhlIGNoaWxkIGhhcyBiZWVuIHJlbW92ZWQgZnJvbSB0aGUgcGFyZW50XCJdKTtcbiAgICB0aGlzLmNoYW5uZWxcbiAgICAgIC5sZWF2ZSgpXG4gICAgICAucmVjZWl2ZShcIm9rXCIsIG9uRmluaXNoZWQpXG4gICAgICAucmVjZWl2ZShcImVycm9yXCIsIG9uRmluaXNoZWQpXG4gICAgICAucmVjZWl2ZShcInRpbWVvdXRcIiwgb25GaW5pc2hlZCk7XG4gIH1cblxuICBzZXRDb250YWluZXJDbGFzc2VzKC4uLmNsYXNzZXMpIHtcbiAgICB0aGlzLmVsLmNsYXNzTGlzdC5yZW1vdmUoXG4gICAgICBQSFhfQ09OTkVDVEVEX0NMQVNTLFxuICAgICAgUEhYX0xPQURJTkdfQ0xBU1MsXG4gICAgICBQSFhfRVJST1JfQ0xBU1MsXG4gICAgICBQSFhfQ0xJRU5UX0VSUk9SX0NMQVNTLFxuICAgICAgUEhYX1NFUlZFUl9FUlJPUl9DTEFTUyxcbiAgICApO1xuICAgIHRoaXMuZWwuY2xhc3NMaXN0LmFkZCguLi5jbGFzc2VzKTtcbiAgfVxuXG4gIHNob3dMb2FkZXIodGltZW91dCkge1xuICAgIGNsZWFyVGltZW91dCh0aGlzLmxvYWRlclRpbWVyKTtcbiAgICBpZiAodGltZW91dCkge1xuICAgICAgdGhpcy5sb2FkZXJUaW1lciA9IHNldFRpbWVvdXQoKCkgPT4gdGhpcy5zaG93TG9hZGVyKCksIHRpbWVvdXQpO1xuICAgIH0gZWxzZSB7XG4gICAgICBmb3IgKGNvbnN0IGlkIGluIHRoaXMudmlld0hvb2tzKSB7XG4gICAgICAgIHRoaXMudmlld0hvb2tzW2lkXS5fX2Rpc2Nvbm5lY3RlZCgpO1xuICAgICAgfVxuICAgICAgdGhpcy5zZXRDb250YWluZXJDbGFzc2VzKFBIWF9MT0FESU5HX0NMQVNTKTtcbiAgICB9XG4gIH1cblxuICBleGVjQWxsKGJpbmRpbmcpIHtcbiAgICBET00uYWxsKHRoaXMuZWwsIGBbJHtiaW5kaW5nfV1gLCAoZWwpID0+XG4gICAgICB0aGlzLmxpdmVTb2NrZXQuZXhlY0pTKGVsLCBlbC5nZXRBdHRyaWJ1dGUoYmluZGluZykpLFxuICAgICk7XG4gIH1cblxuICBoaWRlTG9hZGVyKCkge1xuICAgIGNsZWFyVGltZW91dCh0aGlzLmxvYWRlclRpbWVyKTtcbiAgICBjbGVhclRpbWVvdXQodGhpcy5kaXNjb25uZWN0ZWRUaW1lcik7XG4gICAgdGhpcy5zZXRDb250YWluZXJDbGFzc2VzKFBIWF9DT05ORUNURURfQ0xBU1MpO1xuICAgIHRoaXMuZXhlY0FsbCh0aGlzLmJpbmRpbmcoXCJjb25uZWN0ZWRcIikpO1xuICB9XG5cbiAgdHJpZ2dlclJlY29ubmVjdGVkKCkge1xuICAgIGZvciAoY29uc3QgaWQgaW4gdGhpcy52aWV3SG9va3MpIHtcbiAgICAgIHRoaXMudmlld0hvb2tzW2lkXS5fX3JlY29ubmVjdGVkKCk7XG4gICAgfVxuICB9XG5cbiAgbG9nKGtpbmQsIG1zZ0NhbGxiYWNrKSB7XG4gICAgdGhpcy5saXZlU29ja2V0LmxvZyh0aGlzLCBraW5kLCBtc2dDYWxsYmFjayk7XG4gIH1cblxuICB0cmFuc2l0aW9uKHRpbWUsIG9uU3RhcnQsIG9uRG9uZSA9IGZ1bmN0aW9uICgpIHt9KSB7XG4gICAgdGhpcy5saXZlU29ja2V0LnRyYW5zaXRpb24odGltZSwgb25TdGFydCwgb25Eb25lKTtcbiAgfVxuXG4gIC8vIGNhbGxzIHRoZSBjYWxsYmFjayB3aXRoIHRoZSB2aWV3IGFuZCB0YXJnZXQgZWxlbWVudCBmb3IgdGhlIGdpdmVuIHBoeFRhcmdldFxuICAvLyB0YXJnZXRzIGNhbiBiZTpcbiAgLy8gICogYW4gZWxlbWVudCBpdHNlbGYsIHRoZW4gaXQgaXMgc2ltcGx5IHBhc3NlZCB0byBsaXZlU29ja2V0Lm93bmVyO1xuICAvLyAgKiBhIENJRCAoQ29tcG9uZW50IElEKSwgdGhlbiB3ZSBmaXJzdCBzZWFyY2ggdGhlIGNvbXBvbmVudCdzIGVsZW1lbnQgaW4gdGhlIERPTVxuICAvLyAgKiBhIHNlbGVjdG9yLCB0aGVuIHdlIHNlYXJjaCB0aGUgc2VsZWN0b3IgaW4gdGhlIERPTSBhbmQgY2FsbCB0aGUgY2FsbGJhY2tcbiAgLy8gICAgZm9yIGVhY2ggZWxlbWVudCBmb3VuZCB3aXRoIHRoZSBjb3JyZXNwb25kaW5nIG93bmVyIHZpZXdcbiAgd2l0aGluVGFyZ2V0cyhwaHhUYXJnZXQsIGNhbGxiYWNrLCBkb20gPSBkb2N1bWVudCkge1xuICAgIC8vIGluIHRoZSBmb3JtIHJlY292ZXJ5IGNhc2Ugd2Ugc2VhcmNoIGluIGEgdGVtcGxhdGUgZnJhZ21lbnQgaW5zdGVhZCBvZlxuICAgIC8vIHRoZSByZWFsIGRvbSwgdGhlcmVmb3JlIHdlIG9wdGlvbmFsbHkgcGFzcyBkb20gYW5kIHZpZXdFbFxuXG4gICAgaWYgKHBoeFRhcmdldCBpbnN0YW5jZW9mIEhUTUxFbGVtZW50IHx8IHBoeFRhcmdldCBpbnN0YW5jZW9mIFNWR0VsZW1lbnQpIHtcbiAgICAgIHJldHVybiB0aGlzLmxpdmVTb2NrZXQub3duZXIocGh4VGFyZ2V0LCAodmlldykgPT5cbiAgICAgICAgY2FsbGJhY2sodmlldywgcGh4VGFyZ2V0KSxcbiAgICAgICk7XG4gICAgfVxuXG4gICAgaWYgKGlzQ2lkKHBoeFRhcmdldCkpIHtcbiAgICAgIGNvbnN0IHRhcmdldHMgPSBET00uZmluZENvbXBvbmVudE5vZGVMaXN0KHRoaXMuaWQsIHBoeFRhcmdldCwgZG9tKTtcbiAgICAgIGlmICh0YXJnZXRzLmxlbmd0aCA9PT0gMCkge1xuICAgICAgICBsb2dFcnJvcihgbm8gY29tcG9uZW50IGZvdW5kIG1hdGNoaW5nIHBoeC10YXJnZXQgb2YgJHtwaHhUYXJnZXR9YCk7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBjYWxsYmFjayh0aGlzLCBwYXJzZUludChwaHhUYXJnZXQpKTtcbiAgICAgIH1cbiAgICB9IGVsc2Uge1xuICAgICAgY29uc3QgdGFyZ2V0cyA9IEFycmF5LmZyb20oZG9tLnF1ZXJ5U2VsZWN0b3JBbGwocGh4VGFyZ2V0KSk7XG4gICAgICBpZiAodGFyZ2V0cy5sZW5ndGggPT09IDApIHtcbiAgICAgICAgbG9nRXJyb3IoXG4gICAgICAgICAgYG5vdGhpbmcgZm91bmQgbWF0Y2hpbmcgdGhlIHBoeC10YXJnZXQgc2VsZWN0b3IgXCIke3BoeFRhcmdldH1cImAsXG4gICAgICAgICk7XG4gICAgICB9XG4gICAgICB0YXJnZXRzLmZvckVhY2goKHRhcmdldCkgPT5cbiAgICAgICAgdGhpcy5saXZlU29ja2V0Lm93bmVyKHRhcmdldCwgKHZpZXcpID0+IGNhbGxiYWNrKHZpZXcsIHRhcmdldCkpLFxuICAgICAgKTtcbiAgICB9XG4gIH1cblxuICBhcHBseURpZmYodHlwZSwgcmF3RGlmZiwgY2FsbGJhY2spIHtcbiAgICB0aGlzLmxvZyh0eXBlLCAoKSA9PiBbXCJcIiwgY2xvbmUocmF3RGlmZildKTtcbiAgICBjb25zdCB7IGRpZmYsIHJlcGx5LCBldmVudHMsIHRpdGxlIH0gPSBSZW5kZXJlZC5leHRyYWN0KHJhd0RpZmYpO1xuICAgIGNhbGxiYWNrKHsgZGlmZiwgcmVwbHksIGV2ZW50cyB9KTtcbiAgICBpZiAodHlwZW9mIHRpdGxlID09PSBcInN0cmluZ1wiIHx8ICh0eXBlID09IFwibW91bnRcIiAmJiB0aGlzLmlzTWFpbigpKSkge1xuICAgICAgd2luZG93LnJlcXVlc3RBbmltYXRpb25GcmFtZSgoKSA9PiBET00ucHV0VGl0bGUodGl0bGUpKTtcbiAgICB9XG4gIH1cblxuICBvbkpvaW4ocmVzcCkge1xuICAgIGNvbnN0IHsgcmVuZGVyZWQsIGNvbnRhaW5lciwgbGl2ZXZpZXdfdmVyc2lvbiwgcGlkIH0gPSByZXNwO1xuICAgIGlmIChjb250YWluZXIpIHtcbiAgICAgIGNvbnN0IFt0YWcsIGF0dHJzXSA9IGNvbnRhaW5lcjtcbiAgICAgIHRoaXMuZWwgPSBET00ucmVwbGFjZVJvb3RDb250YWluZXIodGhpcy5lbCwgdGFnLCBhdHRycyk7XG4gICAgfVxuICAgIHRoaXMuY2hpbGRKb2lucyA9IDA7XG4gICAgdGhpcy5qb2luUGVuZGluZyA9IHRydWU7XG4gICAgdGhpcy5mbGFzaCA9IG51bGw7XG4gICAgaWYgKHRoaXMucm9vdCA9PT0gdGhpcykge1xuICAgICAgdGhpcy5mb3Jtc0ZvclJlY292ZXJ5ID0gdGhpcy5nZXRGb3Jtc0ZvclJlY292ZXJ5KCk7XG4gICAgfVxuICAgIGlmICh0aGlzLmlzTWFpbigpICYmIHdpbmRvdy5oaXN0b3J5LnN0YXRlID09PSBudWxsKSB7XG4gICAgICAvLyBzZXQgaW5pdGlhbCBoaXN0b3J5IGVudHJ5IGlmIHRoaXMgaXMgdGhlIGZpcnN0IHBhZ2UgbG9hZCAobm8gaGlzdG9yeSlcbiAgICAgIEJyb3dzZXIucHVzaFN0YXRlKFwicmVwbGFjZVwiLCB7XG4gICAgICAgIHR5cGU6IFwicGF0Y2hcIixcbiAgICAgICAgaWQ6IHRoaXMuaWQsXG4gICAgICAgIHBvc2l0aW9uOiB0aGlzLmxpdmVTb2NrZXQuY3VycmVudEhpc3RvcnlQb3NpdGlvbixcbiAgICAgIH0pO1xuICAgIH1cblxuICAgIGlmIChsaXZldmlld192ZXJzaW9uICE9PSB0aGlzLmxpdmVTb2NrZXQudmVyc2lvbigpKSB7XG4gICAgICBjb25zb2xlLmVycm9yKFxuICAgICAgICBgTGl2ZVZpZXcgYXNzZXQgdmVyc2lvbiBtaXNtYXRjaC4gSmF2YVNjcmlwdCB2ZXJzaW9uICR7dGhpcy5saXZlU29ja2V0LnZlcnNpb24oKX0gdnMuIHNlcnZlciAke2xpdmV2aWV3X3ZlcnNpb259LiBUbyBhdm9pZCBpc3N1ZXMsIHBsZWFzZSBlbnN1cmUgdGhhdCB5b3VyIGFzc2V0cyB1c2UgdGhlIHNhbWUgdmVyc2lvbiBhcyB0aGUgc2VydmVyLmAsXG4gICAgICApO1xuICAgIH1cblxuICAgIC8vIFRoZSBwaWQgaXMgb25seSBzZW50IGlmXG4gICAgLy9cbiAgICAvLyAgICBjb25maWcgOnBob2VuaXhfbGl2ZV92aWV3LCA6ZGVidWdfYXR0cmlidXRlc1xuICAgIC8vXG4gICAgLy8gaWYgc2V0IHRvIHRydWUuIEl0IGlzIHRvIGhlbHAgZGVidWdnaW5nIGluIGRldmVsb3BtZW50LlxuICAgIGlmIChwaWQpIHtcbiAgICAgIHRoaXMuZWwuc2V0QXR0cmlidXRlKFBIWF9MVl9QSUQsIHBpZCk7XG4gICAgfVxuXG4gICAgQnJvd3Nlci5kcm9wTG9jYWwoXG4gICAgICB0aGlzLmxpdmVTb2NrZXQubG9jYWxTdG9yYWdlLFxuICAgICAgd2luZG93LmxvY2F0aW9uLnBhdGhuYW1lLFxuICAgICAgQ09OU0VDVVRJVkVfUkVMT0FEUyxcbiAgICApO1xuICAgIHRoaXMuYXBwbHlEaWZmKFwibW91bnRcIiwgcmVuZGVyZWQsICh7IGRpZmYsIGV2ZW50cyB9KSA9PiB7XG4gICAgICB0aGlzLnJlbmRlcmVkID0gbmV3IFJlbmRlcmVkKHRoaXMuaWQsIGRpZmYpO1xuICAgICAgY29uc3QgW2h0bWwsIHN0cmVhbXNdID0gdGhpcy5yZW5kZXJDb250YWluZXIobnVsbCwgXCJqb2luXCIpO1xuICAgICAgdGhpcy5kcm9wUGVuZGluZ1JlZnMoKTtcbiAgICAgIHRoaXMuam9pbkNvdW50Kys7XG4gICAgICB0aGlzLmpvaW5BdHRlbXB0cyA9IDA7XG5cbiAgICAgIHRoaXMubWF5YmVSZWNvdmVyRm9ybXMoaHRtbCwgKCkgPT4ge1xuICAgICAgICB0aGlzLm9uSm9pbkNvbXBsZXRlKHJlc3AsIGh0bWwsIHN0cmVhbXMsIGV2ZW50cyk7XG4gICAgICB9KTtcbiAgICB9KTtcbiAgfVxuXG4gIGRyb3BQZW5kaW5nUmVmcygpIHtcbiAgICBET00uYWxsKGRvY3VtZW50LCBgWyR7UEhYX1JFRl9TUkN9PVwiJHt0aGlzLnJlZlNyYygpfVwiXWAsIChlbCkgPT4ge1xuICAgICAgZWwucmVtb3ZlQXR0cmlidXRlKFBIWF9SRUZfTE9BRElORyk7XG4gICAgICBlbC5yZW1vdmVBdHRyaWJ1dGUoUEhYX1JFRl9TUkMpO1xuICAgICAgZWwucmVtb3ZlQXR0cmlidXRlKFBIWF9SRUZfTE9DSyk7XG4gICAgfSk7XG4gIH1cblxuICBvbkpvaW5Db21wbGV0ZSh7IGxpdmVfcGF0Y2ggfSwgaHRtbCwgc3RyZWFtcywgZXZlbnRzKSB7XG4gICAgLy8gSW4gb3JkZXIgdG8gcHJvdmlkZSBhIGJldHRlciBleHBlcmllbmNlLCB3ZSB3YW50IHRvIGpvaW5cbiAgICAvLyBhbGwgTGl2ZVZpZXdzIGZpcnN0IGFuZCBvbmx5IHRoZW4gYXBwbHkgdGhlaXIgcGF0Y2hlcy5cbiAgICBpZiAodGhpcy5qb2luQ291bnQgPiAxIHx8ICh0aGlzLnBhcmVudCAmJiAhdGhpcy5wYXJlbnQuaXNKb2luUGVuZGluZygpKSkge1xuICAgICAgcmV0dXJuIHRoaXMuYXBwbHlKb2luUGF0Y2gobGl2ZV9wYXRjaCwgaHRtbCwgc3RyZWFtcywgZXZlbnRzKTtcbiAgICB9XG5cbiAgICAvLyBPbmUgZG93bnNpZGUgb2YgdGhpcyBhcHByb2FjaCBpcyB0aGF0IHdlIG5lZWQgdG8gZmluZCBwaHhDaGlsZHJlblxuICAgIC8vIGluIHRoZSBodG1sIGZyYWdtZW50LCBpbnN0ZWFkIG9mIGRpcmVjdGx5IG9uIHRoZSBET00uIFRoZSBmcmFnbWVudFxuICAgIC8vIGFsc28gZG9lcyBub3QgaW5jbHVkZSBQSFhfU1RBVElDLCBzbyB3ZSBuZWVkIHRvIGNvcHkgaXQgb3ZlciBmcm9tXG4gICAgLy8gdGhlIERPTS5cbiAgICBjb25zdCBuZXdDaGlsZHJlbiA9IERPTS5maW5kUGh4Q2hpbGRyZW5JbkZyYWdtZW50KGh0bWwsIHRoaXMuaWQpLmZpbHRlcihcbiAgICAgICh0b0VsKSA9PiB7XG4gICAgICAgIGNvbnN0IGZyb21FbCA9IHRvRWwuaWQgJiYgdGhpcy5lbC5xdWVyeVNlbGVjdG9yKGBbaWQ9XCIke3RvRWwuaWR9XCJdYCk7XG4gICAgICAgIGNvbnN0IHBoeFN0YXRpYyA9IGZyb21FbCAmJiBmcm9tRWwuZ2V0QXR0cmlidXRlKFBIWF9TVEFUSUMpO1xuICAgICAgICBpZiAocGh4U3RhdGljKSB7XG4gICAgICAgICAgdG9FbC5zZXRBdHRyaWJ1dGUoUEhYX1NUQVRJQywgcGh4U3RhdGljKTtcbiAgICAgICAgfVxuICAgICAgICAvLyBzZXQgUEhYX1JPT1RfSUQgdG8gcHJldmVudCBldmVudHMgZnJvbSBiZWluZyBkaXNwYXRjaGVkIHRvIHRoZSByb290IHZpZXdcbiAgICAgICAgLy8gd2hpbGUgdGhlIGNoaWxkIGpvaW4gaXMgc3RpbGwgcGVuZGluZ1xuICAgICAgICBpZiAoZnJvbUVsKSB7XG4gICAgICAgICAgZnJvbUVsLnNldEF0dHJpYnV0ZShQSFhfUk9PVF9JRCwgdGhpcy5yb290LmlkKTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gdGhpcy5qb2luQ2hpbGQodG9FbCk7XG4gICAgICB9LFxuICAgICk7XG5cbiAgICBpZiAobmV3Q2hpbGRyZW4ubGVuZ3RoID09PSAwKSB7XG4gICAgICBpZiAodGhpcy5wYXJlbnQpIHtcbiAgICAgICAgdGhpcy5yb290LnBlbmRpbmdKb2luT3BzLnB1c2goW1xuICAgICAgICAgIHRoaXMsXG4gICAgICAgICAgKCkgPT4gdGhpcy5hcHBseUpvaW5QYXRjaChsaXZlX3BhdGNoLCBodG1sLCBzdHJlYW1zLCBldmVudHMpLFxuICAgICAgICBdKTtcbiAgICAgICAgdGhpcy5wYXJlbnQuYWNrSm9pbih0aGlzKTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHRoaXMub25BbGxDaGlsZEpvaW5zQ29tcGxldGUoKTtcbiAgICAgICAgdGhpcy5hcHBseUpvaW5QYXRjaChsaXZlX3BhdGNoLCBodG1sLCBzdHJlYW1zLCBldmVudHMpO1xuICAgICAgfVxuICAgIH0gZWxzZSB7XG4gICAgICB0aGlzLnJvb3QucGVuZGluZ0pvaW5PcHMucHVzaChbXG4gICAgICAgIHRoaXMsXG4gICAgICAgICgpID0+IHRoaXMuYXBwbHlKb2luUGF0Y2gobGl2ZV9wYXRjaCwgaHRtbCwgc3RyZWFtcywgZXZlbnRzKSxcbiAgICAgIF0pO1xuICAgIH1cbiAgfVxuXG4gIGF0dGFjaFRydWVEb2NFbCgpIHtcbiAgICB0aGlzLmVsID0gRE9NLmJ5SWQodGhpcy5pZCk7XG4gICAgdGhpcy5lbC5zZXRBdHRyaWJ1dGUoUEhYX1JPT1RfSUQsIHRoaXMucm9vdC5pZCk7XG4gIH1cblxuICAvLyB0aGlzIGlzIGludm9rZWQgZm9yIGRlYWQgYW5kIGxpdmUgdmlld3MsIHNvIHdlIG11c3QgZmlsdGVyIGJ5XG4gIC8vIGJ5IG93bmVyIHRvIGVuc3VyZSB3ZSBhcmVuJ3QgZHVwbGljYXRpbmcgaG9va3MgYWNyb3NzIGRpc2Nvbm5lY3RcbiAgLy8gYW5kIGNvbm5lY3RlZCBzdGF0ZXMuIFRoaXMgYWxzbyBoYW5kbGVzIGNhc2VzIHdoZXJlIGhvb2tzIGV4aXN0XG4gIC8vIGluIGEgcm9vdCBsYXlvdXQgd2l0aCBhIExWIGluIHRoZSBib2R5XG4gIGV4ZWNOZXdNb3VudGVkKHBhcmVudCA9IGRvY3VtZW50KSB7XG4gICAgbGV0IHBoeFZpZXdwb3J0VG9wID0gdGhpcy5iaW5kaW5nKFBIWF9WSUVXUE9SVF9UT1ApO1xuICAgIGxldCBwaHhWaWV3cG9ydEJvdHRvbSA9IHRoaXMuYmluZGluZyhQSFhfVklFV1BPUlRfQk9UVE9NKTtcbiAgICB0aGlzLmFsbChcbiAgICAgIHBhcmVudCxcbiAgICAgIGBbJHtwaHhWaWV3cG9ydFRvcH1dLCBbJHtwaHhWaWV3cG9ydEJvdHRvbX1dYCxcbiAgICAgIChob29rRWwpID0+IHtcbiAgICAgICAgRE9NLm1haW50YWluUHJpdmF0ZUhvb2tzKFxuICAgICAgICAgIGhvb2tFbCxcbiAgICAgICAgICBob29rRWwsXG4gICAgICAgICAgcGh4Vmlld3BvcnRUb3AsXG4gICAgICAgICAgcGh4Vmlld3BvcnRCb3R0b20sXG4gICAgICAgICk7XG4gICAgICAgIHRoaXMubWF5YmVBZGROZXdIb29rKGhvb2tFbCk7XG4gICAgICB9LFxuICAgICk7XG4gICAgdGhpcy5hbGwoXG4gICAgICBwYXJlbnQsXG4gICAgICBgWyR7dGhpcy5iaW5kaW5nKFBIWF9IT09LKX1dLCBbZGF0YS1waHgtJHtQSFhfSE9PS31dYCxcbiAgICAgIChob29rRWwpID0+IHtcbiAgICAgICAgdGhpcy5tYXliZUFkZE5ld0hvb2soaG9va0VsKTtcbiAgICAgIH0sXG4gICAgKTtcbiAgICB0aGlzLmFsbChwYXJlbnQsIGBbJHt0aGlzLmJpbmRpbmcoUEhYX01PVU5URUQpfV1gLCAoZWwpID0+IHtcbiAgICAgIHRoaXMubWF5YmVNb3VudGVkKGVsKTtcbiAgICB9KTtcbiAgfVxuXG4gIGFsbChwYXJlbnQsIHNlbGVjdG9yLCBjYWxsYmFjaykge1xuICAgIERPTS5hbGwocGFyZW50LCBzZWxlY3RvciwgKGVsKSA9PiB7XG4gICAgICBpZiAodGhpcy5vd25zRWxlbWVudChlbCkpIHtcbiAgICAgICAgY2FsbGJhY2soZWwpO1xuICAgICAgfVxuICAgIH0pO1xuICB9XG5cbiAgYXBwbHlKb2luUGF0Y2gobGl2ZV9wYXRjaCwgaHRtbCwgc3RyZWFtcywgZXZlbnRzKSB7XG4gICAgLy8gaW4gY2FzZSBvZiByZWpvaW5zLCB3ZSBuZWVkIHRvIG1hbnVhbGx5IHBlcmZvcm0gYWxsXG4gICAgLy8gcGVuZGluZyBvcHNcbiAgICBpZiAodGhpcy5qb2luQ291bnQgPiAxKSB7XG4gICAgICBpZiAodGhpcy5wZW5kaW5nSm9pbk9wcy5sZW5ndGgpIHtcbiAgICAgICAgdGhpcy5wZW5kaW5nSm9pbk9wcy5mb3JFYWNoKChjYikgPT4gdHlwZW9mIGNiID09PSBcImZ1bmN0aW9uXCIgJiYgY2IoKSk7XG4gICAgICAgIHRoaXMucGVuZGluZ0pvaW5PcHMgPSBbXTtcbiAgICAgIH1cbiAgICB9XG4gICAgdGhpcy5hdHRhY2hUcnVlRG9jRWwoKTtcbiAgICBjb25zdCBwYXRjaCA9IG5ldyBET01QYXRjaCh0aGlzLCB0aGlzLmVsLCB0aGlzLmlkLCBodG1sLCBzdHJlYW1zLCBudWxsKTtcbiAgICBwYXRjaC5tYXJrUHJ1bmFibGVDb250ZW50Rm9yUmVtb3ZhbCgpO1xuICAgIHRoaXMucGVyZm9ybVBhdGNoKHBhdGNoLCBmYWxzZSwgdHJ1ZSk7XG4gICAgdGhpcy5qb2luTmV3Q2hpbGRyZW4oKTtcbiAgICB0aGlzLmV4ZWNOZXdNb3VudGVkKCk7XG5cbiAgICB0aGlzLmpvaW5QZW5kaW5nID0gZmFsc2U7XG4gICAgdGhpcy5saXZlU29ja2V0LmRpc3BhdGNoRXZlbnRzKGV2ZW50cyk7XG4gICAgdGhpcy5hcHBseVBlbmRpbmdVcGRhdGVzKCk7XG5cbiAgICBpZiAobGl2ZV9wYXRjaCkge1xuICAgICAgY29uc3QgeyBraW5kLCB0byB9ID0gbGl2ZV9wYXRjaDtcbiAgICAgIHRoaXMubGl2ZVNvY2tldC5oaXN0b3J5UGF0Y2godG8sIGtpbmQpO1xuICAgIH1cbiAgICB0aGlzLmhpZGVMb2FkZXIoKTtcbiAgICBpZiAodGhpcy5qb2luQ291bnQgPiAxKSB7XG4gICAgICB0aGlzLnRyaWdnZXJSZWNvbm5lY3RlZCgpO1xuICAgIH1cbiAgICB0aGlzLnN0b3BDYWxsYmFjaygpO1xuICB9XG5cbiAgdHJpZ2dlckJlZm9yZVVwZGF0ZUhvb2soZnJvbUVsLCB0b0VsKSB7XG4gICAgdGhpcy5saXZlU29ja2V0LnRyaWdnZXJET00oXCJvbkJlZm9yZUVsVXBkYXRlZFwiLCBbZnJvbUVsLCB0b0VsXSk7XG4gICAgY29uc3QgaG9vayA9IHRoaXMuZ2V0SG9vayhmcm9tRWwpO1xuICAgIGNvbnN0IGlzSWdub3JlZCA9IGhvb2sgJiYgRE9NLmlzSWdub3JlZChmcm9tRWwsIHRoaXMuYmluZGluZyhQSFhfVVBEQVRFKSk7XG4gICAgaWYgKFxuICAgICAgaG9vayAmJlxuICAgICAgIWZyb21FbC5pc0VxdWFsTm9kZSh0b0VsKSAmJlxuICAgICAgIShpc0lnbm9yZWQgJiYgaXNFcXVhbE9iaihmcm9tRWwuZGF0YXNldCwgdG9FbC5kYXRhc2V0KSlcbiAgICApIHtcbiAgICAgIGhvb2suX19iZWZvcmVVcGRhdGUoKTtcbiAgICAgIHJldHVybiBob29rO1xuICAgIH1cbiAgfVxuXG4gIG1heWJlTW91bnRlZChlbCkge1xuICAgIGNvbnN0IHBoeE1vdW50ZWQgPSBlbC5nZXRBdHRyaWJ1dGUodGhpcy5iaW5kaW5nKFBIWF9NT1VOVEVEKSk7XG4gICAgY29uc3QgaGFzQmVlbkludm9rZWQgPSBwaHhNb3VudGVkICYmIERPTS5wcml2YXRlKGVsLCBcIm1vdW50ZWRcIik7XG4gICAgaWYgKHBoeE1vdW50ZWQgJiYgIWhhc0JlZW5JbnZva2VkKSB7XG4gICAgICB0aGlzLmxpdmVTb2NrZXQuZXhlY0pTKGVsLCBwaHhNb3VudGVkKTtcbiAgICAgIERPTS5wdXRQcml2YXRlKGVsLCBcIm1vdW50ZWRcIiwgdHJ1ZSk7XG4gICAgfVxuICB9XG5cbiAgbWF5YmVBZGROZXdIb29rKGVsKSB7XG4gICAgY29uc3QgbmV3SG9vayA9IHRoaXMuYWRkSG9vayhlbCk7XG4gICAgaWYgKG5ld0hvb2spIHtcbiAgICAgIG5ld0hvb2suX19tb3VudGVkKCk7XG4gICAgfVxuICB9XG5cbiAgcGVyZm9ybVBhdGNoKHBhdGNoLCBwcnVuZUNpZHMsIGlzSm9pblBhdGNoID0gZmFsc2UpIHtcbiAgICBjb25zdCByZW1vdmVkRWxzID0gW107XG4gICAgbGV0IHBoeENoaWxkcmVuQWRkZWQgPSBmYWxzZTtcbiAgICBjb25zdCB1cGRhdGVkSG9va0lkcyA9IG5ldyBTZXQoKTtcblxuICAgIHRoaXMubGl2ZVNvY2tldC50cmlnZ2VyRE9NKFwib25QYXRjaFN0YXJ0XCIsIFtwYXRjaC50YXJnZXRDb250YWluZXJdKTtcblxuICAgIHBhdGNoLmFmdGVyKFwiYWRkZWRcIiwgKGVsKSA9PiB7XG4gICAgICB0aGlzLmxpdmVTb2NrZXQudHJpZ2dlckRPTShcIm9uTm9kZUFkZGVkXCIsIFtlbF0pO1xuICAgICAgY29uc3QgcGh4Vmlld3BvcnRUb3AgPSB0aGlzLmJpbmRpbmcoUEhYX1ZJRVdQT1JUX1RPUCk7XG4gICAgICBjb25zdCBwaHhWaWV3cG9ydEJvdHRvbSA9IHRoaXMuYmluZGluZyhQSFhfVklFV1BPUlRfQk9UVE9NKTtcbiAgICAgIERPTS5tYWludGFpblByaXZhdGVIb29rcyhlbCwgZWwsIHBoeFZpZXdwb3J0VG9wLCBwaHhWaWV3cG9ydEJvdHRvbSk7XG4gICAgICB0aGlzLm1heWJlQWRkTmV3SG9vayhlbCk7XG4gICAgICBpZiAoZWwuZ2V0QXR0cmlidXRlKSB7XG4gICAgICAgIHRoaXMubWF5YmVNb3VudGVkKGVsKTtcbiAgICAgIH1cbiAgICB9KTtcblxuICAgIHBhdGNoLmFmdGVyKFwicGh4Q2hpbGRBZGRlZFwiLCAoZWwpID0+IHtcbiAgICAgIGlmIChET00uaXNQaHhTdGlja3koZWwpKSB7XG4gICAgICAgIHRoaXMubGl2ZVNvY2tldC5qb2luUm9vdFZpZXdzKCk7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBwaHhDaGlsZHJlbkFkZGVkID0gdHJ1ZTtcbiAgICAgIH1cbiAgICB9KTtcblxuICAgIHBhdGNoLmJlZm9yZShcInVwZGF0ZWRcIiwgKGZyb21FbCwgdG9FbCkgPT4ge1xuICAgICAgY29uc3QgaG9vayA9IHRoaXMudHJpZ2dlckJlZm9yZVVwZGF0ZUhvb2soZnJvbUVsLCB0b0VsKTtcbiAgICAgIGlmIChob29rKSB7XG4gICAgICAgIHVwZGF0ZWRIb29rSWRzLmFkZChmcm9tRWwuaWQpO1xuICAgICAgfVxuICAgICAgLy8gdHJpZ2dlciBKUyBzcGVjaWZpYyB1cGRhdGUgbG9naWMgKGZvciBleGFtcGxlIGZvciBKUy5pZ25vcmVfYXR0cmlidXRlcylcbiAgICAgIEpTLm9uQmVmb3JlRWxVcGRhdGVkKGZyb21FbCwgdG9FbCk7XG4gICAgfSk7XG5cbiAgICBwYXRjaC5hZnRlcihcInVwZGF0ZWRcIiwgKGVsKSA9PiB7XG4gICAgICBpZiAodXBkYXRlZEhvb2tJZHMuaGFzKGVsLmlkKSkge1xuICAgICAgICB0aGlzLmdldEhvb2soZWwpLl9fdXBkYXRlZCgpO1xuICAgICAgfVxuICAgIH0pO1xuXG4gICAgcGF0Y2guYWZ0ZXIoXCJkaXNjYXJkZWRcIiwgKGVsKSA9PiB7XG4gICAgICBpZiAoZWwubm9kZVR5cGUgPT09IE5vZGUuRUxFTUVOVF9OT0RFKSB7XG4gICAgICAgIHJlbW92ZWRFbHMucHVzaChlbCk7XG4gICAgICB9XG4gICAgfSk7XG5cbiAgICBwYXRjaC5hZnRlcihcInRyYW5zaXRpb25zRGlzY2FyZGVkXCIsIChlbHMpID0+XG4gICAgICB0aGlzLmFmdGVyRWxlbWVudHNSZW1vdmVkKGVscywgcHJ1bmVDaWRzKSxcbiAgICApO1xuICAgIHBhdGNoLnBlcmZvcm0oaXNKb2luUGF0Y2gpO1xuICAgIHRoaXMuYWZ0ZXJFbGVtZW50c1JlbW92ZWQocmVtb3ZlZEVscywgcHJ1bmVDaWRzKTtcblxuICAgIHRoaXMubGl2ZVNvY2tldC50cmlnZ2VyRE9NKFwib25QYXRjaEVuZFwiLCBbcGF0Y2gudGFyZ2V0Q29udGFpbmVyXSk7XG4gICAgcmV0dXJuIHBoeENoaWxkcmVuQWRkZWQ7XG4gIH1cblxuICBhZnRlckVsZW1lbnRzUmVtb3ZlZChlbGVtZW50cywgcHJ1bmVDaWRzKSB7XG4gICAgY29uc3QgZGVzdHJveWVkQ0lEcyA9IFtdO1xuICAgIGVsZW1lbnRzLmZvckVhY2goKHBhcmVudCkgPT4ge1xuICAgICAgY29uc3QgY29tcG9uZW50cyA9IERPTS5hbGwoXG4gICAgICAgIHBhcmVudCxcbiAgICAgICAgYFske1BIWF9WSUVXX1JFRn09XCIke3RoaXMuaWR9XCJdWyR7UEhYX0NPTVBPTkVOVH1dYCxcbiAgICAgICk7XG4gICAgICBjb25zdCBob29rcyA9IERPTS5hbGwoXG4gICAgICAgIHBhcmVudCxcbiAgICAgICAgYFske3RoaXMuYmluZGluZyhQSFhfSE9PSyl9XSwgW2RhdGEtcGh4LWhvb2tdYCxcbiAgICAgICk7XG4gICAgICBjb21wb25lbnRzLmNvbmNhdChwYXJlbnQpLmZvckVhY2goKGVsKSA9PiB7XG4gICAgICAgIGNvbnN0IGNpZCA9IHRoaXMuY29tcG9uZW50SUQoZWwpO1xuICAgICAgICBpZiAoXG4gICAgICAgICAgaXNDaWQoY2lkKSAmJlxuICAgICAgICAgIGRlc3Ryb3llZENJRHMuaW5kZXhPZihjaWQpID09PSAtMSAmJlxuICAgICAgICAgIGVsLmdldEF0dHJpYnV0ZShQSFhfVklFV19SRUYpID09PSB0aGlzLmlkXG4gICAgICAgICkge1xuICAgICAgICAgIGRlc3Ryb3llZENJRHMucHVzaChjaWQpO1xuICAgICAgICB9XG4gICAgICB9KTtcbiAgICAgIGhvb2tzLmNvbmNhdChwYXJlbnQpLmZvckVhY2goKGhvb2tFbCkgPT4ge1xuICAgICAgICBjb25zdCBob29rID0gdGhpcy5nZXRIb29rKGhvb2tFbCk7XG4gICAgICAgIGhvb2sgJiYgdGhpcy5kZXN0cm95SG9vayhob29rKTtcbiAgICAgIH0pO1xuICAgIH0pO1xuICAgIC8vIFdlIHNob3VsZCBub3QgcHJ1bmVDaWRzIG9uIGpvaW5zLiBPdGhlcndpc2UsIGluIGNhc2Ugb2ZcbiAgICAvLyByZWpvaW5zLCB3ZSBtYXkgbm90aWZ5IGNpZHMgdGhhdCBubyBsb25nZXIgYmVsb25nIHRvIHRoZVxuICAgIC8vIGN1cnJlbnQgTGl2ZVZpZXcgdG8gYmUgcmVtb3ZlZC5cbiAgICBpZiAocHJ1bmVDaWRzKSB7XG4gICAgICB0aGlzLm1heWJlUHVzaENvbXBvbmVudHNEZXN0cm95ZWQoZGVzdHJveWVkQ0lEcyk7XG4gICAgfVxuICB9XG5cbiAgam9pbk5ld0NoaWxkcmVuKCkge1xuICAgIERPTS5maW5kUGh4Q2hpbGRyZW4oZG9jdW1lbnQsIHRoaXMuaWQpLmZvckVhY2goKGVsKSA9PiB0aGlzLmpvaW5DaGlsZChlbCkpO1xuICB9XG5cbiAgbWF5YmVSZWNvdmVyRm9ybXMoaHRtbCwgY2FsbGJhY2spIHtcbiAgICBjb25zdCBwaHhDaGFuZ2UgPSB0aGlzLmJpbmRpbmcoXCJjaGFuZ2VcIik7XG4gICAgY29uc3Qgb2xkRm9ybXMgPSB0aGlzLnJvb3QuZm9ybXNGb3JSZWNvdmVyeTtcbiAgICAvLyBTbyB3aHkgZG8gd2UgY3JlYXRlIGEgdGVtcGxhdGUgZWxlbWVudCBoZXJlP1xuICAgIC8vIE9uZSB3YXkgdG8gcmVjb3ZlciBmb3JtcyB3b3VsZCBiZSB0byBpbW1lZGlhdGVseSBhcHBseSB0aGUgbW91bnRcbiAgICAvLyBwYXRjaCBhbmQgdGhlbiBhZnRlcndhcmRzIHJlY292ZXIgdGhlIGZvcm1zLiBIb3dldmVyLCB0aGlzIHdvdWxkXG4gICAgLy8gY2F1c2UgYSBmbGlja2VyLCBiZWNhdXNlIHRoZSBtb3VudCBwYXRjaCB3b3VsZCByZW1vdmUgdGhlIGZvcm0gY29udGVudFxuICAgIC8vIHVudGlsIGl0IGlzIHJlc3RvcmVkLiBUaGVyZWZvcmUgTFYgZGVjaWRlZCB0byBkbyBmb3JtIHJlY292ZXJ5IHdpdGggdGhlXG4gICAgLy8gcmF3IEhUTUwgYmVmb3JlIGl0IGlzIGFwcGxpZWQgYW5kIGRlbGF5IHRoZSBtb3VudCBwYXRjaCB1bnRpbCB0aGUgZm9ybVxuICAgIC8vIHJlY292ZXJ5IGV2ZW50cyBhcmUgZG9uZS5cbiAgICBjb25zdCB0ZW1wbGF0ZSA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoXCJ0ZW1wbGF0ZVwiKTtcbiAgICB0ZW1wbGF0ZS5pbm5lckhUTUwgPSBodG1sO1xuXG4gICAgLy8gd2Ugc3BlY2lhbCBjYXNlIDwucG9ydGFsPiBoZXJlIGFuZCB0ZWxlcG9ydCBpdCBpbnRvIG91ciB0ZW1wb3JhcnkgRE9NIGZvciByZWNvdmVyeVxuICAgIC8vIGFzIHdlJ2Qgb3RoZXJ3aXNlIG5vdCBmaW5kIHRlbGVwb3J0ZWQgZm9ybXNcbiAgICBET00uYWxsKHRlbXBsYXRlLmNvbnRlbnQsIGBbJHtQSFhfUE9SVEFMfV1gKS5mb3JFYWNoKChwb3J0YWxUZW1wbGF0ZSkgPT4ge1xuICAgICAgdGVtcGxhdGUuY29udGVudC5maXJzdEVsZW1lbnRDaGlsZC5hcHBlbmRDaGlsZChcbiAgICAgICAgcG9ydGFsVGVtcGxhdGUuY29udGVudC5maXJzdEVsZW1lbnRDaGlsZCxcbiAgICAgICk7XG4gICAgfSk7XG5cbiAgICAvLyBiZWNhdXNlIHdlIHdvcmsgd2l0aCBhIHRlbXBsYXRlIGVsZW1lbnQsIHdlIG11c3QgbWFudWFsbHkgY29weSB0aGUgYXR0cmlidXRlc1xuICAgIC8vIG90aGVyd2lzZSB0aGUgb3duZXIgLyB0YXJnZXQgaGVscGVycyBkb24ndCB3b3JrIHByb3Blcmx5XG4gICAgY29uc3Qgcm9vdEVsID0gdGVtcGxhdGUuY29udGVudC5maXJzdEVsZW1lbnRDaGlsZDtcbiAgICByb290RWwuaWQgPSB0aGlzLmlkO1xuICAgIHJvb3RFbC5zZXRBdHRyaWJ1dGUoUEhYX1JPT1RfSUQsIHRoaXMucm9vdC5pZCk7XG4gICAgcm9vdEVsLnNldEF0dHJpYnV0ZShQSFhfU0VTU0lPTiwgdGhpcy5nZXRTZXNzaW9uKCkpO1xuICAgIHJvb3RFbC5zZXRBdHRyaWJ1dGUoUEhYX1NUQVRJQywgdGhpcy5nZXRTdGF0aWMoKSk7XG4gICAgcm9vdEVsLnNldEF0dHJpYnV0ZShQSFhfUEFSRU5UX0lELCB0aGlzLnBhcmVudCA/IHRoaXMucGFyZW50LmlkIDogbnVsbCk7XG5cbiAgICAvLyB3ZSBnbyBvdmVyIGFsbCBmb3JtIGVsZW1lbnRzIGluIHRoZSBuZXcgSFRNTCBmb3IgdGhlIExWXG4gICAgLy8gYW5kIGxvb2sgZm9yIG9sZCBmb3JtcyBpbiB0aGUgYGZvcm1zRm9yUmVjb3ZlcnlgIG9iamVjdDtcbiAgICAvLyB0aGUgZm9ybXNGb3JSZWNvdmVyeSBjYW4gYWxzbyBjb250YWluIGZvcm1zIGZyb20gY2hpbGQgdmlld3NcbiAgICBjb25zdCBmb3Jtc1RvUmVjb3ZlciA9XG4gICAgICAvLyB3ZSBnbyBvdmVyIGFsbCBmb3JtcyBpbiB0aGUgbmV3IERPTTsgYmVjYXVzZSB0aGlzIGlzIG9ubHkgdGhlIEhUTUwgZm9yIHRoZSBjdXJyZW50XG4gICAgICAvLyB2aWV3LCB3ZSBjYW4gYmUgc3VyZSB0aGF0IGFsbCBmb3JtcyBhcmUgb3duZWQgYnkgdGhpcyB2aWV3OlxuICAgICAgRE9NLmFsbCh0ZW1wbGF0ZS5jb250ZW50LCBcImZvcm1cIilcbiAgICAgICAgLy8gb25seSByZWNvdmVyIGZvcm1zIHRoYXQgaGF2ZSBhbiBpZCBhbmQgYXJlIGluIHRoZSBvbGQgRE9NXG4gICAgICAgIC5maWx0ZXIoKG5ld0Zvcm0pID0+IG5ld0Zvcm0uaWQgJiYgb2xkRm9ybXNbbmV3Rm9ybS5pZF0pXG4gICAgICAgIC8vIGFiYW5kb24gZm9ybXMgd2UgYWxyZWFkeSB0cmllZCB0byByZWNvdmVyIHRvIHByZXZlbnQgbG9vcGluZyBhIGZhaWxlZCBzdGF0ZVxuICAgICAgICAuZmlsdGVyKChuZXdGb3JtKSA9PiAhdGhpcy5wZW5kaW5nRm9ybXMuaGFzKG5ld0Zvcm0uaWQpKVxuICAgICAgICAvLyBvbmx5IHJlY292ZXIgaWYgdGhlIGZvcm0gaGFzIHRoZSBzYW1lIHBoeC1jaGFuZ2UgdmFsdWVcbiAgICAgICAgLmZpbHRlcihcbiAgICAgICAgICAobmV3Rm9ybSkgPT5cbiAgICAgICAgICAgIG9sZEZvcm1zW25ld0Zvcm0uaWRdLmdldEF0dHJpYnV0ZShwaHhDaGFuZ2UpID09PVxuICAgICAgICAgICAgbmV3Rm9ybS5nZXRBdHRyaWJ1dGUocGh4Q2hhbmdlKSxcbiAgICAgICAgKVxuICAgICAgICAubWFwKChuZXdGb3JtKSA9PiB7XG4gICAgICAgICAgcmV0dXJuIFtvbGRGb3Jtc1tuZXdGb3JtLmlkXSwgbmV3Rm9ybV07XG4gICAgICAgIH0pO1xuXG4gICAgaWYgKGZvcm1zVG9SZWNvdmVyLmxlbmd0aCA9PT0gMCkge1xuICAgICAgcmV0dXJuIGNhbGxiYWNrKCk7XG4gICAgfVxuXG4gICAgZm9ybXNUb1JlY292ZXIuZm9yRWFjaCgoW29sZEZvcm0sIG5ld0Zvcm1dLCBpKSA9PiB7XG4gICAgICB0aGlzLnBlbmRpbmdGb3Jtcy5hZGQobmV3Rm9ybS5pZCk7XG4gICAgICAvLyBpdCBpcyBpbXBvcnRhbnQgdG8gdXNlIHRoZSBmaXJzdEVsZW1lbnRDaGlsZCBvZiB0aGUgdGVtcGxhdGUgY29udGVudFxuICAgICAgLy8gYmVjYXVzZSB3aGVuIHRyYXZlcnNpbmcgYSBkb2N1bWVudEZyYWdtZW50IHVzaW5nIHBhcmVudE5vZGUsIHdlIHdvbid0IGV2ZXIgYXJyaXZlIGF0XG4gICAgICAvLyB0aGUgZnJhZ21lbnQ7IGFzIHRoZSB0ZW1wbGF0ZSBpcyBhbHdheXMgYSBMaXZlVmlldywgd2UgY2FuIGJlIHN1cmUgdGhhdCB0aGVyZSBpcyBvbmx5XG4gICAgICAvLyBvbmUgY2hpbGQgb24gdGhlIHJvb3QgbGV2ZWxcbiAgICAgIHRoaXMucHVzaEZvcm1SZWNvdmVyeShcbiAgICAgICAgb2xkRm9ybSxcbiAgICAgICAgbmV3Rm9ybSxcbiAgICAgICAgdGVtcGxhdGUuY29udGVudC5maXJzdEVsZW1lbnRDaGlsZCxcbiAgICAgICAgKCkgPT4ge1xuICAgICAgICAgIHRoaXMucGVuZGluZ0Zvcm1zLmRlbGV0ZShuZXdGb3JtLmlkKTtcbiAgICAgICAgICAvLyB3ZSBvbmx5IGNhbGwgdGhlIGNhbGxiYWNrIG9uY2UgYWxsIGZvcm1zIGhhdmUgYmVlbiByZWNvdmVyZWRcbiAgICAgICAgICBpZiAoaSA9PT0gZm9ybXNUb1JlY292ZXIubGVuZ3RoIC0gMSkge1xuICAgICAgICAgICAgY2FsbGJhY2soKTtcbiAgICAgICAgICB9XG4gICAgICAgIH0sXG4gICAgICApO1xuICAgIH0pO1xuICB9XG5cbiAgZ2V0Q2hpbGRCeUlkKGlkKSB7XG4gICAgcmV0dXJuIHRoaXMucm9vdC5jaGlsZHJlblt0aGlzLmlkXVtpZF07XG4gIH1cblxuICBnZXREZXNjZW5kZW50QnlFbChlbCkge1xuICAgIGlmIChlbC5pZCA9PT0gdGhpcy5pZCkge1xuICAgICAgcmV0dXJuIHRoaXM7XG4gICAgfSBlbHNlIHtcbiAgICAgIHJldHVybiB0aGlzLmNoaWxkcmVuW2VsLmdldEF0dHJpYnV0ZShQSFhfUEFSRU5UX0lEKV0/LltlbC5pZF07XG4gICAgfVxuICB9XG5cbiAgZGVzdHJveURlc2NlbmRlbnQoaWQpIHtcbiAgICBmb3IgKGNvbnN0IHBhcmVudElkIGluIHRoaXMucm9vdC5jaGlsZHJlbikge1xuICAgICAgZm9yIChjb25zdCBjaGlsZElkIGluIHRoaXMucm9vdC5jaGlsZHJlbltwYXJlbnRJZF0pIHtcbiAgICAgICAgaWYgKGNoaWxkSWQgPT09IGlkKSB7XG4gICAgICAgICAgcmV0dXJuIHRoaXMucm9vdC5jaGlsZHJlbltwYXJlbnRJZF1bY2hpbGRJZF0uZGVzdHJveSgpO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfVxuICB9XG5cbiAgam9pbkNoaWxkKGVsKSB7XG4gICAgY29uc3QgY2hpbGQgPSB0aGlzLmdldENoaWxkQnlJZChlbC5pZCk7XG4gICAgaWYgKCFjaGlsZCkge1xuICAgICAgY29uc3QgdmlldyA9IG5ldyBWaWV3KGVsLCB0aGlzLmxpdmVTb2NrZXQsIHRoaXMpO1xuICAgICAgdGhpcy5yb290LmNoaWxkcmVuW3RoaXMuaWRdW3ZpZXcuaWRdID0gdmlldztcbiAgICAgIHZpZXcuam9pbigpO1xuICAgICAgdGhpcy5jaGlsZEpvaW5zKys7XG4gICAgICByZXR1cm4gdHJ1ZTtcbiAgICB9XG4gIH1cblxuICBpc0pvaW5QZW5kaW5nKCkge1xuICAgIHJldHVybiB0aGlzLmpvaW5QZW5kaW5nO1xuICB9XG5cbiAgYWNrSm9pbihfY2hpbGQpIHtcbiAgICB0aGlzLmNoaWxkSm9pbnMtLTtcblxuICAgIGlmICh0aGlzLmNoaWxkSm9pbnMgPT09IDApIHtcbiAgICAgIGlmICh0aGlzLnBhcmVudCkge1xuICAgICAgICB0aGlzLnBhcmVudC5hY2tKb2luKHRoaXMpO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgdGhpcy5vbkFsbENoaWxkSm9pbnNDb21wbGV0ZSgpO1xuICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIG9uQWxsQ2hpbGRKb2luc0NvbXBsZXRlKCkge1xuICAgIC8vIHdlIGNhbiBjbGVhciBwZW5kaW5nIGZvcm0gcmVjb3ZlcmllcyBub3cgdGhhdCB3ZSd2ZSBqb2luZWQuXG4gICAgLy8gVGhleSBlaXRoZXIgYWxsIHJlc29sdmVkIG9yIHdlcmUgYWJhbmRvbmVkXG4gICAgdGhpcy5wZW5kaW5nRm9ybXMuY2xlYXIoKTtcbiAgICAvLyB3ZSBjYW4gYWxzbyBjbGVhciB0aGUgZm9ybXNGb3JSZWNvdmVyeSBvYmplY3QgdG8gbm90IGtlZXAgb2xkIGZvcm0gZWxlbWVudHMgYXJvdW5kXG4gICAgdGhpcy5mb3Jtc0ZvclJlY292ZXJ5ID0ge307XG4gICAgdGhpcy5qb2luQ2FsbGJhY2soKCkgPT4ge1xuICAgICAgdGhpcy5wZW5kaW5nSm9pbk9wcy5mb3JFYWNoKChbdmlldywgb3BdKSA9PiB7XG4gICAgICAgIGlmICghdmlldy5pc0Rlc3Ryb3llZCgpKSB7XG4gICAgICAgICAgb3AoKTtcbiAgICAgICAgfVxuICAgICAgfSk7XG4gICAgICB0aGlzLnBlbmRpbmdKb2luT3BzID0gW107XG4gICAgfSk7XG4gIH1cblxuICB1cGRhdGUoZGlmZiwgZXZlbnRzLCBpc1BlbmRpbmcgPSBmYWxzZSkge1xuICAgIGlmIChcbiAgICAgIHRoaXMuaXNKb2luUGVuZGluZygpIHx8XG4gICAgICAodGhpcy5saXZlU29ja2V0Lmhhc1BlbmRpbmdMaW5rKCkgJiYgdGhpcy5yb290LmlzTWFpbigpKVxuICAgICkge1xuICAgICAgLy8gZG9uJ3QgbXV0YXRlIGlmIHRoaXMgaXMgYWxyZWFkeSBhIHBlbmRpbmcgZGlmZlxuICAgICAgaWYgKCFpc1BlbmRpbmcpIHtcbiAgICAgICAgdGhpcy5wZW5kaW5nRGlmZnMucHVzaCh7IGRpZmYsIGV2ZW50cyB9KTtcbiAgICAgIH1cbiAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9XG5cbiAgICB0aGlzLnJlbmRlcmVkLm1lcmdlRGlmZihkaWZmKTtcbiAgICBsZXQgcGh4Q2hpbGRyZW5BZGRlZCA9IGZhbHNlO1xuXG4gICAgLy8gV2hlbiB0aGUgZGlmZiBvbmx5IGNvbnRhaW5zIGNvbXBvbmVudCBkaWZmcywgdGhlbiB3YWxrIGNvbXBvbmVudHNcbiAgICAvLyBhbmQgcGF0Y2ggb25seSB0aGUgcGFyZW50IGNvbXBvbmVudCBjb250YWluZXJzIGZvdW5kIGluIHRoZSBkaWZmLlxuICAgIC8vIE90aGVyd2lzZSwgcGF0Y2ggZW50aXJlIExWIGNvbnRhaW5lci5cbiAgICBpZiAodGhpcy5yZW5kZXJlZC5pc0NvbXBvbmVudE9ubHlEaWZmKGRpZmYpKSB7XG4gICAgICB0aGlzLmxpdmVTb2NrZXQudGltZShcImNvbXBvbmVudCBwYXRjaCBjb21wbGV0ZVwiLCAoKSA9PiB7XG4gICAgICAgIGNvbnN0IHBhcmVudENpZHMgPSBET00uZmluZEV4aXN0aW5nUGFyZW50Q0lEcyhcbiAgICAgICAgICB0aGlzLmlkLFxuICAgICAgICAgIHRoaXMucmVuZGVyZWQuY29tcG9uZW50Q0lEcyhkaWZmKSxcbiAgICAgICAgKTtcbiAgICAgICAgcGFyZW50Q2lkcy5mb3JFYWNoKChwYXJlbnRDSUQpID0+IHtcbiAgICAgICAgICBpZiAoXG4gICAgICAgICAgICB0aGlzLmNvbXBvbmVudFBhdGNoKFxuICAgICAgICAgICAgICB0aGlzLnJlbmRlcmVkLmdldENvbXBvbmVudChkaWZmLCBwYXJlbnRDSUQpLFxuICAgICAgICAgICAgICBwYXJlbnRDSUQsXG4gICAgICAgICAgICApXG4gICAgICAgICAgKSB7XG4gICAgICAgICAgICBwaHhDaGlsZHJlbkFkZGVkID0gdHJ1ZTtcbiAgICAgICAgICB9XG4gICAgICAgIH0pO1xuICAgICAgfSk7XG4gICAgfSBlbHNlIGlmICghaXNFbXB0eShkaWZmKSkge1xuICAgICAgdGhpcy5saXZlU29ja2V0LnRpbWUoXCJmdWxsIHBhdGNoIGNvbXBsZXRlXCIsICgpID0+IHtcbiAgICAgICAgY29uc3QgW2h0bWwsIHN0cmVhbXNdID0gdGhpcy5yZW5kZXJDb250YWluZXIoZGlmZiwgXCJ1cGRhdGVcIik7XG4gICAgICAgIGNvbnN0IHBhdGNoID0gbmV3IERPTVBhdGNoKHRoaXMsIHRoaXMuZWwsIHRoaXMuaWQsIGh0bWwsIHN0cmVhbXMsIG51bGwpO1xuICAgICAgICBwaHhDaGlsZHJlbkFkZGVkID0gdGhpcy5wZXJmb3JtUGF0Y2gocGF0Y2gsIHRydWUpO1xuICAgICAgfSk7XG4gICAgfVxuXG4gICAgdGhpcy5saXZlU29ja2V0LmRpc3BhdGNoRXZlbnRzKGV2ZW50cyk7XG4gICAgaWYgKHBoeENoaWxkcmVuQWRkZWQpIHtcbiAgICAgIHRoaXMuam9pbk5ld0NoaWxkcmVuKCk7XG4gICAgfVxuXG4gICAgcmV0dXJuIHRydWU7XG4gIH1cblxuICByZW5kZXJDb250YWluZXIoZGlmZiwga2luZCkge1xuICAgIHJldHVybiB0aGlzLmxpdmVTb2NrZXQudGltZShgdG9TdHJpbmcgZGlmZiAoJHtraW5kfSlgLCAoKSA9PiB7XG4gICAgICBjb25zdCB0YWcgPSB0aGlzLmVsLnRhZ05hbWU7XG4gICAgICAvLyBEb24ndCBza2lwIGFueSBjb21wb25lbnQgaW4gdGhlIGRpZmYgbm9yIGFueSBtYXJrZWQgYXMgcHJ1bmVkXG4gICAgICAvLyAoYXMgdGhleSBtYXkgaGF2ZSBiZWVuIGFkZGVkIGJhY2spXG4gICAgICBjb25zdCBjaWRzID0gZGlmZiA/IHRoaXMucmVuZGVyZWQuY29tcG9uZW50Q0lEcyhkaWZmKSA6IG51bGw7XG4gICAgICBjb25zdCB7IGJ1ZmZlcjogaHRtbCwgc3RyZWFtcyB9ID0gdGhpcy5yZW5kZXJlZC50b1N0cmluZyhjaWRzKTtcbiAgICAgIHJldHVybiBbYDwke3RhZ30+JHtodG1sfTwvJHt0YWd9PmAsIHN0cmVhbXNdO1xuICAgIH0pO1xuICB9XG5cbiAgY29tcG9uZW50UGF0Y2goZGlmZiwgY2lkKSB7XG4gICAgaWYgKGlzRW1wdHkoZGlmZikpIHJldHVybiBmYWxzZTtcbiAgICBjb25zdCB7IGJ1ZmZlcjogaHRtbCwgc3RyZWFtcyB9ID0gdGhpcy5yZW5kZXJlZC5jb21wb25lbnRUb1N0cmluZyhjaWQpO1xuICAgIGNvbnN0IHBhdGNoID0gbmV3IERPTVBhdGNoKHRoaXMsIHRoaXMuZWwsIHRoaXMuaWQsIGh0bWwsIHN0cmVhbXMsIGNpZCk7XG4gICAgY29uc3QgY2hpbGRyZW5BZGRlZCA9IHRoaXMucGVyZm9ybVBhdGNoKHBhdGNoLCB0cnVlKTtcbiAgICByZXR1cm4gY2hpbGRyZW5BZGRlZDtcbiAgfVxuXG4gIGdldEhvb2soZWwpIHtcbiAgICByZXR1cm4gdGhpcy52aWV3SG9va3NbVmlld0hvb2suZWxlbWVudElEKGVsKV07XG4gIH1cblxuICBhZGRIb29rKGVsKSB7XG4gICAgY29uc3QgaG9va0VsSWQgPSBWaWV3SG9vay5lbGVtZW50SUQoZWwpO1xuXG4gICAgLy8gb25seSBldmVyIHRyeSB0byBhZGQgaG9va3MgdG8gZWxlbWVudHMgb3duZWQgYnkgdGhpcyB2aWV3XG4gICAgaWYgKGVsLmdldEF0dHJpYnV0ZSAmJiAhdGhpcy5vd25zRWxlbWVudChlbCkpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICBpZiAoaG9va0VsSWQgJiYgIXRoaXMudmlld0hvb2tzW2hvb2tFbElkXSkge1xuICAgICAgLy8gaG9vayBjcmVhdGVkLCBidXQgbm90IGF0dGFjaGVkIChjcmVhdGVIb29rIGZvciB3ZWIgY29tcG9uZW50KVxuICAgICAgY29uc3QgaG9vayA9XG4gICAgICAgIERPTS5nZXRDdXN0b21FbEhvb2soZWwpIHx8XG4gICAgICAgIGxvZ0Vycm9yKGBubyBob29rIGZvdW5kIGZvciBjdXN0b20gZWxlbWVudDogJHtlbC5pZH1gKTtcbiAgICAgIHRoaXMudmlld0hvb2tzW2hvb2tFbElkXSA9IGhvb2s7XG4gICAgICBob29rLl9fYXR0YWNoVmlldyh0aGlzKTtcbiAgICAgIHJldHVybiBob29rO1xuICAgIH0gZWxzZSBpZiAoaG9va0VsSWQgfHwgIWVsLmdldEF0dHJpYnV0ZSkge1xuICAgICAgLy8gbm8gaG9vayBmb3VuZFxuICAgICAgcmV0dXJuO1xuICAgIH0gZWxzZSB7XG4gICAgICAvLyBuZXcgaG9vayBmb3VuZCB3aXRoIHBoeC1ob29rIGF0dHJpYnV0ZVxuICAgICAgY29uc3QgaG9va05hbWUgPVxuICAgICAgICBlbC5nZXRBdHRyaWJ1dGUoYGRhdGEtcGh4LSR7UEhYX0hPT0t9YCkgfHxcbiAgICAgICAgZWwuZ2V0QXR0cmlidXRlKHRoaXMuYmluZGluZyhQSFhfSE9PSykpO1xuXG4gICAgICBpZiAoIWhvb2tOYW1lKSB7XG4gICAgICAgIHJldHVybjtcbiAgICAgIH1cblxuICAgICAgY29uc3QgaG9va0RlZmluaXRpb24gPSB0aGlzLmxpdmVTb2NrZXQuZ2V0SG9va0RlZmluaXRpb24oaG9va05hbWUpO1xuXG4gICAgICBpZiAoaG9va0RlZmluaXRpb24pIHtcbiAgICAgICAgaWYgKCFlbC5pZCkge1xuICAgICAgICAgIGxvZ0Vycm9yKFxuICAgICAgICAgICAgYG5vIERPTSBJRCBmb3IgaG9vayBcIiR7aG9va05hbWV9XCIuIEhvb2tzIHJlcXVpcmUgYSB1bmlxdWUgSUQgb24gZWFjaCBlbGVtZW50LmAsXG4gICAgICAgICAgICBlbCxcbiAgICAgICAgICApO1xuICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuXG4gICAgICAgIGxldCBob29rSW5zdGFuY2U7XG4gICAgICAgIHRyeSB7XG4gICAgICAgICAgaWYgKFxuICAgICAgICAgICAgdHlwZW9mIGhvb2tEZWZpbml0aW9uID09PSBcImZ1bmN0aW9uXCIgJiZcbiAgICAgICAgICAgIGhvb2tEZWZpbml0aW9uLnByb3RvdHlwZSBpbnN0YW5jZW9mIFZpZXdIb29rXG4gICAgICAgICAgKSB7XG4gICAgICAgICAgICAvLyBJdCdzIGEgY2xhc3MgY29uc3RydWN0b3IgKHN1YmNsYXNzIG9mIFZpZXdIb29rKVxuICAgICAgICAgICAgaG9va0luc3RhbmNlID0gbmV3IGhvb2tEZWZpbml0aW9uKHRoaXMsIGVsKTsgLy8gYHRoaXNgIGlzIHRoZSBWaWV3IGluc3RhbmNlXG4gICAgICAgICAgfSBlbHNlIGlmIChcbiAgICAgICAgICAgIHR5cGVvZiBob29rRGVmaW5pdGlvbiA9PT0gXCJvYmplY3RcIiAmJlxuICAgICAgICAgICAgaG9va0RlZmluaXRpb24gIT09IG51bGxcbiAgICAgICAgICApIHtcbiAgICAgICAgICAgIC8vIEl0J3MgYW4gb2JqZWN0IGxpdGVyYWwsIHBhc3MgaXQgdG8gdGhlIFZpZXdIb29rIGNvbnN0cnVjdG9yIGZvciB3cmFwcGluZ1xuICAgICAgICAgICAgaG9va0luc3RhbmNlID0gbmV3IFZpZXdIb29rKHRoaXMsIGVsLCBob29rRGVmaW5pdGlvbik7XG4gICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIGxvZ0Vycm9yKFxuICAgICAgICAgICAgICBgSW52YWxpZCBob29rIGRlZmluaXRpb24gZm9yIFwiJHtob29rTmFtZX1cIi4gRXhwZWN0ZWQgYSBjbGFzcyBleHRlbmRpbmcgVmlld0hvb2sgb3IgYW4gb2JqZWN0IGRlZmluaXRpb24uYCxcbiAgICAgICAgICAgICAgZWwsXG4gICAgICAgICAgICApO1xuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICAgIH1cbiAgICAgICAgfSBjYXRjaCAoZSkge1xuICAgICAgICAgIGNvbnN0IGVycm9yTWVzc2FnZSA9IGUgaW5zdGFuY2VvZiBFcnJvciA/IGUubWVzc2FnZSA6IFN0cmluZyhlKTtcbiAgICAgICAgICBsb2dFcnJvcihgRmFpbGVkIHRvIGNyZWF0ZSBob29rIFwiJHtob29rTmFtZX1cIjogJHtlcnJvck1lc3NhZ2V9YCwgZWwpO1xuICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuXG4gICAgICAgIHRoaXMudmlld0hvb2tzW1ZpZXdIb29rLmVsZW1lbnRJRChob29rSW5zdGFuY2UuZWwpXSA9IGhvb2tJbnN0YW5jZTtcbiAgICAgICAgcmV0dXJuIGhvb2tJbnN0YW5jZTtcbiAgICAgIH0gZWxzZSBpZiAoaG9va05hbWUgIT09IG51bGwpIHtcbiAgICAgICAgbG9nRXJyb3IoYHVua25vd24gaG9vayBmb3VuZCBmb3IgXCIke2hvb2tOYW1lfVwiYCwgZWwpO1xuICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIGRlc3Ryb3lIb29rKGhvb2spIHtcbiAgICAvLyBfX2Rlc3Ryb3llZCBjbGVhcnMgdGhlIGVsZW1lbnRJRCBmcm9tIHRoZSBob29rLCB0aGVyZWZvcmVcbiAgICAvLyB3ZSBuZWVkIHRvIGdldCBpdCBiZWZvcmUgY2FsbGluZyBfX2Rlc3Ryb3llZFxuICAgIGNvbnN0IGhvb2tJZCA9IFZpZXdIb29rLmVsZW1lbnRJRChob29rLmVsKTtcbiAgICBob29rLl9fZGVzdHJveWVkKCk7XG4gICAgaG9vay5fX2NsZWFudXBfXygpO1xuICAgIGRlbGV0ZSB0aGlzLnZpZXdIb29rc1tob29rSWRdO1xuICB9XG5cbiAgYXBwbHlQZW5kaW5nVXBkYXRlcygpIHtcbiAgICAvLyBUbyBwcmV2ZW50IHJhY2UgY29uZGl0aW9ucyB3aGVyZSB3ZSBtaWdodCBzdGlsbCBiZSBwZW5kaW5nIGEgbmV3XG4gICAgLy8gbmF2aWdhdGlvbiBvciB0aGUgam9pbiBpcyBzdGlsbCBwZW5kaW5nLCBgdGhpcy51cGRhdGVgIHJldHVybnMgZmFsc2VcbiAgICAvLyBpZiB0aGUgZGlmZiB3YXMgbm90IGFwcGxpZWQuXG4gICAgdGhpcy5wZW5kaW5nRGlmZnMgPSB0aGlzLnBlbmRpbmdEaWZmcy5maWx0ZXIoXG4gICAgICAoeyBkaWZmLCBldmVudHMgfSkgPT4gIXRoaXMudXBkYXRlKGRpZmYsIGV2ZW50cywgdHJ1ZSksXG4gICAgKTtcbiAgICB0aGlzLmVhY2hDaGlsZCgoY2hpbGQpID0+IGNoaWxkLmFwcGx5UGVuZGluZ1VwZGF0ZXMoKSk7XG4gIH1cblxuICBlYWNoQ2hpbGQoY2FsbGJhY2spIHtcbiAgICBjb25zdCBjaGlsZHJlbiA9IHRoaXMucm9vdC5jaGlsZHJlblt0aGlzLmlkXSB8fCB7fTtcbiAgICBmb3IgKGNvbnN0IGlkIGluIGNoaWxkcmVuKSB7XG4gICAgICBjYWxsYmFjayh0aGlzLmdldENoaWxkQnlJZChpZCkpO1xuICAgIH1cbiAgfVxuXG4gIG9uQ2hhbm5lbChldmVudCwgY2IpIHtcbiAgICB0aGlzLmxpdmVTb2NrZXQub25DaGFubmVsKHRoaXMuY2hhbm5lbCwgZXZlbnQsIChyZXNwKSA9PiB7XG4gICAgICBpZiAodGhpcy5pc0pvaW5QZW5kaW5nKCkpIHtcbiAgICAgICAgLy8gaW4gY2FzZSB0aGlzIGlzIGEgcmVqb2luIChqb2luQ291bnQgPiAxKSB3ZSBzdG9yZSBvdXIgb3duIGpvaW4gb3BzXG4gICAgICAgIGlmICh0aGlzLmpvaW5Db3VudCA+IDEpIHtcbiAgICAgICAgICB0aGlzLnBlbmRpbmdKb2luT3BzLnB1c2goKCkgPT4gY2IocmVzcCkpO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIHRoaXMucm9vdC5wZW5kaW5nSm9pbk9wcy5wdXNoKFt0aGlzLCAoKSA9PiBjYihyZXNwKV0pO1xuICAgICAgICB9XG4gICAgICB9IGVsc2Uge1xuICAgICAgICB0aGlzLmxpdmVTb2NrZXQucmVxdWVzdERPTVVwZGF0ZSgoKSA9PiBjYihyZXNwKSk7XG4gICAgICB9XG4gICAgfSk7XG4gIH1cblxuICBiaW5kQ2hhbm5lbCgpIHtcbiAgICAvLyBUaGUgZGlmZiBldmVudCBzaG91bGQgYmUgaGFuZGxlZCBieSB0aGUgcmVndWxhciB1cGRhdGUgb3BlcmF0aW9ucy5cbiAgICAvLyBBbGwgb3RoZXIgb3BlcmF0aW9ucyBhcmUgcXVldWVkIHRvIGJlIGFwcGxpZWQgb25seSBhZnRlciBqb2luLlxuICAgIHRoaXMubGl2ZVNvY2tldC5vbkNoYW5uZWwodGhpcy5jaGFubmVsLCBcImRpZmZcIiwgKHJhd0RpZmYpID0+IHtcbiAgICAgIHRoaXMubGl2ZVNvY2tldC5yZXF1ZXN0RE9NVXBkYXRlKCgpID0+IHtcbiAgICAgICAgdGhpcy5hcHBseURpZmYoXCJ1cGRhdGVcIiwgcmF3RGlmZiwgKHsgZGlmZiwgZXZlbnRzIH0pID0+XG4gICAgICAgICAgdGhpcy51cGRhdGUoZGlmZiwgZXZlbnRzKSxcbiAgICAgICAgKTtcbiAgICAgIH0pO1xuICAgIH0pO1xuICAgIHRoaXMub25DaGFubmVsKFwicmVkaXJlY3RcIiwgKHsgdG8sIGZsYXNoIH0pID0+XG4gICAgICB0aGlzLm9uUmVkaXJlY3QoeyB0bywgZmxhc2ggfSksXG4gICAgKTtcbiAgICB0aGlzLm9uQ2hhbm5lbChcImxpdmVfcGF0Y2hcIiwgKHJlZGlyKSA9PiB0aGlzLm9uTGl2ZVBhdGNoKHJlZGlyKSk7XG4gICAgdGhpcy5vbkNoYW5uZWwoXCJsaXZlX3JlZGlyZWN0XCIsIChyZWRpcikgPT4gdGhpcy5vbkxpdmVSZWRpcmVjdChyZWRpcikpO1xuICAgIHRoaXMuY2hhbm5lbC5vbkVycm9yKChyZWFzb24pID0+IHRoaXMub25FcnJvcihyZWFzb24pKTtcbiAgICB0aGlzLmNoYW5uZWwub25DbG9zZSgocmVhc29uKSA9PiB0aGlzLm9uQ2xvc2UocmVhc29uKSk7XG4gIH1cblxuICBkZXN0cm95QWxsQ2hpbGRyZW4oKSB7XG4gICAgdGhpcy5lYWNoQ2hpbGQoKGNoaWxkKSA9PiBjaGlsZC5kZXN0cm95KCkpO1xuICB9XG5cbiAgb25MaXZlUmVkaXJlY3QocmVkaXIpIHtcbiAgICBjb25zdCB7IHRvLCBraW5kLCBmbGFzaCB9ID0gcmVkaXI7XG4gICAgY29uc3QgdXJsID0gdGhpcy5leHBhbmRVUkwodG8pO1xuICAgIGNvbnN0IGUgPSBuZXcgQ3VzdG9tRXZlbnQoXCJwaHg6c2VydmVyLW5hdmlnYXRlXCIsIHtcbiAgICAgIGRldGFpbDogeyB0bywga2luZCwgZmxhc2ggfSxcbiAgICB9KTtcbiAgICB0aGlzLmxpdmVTb2NrZXQuaGlzdG9yeVJlZGlyZWN0KGUsIHVybCwga2luZCwgZmxhc2gpO1xuICB9XG5cbiAgb25MaXZlUGF0Y2gocmVkaXIpIHtcbiAgICBjb25zdCB7IHRvLCBraW5kIH0gPSByZWRpcjtcbiAgICB0aGlzLmhyZWYgPSB0aGlzLmV4cGFuZFVSTCh0byk7XG4gICAgdGhpcy5saXZlU29ja2V0Lmhpc3RvcnlQYXRjaCh0bywga2luZCk7XG4gIH1cblxuICBleHBhbmRVUkwodG8pIHtcbiAgICByZXR1cm4gdG8uc3RhcnRzV2l0aChcIi9cIilcbiAgICAgID8gYCR7d2luZG93LmxvY2F0aW9uLnByb3RvY29sfS8vJHt3aW5kb3cubG9jYXRpb24uaG9zdH0ke3RvfWBcbiAgICAgIDogdG87XG4gIH1cblxuICAvKipcbiAgICogQHBhcmFtIHt7dG86IHN0cmluZywgZmxhc2g/OiBzdHJpbmcsIHJlbG9hZFRva2VuPzogc3RyaW5nfX0gcmVkaXJlY3RcbiAgICovXG4gIG9uUmVkaXJlY3QoeyB0bywgZmxhc2gsIHJlbG9hZFRva2VuIH0pIHtcbiAgICB0aGlzLmxpdmVTb2NrZXQucmVkaXJlY3QodG8sIGZsYXNoLCByZWxvYWRUb2tlbik7XG4gIH1cblxuICBpc0Rlc3Ryb3llZCgpIHtcbiAgICByZXR1cm4gdGhpcy5kZXN0cm95ZWQ7XG4gIH1cblxuICBqb2luRGVhZCgpIHtcbiAgICB0aGlzLmlzRGVhZCA9IHRydWU7XG4gIH1cblxuICBqb2luUHVzaCgpIHtcbiAgICB0aGlzLmpvaW5QdXNoID0gdGhpcy5qb2luUHVzaCB8fCB0aGlzLmNoYW5uZWwuam9pbigpO1xuICAgIHJldHVybiB0aGlzLmpvaW5QdXNoO1xuICB9XG5cbiAgam9pbihjYWxsYmFjaykge1xuICAgIHRoaXMuc2hvd0xvYWRlcih0aGlzLmxpdmVTb2NrZXQubG9hZGVyVGltZW91dCk7XG4gICAgdGhpcy5iaW5kQ2hhbm5lbCgpO1xuICAgIGlmICh0aGlzLmlzTWFpbigpKSB7XG4gICAgICB0aGlzLnN0b3BDYWxsYmFjayA9IHRoaXMubGl2ZVNvY2tldC53aXRoUGFnZUxvYWRpbmcoe1xuICAgICAgICB0bzogdGhpcy5ocmVmLFxuICAgICAgICBraW5kOiBcImluaXRpYWxcIixcbiAgICAgIH0pO1xuICAgIH1cbiAgICB0aGlzLmpvaW5DYWxsYmFjayA9IChvbkRvbmUpID0+IHtcbiAgICAgIG9uRG9uZSA9IG9uRG9uZSB8fCBmdW5jdGlvbiAoKSB7fTtcbiAgICAgIGNhbGxiYWNrID8gY2FsbGJhY2sodGhpcy5qb2luQ291bnQsIG9uRG9uZSkgOiBvbkRvbmUoKTtcbiAgICB9O1xuXG4gICAgdGhpcy53cmFwUHVzaCgoKSA9PiB0aGlzLmNoYW5uZWwuam9pbigpLCB7XG4gICAgICBvazogKHJlc3ApID0+IHRoaXMubGl2ZVNvY2tldC5yZXF1ZXN0RE9NVXBkYXRlKCgpID0+IHRoaXMub25Kb2luKHJlc3ApKSxcbiAgICAgIGVycm9yOiAoZXJyb3IpID0+IHRoaXMub25Kb2luRXJyb3IoZXJyb3IpLFxuICAgICAgdGltZW91dDogKCkgPT4gdGhpcy5vbkpvaW5FcnJvcih7IHJlYXNvbjogXCJ0aW1lb3V0XCIgfSksXG4gICAgfSk7XG4gIH1cblxuICBvbkpvaW5FcnJvcihyZXNwKSB7XG4gICAgaWYgKHJlc3AucmVhc29uID09PSBcInJlbG9hZFwiKSB7XG4gICAgICB0aGlzLmxvZyhcImVycm9yXCIsICgpID0+IFtcbiAgICAgICAgYGZhaWxlZCBtb3VudCB3aXRoICR7cmVzcC5zdGF0dXN9LiBGYWxsaW5nIGJhY2sgdG8gcGFnZSByZWxvYWRgLFxuICAgICAgICByZXNwLFxuICAgICAgXSk7XG4gICAgICB0aGlzLm9uUmVkaXJlY3QoeyB0bzogdGhpcy5yb290LmhyZWYsIHJlbG9hZFRva2VuOiByZXNwLnRva2VuIH0pO1xuICAgICAgcmV0dXJuO1xuICAgIH0gZWxzZSBpZiAocmVzcC5yZWFzb24gPT09IFwidW5hdXRob3JpemVkXCIgfHwgcmVzcC5yZWFzb24gPT09IFwic3RhbGVcIikge1xuICAgICAgdGhpcy5sb2coXCJlcnJvclwiLCAoKSA9PiBbXG4gICAgICAgIFwidW5hdXRob3JpemVkIGxpdmVfcmVkaXJlY3QuIEZhbGxpbmcgYmFjayB0byBwYWdlIHJlcXVlc3RcIixcbiAgICAgICAgcmVzcCxcbiAgICAgIF0pO1xuICAgICAgdGhpcy5vblJlZGlyZWN0KHsgdG86IHRoaXMucm9vdC5ocmVmLCBmbGFzaDogdGhpcy5mbGFzaCB9KTtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgaWYgKHJlc3AucmVkaXJlY3QgfHwgcmVzcC5saXZlX3JlZGlyZWN0KSB7XG4gICAgICB0aGlzLmpvaW5QZW5kaW5nID0gZmFsc2U7XG4gICAgICB0aGlzLmNoYW5uZWwubGVhdmUoKTtcbiAgICB9XG4gICAgaWYgKHJlc3AucmVkaXJlY3QpIHtcbiAgICAgIHJldHVybiB0aGlzLm9uUmVkaXJlY3QocmVzcC5yZWRpcmVjdCk7XG4gICAgfVxuICAgIGlmIChyZXNwLmxpdmVfcmVkaXJlY3QpIHtcbiAgICAgIHJldHVybiB0aGlzLm9uTGl2ZVJlZGlyZWN0KHJlc3AubGl2ZV9yZWRpcmVjdCk7XG4gICAgfVxuICAgIHRoaXMubG9nKFwiZXJyb3JcIiwgKCkgPT4gW1widW5hYmxlIHRvIGpvaW5cIiwgcmVzcF0pO1xuICAgIGlmICh0aGlzLmlzTWFpbigpKSB7XG4gICAgICB0aGlzLmRpc3BsYXlFcnJvcihcbiAgICAgICAgW1BIWF9MT0FESU5HX0NMQVNTLCBQSFhfRVJST1JfQ0xBU1MsIFBIWF9TRVJWRVJfRVJST1JfQ0xBU1NdLFxuICAgICAgICB7IHVuc3RydWN0dXJlZEVycm9yOiByZXNwLCBlcnJvcktpbmQ6IFwic2VydmVyXCIgfSxcbiAgICAgICk7XG4gICAgICBpZiAodGhpcy5saXZlU29ja2V0LmlzQ29ubmVjdGVkKCkpIHtcbiAgICAgICAgdGhpcy5saXZlU29ja2V0LnJlbG9hZFdpdGhKaXR0ZXIodGhpcyk7XG4gICAgICB9XG4gICAgfSBlbHNlIHtcbiAgICAgIGlmICh0aGlzLmpvaW5BdHRlbXB0cyA+PSBNQVhfQ0hJTERfSk9JTl9BVFRFTVBUUykge1xuICAgICAgICAvLyBwdXQgdGhlIHJvb3QgcmV2aWV3IGludG8gcGVybWFuZW50IGVycm9yIHN0YXRlLCBidXQgZG9uJ3QgZGVzdHJveSBpdCBhcyBpdCBjYW4gcmVtYWluIGFjdGl2ZVxuICAgICAgICB0aGlzLnJvb3QuZGlzcGxheUVycm9yKFxuICAgICAgICAgIFtQSFhfTE9BRElOR19DTEFTUywgUEhYX0VSUk9SX0NMQVNTLCBQSFhfU0VSVkVSX0VSUk9SX0NMQVNTXSxcbiAgICAgICAgICB7IHVuc3RydWN0dXJlZEVycm9yOiByZXNwLCBlcnJvcktpbmQ6IFwic2VydmVyXCIgfSxcbiAgICAgICAgKTtcbiAgICAgICAgdGhpcy5sb2coXCJlcnJvclwiLCAoKSA9PiBbXG4gICAgICAgICAgYGdpdmluZyB1cCB0cnlpbmcgdG8gbW91bnQgYWZ0ZXIgJHtNQVhfQ0hJTERfSk9JTl9BVFRFTVBUU30gdHJpZXNgLFxuICAgICAgICAgIHJlc3AsXG4gICAgICAgIF0pO1xuICAgICAgICB0aGlzLmRlc3Ryb3koKTtcbiAgICAgIH1cbiAgICAgIGNvbnN0IHRydWVDaGlsZEVsID0gRE9NLmJ5SWQodGhpcy5lbC5pZCk7XG4gICAgICBpZiAodHJ1ZUNoaWxkRWwpIHtcbiAgICAgICAgRE9NLm1lcmdlQXR0cnModHJ1ZUNoaWxkRWwsIHRoaXMuZWwpO1xuICAgICAgICB0aGlzLmRpc3BsYXlFcnJvcihcbiAgICAgICAgICBbUEhYX0xPQURJTkdfQ0xBU1MsIFBIWF9FUlJPUl9DTEFTUywgUEhYX1NFUlZFUl9FUlJPUl9DTEFTU10sXG4gICAgICAgICAgeyB1bnN0cnVjdHVyZWRFcnJvcjogcmVzcCwgZXJyb3JLaW5kOiBcInNlcnZlclwiIH0sXG4gICAgICAgICk7XG4gICAgICAgIHRoaXMuZWwgPSB0cnVlQ2hpbGRFbDtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHRoaXMuZGVzdHJveSgpO1xuICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIG9uQ2xvc2UocmVhc29uKSB7XG4gICAgaWYgKHRoaXMuaXNEZXN0cm95ZWQoKSkge1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICBpZiAoXG4gICAgICB0aGlzLmlzTWFpbigpICYmXG4gICAgICB0aGlzLmxpdmVTb2NrZXQuaGFzUGVuZGluZ0xpbmsoKSAmJlxuICAgICAgcmVhc29uICE9PSBcImxlYXZlXCJcbiAgICApIHtcbiAgICAgIHJldHVybiB0aGlzLmxpdmVTb2NrZXQucmVsb2FkV2l0aEppdHRlcih0aGlzKTtcbiAgICB9XG4gICAgdGhpcy5kZXN0cm95QWxsQ2hpbGRyZW4oKTtcbiAgICB0aGlzLmxpdmVTb2NrZXQuZHJvcEFjdGl2ZUVsZW1lbnQodGhpcyk7XG4gICAgaWYgKHRoaXMubGl2ZVNvY2tldC5pc1VubG9hZGVkKCkpIHtcbiAgICAgIHRoaXMuc2hvd0xvYWRlcihCRUZPUkVfVU5MT0FEX0xPQURFUl9USU1FT1VUKTtcbiAgICB9XG4gIH1cblxuICBvbkVycm9yKHJlYXNvbikge1xuICAgIHRoaXMub25DbG9zZShyZWFzb24pO1xuICAgIGlmICh0aGlzLmxpdmVTb2NrZXQuaXNDb25uZWN0ZWQoKSkge1xuICAgICAgdGhpcy5sb2coXCJlcnJvclwiLCAoKSA9PiBbXCJ2aWV3IGNyYXNoZWRcIiwgcmVhc29uXSk7XG4gICAgfVxuICAgIGlmICghdGhpcy5saXZlU29ja2V0LmlzVW5sb2FkZWQoKSkge1xuICAgICAgaWYgKHRoaXMubGl2ZVNvY2tldC5pc0Nvbm5lY3RlZCgpKSB7XG4gICAgICAgIHRoaXMuZGlzcGxheUVycm9yKFxuICAgICAgICAgIFtQSFhfTE9BRElOR19DTEFTUywgUEhYX0VSUk9SX0NMQVNTLCBQSFhfU0VSVkVSX0VSUk9SX0NMQVNTXSxcbiAgICAgICAgICB7IHVuc3RydWN0dXJlZEVycm9yOiByZWFzb24sIGVycm9yS2luZDogXCJzZXJ2ZXJcIiB9LFxuICAgICAgICApO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgdGhpcy5kaXNwbGF5RXJyb3IoXG4gICAgICAgICAgW1BIWF9MT0FESU5HX0NMQVNTLCBQSFhfRVJST1JfQ0xBU1MsIFBIWF9DTElFTlRfRVJST1JfQ0xBU1NdLFxuICAgICAgICAgIHsgdW5zdHJ1Y3R1cmVkRXJyb3I6IHJlYXNvbiwgZXJyb3JLaW5kOiBcImNsaWVudFwiIH0sXG4gICAgICAgICk7XG4gICAgICB9XG4gICAgfVxuICB9XG5cbiAgZGlzcGxheUVycm9yKGNsYXNzZXMsIGRldGFpbHMgPSB7fSkge1xuICAgIGlmICh0aGlzLmlzTWFpbigpKSB7XG4gICAgICBET00uZGlzcGF0Y2hFdmVudCh3aW5kb3csIFwicGh4OnBhZ2UtbG9hZGluZy1zdGFydFwiLCB7XG4gICAgICAgIGRldGFpbDogeyB0bzogdGhpcy5ocmVmLCBraW5kOiBcImVycm9yXCIsIC4uLmRldGFpbHMgfSxcbiAgICAgIH0pO1xuICAgIH1cbiAgICB0aGlzLnNob3dMb2FkZXIoKTtcbiAgICB0aGlzLnNldENvbnRhaW5lckNsYXNzZXMoLi4uY2xhc3Nlcyk7XG4gICAgdGhpcy5kZWxheWVkRGlzY29ubmVjdGVkKCk7XG4gIH1cblxuICBkZWxheWVkRGlzY29ubmVjdGVkKCkge1xuICAgIHRoaXMuZGlzY29ubmVjdGVkVGltZXIgPSBzZXRUaW1lb3V0KCgpID0+IHtcbiAgICAgIHRoaXMuZXhlY0FsbCh0aGlzLmJpbmRpbmcoXCJkaXNjb25uZWN0ZWRcIikpO1xuICAgIH0sIHRoaXMubGl2ZVNvY2tldC5kaXNjb25uZWN0ZWRUaW1lb3V0KTtcbiAgfVxuXG4gIHdyYXBQdXNoKGNhbGxlclB1c2gsIHJlY2VpdmVzKSB7XG4gICAgY29uc3QgbGF0ZW5jeSA9IHRoaXMubGl2ZVNvY2tldC5nZXRMYXRlbmN5U2ltKCk7XG4gICAgY29uc3Qgd2l0aExhdGVuY3kgPSBsYXRlbmN5XG4gICAgICA/IChjYikgPT4gc2V0VGltZW91dCgoKSA9PiAhdGhpcy5pc0Rlc3Ryb3llZCgpICYmIGNiKCksIGxhdGVuY3kpXG4gICAgICA6IChjYikgPT4gIXRoaXMuaXNEZXN0cm95ZWQoKSAmJiBjYigpO1xuXG4gICAgd2l0aExhdGVuY3koKCkgPT4ge1xuICAgICAgY2FsbGVyUHVzaCgpXG4gICAgICAgIC5yZWNlaXZlKFwib2tcIiwgKHJlc3ApID0+XG4gICAgICAgICAgd2l0aExhdGVuY3koKCkgPT4gcmVjZWl2ZXMub2sgJiYgcmVjZWl2ZXMub2socmVzcCkpLFxuICAgICAgICApXG4gICAgICAgIC5yZWNlaXZlKFwiZXJyb3JcIiwgKHJlYXNvbikgPT5cbiAgICAgICAgICB3aXRoTGF0ZW5jeSgoKSA9PiByZWNlaXZlcy5lcnJvciAmJiByZWNlaXZlcy5lcnJvcihyZWFzb24pKSxcbiAgICAgICAgKVxuICAgICAgICAucmVjZWl2ZShcInRpbWVvdXRcIiwgKCkgPT5cbiAgICAgICAgICB3aXRoTGF0ZW5jeSgoKSA9PiByZWNlaXZlcy50aW1lb3V0ICYmIHJlY2VpdmVzLnRpbWVvdXQoKSksXG4gICAgICAgICk7XG4gICAgfSk7XG4gIH1cblxuICBwdXNoV2l0aFJlcGx5KHJlZkdlbmVyYXRvciwgZXZlbnQsIHBheWxvYWQpIHtcbiAgICBpZiAoIXRoaXMuaXNDb25uZWN0ZWQoKSkge1xuICAgICAgcmV0dXJuIFByb21pc2UucmVqZWN0KG5ldyBFcnJvcihcIm5vIGNvbm5lY3Rpb25cIikpO1xuICAgIH1cblxuICAgIGNvbnN0IFtyZWYsIFtlbF0sIG9wdHNdID0gcmVmR2VuZXJhdG9yXG4gICAgICA/IHJlZkdlbmVyYXRvcih7IHBheWxvYWQgfSlcbiAgICAgIDogW251bGwsIFtdLCB7fV07XG4gICAgY29uc3Qgb2xkSm9pbkNvdW50ID0gdGhpcy5qb2luQ291bnQ7XG4gICAgbGV0IG9uTG9hZGluZ0RvbmUgPSBmdW5jdGlvbiAoKSB7fTtcbiAgICBpZiAob3B0cy5wYWdlX2xvYWRpbmcpIHtcbiAgICAgIG9uTG9hZGluZ0RvbmUgPSB0aGlzLmxpdmVTb2NrZXQud2l0aFBhZ2VMb2FkaW5nKHtcbiAgICAgICAga2luZDogXCJlbGVtZW50XCIsXG4gICAgICAgIHRhcmdldDogZWwsXG4gICAgICB9KTtcbiAgICB9XG5cbiAgICBpZiAodHlwZW9mIHBheWxvYWQuY2lkICE9PSBcIm51bWJlclwiKSB7XG4gICAgICBkZWxldGUgcGF5bG9hZC5jaWQ7XG4gICAgfVxuXG4gICAgcmV0dXJuIG5ldyBQcm9taXNlKChyZXNvbHZlLCByZWplY3QpID0+IHtcbiAgICAgIHRoaXMud3JhcFB1c2goKCkgPT4gdGhpcy5jaGFubmVsLnB1c2goZXZlbnQsIHBheWxvYWQsIFBVU0hfVElNRU9VVCksIHtcbiAgICAgICAgb2s6IChyZXNwKSA9PiB7XG4gICAgICAgICAgaWYgKHJlZiAhPT0gbnVsbCkge1xuICAgICAgICAgICAgdGhpcy5sYXN0QWNrUmVmID0gcmVmO1xuICAgICAgICAgIH1cbiAgICAgICAgICBjb25zdCBmaW5pc2ggPSAoaG9va1JlcGx5KSA9PiB7XG4gICAgICAgICAgICBpZiAocmVzcC5yZWRpcmVjdCkge1xuICAgICAgICAgICAgICB0aGlzLm9uUmVkaXJlY3QocmVzcC5yZWRpcmVjdCk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBpZiAocmVzcC5saXZlX3BhdGNoKSB7XG4gICAgICAgICAgICAgIHRoaXMub25MaXZlUGF0Y2gocmVzcC5saXZlX3BhdGNoKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGlmIChyZXNwLmxpdmVfcmVkaXJlY3QpIHtcbiAgICAgICAgICAgICAgdGhpcy5vbkxpdmVSZWRpcmVjdChyZXNwLmxpdmVfcmVkaXJlY3QpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgb25Mb2FkaW5nRG9uZSgpO1xuICAgICAgICAgICAgcmVzb2x2ZSh7IHJlc3A6IHJlc3AsIHJlcGx5OiBob29rUmVwbHksIHJlZiB9KTtcbiAgICAgICAgICB9O1xuICAgICAgICAgIGlmIChyZXNwLmRpZmYpIHtcbiAgICAgICAgICAgIHRoaXMubGl2ZVNvY2tldC5yZXF1ZXN0RE9NVXBkYXRlKCgpID0+IHtcbiAgICAgICAgICAgICAgdGhpcy5hcHBseURpZmYoXCJ1cGRhdGVcIiwgcmVzcC5kaWZmLCAoeyBkaWZmLCByZXBseSwgZXZlbnRzIH0pID0+IHtcbiAgICAgICAgICAgICAgICBpZiAocmVmICE9PSBudWxsKSB7XG4gICAgICAgICAgICAgICAgICB0aGlzLnVuZG9SZWZzKHJlZiwgcGF5bG9hZC5ldmVudCk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIHRoaXMudXBkYXRlKGRpZmYsIGV2ZW50cyk7XG4gICAgICAgICAgICAgICAgZmluaXNoKHJlcGx5KTtcbiAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICB9KTtcbiAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgaWYgKHJlZiAhPT0gbnVsbCkge1xuICAgICAgICAgICAgICB0aGlzLnVuZG9SZWZzKHJlZiwgcGF5bG9hZC5ldmVudCk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBmaW5pc2gobnVsbCk7XG4gICAgICAgICAgfVxuICAgICAgICB9LFxuICAgICAgICBlcnJvcjogKHJlYXNvbikgPT5cbiAgICAgICAgICByZWplY3QobmV3IEVycm9yKGBmYWlsZWQgd2l0aCByZWFzb246ICR7SlNPTi5zdHJpbmdpZnkocmVhc29uKX1gKSksXG4gICAgICAgIHRpbWVvdXQ6ICgpID0+IHtcbiAgICAgICAgICByZWplY3QobmV3IEVycm9yKFwidGltZW91dFwiKSk7XG4gICAgICAgICAgaWYgKHRoaXMuam9pbkNvdW50ID09PSBvbGRKb2luQ291bnQpIHtcbiAgICAgICAgICAgIHRoaXMubGl2ZVNvY2tldC5yZWxvYWRXaXRoSml0dGVyKHRoaXMsICgpID0+IHtcbiAgICAgICAgICAgICAgdGhpcy5sb2coXCJ0aW1lb3V0XCIsICgpID0+IFtcbiAgICAgICAgICAgICAgICBcInJlY2VpdmVkIHRpbWVvdXQgd2hpbGUgY29tbXVuaWNhdGluZyB3aXRoIHNlcnZlci4gRmFsbGluZyBiYWNrIHRvIGhhcmQgcmVmcmVzaCBmb3IgcmVjb3ZlcnlcIixcbiAgICAgICAgICAgICAgXSk7XG4gICAgICAgICAgICB9KTtcbiAgICAgICAgICB9XG4gICAgICAgIH0sXG4gICAgICB9KTtcbiAgICB9KTtcbiAgfVxuXG4gIHVuZG9SZWZzKHJlZiwgcGh4RXZlbnQsIG9ubHlFbHMpIHtcbiAgICBpZiAoIXRoaXMuaXNDb25uZWN0ZWQoKSkge1xuICAgICAgcmV0dXJuO1xuICAgIH0gLy8gZXhpdCBpZiBleHRlcm5hbCBmb3JtIHRyaWdnZXJlZFxuICAgIGNvbnN0IHNlbGVjdG9yID0gYFske1BIWF9SRUZfU1JDfT1cIiR7dGhpcy5yZWZTcmMoKX1cIl1gO1xuXG4gICAgaWYgKG9ubHlFbHMpIHtcbiAgICAgIG9ubHlFbHMgPSBuZXcgU2V0KG9ubHlFbHMpO1xuICAgICAgRE9NLmFsbChkb2N1bWVudCwgc2VsZWN0b3IsIChwYXJlbnQpID0+IHtcbiAgICAgICAgaWYgKG9ubHlFbHMgJiYgIW9ubHlFbHMuaGFzKHBhcmVudCkpIHtcbiAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cbiAgICAgICAgLy8gdW5kbyBhbnkgY2hpbGQgcmVmcyB3aXRoaW4gcGFyZW50IGZpcnN0XG4gICAgICAgIERPTS5hbGwocGFyZW50LCBzZWxlY3RvciwgKGNoaWxkKSA9PlxuICAgICAgICAgIHRoaXMudW5kb0VsUmVmKGNoaWxkLCByZWYsIHBoeEV2ZW50KSxcbiAgICAgICAgKTtcbiAgICAgICAgdGhpcy51bmRvRWxSZWYocGFyZW50LCByZWYsIHBoeEV2ZW50KTtcbiAgICAgIH0pO1xuICAgIH0gZWxzZSB7XG4gICAgICBET00uYWxsKGRvY3VtZW50LCBzZWxlY3RvciwgKGVsKSA9PiB0aGlzLnVuZG9FbFJlZihlbCwgcmVmLCBwaHhFdmVudCkpO1xuICAgIH1cbiAgfVxuXG4gIHVuZG9FbFJlZihlbCwgcmVmLCBwaHhFdmVudCkge1xuICAgIGNvbnN0IGVsUmVmID0gbmV3IEVsZW1lbnRSZWYoZWwpO1xuXG4gICAgZWxSZWYubWF5YmVVbmRvKHJlZiwgcGh4RXZlbnQsIChjbG9uZWRUcmVlKSA9PiB7XG4gICAgICAvLyB3ZSBuZWVkIHRvIHBlcmZvcm0gYSBmdWxsIHBhdGNoIG9uIHVubG9ja2VkIGVsZW1lbnRzXG4gICAgICAvLyB0byBwZXJmb3JtIGFsbCB0aGUgbmVjZXNzYXJ5IGxvZ2ljIChsaWtlIGNhbGxpbmcgdXBkYXRlZCBmb3IgaG9va3MsIGV0Yy4pXG4gICAgICBjb25zdCBwYXRjaCA9IG5ldyBET01QYXRjaCh0aGlzLCBlbCwgdGhpcy5pZCwgY2xvbmVkVHJlZSwgW10sIG51bGwsIHtcbiAgICAgICAgdW5kb1JlZjogcmVmLFxuICAgICAgfSk7XG4gICAgICBjb25zdCBwaHhDaGlsZHJlbkFkZGVkID0gdGhpcy5wZXJmb3JtUGF0Y2gocGF0Y2gsIHRydWUpO1xuICAgICAgRE9NLmFsbChlbCwgYFske1BIWF9SRUZfU1JDfT1cIiR7dGhpcy5yZWZTcmMoKX1cIl1gLCAoY2hpbGQpID0+XG4gICAgICAgIHRoaXMudW5kb0VsUmVmKGNoaWxkLCByZWYsIHBoeEV2ZW50KSxcbiAgICAgICk7XG4gICAgICBpZiAocGh4Q2hpbGRyZW5BZGRlZCkge1xuICAgICAgICB0aGlzLmpvaW5OZXdDaGlsZHJlbigpO1xuICAgICAgfVxuICAgIH0pO1xuICB9XG5cbiAgcmVmU3JjKCkge1xuICAgIHJldHVybiB0aGlzLmVsLmlkO1xuICB9XG5cbiAgcHV0UmVmKGVsZW1lbnRzLCBwaHhFdmVudCwgZXZlbnRUeXBlLCBvcHRzID0ge30pIHtcbiAgICBjb25zdCBuZXdSZWYgPSB0aGlzLnJlZisrO1xuICAgIGNvbnN0IGRpc2FibGVXaXRoID0gdGhpcy5iaW5kaW5nKFBIWF9ESVNBQkxFX1dJVEgpO1xuICAgIGlmIChvcHRzLmxvYWRpbmcpIHtcbiAgICAgIGNvbnN0IGxvYWRpbmdFbHMgPSBET00uYWxsKGRvY3VtZW50LCBvcHRzLmxvYWRpbmcpLm1hcCgoZWwpID0+IHtcbiAgICAgICAgcmV0dXJuIHsgZWwsIGxvY2s6IHRydWUsIGxvYWRpbmc6IHRydWUgfTtcbiAgICAgIH0pO1xuICAgICAgZWxlbWVudHMgPSBlbGVtZW50cy5jb25jYXQobG9hZGluZ0Vscyk7XG4gICAgfVxuXG4gICAgZm9yIChjb25zdCB7IGVsLCBsb2NrLCBsb2FkaW5nIH0gb2YgZWxlbWVudHMpIHtcbiAgICAgIGlmICghbG9jayAmJiAhbG9hZGluZykge1xuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoXCJwdXRSZWYgcmVxdWlyZXMgbG9jayBvciBsb2FkaW5nXCIpO1xuICAgICAgfVxuICAgICAgZWwuc2V0QXR0cmlidXRlKFBIWF9SRUZfU1JDLCB0aGlzLnJlZlNyYygpKTtcbiAgICAgIGlmIChsb2FkaW5nKSB7XG4gICAgICAgIGVsLnNldEF0dHJpYnV0ZShQSFhfUkVGX0xPQURJTkcsIG5ld1JlZik7XG4gICAgICB9XG4gICAgICBpZiAobG9jaykge1xuICAgICAgICBlbC5zZXRBdHRyaWJ1dGUoUEhYX1JFRl9MT0NLLCBuZXdSZWYpO1xuICAgICAgfVxuXG4gICAgICBpZiAoXG4gICAgICAgICFsb2FkaW5nIHx8XG4gICAgICAgIChvcHRzLnN1Ym1pdHRlciAmJiAhKGVsID09PSBvcHRzLnN1Ym1pdHRlciB8fCBlbCA9PT0gb3B0cy5mb3JtKSlcbiAgICAgICkge1xuICAgICAgICBjb250aW51ZTtcbiAgICAgIH1cblxuICAgICAgY29uc3QgbG9ja0NvbXBsZXRlUHJvbWlzZSA9IG5ldyBQcm9taXNlKChyZXNvbHZlKSA9PiB7XG4gICAgICAgIGVsLmFkZEV2ZW50TGlzdGVuZXIoYHBoeDp1bmRvLWxvY2s6JHtuZXdSZWZ9YCwgKCkgPT4gcmVzb2x2ZShkZXRhaWwpLCB7XG4gICAgICAgICAgb25jZTogdHJ1ZSxcbiAgICAgICAgfSk7XG4gICAgICB9KTtcblxuICAgICAgY29uc3QgbG9hZGluZ0NvbXBsZXRlUHJvbWlzZSA9IG5ldyBQcm9taXNlKChyZXNvbHZlKSA9PiB7XG4gICAgICAgIGVsLmFkZEV2ZW50TGlzdGVuZXIoXG4gICAgICAgICAgYHBoeDp1bmRvLWxvYWRpbmc6JHtuZXdSZWZ9YCxcbiAgICAgICAgICAoKSA9PiByZXNvbHZlKGRldGFpbCksXG4gICAgICAgICAgeyBvbmNlOiB0cnVlIH0sXG4gICAgICAgICk7XG4gICAgICB9KTtcblxuICAgICAgZWwuY2xhc3NMaXN0LmFkZChgcGh4LSR7ZXZlbnRUeXBlfS1sb2FkaW5nYCk7XG4gICAgICBjb25zdCBkaXNhYmxlVGV4dCA9IGVsLmdldEF0dHJpYnV0ZShkaXNhYmxlV2l0aCk7XG4gICAgICBpZiAoZGlzYWJsZVRleHQgIT09IG51bGwpIHtcbiAgICAgICAgaWYgKCFlbC5nZXRBdHRyaWJ1dGUoUEhYX0RJU0FCTEVfV0lUSF9SRVNUT1JFKSkge1xuICAgICAgICAgIGVsLnNldEF0dHJpYnV0ZShQSFhfRElTQUJMRV9XSVRIX1JFU1RPUkUsIGVsLmlubmVyVGV4dCk7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKGRpc2FibGVUZXh0ICE9PSBcIlwiKSB7XG4gICAgICAgICAgZWwuaW5uZXJUZXh0ID0gZGlzYWJsZVRleHQ7XG4gICAgICAgIH1cbiAgICAgICAgLy8gUEhYX0RJU0FCTEVEIGNvdWxkIGhhdmUgYWxyZWFkeSBiZWVuIHNldCBpbiBkaXNhYmxlRm9ybVxuICAgICAgICBlbC5zZXRBdHRyaWJ1dGUoXG4gICAgICAgICAgUEhYX0RJU0FCTEVELFxuICAgICAgICAgIGVsLmdldEF0dHJpYnV0ZShQSFhfRElTQUJMRUQpIHx8IGVsLmRpc2FibGVkLFxuICAgICAgICApO1xuICAgICAgICBlbC5zZXRBdHRyaWJ1dGUoXCJkaXNhYmxlZFwiLCBcIlwiKTtcbiAgICAgIH1cblxuICAgICAgY29uc3QgZGV0YWlsID0ge1xuICAgICAgICBldmVudDogcGh4RXZlbnQsXG4gICAgICAgIGV2ZW50VHlwZTogZXZlbnRUeXBlLFxuICAgICAgICByZWY6IG5ld1JlZixcbiAgICAgICAgaXNMb2FkaW5nOiBsb2FkaW5nLFxuICAgICAgICBpc0xvY2tlZDogbG9jayxcbiAgICAgICAgbG9ja0VsZW1lbnRzOiBlbGVtZW50cy5maWx0ZXIoKHsgbG9jayB9KSA9PiBsb2NrKS5tYXAoKHsgZWwgfSkgPT4gZWwpLFxuICAgICAgICBsb2FkaW5nRWxlbWVudHM6IGVsZW1lbnRzXG4gICAgICAgICAgLmZpbHRlcigoeyBsb2FkaW5nIH0pID0+IGxvYWRpbmcpXG4gICAgICAgICAgLm1hcCgoeyBlbCB9KSA9PiBlbCksXG4gICAgICAgIHVubG9jazogKGVscykgPT4ge1xuICAgICAgICAgIGVscyA9IEFycmF5LmlzQXJyYXkoZWxzKSA/IGVscyA6IFtlbHNdO1xuICAgICAgICAgIHRoaXMudW5kb1JlZnMobmV3UmVmLCBwaHhFdmVudCwgZWxzKTtcbiAgICAgICAgfSxcbiAgICAgICAgbG9ja0NvbXBsZXRlOiBsb2NrQ29tcGxldGVQcm9taXNlLFxuICAgICAgICBsb2FkaW5nQ29tcGxldGU6IGxvYWRpbmdDb21wbGV0ZVByb21pc2UsXG4gICAgICAgIGxvY2s6IChsb2NrRWwpID0+IHtcbiAgICAgICAgICByZXR1cm4gbmV3IFByb21pc2UoKHJlc29sdmUpID0+IHtcbiAgICAgICAgICAgIGlmICh0aGlzLmlzQWNrZWQobmV3UmVmKSkge1xuICAgICAgICAgICAgICByZXR1cm4gcmVzb2x2ZShkZXRhaWwpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgbG9ja0VsLnNldEF0dHJpYnV0ZShQSFhfUkVGX0xPQ0ssIG5ld1JlZik7XG4gICAgICAgICAgICBsb2NrRWwuc2V0QXR0cmlidXRlKFBIWF9SRUZfU1JDLCB0aGlzLnJlZlNyYygpKTtcbiAgICAgICAgICAgIGxvY2tFbC5hZGRFdmVudExpc3RlbmVyKFxuICAgICAgICAgICAgICBgcGh4OmxvY2stc3RvcDoke25ld1JlZn1gLFxuICAgICAgICAgICAgICAoKSA9PiByZXNvbHZlKGRldGFpbCksXG4gICAgICAgICAgICAgIHsgb25jZTogdHJ1ZSB9LFxuICAgICAgICAgICAgKTtcbiAgICAgICAgICB9KTtcbiAgICAgICAgfSxcbiAgICAgIH07XG4gICAgICBpZiAob3B0cy5wYXlsb2FkKSB7XG4gICAgICAgIGRldGFpbFtcInBheWxvYWRcIl0gPSBvcHRzLnBheWxvYWQ7XG4gICAgICB9XG4gICAgICBpZiAob3B0cy50YXJnZXQpIHtcbiAgICAgICAgZGV0YWlsW1widGFyZ2V0XCJdID0gb3B0cy50YXJnZXQ7XG4gICAgICB9XG4gICAgICBpZiAob3B0cy5vcmlnaW5hbEV2ZW50KSB7XG4gICAgICAgIGRldGFpbFtcIm9yaWdpbmFsRXZlbnRcIl0gPSBvcHRzLm9yaWdpbmFsRXZlbnQ7XG4gICAgICB9XG4gICAgICBlbC5kaXNwYXRjaEV2ZW50KFxuICAgICAgICBuZXcgQ3VzdG9tRXZlbnQoXCJwaHg6cHVzaFwiLCB7XG4gICAgICAgICAgZGV0YWlsOiBkZXRhaWwsXG4gICAgICAgICAgYnViYmxlczogdHJ1ZSxcbiAgICAgICAgICBjYW5jZWxhYmxlOiBmYWxzZSxcbiAgICAgICAgfSksXG4gICAgICApO1xuICAgICAgaWYgKHBoeEV2ZW50KSB7XG4gICAgICAgIGVsLmRpc3BhdGNoRXZlbnQoXG4gICAgICAgICAgbmV3IEN1c3RvbUV2ZW50KGBwaHg6cHVzaDoke3BoeEV2ZW50fWAsIHtcbiAgICAgICAgICAgIGRldGFpbDogZGV0YWlsLFxuICAgICAgICAgICAgYnViYmxlczogdHJ1ZSxcbiAgICAgICAgICAgIGNhbmNlbGFibGU6IGZhbHNlLFxuICAgICAgICAgIH0pLFxuICAgICAgICApO1xuICAgICAgfVxuICAgIH1cbiAgICByZXR1cm4gW25ld1JlZiwgZWxlbWVudHMubWFwKCh7IGVsIH0pID0+IGVsKSwgb3B0c107XG4gIH1cblxuICBpc0Fja2VkKHJlZikge1xuICAgIHJldHVybiB0aGlzLmxhc3RBY2tSZWYgIT09IG51bGwgJiYgdGhpcy5sYXN0QWNrUmVmID49IHJlZjtcbiAgfVxuXG4gIGNvbXBvbmVudElEKGVsKSB7XG4gICAgY29uc3QgY2lkID0gZWwuZ2V0QXR0cmlidXRlICYmIGVsLmdldEF0dHJpYnV0ZShQSFhfQ09NUE9ORU5UKTtcbiAgICByZXR1cm4gY2lkID8gcGFyc2VJbnQoY2lkKSA6IG51bGw7XG4gIH1cblxuICB0YXJnZXRDb21wb25lbnRJRCh0YXJnZXQsIHRhcmdldEN0eCwgb3B0cyA9IHt9KSB7XG4gICAgaWYgKGlzQ2lkKHRhcmdldEN0eCkpIHtcbiAgICAgIHJldHVybiB0YXJnZXRDdHg7XG4gICAgfVxuXG4gICAgY29uc3QgY2lkT3JTZWxlY3RvciA9XG4gICAgICBvcHRzLnRhcmdldCB8fCB0YXJnZXQuZ2V0QXR0cmlidXRlKHRoaXMuYmluZGluZyhcInRhcmdldFwiKSk7XG4gICAgaWYgKGlzQ2lkKGNpZE9yU2VsZWN0b3IpKSB7XG4gICAgICByZXR1cm4gcGFyc2VJbnQoY2lkT3JTZWxlY3Rvcik7XG4gICAgfSBlbHNlIGlmICh0YXJnZXRDdHggJiYgKGNpZE9yU2VsZWN0b3IgIT09IG51bGwgfHwgb3B0cy50YXJnZXQpKSB7XG4gICAgICByZXR1cm4gdGhpcy5jbG9zZXN0Q29tcG9uZW50SUQodGFyZ2V0Q3R4KTtcbiAgICB9IGVsc2Uge1xuICAgICAgcmV0dXJuIG51bGw7XG4gICAgfVxuICB9XG5cbiAgY2xvc2VzdENvbXBvbmVudElEKHRhcmdldEN0eCkge1xuICAgIGlmIChpc0NpZCh0YXJnZXRDdHgpKSB7XG4gICAgICByZXR1cm4gdGFyZ2V0Q3R4O1xuICAgIH0gZWxzZSBpZiAodGFyZ2V0Q3R4KSB7XG4gICAgICByZXR1cm4gbWF5YmUoXG4gICAgICAgIHRhcmdldEN0eC5jbG9zZXN0KGBbJHtQSFhfQ09NUE9ORU5UfV1gKSxcbiAgICAgICAgKGVsKSA9PiB0aGlzLm93bnNFbGVtZW50KGVsKSAmJiB0aGlzLmNvbXBvbmVudElEKGVsKSxcbiAgICAgICk7XG4gICAgfSBlbHNlIHtcbiAgICAgIHJldHVybiBudWxsO1xuICAgIH1cbiAgfVxuXG4gIHB1c2hIb29rRXZlbnQoZWwsIHRhcmdldEN0eCwgZXZlbnQsIHBheWxvYWQpIHtcbiAgICBpZiAoIXRoaXMuaXNDb25uZWN0ZWQoKSkge1xuICAgICAgdGhpcy5sb2coXCJob29rXCIsICgpID0+IFtcbiAgICAgICAgXCJ1bmFibGUgdG8gcHVzaCBob29rIGV2ZW50LiBMaXZlVmlldyBub3QgY29ubmVjdGVkXCIsXG4gICAgICAgIGV2ZW50LFxuICAgICAgICBwYXlsb2FkLFxuICAgICAgXSk7XG4gICAgICByZXR1cm4gUHJvbWlzZS5yZWplY3QoXG4gICAgICAgIG5ldyBFcnJvcihcInVuYWJsZSB0byBwdXNoIGhvb2sgZXZlbnQuIExpdmVWaWV3IG5vdCBjb25uZWN0ZWRcIiksXG4gICAgICApO1xuICAgIH1cblxuICAgIGNvbnN0IHJlZkdlbmVyYXRvciA9ICgpID0+XG4gICAgICB0aGlzLnB1dFJlZihbeyBlbCwgbG9hZGluZzogdHJ1ZSwgbG9jazogdHJ1ZSB9XSwgZXZlbnQsIFwiaG9va1wiLCB7XG4gICAgICAgIHBheWxvYWQsXG4gICAgICAgIHRhcmdldDogdGFyZ2V0Q3R4LFxuICAgICAgfSk7XG5cbiAgICByZXR1cm4gdGhpcy5wdXNoV2l0aFJlcGx5KHJlZkdlbmVyYXRvciwgXCJldmVudFwiLCB7XG4gICAgICB0eXBlOiBcImhvb2tcIixcbiAgICAgIGV2ZW50OiBldmVudCxcbiAgICAgIHZhbHVlOiBwYXlsb2FkLFxuICAgICAgY2lkOiB0aGlzLmNsb3Nlc3RDb21wb25lbnRJRCh0YXJnZXRDdHgpLFxuICAgIH0pLnRoZW4oKHsgcmVzcDogX3Jlc3AsIHJlcGx5LCByZWYgfSkgPT4gKHsgcmVwbHksIHJlZiB9KSk7XG4gIH1cblxuICBleHRyYWN0TWV0YShlbCwgbWV0YSwgdmFsdWUpIHtcbiAgICBjb25zdCBwcmVmaXggPSB0aGlzLmJpbmRpbmcoXCJ2YWx1ZS1cIik7XG4gICAgZm9yIChsZXQgaSA9IDA7IGkgPCBlbC5hdHRyaWJ1dGVzLmxlbmd0aDsgaSsrKSB7XG4gICAgICBpZiAoIW1ldGEpIHtcbiAgICAgICAgbWV0YSA9IHt9O1xuICAgICAgfVxuICAgICAgY29uc3QgbmFtZSA9IGVsLmF0dHJpYnV0ZXNbaV0ubmFtZTtcbiAgICAgIGlmIChuYW1lLnN0YXJ0c1dpdGgocHJlZml4KSkge1xuICAgICAgICBtZXRhW25hbWUucmVwbGFjZShwcmVmaXgsIFwiXCIpXSA9IGVsLmdldEF0dHJpYnV0ZShuYW1lKTtcbiAgICAgIH1cbiAgICB9XG4gICAgaWYgKGVsLnZhbHVlICE9PSB1bmRlZmluZWQgJiYgIShlbCBpbnN0YW5jZW9mIEhUTUxGb3JtRWxlbWVudCkpIHtcbiAgICAgIGlmICghbWV0YSkge1xuICAgICAgICBtZXRhID0ge307XG4gICAgICB9XG4gICAgICBtZXRhLnZhbHVlID0gZWwudmFsdWU7XG5cbiAgICAgIGlmIChcbiAgICAgICAgZWwudGFnTmFtZSA9PT0gXCJJTlBVVFwiICYmXG4gICAgICAgIENIRUNLQUJMRV9JTlBVVFMuaW5kZXhPZihlbC50eXBlKSA+PSAwICYmXG4gICAgICAgICFlbC5jaGVja2VkXG4gICAgICApIHtcbiAgICAgICAgZGVsZXRlIG1ldGEudmFsdWU7XG4gICAgICB9XG4gICAgfVxuICAgIGlmICh2YWx1ZSkge1xuICAgICAgaWYgKCFtZXRhKSB7XG4gICAgICAgIG1ldGEgPSB7fTtcbiAgICAgIH1cbiAgICAgIGZvciAoY29uc3Qga2V5IGluIHZhbHVlKSB7XG4gICAgICAgIG1ldGFba2V5XSA9IHZhbHVlW2tleV07XG4gICAgICB9XG4gICAgfVxuICAgIHJldHVybiBtZXRhO1xuICB9XG5cbiAgcHVzaEV2ZW50KHR5cGUsIGVsLCB0YXJnZXRDdHgsIHBoeEV2ZW50LCBtZXRhLCBvcHRzID0ge30sIG9uUmVwbHkpIHtcbiAgICB0aGlzLnB1c2hXaXRoUmVwbHkoXG4gICAgICAobWF5YmVQYXlsb2FkKSA9PlxuICAgICAgICB0aGlzLnB1dFJlZihbeyBlbCwgbG9hZGluZzogdHJ1ZSwgbG9jazogdHJ1ZSB9XSwgcGh4RXZlbnQsIHR5cGUsIHtcbiAgICAgICAgICAuLi5vcHRzLFxuICAgICAgICAgIHBheWxvYWQ6IG1heWJlUGF5bG9hZD8ucGF5bG9hZCxcbiAgICAgICAgfSksXG4gICAgICBcImV2ZW50XCIsXG4gICAgICB7XG4gICAgICAgIHR5cGU6IHR5cGUsXG4gICAgICAgIGV2ZW50OiBwaHhFdmVudCxcbiAgICAgICAgdmFsdWU6IHRoaXMuZXh0cmFjdE1ldGEoZWwsIG1ldGEsIG9wdHMudmFsdWUpLFxuICAgICAgICBjaWQ6IHRoaXMudGFyZ2V0Q29tcG9uZW50SUQoZWwsIHRhcmdldEN0eCwgb3B0cyksXG4gICAgICB9LFxuICAgIClcbiAgICAgIC50aGVuKCh7IHJlcGx5IH0pID0+IG9uUmVwbHkgJiYgb25SZXBseShyZXBseSkpXG4gICAgICAuY2F0Y2goKGVycm9yKSA9PiBsb2dFcnJvcihcIkZhaWxlZCB0byBwdXNoIGV2ZW50XCIsIGVycm9yKSk7XG4gIH1cblxuICBwdXNoRmlsZVByb2dyZXNzKGZpbGVFbCwgZW50cnlSZWYsIHByb2dyZXNzLCBvblJlcGx5ID0gZnVuY3Rpb24gKCkge30pIHtcbiAgICB0aGlzLmxpdmVTb2NrZXQud2l0aGluT3duZXJzKGZpbGVFbC5mb3JtLCAodmlldywgdGFyZ2V0Q3R4KSA9PiB7XG4gICAgICB2aWV3XG4gICAgICAgIC5wdXNoV2l0aFJlcGx5KG51bGwsIFwicHJvZ3Jlc3NcIiwge1xuICAgICAgICAgIGV2ZW50OiBmaWxlRWwuZ2V0QXR0cmlidXRlKHZpZXcuYmluZGluZyhQSFhfUFJPR1JFU1MpKSxcbiAgICAgICAgICByZWY6IGZpbGVFbC5nZXRBdHRyaWJ1dGUoUEhYX1VQTE9BRF9SRUYpLFxuICAgICAgICAgIGVudHJ5X3JlZjogZW50cnlSZWYsXG4gICAgICAgICAgcHJvZ3Jlc3M6IHByb2dyZXNzLFxuICAgICAgICAgIGNpZDogdmlldy50YXJnZXRDb21wb25lbnRJRChmaWxlRWwuZm9ybSwgdGFyZ2V0Q3R4KSxcbiAgICAgICAgfSlcbiAgICAgICAgLnRoZW4oKCkgPT4gb25SZXBseSgpKVxuICAgICAgICAuY2F0Y2goKGVycm9yKSA9PiBsb2dFcnJvcihcIkZhaWxlZCB0byBwdXNoIGZpbGUgcHJvZ3Jlc3NcIiwgZXJyb3IpKTtcbiAgICB9KTtcbiAgfVxuXG4gIHB1c2hJbnB1dChpbnB1dEVsLCB0YXJnZXRDdHgsIGZvcmNlQ2lkLCBwaHhFdmVudCwgb3B0cywgY2FsbGJhY2spIHtcbiAgICBpZiAoIWlucHV0RWwuZm9ybSkge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKFwiZm9ybSBldmVudHMgcmVxdWlyZSB0aGUgaW5wdXQgdG8gYmUgaW5zaWRlIGEgZm9ybVwiKTtcbiAgICB9XG5cbiAgICBsZXQgdXBsb2FkcztcbiAgICBjb25zdCBjaWQgPSBpc0NpZChmb3JjZUNpZClcbiAgICAgID8gZm9yY2VDaWRcbiAgICAgIDogdGhpcy50YXJnZXRDb21wb25lbnRJRChpbnB1dEVsLmZvcm0sIHRhcmdldEN0eCwgb3B0cyk7XG4gICAgY29uc3QgcmVmR2VuZXJhdG9yID0gKG1heWJlUGF5bG9hZCkgPT4ge1xuICAgICAgcmV0dXJuIHRoaXMucHV0UmVmKFxuICAgICAgICBbXG4gICAgICAgICAgeyBlbDogaW5wdXRFbCwgbG9hZGluZzogdHJ1ZSwgbG9jazogdHJ1ZSB9LFxuICAgICAgICAgIHsgZWw6IGlucHV0RWwuZm9ybSwgbG9hZGluZzogdHJ1ZSwgbG9jazogdHJ1ZSB9LFxuICAgICAgICBdLFxuICAgICAgICBwaHhFdmVudCxcbiAgICAgICAgXCJjaGFuZ2VcIixcbiAgICAgICAgeyAuLi5vcHRzLCBwYXlsb2FkOiBtYXliZVBheWxvYWQ/LnBheWxvYWQgfSxcbiAgICAgICk7XG4gICAgfTtcbiAgICBsZXQgZm9ybURhdGE7XG4gICAgY29uc3QgbWV0YSA9IHRoaXMuZXh0cmFjdE1ldGEoaW5wdXRFbC5mb3JtLCB7fSwgb3B0cy52YWx1ZSk7XG4gICAgY29uc3Qgc2VyaWFsaXplT3B0cyA9IHt9O1xuICAgIGlmIChpbnB1dEVsIGluc3RhbmNlb2YgSFRNTEJ1dHRvbkVsZW1lbnQpIHtcbiAgICAgIHNlcmlhbGl6ZU9wdHMuc3VibWl0dGVyID0gaW5wdXRFbDtcbiAgICB9XG4gICAgaWYgKGlucHV0RWwuZ2V0QXR0cmlidXRlKHRoaXMuYmluZGluZyhcImNoYW5nZVwiKSkpIHtcbiAgICAgIGZvcm1EYXRhID0gc2VyaWFsaXplRm9ybShpbnB1dEVsLmZvcm0sIHNlcmlhbGl6ZU9wdHMsIFtpbnB1dEVsLm5hbWVdKTtcbiAgICB9IGVsc2Uge1xuICAgICAgZm9ybURhdGEgPSBzZXJpYWxpemVGb3JtKGlucHV0RWwuZm9ybSwgc2VyaWFsaXplT3B0cyk7XG4gICAgfVxuICAgIGlmIChcbiAgICAgIERPTS5pc1VwbG9hZElucHV0KGlucHV0RWwpICYmXG4gICAgICBpbnB1dEVsLmZpbGVzICYmXG4gICAgICBpbnB1dEVsLmZpbGVzLmxlbmd0aCA+IDBcbiAgICApIHtcbiAgICAgIExpdmVVcGxvYWRlci50cmFja0ZpbGVzKGlucHV0RWwsIEFycmF5LmZyb20oaW5wdXRFbC5maWxlcykpO1xuICAgIH1cbiAgICB1cGxvYWRzID0gTGl2ZVVwbG9hZGVyLnNlcmlhbGl6ZVVwbG9hZHMoaW5wdXRFbCk7XG5cbiAgICBjb25zdCBldmVudCA9IHtcbiAgICAgIHR5cGU6IFwiZm9ybVwiLFxuICAgICAgZXZlbnQ6IHBoeEV2ZW50LFxuICAgICAgdmFsdWU6IGZvcm1EYXRhLFxuICAgICAgbWV0YToge1xuICAgICAgICAvLyBubyB0YXJnZXQgd2FzIGltcGxpY2l0bHkgc2VudCBhcyBcInVuZGVmaW5lZFwiIGluIExWIDw9IDEuMC41LCB0aGVyZWZvcmVcbiAgICAgICAgLy8gd2UgaGF2ZSB0byBrZWVwIGl0LiBJbiAxLjAuNiB3ZSBzd2l0Y2hlZCBmcm9tIHBhc3NpbmcgbWV0YSBhcyBVUkwgZW5jb2RlZCBkYXRhXG4gICAgICAgIC8vIHRvIHBhc3NpbmcgaXQgZGlyZWN0bHkgaW4gdGhlIGV2ZW50LCBidXQgdGhlIEpTT04gZW5jb2RlIHdvdWxkIGRyb3Aga2V5cyB3aXRoXG4gICAgICAgIC8vIHVuZGVmaW5lZCB2YWx1ZXMuXG4gICAgICAgIF90YXJnZXQ6IG9wdHMuX3RhcmdldCB8fCBcInVuZGVmaW5lZFwiLFxuICAgICAgICAuLi5tZXRhLFxuICAgICAgfSxcbiAgICAgIHVwbG9hZHM6IHVwbG9hZHMsXG4gICAgICBjaWQ6IGNpZCxcbiAgICB9O1xuICAgIHRoaXMucHVzaFdpdGhSZXBseShyZWZHZW5lcmF0b3IsIFwiZXZlbnRcIiwgZXZlbnQpXG4gICAgICAudGhlbigoeyByZXNwIH0pID0+IHtcbiAgICAgICAgaWYgKERPTS5pc1VwbG9hZElucHV0KGlucHV0RWwpICYmIERPTS5pc0F1dG9VcGxvYWQoaW5wdXRFbCkpIHtcbiAgICAgICAgICAvLyB0aGUgZWxlbWVudCBjb3VsZCBiZSBpbnNpZGUgYSBsb2NrZWQgcGFyZW50IGZvciBvdGhlciB1bnJlbGF0ZWQgY2hhbmdlcztcbiAgICAgICAgICAvLyB3ZSBjYW4gb25seSBzdGFydCB1cGxvYWRzIHdoZW4gdGhlIHRyZWUgaXMgdW5sb2NrZWQgYW5kIHRoZVxuICAgICAgICAgIC8vIG5lY2Vzc2FyeSBkYXRhIGF0dHJpYnV0ZXMgYXJlIHNldCBpbiB0aGUgcmVhbCBET01cbiAgICAgICAgICBFbGVtZW50UmVmLm9uVW5sb2NrKGlucHV0RWwsICgpID0+IHtcbiAgICAgICAgICAgIGlmIChMaXZlVXBsb2FkZXIuZmlsZXNBd2FpdGluZ1ByZWZsaWdodChpbnB1dEVsKS5sZW5ndGggPiAwKSB7XG4gICAgICAgICAgICAgIGNvbnN0IFtyZWYsIF9lbHNdID0gcmVmR2VuZXJhdG9yKCk7XG4gICAgICAgICAgICAgIHRoaXMudW5kb1JlZnMocmVmLCBwaHhFdmVudCwgW2lucHV0RWwuZm9ybV0pO1xuICAgICAgICAgICAgICB0aGlzLnVwbG9hZEZpbGVzKFxuICAgICAgICAgICAgICAgIGlucHV0RWwuZm9ybSxcbiAgICAgICAgICAgICAgICBwaHhFdmVudCxcbiAgICAgICAgICAgICAgICB0YXJnZXRDdHgsXG4gICAgICAgICAgICAgICAgcmVmLFxuICAgICAgICAgICAgICAgIGNpZCxcbiAgICAgICAgICAgICAgICAoX3VwbG9hZHMpID0+IHtcbiAgICAgICAgICAgICAgICAgIGNhbGxiYWNrICYmIGNhbGxiYWNrKHJlc3ApO1xuICAgICAgICAgICAgICAgICAgdGhpcy50cmlnZ2VyQXdhaXRpbmdTdWJtaXQoaW5wdXRFbC5mb3JtLCBwaHhFdmVudCk7XG4gICAgICAgICAgICAgICAgICB0aGlzLnVuZG9SZWZzKHJlZiwgcGh4RXZlbnQpO1xuICAgICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAgICk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgfSk7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgY2FsbGJhY2sgJiYgY2FsbGJhY2socmVzcCk7XG4gICAgICAgIH1cbiAgICAgIH0pXG4gICAgICAuY2F0Y2goKGVycm9yKSA9PiBsb2dFcnJvcihcIkZhaWxlZCB0byBwdXNoIGlucHV0IGV2ZW50XCIsIGVycm9yKSk7XG4gIH1cblxuICB0cmlnZ2VyQXdhaXRpbmdTdWJtaXQoZm9ybUVsLCBwaHhFdmVudCkge1xuICAgIGNvbnN0IGF3YWl0aW5nU3VibWl0ID0gdGhpcy5nZXRTY2hlZHVsZWRTdWJtaXQoZm9ybUVsKTtcbiAgICBpZiAoYXdhaXRpbmdTdWJtaXQpIHtcbiAgICAgIGNvbnN0IFtfZWwsIF9yZWYsIF9vcHRzLCBjYWxsYmFja10gPSBhd2FpdGluZ1N1Ym1pdDtcbiAgICAgIHRoaXMuY2FuY2VsU3VibWl0KGZvcm1FbCwgcGh4RXZlbnQpO1xuICAgICAgY2FsbGJhY2soKTtcbiAgICB9XG4gIH1cblxuICBnZXRTY2hlZHVsZWRTdWJtaXQoZm9ybUVsKSB7XG4gICAgcmV0dXJuIHRoaXMuZm9ybVN1Ym1pdHMuZmluZCgoW2VsLCBfcmVmLCBfb3B0cywgX2NhbGxiYWNrXSkgPT5cbiAgICAgIGVsLmlzU2FtZU5vZGUoZm9ybUVsKSxcbiAgICApO1xuICB9XG5cbiAgc2NoZWR1bGVTdWJtaXQoZm9ybUVsLCByZWYsIG9wdHMsIGNhbGxiYWNrKSB7XG4gICAgaWYgKHRoaXMuZ2V0U2NoZWR1bGVkU3VibWl0KGZvcm1FbCkpIHtcbiAgICAgIHJldHVybiB0cnVlO1xuICAgIH1cbiAgICB0aGlzLmZvcm1TdWJtaXRzLnB1c2goW2Zvcm1FbCwgcmVmLCBvcHRzLCBjYWxsYmFja10pO1xuICB9XG5cbiAgY2FuY2VsU3VibWl0KGZvcm1FbCwgcGh4RXZlbnQpIHtcbiAgICB0aGlzLmZvcm1TdWJtaXRzID0gdGhpcy5mb3JtU3VibWl0cy5maWx0ZXIoXG4gICAgICAoW2VsLCByZWYsIF9vcHRzLCBfY2FsbGJhY2tdKSA9PiB7XG4gICAgICAgIGlmIChlbC5pc1NhbWVOb2RlKGZvcm1FbCkpIHtcbiAgICAgICAgICB0aGlzLnVuZG9SZWZzKHJlZiwgcGh4RXZlbnQpO1xuICAgICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICAgICAgfVxuICAgICAgfSxcbiAgICApO1xuICB9XG5cbiAgZGlzYWJsZUZvcm0oZm9ybUVsLCBwaHhFdmVudCwgb3B0cyA9IHt9KSB7XG4gICAgY29uc3QgZmlsdGVySWdub3JlZCA9IChlbCkgPT4ge1xuICAgICAgY29uc3QgdXNlcklnbm9yZWQgPSBjbG9zZXN0UGh4QmluZGluZyhcbiAgICAgICAgZWwsXG4gICAgICAgIGAke3RoaXMuYmluZGluZyhQSFhfVVBEQVRFKX09aWdub3JlYCxcbiAgICAgICAgZWwuZm9ybSxcbiAgICAgICk7XG4gICAgICByZXR1cm4gIShcbiAgICAgICAgdXNlcklnbm9yZWQgfHwgY2xvc2VzdFBoeEJpbmRpbmcoZWwsIFwiZGF0YS1waHgtdXBkYXRlPWlnbm9yZVwiLCBlbC5mb3JtKVxuICAgICAgKTtcbiAgICB9O1xuICAgIGNvbnN0IGZpbHRlckRpc2FibGVzID0gKGVsKSA9PiB7XG4gICAgICByZXR1cm4gZWwuaGFzQXR0cmlidXRlKHRoaXMuYmluZGluZyhQSFhfRElTQUJMRV9XSVRIKSk7XG4gICAgfTtcbiAgICBjb25zdCBmaWx0ZXJCdXR0b24gPSAoZWwpID0+IGVsLnRhZ05hbWUgPT0gXCJCVVRUT05cIjtcblxuICAgIGNvbnN0IGZpbHRlcklucHV0ID0gKGVsKSA9PlxuICAgICAgW1wiSU5QVVRcIiwgXCJURVhUQVJFQVwiLCBcIlNFTEVDVFwiXS5pbmNsdWRlcyhlbC50YWdOYW1lKTtcblxuICAgIGNvbnN0IGZvcm1FbGVtZW50cyA9IEFycmF5LmZyb20oZm9ybUVsLmVsZW1lbnRzKTtcbiAgICBjb25zdCBkaXNhYmxlcyA9IGZvcm1FbGVtZW50cy5maWx0ZXIoZmlsdGVyRGlzYWJsZXMpO1xuICAgIGNvbnN0IGJ1dHRvbnMgPSBmb3JtRWxlbWVudHMuZmlsdGVyKGZpbHRlckJ1dHRvbikuZmlsdGVyKGZpbHRlcklnbm9yZWQpO1xuICAgIGNvbnN0IGlucHV0cyA9IGZvcm1FbGVtZW50cy5maWx0ZXIoZmlsdGVySW5wdXQpLmZpbHRlcihmaWx0ZXJJZ25vcmVkKTtcblxuICAgIGJ1dHRvbnMuZm9yRWFjaCgoYnV0dG9uKSA9PiB7XG4gICAgICBidXR0b24uc2V0QXR0cmlidXRlKFBIWF9ESVNBQkxFRCwgYnV0dG9uLmRpc2FibGVkKTtcbiAgICAgIGJ1dHRvbi5kaXNhYmxlZCA9IHRydWU7XG4gICAgfSk7XG4gICAgaW5wdXRzLmZvckVhY2goKGlucHV0KSA9PiB7XG4gICAgICBpbnB1dC5zZXRBdHRyaWJ1dGUoUEhYX1JFQURPTkxZLCBpbnB1dC5yZWFkT25seSk7XG4gICAgICBpbnB1dC5yZWFkT25seSA9IHRydWU7XG4gICAgICBpZiAoaW5wdXQuZmlsZXMpIHtcbiAgICAgICAgaW5wdXQuc2V0QXR0cmlidXRlKFBIWF9ESVNBQkxFRCwgaW5wdXQuZGlzYWJsZWQpO1xuICAgICAgICBpbnB1dC5kaXNhYmxlZCA9IHRydWU7XG4gICAgICB9XG4gICAgfSk7XG4gICAgY29uc3QgZm9ybUVscyA9IGRpc2FibGVzXG4gICAgICAuY29uY2F0KGJ1dHRvbnMpXG4gICAgICAuY29uY2F0KGlucHV0cylcbiAgICAgIC5tYXAoKGVsKSA9PiB7XG4gICAgICAgIHJldHVybiB7IGVsLCBsb2FkaW5nOiB0cnVlLCBsb2NrOiB0cnVlIH07XG4gICAgICB9KTtcblxuICAgIC8vIHdlIHJldmVyc2UgdGhlIG9yZGVyIHNvIGZvcm0gY2hpbGRyZW4gYXJlIGFscmVhZHkgbG9ja2VkIGJ5IHRoZSB0aW1lXG4gICAgLy8gdGhlIGZvcm0gaXMgbG9ja2VkXG4gICAgY29uc3QgZWxzID0gW3sgZWw6IGZvcm1FbCwgbG9hZGluZzogdHJ1ZSwgbG9jazogZmFsc2UgfV1cbiAgICAgIC5jb25jYXQoZm9ybUVscylcbiAgICAgIC5yZXZlcnNlKCk7XG4gICAgcmV0dXJuIHRoaXMucHV0UmVmKGVscywgcGh4RXZlbnQsIFwic3VibWl0XCIsIG9wdHMpO1xuICB9XG5cbiAgcHVzaEZvcm1TdWJtaXQoZm9ybUVsLCB0YXJnZXRDdHgsIHBoeEV2ZW50LCBzdWJtaXR0ZXIsIG9wdHMsIG9uUmVwbHkpIHtcbiAgICBjb25zdCByZWZHZW5lcmF0b3IgPSAobWF5YmVQYXlsb2FkKSA9PlxuICAgICAgdGhpcy5kaXNhYmxlRm9ybShmb3JtRWwsIHBoeEV2ZW50LCB7XG4gICAgICAgIC4uLm9wdHMsXG4gICAgICAgIGZvcm06IGZvcm1FbCxcbiAgICAgICAgcGF5bG9hZDogbWF5YmVQYXlsb2FkPy5wYXlsb2FkLFxuICAgICAgICBzdWJtaXR0ZXI6IHN1Ym1pdHRlcixcbiAgICAgIH0pO1xuICAgIC8vIHN0b3JlIHRoZSBzdWJtaXR0ZXIgaW4gdGhlIGZvcm0gZWxlbWVudCBpbiBvcmRlciB0byB0cmlnZ2VyIGl0XG4gICAgLy8gZm9yIHBoeC10cmlnZ2VyLWFjdGlvblxuICAgIERPTS5wdXRQcml2YXRlKGZvcm1FbCwgXCJzdWJtaXR0ZXJcIiwgc3VibWl0dGVyKTtcbiAgICBjb25zdCBjaWQgPSB0aGlzLnRhcmdldENvbXBvbmVudElEKGZvcm1FbCwgdGFyZ2V0Q3R4KTtcbiAgICBpZiAoTGl2ZVVwbG9hZGVyLmhhc1VwbG9hZHNJblByb2dyZXNzKGZvcm1FbCkpIHtcbiAgICAgIGNvbnN0IFtyZWYsIF9lbHNdID0gcmVmR2VuZXJhdG9yKCk7XG4gICAgICBjb25zdCBwdXNoID0gKCkgPT5cbiAgICAgICAgdGhpcy5wdXNoRm9ybVN1Ym1pdChcbiAgICAgICAgICBmb3JtRWwsXG4gICAgICAgICAgdGFyZ2V0Q3R4LFxuICAgICAgICAgIHBoeEV2ZW50LFxuICAgICAgICAgIHN1Ym1pdHRlcixcbiAgICAgICAgICBvcHRzLFxuICAgICAgICAgIG9uUmVwbHksXG4gICAgICAgICk7XG4gICAgICByZXR1cm4gdGhpcy5zY2hlZHVsZVN1Ym1pdChmb3JtRWwsIHJlZiwgb3B0cywgcHVzaCk7XG4gICAgfSBlbHNlIGlmIChMaXZlVXBsb2FkZXIuaW5wdXRzQXdhaXRpbmdQcmVmbGlnaHQoZm9ybUVsKS5sZW5ndGggPiAwKSB7XG4gICAgICBjb25zdCBbcmVmLCBlbHNdID0gcmVmR2VuZXJhdG9yKCk7XG4gICAgICBjb25zdCBwcm94eVJlZkdlbiA9ICgpID0+IFtyZWYsIGVscywgb3B0c107XG4gICAgICB0aGlzLnVwbG9hZEZpbGVzKGZvcm1FbCwgcGh4RXZlbnQsIHRhcmdldEN0eCwgcmVmLCBjaWQsIChfdXBsb2FkcykgPT4ge1xuICAgICAgICAvLyBpZiB3ZSBzdGlsbCBoYXZpbmcgcGVuZGluZyBwcmVmbGlnaHRzIGl0IG1lYW5zIHdlIGhhdmUgaW52YWxpZCBlbnRyaWVzXG4gICAgICAgIC8vIGFuZCB0aGUgcGh4LXN1Ym1pdCBjYW5ub3QgYmUgY29tcGxldGVkXG4gICAgICAgIGlmIChMaXZlVXBsb2FkZXIuaW5wdXRzQXdhaXRpbmdQcmVmbGlnaHQoZm9ybUVsKS5sZW5ndGggPiAwKSB7XG4gICAgICAgICAgcmV0dXJuIHRoaXMudW5kb1JlZnMocmVmLCBwaHhFdmVudCk7XG4gICAgICAgIH1cbiAgICAgICAgY29uc3QgbWV0YSA9IHRoaXMuZXh0cmFjdE1ldGEoZm9ybUVsLCB7fSwgb3B0cy52YWx1ZSk7XG4gICAgICAgIGNvbnN0IGZvcm1EYXRhID0gc2VyaWFsaXplRm9ybShmb3JtRWwsIHsgc3VibWl0dGVyIH0pO1xuICAgICAgICB0aGlzLnB1c2hXaXRoUmVwbHkocHJveHlSZWZHZW4sIFwiZXZlbnRcIiwge1xuICAgICAgICAgIHR5cGU6IFwiZm9ybVwiLFxuICAgICAgICAgIGV2ZW50OiBwaHhFdmVudCxcbiAgICAgICAgICB2YWx1ZTogZm9ybURhdGEsXG4gICAgICAgICAgbWV0YTogbWV0YSxcbiAgICAgICAgICBjaWQ6IGNpZCxcbiAgICAgICAgfSlcbiAgICAgICAgICAudGhlbigoeyByZXNwIH0pID0+IG9uUmVwbHkocmVzcCkpXG4gICAgICAgICAgLmNhdGNoKChlcnJvcikgPT4gbG9nRXJyb3IoXCJGYWlsZWQgdG8gcHVzaCBmb3JtIHN1Ym1pdFwiLCBlcnJvcikpO1xuICAgICAgfSk7XG4gICAgfSBlbHNlIGlmIChcbiAgICAgICEoXG4gICAgICAgIGZvcm1FbC5oYXNBdHRyaWJ1dGUoUEhYX1JFRl9TUkMpICYmXG4gICAgICAgIGZvcm1FbC5jbGFzc0xpc3QuY29udGFpbnMoXCJwaHgtc3VibWl0LWxvYWRpbmdcIilcbiAgICAgIClcbiAgICApIHtcbiAgICAgIGNvbnN0IG1ldGEgPSB0aGlzLmV4dHJhY3RNZXRhKGZvcm1FbCwge30sIG9wdHMudmFsdWUpO1xuICAgICAgY29uc3QgZm9ybURhdGEgPSBzZXJpYWxpemVGb3JtKGZvcm1FbCwgeyBzdWJtaXR0ZXIgfSk7XG4gICAgICB0aGlzLnB1c2hXaXRoUmVwbHkocmVmR2VuZXJhdG9yLCBcImV2ZW50XCIsIHtcbiAgICAgICAgdHlwZTogXCJmb3JtXCIsXG4gICAgICAgIGV2ZW50OiBwaHhFdmVudCxcbiAgICAgICAgdmFsdWU6IGZvcm1EYXRhLFxuICAgICAgICBtZXRhOiBtZXRhLFxuICAgICAgICBjaWQ6IGNpZCxcbiAgICAgIH0pXG4gICAgICAgIC50aGVuKCh7IHJlc3AgfSkgPT4gb25SZXBseShyZXNwKSlcbiAgICAgICAgLmNhdGNoKChlcnJvcikgPT4gbG9nRXJyb3IoXCJGYWlsZWQgdG8gcHVzaCBmb3JtIHN1Ym1pdFwiLCBlcnJvcikpO1xuICAgIH1cbiAgfVxuXG4gIHVwbG9hZEZpbGVzKGZvcm1FbCwgcGh4RXZlbnQsIHRhcmdldEN0eCwgcmVmLCBjaWQsIG9uQ29tcGxldGUpIHtcbiAgICBjb25zdCBqb2luQ291bnRBdFVwbG9hZCA9IHRoaXMuam9pbkNvdW50O1xuICAgIGNvbnN0IGlucHV0RWxzID0gTGl2ZVVwbG9hZGVyLmFjdGl2ZUZpbGVJbnB1dHMoZm9ybUVsKTtcbiAgICBsZXQgbnVtRmlsZUlucHV0c0luUHJvZ3Jlc3MgPSBpbnB1dEVscy5sZW5ndGg7XG5cbiAgICAvLyBnZXQgZWFjaCBmaWxlIGlucHV0XG4gICAgaW5wdXRFbHMuZm9yRWFjaCgoaW5wdXRFbCkgPT4ge1xuICAgICAgY29uc3QgdXBsb2FkZXIgPSBuZXcgTGl2ZVVwbG9hZGVyKGlucHV0RWwsIHRoaXMsICgpID0+IHtcbiAgICAgICAgbnVtRmlsZUlucHV0c0luUHJvZ3Jlc3MtLTtcbiAgICAgICAgaWYgKG51bUZpbGVJbnB1dHNJblByb2dyZXNzID09PSAwKSB7XG4gICAgICAgICAgb25Db21wbGV0ZSgpO1xuICAgICAgICB9XG4gICAgICB9KTtcblxuICAgICAgY29uc3QgZW50cmllcyA9IHVwbG9hZGVyXG4gICAgICAgIC5lbnRyaWVzKClcbiAgICAgICAgLm1hcCgoZW50cnkpID0+IGVudHJ5LnRvUHJlZmxpZ2h0UGF5bG9hZCgpKTtcblxuICAgICAgaWYgKGVudHJpZXMubGVuZ3RoID09PSAwKSB7XG4gICAgICAgIG51bUZpbGVJbnB1dHNJblByb2dyZXNzLS07XG4gICAgICAgIHJldHVybjtcbiAgICAgIH1cblxuICAgICAgY29uc3QgcGF5bG9hZCA9IHtcbiAgICAgICAgcmVmOiBpbnB1dEVsLmdldEF0dHJpYnV0ZShQSFhfVVBMT0FEX1JFRiksXG4gICAgICAgIGVudHJpZXM6IGVudHJpZXMsXG4gICAgICAgIGNpZDogdGhpcy50YXJnZXRDb21wb25lbnRJRChpbnB1dEVsLmZvcm0sIHRhcmdldEN0eCksXG4gICAgICB9O1xuXG4gICAgICB0aGlzLmxvZyhcInVwbG9hZFwiLCAoKSA9PiBbXCJzZW5kaW5nIHByZWZsaWdodCByZXF1ZXN0XCIsIHBheWxvYWRdKTtcblxuICAgICAgdGhpcy5wdXNoV2l0aFJlcGx5KG51bGwsIFwiYWxsb3dfdXBsb2FkXCIsIHBheWxvYWQpXG4gICAgICAgIC50aGVuKCh7IHJlc3AgfSkgPT4ge1xuICAgICAgICAgIHRoaXMubG9nKFwidXBsb2FkXCIsICgpID0+IFtcImdvdCBwcmVmbGlnaHQgcmVzcG9uc2VcIiwgcmVzcF0pO1xuICAgICAgICAgIC8vIHRoZSBwcmVmbGlnaHQgd2lsbCByZWplY3QgZW50cmllcyBiZXlvbmQgdGhlIG1heCBlbnRyaWVzXG4gICAgICAgICAgLy8gc28gd2UgZXJyb3IgYW5kIGNhbmNlbCBlbnRyaWVzIG9uIHRoZSBjbGllbnQgdGhhdCBhcmUgbWlzc2luZyBmcm9tIHRoZSByZXNwb25zZVxuICAgICAgICAgIHVwbG9hZGVyLmVudHJpZXMoKS5mb3JFYWNoKChlbnRyeSkgPT4ge1xuICAgICAgICAgICAgaWYgKHJlc3AuZW50cmllcyAmJiAhcmVzcC5lbnRyaWVzW2VudHJ5LnJlZl0pIHtcbiAgICAgICAgICAgICAgdGhpcy5oYW5kbGVGYWlsZWRFbnRyeVByZWZsaWdodChcbiAgICAgICAgICAgICAgICBlbnRyeS5yZWYsXG4gICAgICAgICAgICAgICAgXCJmYWlsZWQgcHJlZmxpZ2h0XCIsXG4gICAgICAgICAgICAgICAgdXBsb2FkZXIsXG4gICAgICAgICAgICAgICk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgfSk7XG4gICAgICAgICAgLy8gZm9yIGF1dG8gdXBsb2Fkcywgd2UgbWF5IGhhdmUgYW4gZW1wdHkgZW50cmllcyByZXNwb25zZSBmcm9tIHRoZSBzZXJ2ZXJcbiAgICAgICAgICAvLyBmb3IgZm9ybSBzdWJtaXRzIHRoYXQgY29udGFpbiBpbnZhbGlkIGVudHJpZXNcbiAgICAgICAgICBpZiAocmVzcC5lcnJvciB8fCBPYmplY3Qua2V5cyhyZXNwLmVudHJpZXMpLmxlbmd0aCA9PT0gMCkge1xuICAgICAgICAgICAgdGhpcy51bmRvUmVmcyhyZWYsIHBoeEV2ZW50KTtcbiAgICAgICAgICAgIGNvbnN0IGVycm9ycyA9IHJlc3AuZXJyb3IgfHwgW107XG4gICAgICAgICAgICBlcnJvcnMubWFwKChbZW50cnlfcmVmLCByZWFzb25dKSA9PiB7XG4gICAgICAgICAgICAgIHRoaXMuaGFuZGxlRmFpbGVkRW50cnlQcmVmbGlnaHQoZW50cnlfcmVmLCByZWFzb24sIHVwbG9hZGVyKTtcbiAgICAgICAgICAgIH0pO1xuICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICBjb25zdCBvbkVycm9yID0gKGNhbGxiYWNrKSA9PiB7XG4gICAgICAgICAgICAgIHRoaXMuY2hhbm5lbC5vbkVycm9yKCgpID0+IHtcbiAgICAgICAgICAgICAgICBpZiAodGhpcy5qb2luQ291bnQgPT09IGpvaW5Db3VudEF0VXBsb2FkKSB7XG4gICAgICAgICAgICAgICAgICBjYWxsYmFjaygpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICB9O1xuICAgICAgICAgICAgdXBsb2FkZXIuaW5pdEFkYXB0ZXJVcGxvYWQocmVzcCwgb25FcnJvciwgdGhpcy5saXZlU29ja2V0KTtcbiAgICAgICAgICB9XG4gICAgICAgIH0pXG4gICAgICAgIC5jYXRjaCgoZXJyb3IpID0+IGxvZ0Vycm9yKFwiRmFpbGVkIHRvIHB1c2ggdXBsb2FkXCIsIGVycm9yKSk7XG4gICAgfSk7XG4gIH1cblxuICBoYW5kbGVGYWlsZWRFbnRyeVByZWZsaWdodCh1cGxvYWRSZWYsIHJlYXNvbiwgdXBsb2FkZXIpIHtcbiAgICBpZiAodXBsb2FkZXIuaXNBdXRvVXBsb2FkKCkpIHtcbiAgICAgIC8vIHVwbG9hZFJlZiBtYXkgYmUgdG9wIGxldmVsIHVwbG9hZCBjb25maWcgcmVmIG9yIGVudHJ5IHJlZlxuICAgICAgY29uc3QgZW50cnkgPSB1cGxvYWRlclxuICAgICAgICAuZW50cmllcygpXG4gICAgICAgIC5maW5kKChlbnRyeSkgPT4gZW50cnkucmVmID09PSB1cGxvYWRSZWYudG9TdHJpbmcoKSk7XG4gICAgICBpZiAoZW50cnkpIHtcbiAgICAgICAgZW50cnkuY2FuY2VsKCk7XG4gICAgICB9XG4gICAgfSBlbHNlIHtcbiAgICAgIHVwbG9hZGVyLmVudHJpZXMoKS5tYXAoKGVudHJ5KSA9PiBlbnRyeS5jYW5jZWwoKSk7XG4gICAgfVxuICAgIHRoaXMubG9nKFwidXBsb2FkXCIsICgpID0+IFtgZXJyb3IgZm9yIGVudHJ5ICR7dXBsb2FkUmVmfWAsIHJlYXNvbl0pO1xuICB9XG5cbiAgZGlzcGF0Y2hVcGxvYWRzKHRhcmdldEN0eCwgbmFtZSwgZmlsZXNPckJsb2JzKSB7XG4gICAgY29uc3QgdGFyZ2V0RWxlbWVudCA9IHRoaXMudGFyZ2V0Q3R4RWxlbWVudCh0YXJnZXRDdHgpIHx8IHRoaXMuZWw7XG4gICAgY29uc3QgaW5wdXRzID0gRE9NLmZpbmRVcGxvYWRJbnB1dHModGFyZ2V0RWxlbWVudCkuZmlsdGVyKFxuICAgICAgKGVsKSA9PiBlbC5uYW1lID09PSBuYW1lLFxuICAgICk7XG4gICAgaWYgKGlucHV0cy5sZW5ndGggPT09IDApIHtcbiAgICAgIGxvZ0Vycm9yKGBubyBsaXZlIGZpbGUgaW5wdXRzIGZvdW5kIG1hdGNoaW5nIHRoZSBuYW1lIFwiJHtuYW1lfVwiYCk7XG4gICAgfSBlbHNlIGlmIChpbnB1dHMubGVuZ3RoID4gMSkge1xuICAgICAgbG9nRXJyb3IoYGR1cGxpY2F0ZSBsaXZlIGZpbGUgaW5wdXRzIGZvdW5kIG1hdGNoaW5nIHRoZSBuYW1lIFwiJHtuYW1lfVwiYCk7XG4gICAgfSBlbHNlIHtcbiAgICAgIERPTS5kaXNwYXRjaEV2ZW50KGlucHV0c1swXSwgUEhYX1RSQUNLX1VQTE9BRFMsIHtcbiAgICAgICAgZGV0YWlsOiB7IGZpbGVzOiBmaWxlc09yQmxvYnMgfSxcbiAgICAgIH0pO1xuICAgIH1cbiAgfVxuXG4gIHRhcmdldEN0eEVsZW1lbnQodGFyZ2V0Q3R4KSB7XG4gICAgaWYgKGlzQ2lkKHRhcmdldEN0eCkpIHtcbiAgICAgIGNvbnN0IFt0YXJnZXRdID0gRE9NLmZpbmRDb21wb25lbnROb2RlTGlzdCh0aGlzLmlkLCB0YXJnZXRDdHgpO1xuICAgICAgcmV0dXJuIHRhcmdldDtcbiAgICB9IGVsc2UgaWYgKHRhcmdldEN0eCkge1xuICAgICAgcmV0dXJuIHRhcmdldEN0eDtcbiAgICB9IGVsc2Uge1xuICAgICAgcmV0dXJuIG51bGw7XG4gICAgfVxuICB9XG5cbiAgcHVzaEZvcm1SZWNvdmVyeShvbGRGb3JtLCBuZXdGb3JtLCB0ZW1wbGF0ZURvbSwgY2FsbGJhY2spIHtcbiAgICAvLyB3ZSBhcmUgb25seSByZWNvdmVyaW5nIGZvcm1zIGluc2lkZSB0aGUgY3VycmVudCB2aWV3LCB0aGVyZWZvcmUgaXQgaXMgc2FmZSB0b1xuICAgIC8vIHNraXAgd2l0aGluT3duZXJzIGhlcmUgYW5kIGFsd2F5cyB1c2UgdGhpcyB3aGVuIHJlZmVycmluZyB0byB0aGUgdmlld1xuICAgIGNvbnN0IHBoeENoYW5nZSA9IHRoaXMuYmluZGluZyhcImNoYW5nZVwiKTtcbiAgICBjb25zdCBwaHhUYXJnZXQgPSBuZXdGb3JtLmdldEF0dHJpYnV0ZSh0aGlzLmJpbmRpbmcoXCJ0YXJnZXRcIikpIHx8IG5ld0Zvcm07XG4gICAgY29uc3QgcGh4RXZlbnQgPVxuICAgICAgbmV3Rm9ybS5nZXRBdHRyaWJ1dGUodGhpcy5iaW5kaW5nKFBIWF9BVVRPX1JFQ09WRVIpKSB8fFxuICAgICAgbmV3Rm9ybS5nZXRBdHRyaWJ1dGUodGhpcy5iaW5kaW5nKFwiY2hhbmdlXCIpKTtcbiAgICBjb25zdCBpbnB1dHMgPSBBcnJheS5mcm9tKG9sZEZvcm0uZWxlbWVudHMpLmZpbHRlcihcbiAgICAgIChlbCkgPT4gRE9NLmlzRm9ybUlucHV0KGVsKSAmJiBlbC5uYW1lICYmICFlbC5oYXNBdHRyaWJ1dGUocGh4Q2hhbmdlKSxcbiAgICApO1xuICAgIGlmIChpbnB1dHMubGVuZ3RoID09PSAwKSB7XG4gICAgICBjYWxsYmFjaygpO1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIC8vIHdlIG11c3QgY2xlYXIgdHJhY2tlZCB1cGxvYWRzIGJlZm9yZSByZWNvdmVyeSBhcyB0aGV5IG5vIGxvbmdlciBoYXZlIHZhbGlkIHJlZnNcbiAgICBpbnB1dHMuZm9yRWFjaChcbiAgICAgIChpbnB1dCkgPT5cbiAgICAgICAgaW5wdXQuaGFzQXR0cmlidXRlKFBIWF9VUExPQURfUkVGKSAmJiBMaXZlVXBsb2FkZXIuY2xlYXJGaWxlcyhpbnB1dCksXG4gICAgKTtcbiAgICAvLyBwdXNoSW5wdXQgYXNzdW1lcyB0aGF0IHRoZXJlIGlzIGEgc291cmNlIGVsZW1lbnQgdGhhdCBpbml0aWF0ZWQgdGhlIGNoYW5nZTtcbiAgICAvLyBiZWNhdXNlIHRoaXMgaXMgbm90IHRoZSBjYXNlIHdoZW4gd2UgcmVjb3ZlciBmb3Jtcywgd2UgcHJvdmlkZSB0aGUgZmlyc3QgaW5wdXQgd2UgZmluZFxuICAgIGNvbnN0IGlucHV0ID0gaW5wdXRzLmZpbmQoKGVsKSA9PiBlbC50eXBlICE9PSBcImhpZGRlblwiKSB8fCBpbnB1dHNbMF07XG5cbiAgICAvLyBpbiB0aGUgY2FzZSB0aGF0IHRoZXJlIGFyZSBtdWx0aXBsZSB0YXJnZXRzLCB3ZSBjb3VudCB0aGUgbnVtYmVyIG9mIHBlbmRpbmcgcmVjb3ZlcnkgZXZlbnRzXG4gICAgLy8gYW5kIG9ubHkgY2FsbCB0aGUgY2FsbGJhY2sgb25jZSBhbGwgZXZlbnRzIGhhdmUgYmVlbiBwcm9jZXNzZWRcbiAgICBsZXQgcGVuZGluZyA9IDA7XG4gICAgLy8gd2l0aGluVGFyZ2V0cyhwaHhUYXJnZXQsIGNhbGxiYWNrLCBkb20sIHZpZXdFbClcbiAgICB0aGlzLndpdGhpblRhcmdldHMoXG4gICAgICBwaHhUYXJnZXQsXG4gICAgICAodGFyZ2V0VmlldywgdGFyZ2V0Q3R4KSA9PiB7XG4gICAgICAgIGNvbnN0IGNpZCA9IHRoaXMudGFyZ2V0Q29tcG9uZW50SUQobmV3Rm9ybSwgdGFyZ2V0Q3R4KTtcbiAgICAgICAgcGVuZGluZysrO1xuICAgICAgICBsZXQgZSA9IG5ldyBDdXN0b21FdmVudChcInBoeDpmb3JtLXJlY292ZXJ5XCIsIHtcbiAgICAgICAgICBkZXRhaWw6IHsgc291cmNlRWxlbWVudDogb2xkRm9ybSB9LFxuICAgICAgICB9KTtcbiAgICAgICAgSlMuZXhlYyhlLCBcImNoYW5nZVwiLCBwaHhFdmVudCwgdGhpcywgaW5wdXQsIFtcbiAgICAgICAgICBcInB1c2hcIixcbiAgICAgICAgICB7XG4gICAgICAgICAgICBfdGFyZ2V0OiBpbnB1dC5uYW1lLFxuICAgICAgICAgICAgdGFyZ2V0VmlldyxcbiAgICAgICAgICAgIHRhcmdldEN0eCxcbiAgICAgICAgICAgIG5ld0NpZDogY2lkLFxuICAgICAgICAgICAgY2FsbGJhY2s6ICgpID0+IHtcbiAgICAgICAgICAgICAgcGVuZGluZy0tO1xuICAgICAgICAgICAgICBpZiAocGVuZGluZyA9PT0gMCkge1xuICAgICAgICAgICAgICAgIGNhbGxiYWNrKCk7XG4gICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgfSxcbiAgICAgICAgXSk7XG4gICAgICB9LFxuICAgICAgdGVtcGxhdGVEb20sXG4gICAgKTtcbiAgfVxuXG4gIHB1c2hMaW5rUGF0Y2goZSwgaHJlZiwgdGFyZ2V0RWwsIGNhbGxiYWNrKSB7XG4gICAgY29uc3QgbGlua1JlZiA9IHRoaXMubGl2ZVNvY2tldC5zZXRQZW5kaW5nTGluayhocmVmKTtcbiAgICAvLyBvbmx5IGFkZCBsb2FkaW5nIHN0YXRlcyBpZiBldmVudCBpcyB0cnVzdGVkIChpdCB3YXMgdHJpZ2dlcmVkIGJ5IHVzZXIsIHN1Y2ggYXMgY2xpY2spIGFuZFxuICAgIC8vIGl0J3Mgbm90IGEgZm9yd2FyZC9iYWNrIG5hdmlnYXRpb24gZnJvbSBwb3BzdGF0ZVxuICAgIGNvbnN0IGxvYWRpbmcgPSBlLmlzVHJ1c3RlZCAmJiBlLnR5cGUgIT09IFwicG9wc3RhdGVcIjtcbiAgICBjb25zdCByZWZHZW4gPSB0YXJnZXRFbFxuICAgICAgPyAoKSA9PlxuICAgICAgICAgIHRoaXMucHV0UmVmKFxuICAgICAgICAgICAgW3sgZWw6IHRhcmdldEVsLCBsb2FkaW5nOiBsb2FkaW5nLCBsb2NrOiB0cnVlIH1dLFxuICAgICAgICAgICAgbnVsbCxcbiAgICAgICAgICAgIFwiY2xpY2tcIixcbiAgICAgICAgICApXG4gICAgICA6IG51bGw7XG4gICAgY29uc3QgZmFsbGJhY2sgPSAoKSA9PiB0aGlzLmxpdmVTb2NrZXQucmVkaXJlY3Qod2luZG93LmxvY2F0aW9uLmhyZWYpO1xuICAgIGNvbnN0IHVybCA9IGhyZWYuc3RhcnRzV2l0aChcIi9cIilcbiAgICAgID8gYCR7bG9jYXRpb24ucHJvdG9jb2x9Ly8ke2xvY2F0aW9uLmhvc3R9JHtocmVmfWBcbiAgICAgIDogaHJlZjtcblxuICAgIHRoaXMucHVzaFdpdGhSZXBseShyZWZHZW4sIFwibGl2ZV9wYXRjaFwiLCB7IHVybCB9KS50aGVuKFxuICAgICAgKHsgcmVzcCB9KSA9PiB7XG4gICAgICAgIHRoaXMubGl2ZVNvY2tldC5yZXF1ZXN0RE9NVXBkYXRlKCgpID0+IHtcbiAgICAgICAgICBpZiAocmVzcC5saW5rX3JlZGlyZWN0KSB7XG4gICAgICAgICAgICB0aGlzLmxpdmVTb2NrZXQucmVwbGFjZU1haW4oaHJlZiwgbnVsbCwgY2FsbGJhY2ssIGxpbmtSZWYpO1xuICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICBpZiAodGhpcy5saXZlU29ja2V0LmNvbW1pdFBlbmRpbmdMaW5rKGxpbmtSZWYpKSB7XG4gICAgICAgICAgICAgIHRoaXMuaHJlZiA9IGhyZWY7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICB0aGlzLmFwcGx5UGVuZGluZ1VwZGF0ZXMoKTtcbiAgICAgICAgICAgIGNhbGxiYWNrICYmIGNhbGxiYWNrKGxpbmtSZWYpO1xuICAgICAgICAgIH1cbiAgICAgICAgfSk7XG4gICAgICB9LFxuICAgICAgKHsgZXJyb3I6IF9lcnJvciwgdGltZW91dDogX3RpbWVvdXQgfSkgPT4gZmFsbGJhY2soKSxcbiAgICApO1xuICB9XG5cbiAgZ2V0Rm9ybXNGb3JSZWNvdmVyeSgpIHtcbiAgICAvLyBGb3JtIHJlY292ZXJ5IGlzIGNvbXBsZXggaW4gTGl2ZVZpZXc6XG4gICAgLy8gV2Ugd2FudCB0byBzdXBwb3J0IG5lc3RlZCBMaXZlVmlld3MgYW5kIGFsc28gcHJvdmlkZSBhIGdvb2QgdXNlciBleHBlcmllbmNlLlxuICAgIC8vIFRoZXJlZm9yZSwgd2hlbiB0aGUgY2hhbm5lbCByZWpvaW5zLCB3ZSBjb3B5IGFsbCBmb3JtcyB0aGF0IGFyZSBlbGlnaWJsZSBmb3JcbiAgICAvLyByZWNvdmVyeSB0byBiZSBhYmxlIHRvIGFjY2VzcyB0aGVtIGxhdGVyLlxuICAgIC8vIFdoeSBkbyB3ZSBuZWVkIHRvIGNvcHkgdGhlbT8gQmVjYXVzZSB3aGVuIHRoZSBtYWluIExpdmVWaWV3IGpvaW5zLCBhbnkgZm9ybXNcbiAgICAvLyBpbiBuZXN0ZWQgTGl2ZVZpZXdzIHdvdWxkIGJlIGxvc3QuXG4gICAgLy9cbiAgICAvLyBXZSBzaG91bGQgcmV3b3JrIHRoaXMgaW4gdGhlIGZ1dHVyZSB0byBzZXJpYWxpemUgdGhlIGZvcm0gcGF5bG9hZCBoZXJlXG4gICAgLy8gaW5zdGVhZCBvZiBjbG9uaW5nIHRoZSBET00gbm9kZXMsIGJ1dCBtYWtpbmcgdGhpcyB3b3JrIGNvcnJlY3RseSBpcyB0ZWRpb3VzLFxuICAgIC8vIGFzIHNlbmRpbmcgdGhlIGNvcnJlY3QgZm9ybSBwYXlsb2FkIHJlbGllcyBvbiBKUy5wdXNoIHRvIGV4dHJhY3QgdmFsdWVzXG4gICAgLy8gZnJvbSBKUyBjb21tYW5kcyAocGh4LWNoYW5nZT17SlMucHVzaChcImV2ZW50XCIsIHZhbHVlOiAuLi4sIHRhcmdldDogLi4uKX0pLFxuICAgIC8vIGFzIHdlbGwgYXMgdmlldy5wdXNoSW5wdXQsIHdoaWNoIGV4cGVjdHMgRE9NIGVsZW1lbnRzLlxuXG4gICAgaWYgKHRoaXMuam9pbkNvdW50ID09PSAwKSB7XG4gICAgICByZXR1cm4ge307XG4gICAgfVxuXG4gICAgY29uc3QgcGh4Q2hhbmdlID0gdGhpcy5iaW5kaW5nKFwiY2hhbmdlXCIpO1xuXG4gICAgcmV0dXJuIERPTS5hbGwoXG4gICAgICBkb2N1bWVudCxcbiAgICAgIGAjJHtDU1MuZXNjYXBlKHRoaXMuaWQpfSBmb3JtWyR7cGh4Q2hhbmdlfV0sIFske1BIWF9URUxFUE9SVEVEX1JFRn09XCIke0NTUy5lc2NhcGUodGhpcy5pZCl9XCJdIGZvcm1bJHtwaHhDaGFuZ2V9XWAsXG4gICAgKVxuICAgICAgLmZpbHRlcigoZm9ybSkgPT4gZm9ybS5pZClcbiAgICAgIC5maWx0ZXIoKGZvcm0pID0+IGZvcm0uZWxlbWVudHMubGVuZ3RoID4gMClcbiAgICAgIC5maWx0ZXIoXG4gICAgICAgIChmb3JtKSA9PlxuICAgICAgICAgIGZvcm0uZ2V0QXR0cmlidXRlKHRoaXMuYmluZGluZyhQSFhfQVVUT19SRUNPVkVSKSkgIT09IFwiaWdub3JlXCIsXG4gICAgICApXG4gICAgICAubWFwKChmb3JtKSA9PiB7XG4gICAgICAgIC8vIFdlIG5lZWQgdG8gY2xvbmUgdGhlIHdob2xlIGZvcm0sIGFzIHJlbHlpbmcgb24gZm9ybS5lbGVtZW50cyBjYW4gbGVhZCB0b1xuICAgICAgICAvLyBzaXR1YXRpb25zIHdoZXJlIHdlIGhhdmVcbiAgICAgICAgLy9cbiAgICAgICAgLy8gICA8Zm9ybT48ZmllbGRzZXQgZGlzYWJsZWQ+PGlucHV0IG5hbWU9XCJmb29cIiB2YWx1ZT1cImJhclwiPjwvZmllbGRzZXQ+PC9mb3JtPlxuICAgICAgICAvL1xuICAgICAgICAvLyBhbmQgZm9ybS5lbGVtZW50cyByZXR1cm5zIGJvdGggdGhlIGZpZWxkc2V0IGFuZCB0aGUgaW5wdXQgc2VwYXJhdGVseS5cbiAgICAgICAgLy8gQmVjYXVzZSB0aGUgZmllbGRzZXQgaXMgZGlzYWJsZWQsIHRoZSBpbnB1dCBzaG91bGQgTk9UIGJlIHNlbnQgdGhvdWdoLlxuICAgICAgICAvLyBXZSBjYW4gb25seSByZWxpYWJseSBzZXJpYWxpemUgdGhlIGZvcm0gYnkgY2xvbmluZyBpdCBmdWxseS5cbiAgICAgICAgY29uc3QgY2xvbmVkRm9ybSA9IGZvcm0uY2xvbmVOb2RlKHRydWUpO1xuICAgICAgICAvLyB3ZSBjYWxsIG1vcnBoZG9tIHRvIGNvcHkgYW55IHNwZWNpYWwgc3RhdGVcbiAgICAgICAgLy8gbGlrZSB0aGUgc2VsZWN0ZWQgb3B0aW9uIG9mIGEgPHNlbGVjdD4gZWxlbWVudDtcbiAgICAgICAgLy8gYW55IGFsc28gY29weSBvdmVyIHByaXZhdGVzICh3aGljaCBjb250YWluIGluZm9ybWF0aW9uIGFib3V0IHRvdWNoZWQgZmllbGRzKVxuICAgICAgICBtb3JwaGRvbShjbG9uZWRGb3JtLCBmb3JtLCB7XG4gICAgICAgICAgb25CZWZvcmVFbFVwZGF0ZWQ6IChmcm9tRWwsIHRvRWwpID0+IHtcbiAgICAgICAgICAgIERPTS5jb3B5UHJpdmF0ZXMoZnJvbUVsLCB0b0VsKTtcbiAgICAgICAgICAgIHJldHVybiB0cnVlO1xuICAgICAgICAgIH0sXG4gICAgICAgIH0pO1xuICAgICAgICAvLyBuZXh0IHVwLCB3ZSBhbHNvIG5lZWQgdG8gY2xvbmUgYW55IGVsZW1lbnRzIHdpdGggZm9ybT1cImlkXCIgcGFyYW1ldGVyXG4gICAgICAgIGNvbnN0IGV4dGVybmFsRWxlbWVudHMgPSBkb2N1bWVudC5xdWVyeVNlbGVjdG9yQWxsKFxuICAgICAgICAgIGBbZm9ybT1cIiR7Zm9ybS5pZH1cIl1gLFxuICAgICAgICApO1xuICAgICAgICBBcnJheS5mcm9tKGV4dGVybmFsRWxlbWVudHMpLmZvckVhY2goKGVsKSA9PiB7XG4gICAgICAgICAgaWYgKGZvcm0uY29udGFpbnMoZWwpKSB7XG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgICAgfVxuICAgICAgICAgIGNvbnN0IGNsb25lZEVsID0gZWwuY2xvbmVOb2RlKHRydWUpO1xuICAgICAgICAgIG1vcnBoZG9tKGNsb25lZEVsLCBlbCk7XG4gICAgICAgICAgRE9NLmNvcHlQcml2YXRlcyhjbG9uZWRFbCwgZWwpO1xuICAgICAgICAgIGNsb25lZEZvcm0uYXBwZW5kQ2hpbGQoY2xvbmVkRWwpO1xuICAgICAgICB9KTtcbiAgICAgICAgcmV0dXJuIGNsb25lZEZvcm07XG4gICAgICB9KVxuICAgICAgLnJlZHVjZSgoYWNjLCBmb3JtKSA9PiB7XG4gICAgICAgIGFjY1tmb3JtLmlkXSA9IGZvcm07XG4gICAgICAgIHJldHVybiBhY2M7XG4gICAgICB9LCB7fSk7XG4gIH1cblxuICBtYXliZVB1c2hDb21wb25lbnRzRGVzdHJveWVkKGRlc3Ryb3llZENJRHMpIHtcbiAgICBsZXQgd2lsbERlc3Ryb3lDSURzID0gZGVzdHJveWVkQ0lEcy5maWx0ZXIoKGNpZCkgPT4ge1xuICAgICAgcmV0dXJuIERPTS5maW5kQ29tcG9uZW50Tm9kZUxpc3QodGhpcy5pZCwgY2lkKS5sZW5ndGggPT09IDA7XG4gICAgfSk7XG5cbiAgICBjb25zdCBvbkVycm9yID0gKGVycm9yKSA9PiB7XG4gICAgICBpZiAoIXRoaXMuaXNEZXN0cm95ZWQoKSkge1xuICAgICAgICBsb2dFcnJvcihcIkZhaWxlZCB0byBwdXNoIGNvbXBvbmVudHMgZGVzdHJveWVkXCIsIGVycm9yKTtcbiAgICAgIH1cbiAgICB9O1xuXG4gICAgaWYgKHdpbGxEZXN0cm95Q0lEcy5sZW5ndGggPiAwKSB7XG4gICAgICAvLyB3ZSBtdXN0IHJlc2V0IHRoZSByZW5kZXIgY2hhbmdlIHRyYWNraW5nIGZvciBjaWRzIHRoYXRcbiAgICAgIC8vIGNvdWxkIGJlIGFkZGVkIGJhY2sgZnJvbSB0aGUgc2VydmVyIHNvIHdlIGRvbid0IHNraXAgdGhlbVxuICAgICAgd2lsbERlc3Ryb3lDSURzLmZvckVhY2goKGNpZCkgPT4gdGhpcy5yZW5kZXJlZC5yZXNldFJlbmRlcihjaWQpKTtcblxuICAgICAgdGhpcy5wdXNoV2l0aFJlcGx5KG51bGwsIFwiY2lkc193aWxsX2Rlc3Ryb3lcIiwgeyBjaWRzOiB3aWxsRGVzdHJveUNJRHMgfSlcbiAgICAgICAgLnRoZW4oKCkgPT4ge1xuICAgICAgICAgIC8vIHdlIG11c3Qgd2FpdCBmb3IgcGVuZGluZyB0cmFuc2l0aW9ucyB0byBjb21wbGV0ZSBiZWZvcmUgZGV0ZXJtaW5pbmdcbiAgICAgICAgICAvLyBpZiB0aGUgY2lkcyB3ZXJlIGFkZGVkIGJhY2sgdG8gdGhlIERPTSBpbiB0aGUgbWVhbnRpbWUgKCMzMTM5KVxuICAgICAgICAgIHRoaXMubGl2ZVNvY2tldC5yZXF1ZXN0RE9NVXBkYXRlKCgpID0+IHtcbiAgICAgICAgICAgIC8vIFNlZSBpZiBhbnkgb2YgdGhlIGNpZHMgd2Ugd2FudGVkIHRvIGRlc3Ryb3kgd2VyZSBhZGRlZCBiYWNrLFxuICAgICAgICAgICAgLy8gaWYgdGhleSB3ZXJlIGFkZGVkIGJhY2ssIHdlIGRvbid0IGFjdHVhbGx5IGRlc3Ryb3kgdGhlbS5cbiAgICAgICAgICAgIGxldCBjb21wbGV0ZWx5RGVzdHJveUNJRHMgPSB3aWxsRGVzdHJveUNJRHMuZmlsdGVyKChjaWQpID0+IHtcbiAgICAgICAgICAgICAgcmV0dXJuIERPTS5maW5kQ29tcG9uZW50Tm9kZUxpc3QodGhpcy5pZCwgY2lkKS5sZW5ndGggPT09IDA7XG4gICAgICAgICAgICB9KTtcblxuICAgICAgICAgICAgaWYgKGNvbXBsZXRlbHlEZXN0cm95Q0lEcy5sZW5ndGggPiAwKSB7XG4gICAgICAgICAgICAgIHRoaXMucHVzaFdpdGhSZXBseShudWxsLCBcImNpZHNfZGVzdHJveWVkXCIsIHtcbiAgICAgICAgICAgICAgICBjaWRzOiBjb21wbGV0ZWx5RGVzdHJveUNJRHMsXG4gICAgICAgICAgICAgIH0pXG4gICAgICAgICAgICAgICAgLnRoZW4oKHsgcmVzcCB9KSA9PiB7XG4gICAgICAgICAgICAgICAgICB0aGlzLnJlbmRlcmVkLnBydW5lQ0lEcyhyZXNwLmNpZHMpO1xuICAgICAgICAgICAgICAgIH0pXG4gICAgICAgICAgICAgICAgLmNhdGNoKG9uRXJyb3IpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgIH0pO1xuICAgICAgICB9KVxuICAgICAgICAuY2F0Y2gob25FcnJvcik7XG4gICAgfVxuICB9XG5cbiAgb3duc0VsZW1lbnQoZWwpIHtcbiAgICBsZXQgcGFyZW50Vmlld0VsID0gRE9NLmNsb3Nlc3RWaWV3RWwoZWwpO1xuICAgIHJldHVybiAoXG4gICAgICBlbC5nZXRBdHRyaWJ1dGUoUEhYX1BBUkVOVF9JRCkgPT09IHRoaXMuaWQgfHxcbiAgICAgIChwYXJlbnRWaWV3RWwgJiYgcGFyZW50Vmlld0VsLmlkID09PSB0aGlzLmlkKSB8fFxuICAgICAgKCFwYXJlbnRWaWV3RWwgJiYgdGhpcy5pc0RlYWQpXG4gICAgKTtcbiAgfVxuXG4gIHN1Ym1pdEZvcm0oZm9ybSwgdGFyZ2V0Q3R4LCBwaHhFdmVudCwgc3VibWl0dGVyLCBvcHRzID0ge30pIHtcbiAgICBET00ucHV0UHJpdmF0ZShmb3JtLCBQSFhfSEFTX1NVQk1JVFRFRCwgdHJ1ZSk7XG4gICAgY29uc3QgaW5wdXRzID0gQXJyYXkuZnJvbShmb3JtLmVsZW1lbnRzKTtcbiAgICBpbnB1dHMuZm9yRWFjaCgoaW5wdXQpID0+IERPTS5wdXRQcml2YXRlKGlucHV0LCBQSFhfSEFTX1NVQk1JVFRFRCwgdHJ1ZSkpO1xuICAgIHRoaXMubGl2ZVNvY2tldC5ibHVyQWN0aXZlRWxlbWVudCh0aGlzKTtcbiAgICB0aGlzLnB1c2hGb3JtU3VibWl0KGZvcm0sIHRhcmdldEN0eCwgcGh4RXZlbnQsIHN1Ym1pdHRlciwgb3B0cywgKCkgPT4ge1xuICAgICAgdGhpcy5saXZlU29ja2V0LnJlc3RvcmVQcmV2aW91c2x5QWN0aXZlRm9jdXMoKTtcbiAgICB9KTtcbiAgfVxuXG4gIGJpbmRpbmcoa2luZCkge1xuICAgIHJldHVybiB0aGlzLmxpdmVTb2NrZXQuYmluZGluZyhraW5kKTtcbiAgfVxuXG4gIC8vIHBoeC1wb3J0YWxcbiAgcHVzaFBvcnRhbEVsZW1lbnRJZChpZCkge1xuICAgIHRoaXMucG9ydGFsRWxlbWVudElkcy5hZGQoaWQpO1xuICB9XG5cbiAgZHJvcFBvcnRhbEVsZW1lbnRJZChpZCkge1xuICAgIHRoaXMucG9ydGFsRWxlbWVudElkcy5kZWxldGUoaWQpO1xuICB9XG5cbiAgZGVzdHJveVBvcnRhbEVsZW1lbnRzKCkge1xuICAgIHRoaXMucG9ydGFsRWxlbWVudElkcy5mb3JFYWNoKChpZCkgPT4ge1xuICAgICAgY29uc3QgZWwgPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZChpZCk7XG4gICAgICBpZiAoZWwpIHtcbiAgICAgICAgZWwucmVtb3ZlKCk7XG4gICAgICB9XG4gICAgfSk7XG4gIH1cbn1cbiIsICJpbXBvcnQge1xuICBCSU5ESU5HX1BSRUZJWCxcbiAgQ09OU0VDVVRJVkVfUkVMT0FEUyxcbiAgREVGQVVMVFMsXG4gIEZBSUxTQUZFX0pJVFRFUixcbiAgTE9BREVSX1RJTUVPVVQsXG4gIERJU0NPTk5FQ1RFRF9USU1FT1VULFxuICBNQVhfUkVMT0FEUyxcbiAgUEhYX0RFQk9VTkNFLFxuICBQSFhfRFJPUF9UQVJHRVQsXG4gIFBIWF9IQVNfRk9DVVNFRCxcbiAgUEhYX0tFWSxcbiAgUEhYX0xJTktfU1RBVEUsXG4gIFBIWF9MSVZFX0xJTkssXG4gIFBIWF9MVl9ERUJVRyxcbiAgUEhYX0xWX0xBVEVOQ1lfU0lNLFxuICBQSFhfTFZfUFJPRklMRSxcbiAgUEhYX0xWX0hJU1RPUllfUE9TSVRJT04sXG4gIFBIWF9NQUlOLFxuICBQSFhfUEFSRU5UX0lELFxuICBQSFhfVklFV19TRUxFQ1RPUixcbiAgUEhYX1JPT1RfSUQsXG4gIFBIWF9USFJPVFRMRSxcbiAgUEhYX1RSQUNLX1VQTE9BRFMsXG4gIFBIWF9TRVNTSU9OLFxuICBSRUxPQURfSklUVEVSX01JTixcbiAgUkVMT0FEX0pJVFRFUl9NQVgsXG4gIFBIWF9SRUZfU1JDLFxuICBQSFhfUkVMT0FEX1NUQVRVUyxcbiAgUEhYX1JVTlRJTUVfSE9PSyxcbn0gZnJvbSBcIi4vY29uc3RhbnRzXCI7XG5cbmltcG9ydCB7XG4gIGNsb25lLFxuICBjbG9zZXN0UGh4QmluZGluZyxcbiAgY2xvc3VyZSxcbiAgZGVidWcsXG4gIG1heWJlLFxuICBsb2dFcnJvcixcbn0gZnJvbSBcIi4vdXRpbHNcIjtcblxuaW1wb3J0IEJyb3dzZXIgZnJvbSBcIi4vYnJvd3NlclwiO1xuaW1wb3J0IERPTSBmcm9tIFwiLi9kb21cIjtcbmltcG9ydCBIb29rcyBmcm9tIFwiLi9ob29rc1wiO1xuaW1wb3J0IExpdmVVcGxvYWRlciBmcm9tIFwiLi9saXZlX3VwbG9hZGVyXCI7XG5pbXBvcnQgVmlldyBmcm9tIFwiLi92aWV3XCI7XG5pbXBvcnQgSlMgZnJvbSBcIi4vanNcIjtcbmltcG9ydCBqc0NvbW1hbmRzIGZyb20gXCIuL2pzX2NvbW1hbmRzXCI7XG5cbmV4cG9ydCBjb25zdCBpc1VzZWRJbnB1dCA9IChlbCkgPT4gRE9NLmlzVXNlZElucHV0KGVsKTtcblxuZXhwb3J0IGRlZmF1bHQgY2xhc3MgTGl2ZVNvY2tldCB7XG4gIGNvbnN0cnVjdG9yKHVybCwgcGh4U29ja2V0LCBvcHRzID0ge30pIHtcbiAgICB0aGlzLnVubG9hZGVkID0gZmFsc2U7XG4gICAgaWYgKCFwaHhTb2NrZXQgfHwgcGh4U29ja2V0LmNvbnN0cnVjdG9yLm5hbWUgPT09IFwiT2JqZWN0XCIpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcihgXG4gICAgICBhIHBob2VuaXggU29ja2V0IG11c3QgYmUgcHJvdmlkZWQgYXMgdGhlIHNlY29uZCBhcmd1bWVudCB0byB0aGUgTGl2ZVNvY2tldCBjb25zdHJ1Y3Rvci4gRm9yIGV4YW1wbGU6XG5cbiAgICAgICAgICBpbXBvcnQge1NvY2tldH0gZnJvbSBcInBob2VuaXhcIlxuICAgICAgICAgIGltcG9ydCB7TGl2ZVNvY2tldH0gZnJvbSBcInBob2VuaXhfbGl2ZV92aWV3XCJcbiAgICAgICAgICBsZXQgbGl2ZVNvY2tldCA9IG5ldyBMaXZlU29ja2V0KFwiL2xpdmVcIiwgU29ja2V0LCB7Li4ufSlcbiAgICAgIGApO1xuICAgIH1cbiAgICB0aGlzLnNvY2tldCA9IG5ldyBwaHhTb2NrZXQodXJsLCBvcHRzKTtcbiAgICB0aGlzLmJpbmRpbmdQcmVmaXggPSBvcHRzLmJpbmRpbmdQcmVmaXggfHwgQklORElOR19QUkVGSVg7XG4gICAgdGhpcy5vcHRzID0gb3B0cztcbiAgICB0aGlzLnBhcmFtcyA9IGNsb3N1cmUob3B0cy5wYXJhbXMgfHwge30pO1xuICAgIHRoaXMudmlld0xvZ2dlciA9IG9wdHMudmlld0xvZ2dlcjtcbiAgICB0aGlzLm1ldGFkYXRhQ2FsbGJhY2tzID0gb3B0cy5tZXRhZGF0YSB8fCB7fTtcbiAgICB0aGlzLmRlZmF1bHRzID0gT2JqZWN0LmFzc2lnbihjbG9uZShERUZBVUxUUyksIG9wdHMuZGVmYXVsdHMgfHwge30pO1xuICAgIHRoaXMucHJldkFjdGl2ZSA9IG51bGw7XG4gICAgdGhpcy5zaWxlbmNlZCA9IGZhbHNlO1xuICAgIHRoaXMubWFpbiA9IG51bGw7XG4gICAgdGhpcy5vdXRnb2luZ01haW5FbCA9IG51bGw7XG4gICAgdGhpcy5jbGlja1N0YXJ0ZWRBdFRhcmdldCA9IG51bGw7XG4gICAgdGhpcy5saW5rUmVmID0gMTtcbiAgICB0aGlzLnJvb3RzID0ge307XG4gICAgdGhpcy5ocmVmID0gd2luZG93LmxvY2F0aW9uLmhyZWY7XG4gICAgdGhpcy5wZW5kaW5nTGluayA9IG51bGw7XG4gICAgdGhpcy5jdXJyZW50TG9jYXRpb24gPSBjbG9uZSh3aW5kb3cubG9jYXRpb24pO1xuICAgIHRoaXMuaG9va3MgPSBvcHRzLmhvb2tzIHx8IHt9O1xuICAgIHRoaXMudXBsb2FkZXJzID0gb3B0cy51cGxvYWRlcnMgfHwge307XG4gICAgdGhpcy5sb2FkZXJUaW1lb3V0ID0gb3B0cy5sb2FkZXJUaW1lb3V0IHx8IExPQURFUl9USU1FT1VUO1xuICAgIHRoaXMuZGlzY29ubmVjdGVkVGltZW91dCA9IG9wdHMuZGlzY29ubmVjdGVkVGltZW91dCB8fCBESVNDT05ORUNURURfVElNRU9VVDtcbiAgICAvKipcbiAgICAgKiBAdHlwZSB7UmV0dXJuVHlwZTx0eXBlb2Ygc2V0VGltZW91dD4gfCBudWxsfVxuICAgICAqL1xuICAgIHRoaXMucmVsb2FkV2l0aEppdHRlclRpbWVyID0gbnVsbDtcbiAgICB0aGlzLm1heFJlbG9hZHMgPSBvcHRzLm1heFJlbG9hZHMgfHwgTUFYX1JFTE9BRFM7XG4gICAgdGhpcy5yZWxvYWRKaXR0ZXJNaW4gPSBvcHRzLnJlbG9hZEppdHRlck1pbiB8fCBSRUxPQURfSklUVEVSX01JTjtcbiAgICB0aGlzLnJlbG9hZEppdHRlck1heCA9IG9wdHMucmVsb2FkSml0dGVyTWF4IHx8IFJFTE9BRF9KSVRURVJfTUFYO1xuICAgIHRoaXMuZmFpbHNhZmVKaXR0ZXIgPSBvcHRzLmZhaWxzYWZlSml0dGVyIHx8IEZBSUxTQUZFX0pJVFRFUjtcbiAgICB0aGlzLmxvY2FsU3RvcmFnZSA9IG9wdHMubG9jYWxTdG9yYWdlIHx8IHdpbmRvdy5sb2NhbFN0b3JhZ2U7XG4gICAgdGhpcy5zZXNzaW9uU3RvcmFnZSA9IG9wdHMuc2Vzc2lvblN0b3JhZ2UgfHwgd2luZG93LnNlc3Npb25TdG9yYWdlO1xuICAgIHRoaXMuYm91bmRUb3BMZXZlbEV2ZW50cyA9IGZhbHNlO1xuICAgIHRoaXMuYm91bmRFdmVudE5hbWVzID0gbmV3IFNldCgpO1xuICAgIHRoaXMuYmxvY2tQaHhDaGFuZ2VXaGlsZUNvbXBvc2luZyA9XG4gICAgICBvcHRzLmJsb2NrUGh4Q2hhbmdlV2hpbGVDb21wb3NpbmcgfHwgZmFsc2U7XG4gICAgdGhpcy5zZXJ2ZXJDbG9zZVJlZiA9IG51bGw7XG4gICAgdGhpcy5kb21DYWxsYmFja3MgPSBPYmplY3QuYXNzaWduKFxuICAgICAge1xuICAgICAgICBqc1F1ZXJ5U2VsZWN0b3JBbGw6IG51bGwsXG4gICAgICAgIG9uUGF0Y2hTdGFydDogY2xvc3VyZSgpLFxuICAgICAgICBvblBhdGNoRW5kOiBjbG9zdXJlKCksXG4gICAgICAgIG9uTm9kZUFkZGVkOiBjbG9zdXJlKCksXG4gICAgICAgIG9uQmVmb3JlRWxVcGRhdGVkOiBjbG9zdXJlKCksXG4gICAgICB9LFxuICAgICAgb3B0cy5kb20gfHwge30sXG4gICAgKTtcbiAgICB0aGlzLnRyYW5zaXRpb25zID0gbmV3IFRyYW5zaXRpb25TZXQoKTtcbiAgICB0aGlzLmN1cnJlbnRIaXN0b3J5UG9zaXRpb24gPVxuICAgICAgcGFyc2VJbnQodGhpcy5zZXNzaW9uU3RvcmFnZS5nZXRJdGVtKFBIWF9MVl9ISVNUT1JZX1BPU0lUSU9OKSkgfHwgMDtcbiAgICB3aW5kb3cuYWRkRXZlbnRMaXN0ZW5lcihcInBhZ2VoaWRlXCIsIChfZSkgPT4ge1xuICAgICAgdGhpcy51bmxvYWRlZCA9IHRydWU7XG4gICAgfSk7XG4gICAgdGhpcy5zb2NrZXQub25PcGVuKCgpID0+IHtcbiAgICAgIGlmICh0aGlzLmlzVW5sb2FkZWQoKSkge1xuICAgICAgICAvLyByZWxvYWQgcGFnZSBpZiBiZWluZyByZXN0b3JlZCBmcm9tIGJhY2svZm9yd2FyZCBjYWNoZSBhbmQgYnJvd3NlciBkb2VzIG5vdCBlbWl0IFwicGFnZXNob3dcIlxuICAgICAgICB3aW5kb3cubG9jYXRpb24ucmVsb2FkKCk7XG4gICAgICB9XG4gICAgfSk7XG4gIH1cblxuICAvLyBwdWJsaWNcblxuICB2ZXJzaW9uKCkge1xuICAgIHJldHVybiBMVl9WU047XG4gIH1cblxuICBpc1Byb2ZpbGVFbmFibGVkKCkge1xuICAgIHJldHVybiB0aGlzLnNlc3Npb25TdG9yYWdlLmdldEl0ZW0oUEhYX0xWX1BST0ZJTEUpID09PSBcInRydWVcIjtcbiAgfVxuXG4gIGlzRGVidWdFbmFibGVkKCkge1xuICAgIHJldHVybiB0aGlzLnNlc3Npb25TdG9yYWdlLmdldEl0ZW0oUEhYX0xWX0RFQlVHKSA9PT0gXCJ0cnVlXCI7XG4gIH1cblxuICBpc0RlYnVnRGlzYWJsZWQoKSB7XG4gICAgcmV0dXJuIHRoaXMuc2Vzc2lvblN0b3JhZ2UuZ2V0SXRlbShQSFhfTFZfREVCVUcpID09PSBcImZhbHNlXCI7XG4gIH1cblxuICBlbmFibGVEZWJ1ZygpIHtcbiAgICB0aGlzLnNlc3Npb25TdG9yYWdlLnNldEl0ZW0oUEhYX0xWX0RFQlVHLCBcInRydWVcIik7XG4gIH1cblxuICBlbmFibGVQcm9maWxpbmcoKSB7XG4gICAgdGhpcy5zZXNzaW9uU3RvcmFnZS5zZXRJdGVtKFBIWF9MVl9QUk9GSUxFLCBcInRydWVcIik7XG4gIH1cblxuICBkaXNhYmxlRGVidWcoKSB7XG4gICAgdGhpcy5zZXNzaW9uU3RvcmFnZS5zZXRJdGVtKFBIWF9MVl9ERUJVRywgXCJmYWxzZVwiKTtcbiAgfVxuXG4gIGRpc2FibGVQcm9maWxpbmcoKSB7XG4gICAgdGhpcy5zZXNzaW9uU3RvcmFnZS5yZW1vdmVJdGVtKFBIWF9MVl9QUk9GSUxFKTtcbiAgfVxuXG4gIGVuYWJsZUxhdGVuY3lTaW0odXBwZXJCb3VuZE1zKSB7XG4gICAgdGhpcy5lbmFibGVEZWJ1ZygpO1xuICAgIGNvbnNvbGUubG9nKFxuICAgICAgXCJsYXRlbmN5IHNpbXVsYXRvciBlbmFibGVkIGZvciB0aGUgZHVyYXRpb24gb2YgdGhpcyBicm93c2VyIHNlc3Npb24uIENhbGwgZGlzYWJsZUxhdGVuY3lTaW0oKSB0byBkaXNhYmxlXCIsXG4gICAgKTtcbiAgICB0aGlzLnNlc3Npb25TdG9yYWdlLnNldEl0ZW0oUEhYX0xWX0xBVEVOQ1lfU0lNLCB1cHBlckJvdW5kTXMpO1xuICB9XG5cbiAgZGlzYWJsZUxhdGVuY3lTaW0oKSB7XG4gICAgdGhpcy5zZXNzaW9uU3RvcmFnZS5yZW1vdmVJdGVtKFBIWF9MVl9MQVRFTkNZX1NJTSk7XG4gIH1cblxuICBnZXRMYXRlbmN5U2ltKCkge1xuICAgIGNvbnN0IHN0ciA9IHRoaXMuc2Vzc2lvblN0b3JhZ2UuZ2V0SXRlbShQSFhfTFZfTEFURU5DWV9TSU0pO1xuICAgIHJldHVybiBzdHIgPyBwYXJzZUludChzdHIpIDogbnVsbDtcbiAgfVxuXG4gIGdldFNvY2tldCgpIHtcbiAgICByZXR1cm4gdGhpcy5zb2NrZXQ7XG4gIH1cblxuICBjb25uZWN0KCkge1xuICAgIC8vIGVuYWJsZSBkZWJ1ZyBieSBkZWZhdWx0IGlmIG9uIGxvY2FsaG9zdCBhbmQgbm90IGV4cGxpY2l0bHkgZGlzYWJsZWRcbiAgICBpZiAod2luZG93LmxvY2F0aW9uLmhvc3RuYW1lID09PSBcImxvY2FsaG9zdFwiICYmICF0aGlzLmlzRGVidWdEaXNhYmxlZCgpKSB7XG4gICAgICB0aGlzLmVuYWJsZURlYnVnKCk7XG4gICAgfVxuICAgIGNvbnN0IGRvQ29ubmVjdCA9ICgpID0+IHtcbiAgICAgIHRoaXMucmVzZXRSZWxvYWRTdGF0dXMoKTtcbiAgICAgIGlmICh0aGlzLmpvaW5Sb290Vmlld3MoKSkge1xuICAgICAgICB0aGlzLmJpbmRUb3BMZXZlbEV2ZW50cygpO1xuICAgICAgICB0aGlzLnNvY2tldC5jb25uZWN0KCk7XG4gICAgICB9IGVsc2UgaWYgKHRoaXMubWFpbikge1xuICAgICAgICB0aGlzLnNvY2tldC5jb25uZWN0KCk7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICB0aGlzLmJpbmRUb3BMZXZlbEV2ZW50cyh7IGRlYWQ6IHRydWUgfSk7XG4gICAgICB9XG4gICAgICB0aGlzLmpvaW5EZWFkVmlldygpO1xuICAgIH07XG4gICAgaWYgKFxuICAgICAgW1wiY29tcGxldGVcIiwgXCJsb2FkZWRcIiwgXCJpbnRlcmFjdGl2ZVwiXS5pbmRleE9mKGRvY3VtZW50LnJlYWR5U3RhdGUpID49IDBcbiAgICApIHtcbiAgICAgIGRvQ29ubmVjdCgpO1xuICAgIH0gZWxzZSB7XG4gICAgICBkb2N1bWVudC5hZGRFdmVudExpc3RlbmVyKFwiRE9NQ29udGVudExvYWRlZFwiLCAoKSA9PiBkb0Nvbm5lY3QoKSk7XG4gICAgfVxuICB9XG5cbiAgZGlzY29ubmVjdChjYWxsYmFjaykge1xuICAgIGNsZWFyVGltZW91dCh0aGlzLnJlbG9hZFdpdGhKaXR0ZXJUaW1lcik7XG4gICAgLy8gcmVtb3ZlIHRoZSBzb2NrZXQgY2xvc2UgbGlzdGVuZXIgdG8gYXZvaWQgdHJ5aW5nIHRvIGhhbmRsZVxuICAgIC8vIGEgc2VydmVyIGNsb3NlIGV2ZW50IHdoZW4gaXQgaXMgYWN0dWFsbHkgY2F1c2VkIGJ5IHVzIGRpc2Nvbm5lY3RpbmdcbiAgICBpZiAodGhpcy5zZXJ2ZXJDbG9zZVJlZikge1xuICAgICAgdGhpcy5zb2NrZXQub2ZmKHRoaXMuc2VydmVyQ2xvc2VSZWYpO1xuICAgICAgdGhpcy5zZXJ2ZXJDbG9zZVJlZiA9IG51bGw7XG4gICAgfVxuICAgIHRoaXMuc29ja2V0LmRpc2Nvbm5lY3QoY2FsbGJhY2spO1xuICB9XG5cbiAgcmVwbGFjZVRyYW5zcG9ydCh0cmFuc3BvcnQpIHtcbiAgICBjbGVhclRpbWVvdXQodGhpcy5yZWxvYWRXaXRoSml0dGVyVGltZXIpO1xuICAgIHRoaXMuc29ja2V0LnJlcGxhY2VUcmFuc3BvcnQodHJhbnNwb3J0KTtcbiAgICB0aGlzLmNvbm5lY3QoKTtcbiAgfVxuXG4gIGV4ZWNKUyhlbCwgZW5jb2RlZEpTLCBldmVudFR5cGUgPSBudWxsKSB7XG4gICAgY29uc3QgZSA9IG5ldyBDdXN0b21FdmVudChcInBoeDpleGVjXCIsIHsgZGV0YWlsOiB7IHNvdXJjZUVsZW1lbnQ6IGVsIH0gfSk7XG4gICAgdGhpcy5vd25lcihlbCwgKHZpZXcpID0+IEpTLmV4ZWMoZSwgZXZlbnRUeXBlLCBlbmNvZGVkSlMsIHZpZXcsIGVsKSk7XG4gIH1cblxuICAvKipcbiAgICogUmV0dXJucyBhbiBvYmplY3Qgd2l0aCBtZXRob2RzIHRvIG1hbmlwbHVhdGUgdGhlIERPTSBhbmQgZXhlY3V0ZSBKYXZhU2NyaXB0LlxuICAgKiBUaGUgYXBwbGllZCBjaGFuZ2VzIGludGVncmF0ZSB3aXRoIHNlcnZlciBET00gcGF0Y2hpbmcuXG4gICAqXG4gICAqIEByZXR1cm5zIHtpbXBvcnQoXCIuL2pzX2NvbW1hbmRzXCIpLkxpdmVTb2NrZXRKU0NvbW1hbmRzfVxuICAgKi9cbiAganMoKSB7XG4gICAgcmV0dXJuIGpzQ29tbWFuZHModGhpcywgXCJqc1wiKTtcbiAgfVxuXG4gIC8vIHByaXZhdGVcblxuICB1bmxvYWQoKSB7XG4gICAgaWYgKHRoaXMudW5sb2FkZWQpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgaWYgKHRoaXMubWFpbiAmJiB0aGlzLmlzQ29ubmVjdGVkKCkpIHtcbiAgICAgIHRoaXMubG9nKHRoaXMubWFpbiwgXCJzb2NrZXRcIiwgKCkgPT4gW1wiZGlzY29ubmVjdCBmb3IgcGFnZSBuYXZcIl0pO1xuICAgIH1cbiAgICB0aGlzLnVubG9hZGVkID0gdHJ1ZTtcbiAgICB0aGlzLmRlc3Ryb3lBbGxWaWV3cygpO1xuICAgIHRoaXMuZGlzY29ubmVjdCgpO1xuICB9XG5cbiAgdHJpZ2dlckRPTShraW5kLCBhcmdzKSB7XG4gICAgdGhpcy5kb21DYWxsYmFja3Nba2luZF0oLi4uYXJncyk7XG4gIH1cblxuICB0aW1lKG5hbWUsIGZ1bmMpIHtcbiAgICBpZiAoIXRoaXMuaXNQcm9maWxlRW5hYmxlZCgpIHx8ICFjb25zb2xlLnRpbWUpIHtcbiAgICAgIHJldHVybiBmdW5jKCk7XG4gICAgfVxuICAgIGNvbnNvbGUudGltZShuYW1lKTtcbiAgICBjb25zdCByZXN1bHQgPSBmdW5jKCk7XG4gICAgY29uc29sZS50aW1lRW5kKG5hbWUpO1xuICAgIHJldHVybiByZXN1bHQ7XG4gIH1cblxuICBsb2codmlldywga2luZCwgbXNnQ2FsbGJhY2spIHtcbiAgICBpZiAodGhpcy52aWV3TG9nZ2VyKSB7XG4gICAgICBjb25zdCBbbXNnLCBvYmpdID0gbXNnQ2FsbGJhY2soKTtcbiAgICAgIHRoaXMudmlld0xvZ2dlcih2aWV3LCBraW5kLCBtc2csIG9iaik7XG4gICAgfSBlbHNlIGlmICh0aGlzLmlzRGVidWdFbmFibGVkKCkpIHtcbiAgICAgIGNvbnN0IFttc2csIG9ial0gPSBtc2dDYWxsYmFjaygpO1xuICAgICAgZGVidWcodmlldywga2luZCwgbXNnLCBvYmopO1xuICAgIH1cbiAgfVxuXG4gIHJlcXVlc3RET01VcGRhdGUoY2FsbGJhY2spIHtcbiAgICB0aGlzLnRyYW5zaXRpb25zLmFmdGVyKGNhbGxiYWNrKTtcbiAgfVxuXG4gIGFzeW5jVHJhbnNpdGlvbihwcm9taXNlKSB7XG4gICAgdGhpcy50cmFuc2l0aW9ucy5hZGRBc3luY1RyYW5zaXRpb24ocHJvbWlzZSk7XG4gIH1cblxuICB0cmFuc2l0aW9uKHRpbWUsIG9uU3RhcnQsIG9uRG9uZSA9IGZ1bmN0aW9uICgpIHt9KSB7XG4gICAgdGhpcy50cmFuc2l0aW9ucy5hZGRUcmFuc2l0aW9uKHRpbWUsIG9uU3RhcnQsIG9uRG9uZSk7XG4gIH1cblxuICBvbkNoYW5uZWwoY2hhbm5lbCwgZXZlbnQsIGNiKSB7XG4gICAgY2hhbm5lbC5vbihldmVudCwgKGRhdGEpID0+IHtcbiAgICAgIGNvbnN0IGxhdGVuY3kgPSB0aGlzLmdldExhdGVuY3lTaW0oKTtcbiAgICAgIGlmICghbGF0ZW5jeSkge1xuICAgICAgICBjYihkYXRhKTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHNldFRpbWVvdXQoKCkgPT4gY2IoZGF0YSksIGxhdGVuY3kpO1xuICAgICAgfVxuICAgIH0pO1xuICB9XG5cbiAgcmVsb2FkV2l0aEppdHRlcih2aWV3LCBsb2cpIHtcbiAgICBjbGVhclRpbWVvdXQodGhpcy5yZWxvYWRXaXRoSml0dGVyVGltZXIpO1xuICAgIHRoaXMuZGlzY29ubmVjdCgpO1xuICAgIGNvbnN0IG1pbk1zID0gdGhpcy5yZWxvYWRKaXR0ZXJNaW47XG4gICAgY29uc3QgbWF4TXMgPSB0aGlzLnJlbG9hZEppdHRlck1heDtcbiAgICBsZXQgYWZ0ZXJNcyA9IE1hdGguZmxvb3IoTWF0aC5yYW5kb20oKSAqIChtYXhNcyAtIG1pbk1zICsgMSkpICsgbWluTXM7XG4gICAgY29uc3QgdHJpZXMgPSBCcm93c2VyLnVwZGF0ZUxvY2FsKFxuICAgICAgdGhpcy5sb2NhbFN0b3JhZ2UsXG4gICAgICB3aW5kb3cubG9jYXRpb24ucGF0aG5hbWUsXG4gICAgICBDT05TRUNVVElWRV9SRUxPQURTLFxuICAgICAgMCxcbiAgICAgIChjb3VudCkgPT4gY291bnQgKyAxLFxuICAgICk7XG4gICAgaWYgKHRyaWVzID49IHRoaXMubWF4UmVsb2Fkcykge1xuICAgICAgYWZ0ZXJNcyA9IHRoaXMuZmFpbHNhZmVKaXR0ZXI7XG4gICAgfVxuICAgIHRoaXMucmVsb2FkV2l0aEppdHRlclRpbWVyID0gc2V0VGltZW91dCgoKSA9PiB7XG4gICAgICAvLyBpZiB2aWV3IGhhcyByZWNvdmVyZWQsIHN1Y2ggYXMgdHJhbnNwb3J0IHJlcGxhY2VkLCB0aGVuIGNhbmNlbFxuICAgICAgaWYgKHZpZXcuaXNEZXN0cm95ZWQoKSB8fCB2aWV3LmlzQ29ubmVjdGVkKCkpIHtcbiAgICAgICAgcmV0dXJuO1xuICAgICAgfVxuICAgICAgdmlldy5kZXN0cm95KCk7XG4gICAgICBsb2dcbiAgICAgICAgPyBsb2coKVxuICAgICAgICA6IHRoaXMubG9nKHZpZXcsIFwiam9pblwiLCAoKSA9PiBbXG4gICAgICAgICAgICBgZW5jb3VudGVyZWQgJHt0cmllc30gY29uc2VjdXRpdmUgcmVsb2Fkc2AsXG4gICAgICAgICAgXSk7XG4gICAgICBpZiAodHJpZXMgPj0gdGhpcy5tYXhSZWxvYWRzKSB7XG4gICAgICAgIHRoaXMubG9nKHZpZXcsIFwiam9pblwiLCAoKSA9PiBbXG4gICAgICAgICAgYGV4Y2VlZGVkICR7dGhpcy5tYXhSZWxvYWRzfSBjb25zZWN1dGl2ZSByZWxvYWRzLiBFbnRlcmluZyBmYWlsc2FmZSBtb2RlYCxcbiAgICAgICAgXSk7XG4gICAgICB9XG4gICAgICBpZiAodGhpcy5oYXNQZW5kaW5nTGluaygpKSB7XG4gICAgICAgIHdpbmRvdy5sb2NhdGlvbiA9IHRoaXMucGVuZGluZ0xpbms7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICB3aW5kb3cubG9jYXRpb24ucmVsb2FkKCk7XG4gICAgICB9XG4gICAgfSwgYWZ0ZXJNcyk7XG4gIH1cblxuICBnZXRIb29rRGVmaW5pdGlvbihuYW1lKSB7XG4gICAgaWYgKCFuYW1lKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIHJldHVybiAoXG4gICAgICB0aGlzLm1heWJlSW50ZXJuYWxIb29rKG5hbWUpIHx8XG4gICAgICB0aGlzLmhvb2tzW25hbWVdIHx8XG4gICAgICB0aGlzLm1heWJlUnVudGltZUhvb2sobmFtZSlcbiAgICApO1xuICB9XG5cbiAgbWF5YmVJbnRlcm5hbEhvb2sobmFtZSkge1xuICAgIHJldHVybiBuYW1lICYmIG5hbWUuc3RhcnRzV2l0aChcIlBob2VuaXguXCIpICYmIEhvb2tzW25hbWUuc3BsaXQoXCIuXCIpWzFdXTtcbiAgfVxuXG4gIG1heWJlUnVudGltZUhvb2sobmFtZSkge1xuICAgIGNvbnN0IHJ1bnRpbWVIb29rID0gZG9jdW1lbnQucXVlcnlTZWxlY3RvcihcbiAgICAgIGBzY3JpcHRbJHtQSFhfUlVOVElNRV9IT09LfT1cIiR7Q1NTLmVzY2FwZShuYW1lKX1cIl1gLFxuICAgICk7XG4gICAgaWYgKCFydW50aW1lSG9vaykge1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICBsZXQgY2FsbGJhY2tzID0gd2luZG93W2BwaHhfaG9va18ke25hbWV9YF07XG4gICAgaWYgKCFjYWxsYmFja3MgfHwgdHlwZW9mIGNhbGxiYWNrcyAhPT0gXCJmdW5jdGlvblwiKSB7XG4gICAgICBsb2dFcnJvcihcImEgcnVudGltZSBob29rIG11c3QgYmUgYSBmdW5jdGlvblwiLCBydW50aW1lSG9vayk7XG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIGNvbnN0IGhvb2tEZWZpbml0b24gPSBjYWxsYmFja3MoKTtcbiAgICBpZiAoXG4gICAgICBob29rRGVmaW5pdG9uICYmXG4gICAgICAodHlwZW9mIGhvb2tEZWZpbml0b24gPT09IFwib2JqZWN0XCIgfHwgdHlwZW9mIGhvb2tEZWZpbml0b24gPT09IFwiZnVuY3Rpb25cIilcbiAgICApIHtcbiAgICAgIHJldHVybiBob29rRGVmaW5pdG9uO1xuICAgIH1cbiAgICBsb2dFcnJvcihcbiAgICAgIFwicnVudGltZSBob29rIG11c3QgcmV0dXJuIGFuIG9iamVjdCB3aXRoIGhvb2sgY2FsbGJhY2tzIG9yIGFuIGluc3RhbmNlIG9mIFZpZXdIb29rXCIsXG4gICAgICBydW50aW1lSG9vayxcbiAgICApO1xuICB9XG5cbiAgaXNVbmxvYWRlZCgpIHtcbiAgICByZXR1cm4gdGhpcy51bmxvYWRlZDtcbiAgfVxuXG4gIGlzQ29ubmVjdGVkKCkge1xuICAgIHJldHVybiB0aGlzLnNvY2tldC5pc0Nvbm5lY3RlZCgpO1xuICB9XG5cbiAgZ2V0QmluZGluZ1ByZWZpeCgpIHtcbiAgICByZXR1cm4gdGhpcy5iaW5kaW5nUHJlZml4O1xuICB9XG5cbiAgYmluZGluZyhraW5kKSB7XG4gICAgcmV0dXJuIGAke3RoaXMuZ2V0QmluZGluZ1ByZWZpeCgpfSR7a2luZH1gO1xuICB9XG5cbiAgY2hhbm5lbCh0b3BpYywgcGFyYW1zKSB7XG4gICAgcmV0dXJuIHRoaXMuc29ja2V0LmNoYW5uZWwodG9waWMsIHBhcmFtcyk7XG4gIH1cblxuICBqb2luRGVhZFZpZXcoKSB7XG4gICAgY29uc3QgYm9keSA9IGRvY3VtZW50LmJvZHk7XG4gICAgaWYgKFxuICAgICAgYm9keSAmJlxuICAgICAgIXRoaXMuaXNQaHhWaWV3KGJvZHkpICYmXG4gICAgICAhdGhpcy5pc1BoeFZpZXcoZG9jdW1lbnQuZmlyc3RFbGVtZW50Q2hpbGQpXG4gICAgKSB7XG4gICAgICBjb25zdCB2aWV3ID0gdGhpcy5uZXdSb290Vmlldyhib2R5KTtcbiAgICAgIHZpZXcuc2V0SHJlZih0aGlzLmdldEhyZWYoKSk7XG4gICAgICB2aWV3LmpvaW5EZWFkKCk7XG4gICAgICBpZiAoIXRoaXMubWFpbikge1xuICAgICAgICB0aGlzLm1haW4gPSB2aWV3O1xuICAgICAgfVxuICAgICAgd2luZG93LnJlcXVlc3RBbmltYXRpb25GcmFtZSgoKSA9PiB7XG4gICAgICAgIHZpZXcuZXhlY05ld01vdW50ZWQoKTtcbiAgICAgICAgLy8gcmVzdG9yZSBzY3JvbGwgcG9zaXRpb24gd2hlbiBuYXZpZ2F0aW5nIGZyb20gYW4gZXh0ZXJuYWwgLyBub24tbGl2ZSBwYWdlXG4gICAgICAgIHRoaXMubWF5YmVTY3JvbGwoaGlzdG9yeS5zdGF0ZT8uc2Nyb2xsKTtcbiAgICAgIH0pO1xuICAgIH1cbiAgfVxuXG4gIGpvaW5Sb290Vmlld3MoKSB7XG4gICAgbGV0IHJvb3RzRm91bmQgPSBmYWxzZTtcbiAgICBET00uYWxsKFxuICAgICAgZG9jdW1lbnQsXG4gICAgICBgJHtQSFhfVklFV19TRUxFQ1RPUn06bm90KFske1BIWF9QQVJFTlRfSUR9XSlgLFxuICAgICAgKHJvb3RFbCkgPT4ge1xuICAgICAgICBpZiAoIXRoaXMuZ2V0Um9vdEJ5SWQocm9vdEVsLmlkKSkge1xuICAgICAgICAgIGNvbnN0IHZpZXcgPSB0aGlzLm5ld1Jvb3RWaWV3KHJvb3RFbCk7XG4gICAgICAgICAgLy8gc3RpY2tpZXMgY2Fubm90IGJlIG1vdW50ZWQgYXQgdGhlIHJvdXRlciBhbmQgdGhlcmVmb3JlIHNob3VsZCBub3RcbiAgICAgICAgICAvLyBnZXQgYSBocmVmIHNldCBvbiB0aGVtXG4gICAgICAgICAgaWYgKCFET00uaXNQaHhTdGlja3kocm9vdEVsKSkge1xuICAgICAgICAgICAgdmlldy5zZXRIcmVmKHRoaXMuZ2V0SHJlZigpKTtcbiAgICAgICAgICB9XG4gICAgICAgICAgdmlldy5qb2luKCk7XG4gICAgICAgICAgaWYgKHJvb3RFbC5oYXNBdHRyaWJ1dGUoUEhYX01BSU4pKSB7XG4gICAgICAgICAgICB0aGlzLm1haW4gPSB2aWV3O1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICByb290c0ZvdW5kID0gdHJ1ZTtcbiAgICAgIH0sXG4gICAgKTtcbiAgICByZXR1cm4gcm9vdHNGb3VuZDtcbiAgfVxuXG4gIHJlZGlyZWN0KHRvLCBmbGFzaCwgcmVsb2FkVG9rZW4pIHtcbiAgICBpZiAocmVsb2FkVG9rZW4pIHtcbiAgICAgIEJyb3dzZXIuc2V0Q29va2llKFBIWF9SRUxPQURfU1RBVFVTLCByZWxvYWRUb2tlbiwgNjApO1xuICAgIH1cbiAgICB0aGlzLnVubG9hZCgpO1xuICAgIEJyb3dzZXIucmVkaXJlY3QodG8sIGZsYXNoKTtcbiAgfVxuXG4gIHJlcGxhY2VNYWluKFxuICAgIGhyZWYsXG4gICAgZmxhc2gsXG4gICAgY2FsbGJhY2sgPSBudWxsLFxuICAgIGxpbmtSZWYgPSB0aGlzLnNldFBlbmRpbmdMaW5rKGhyZWYpLFxuICApIHtcbiAgICBjb25zdCBsaXZlUmVmZXJlciA9IHRoaXMuY3VycmVudExvY2F0aW9uLmhyZWY7XG4gICAgdGhpcy5vdXRnb2luZ01haW5FbCA9IHRoaXMub3V0Z29pbmdNYWluRWwgfHwgdGhpcy5tYWluLmVsO1xuXG4gICAgY29uc3Qgc3RpY2tpZXMgPSBET00uZmluZFBoeFN0aWNreShkb2N1bWVudCkgfHwgW107XG4gICAgY29uc3QgcmVtb3ZlRWxzID0gRE9NLmFsbChcbiAgICAgIHRoaXMub3V0Z29pbmdNYWluRWwsXG4gICAgICBgWyR7dGhpcy5iaW5kaW5nKFwicmVtb3ZlXCIpfV1gLFxuICAgICkuZmlsdGVyKChlbCkgPT4gIURPTS5pc0NoaWxkT2ZBbnkoZWwsIHN0aWNraWVzKSk7XG5cbiAgICBjb25zdCBuZXdNYWluRWwgPSBET00uY2xvbmVOb2RlKHRoaXMub3V0Z29pbmdNYWluRWwsIFwiXCIpO1xuICAgIHRoaXMubWFpbi5zaG93TG9hZGVyKHRoaXMubG9hZGVyVGltZW91dCk7XG4gICAgdGhpcy5tYWluLmRlc3Ryb3koKTtcblxuICAgIHRoaXMubWFpbiA9IHRoaXMubmV3Um9vdFZpZXcobmV3TWFpbkVsLCBmbGFzaCwgbGl2ZVJlZmVyZXIpO1xuICAgIHRoaXMubWFpbi5zZXRSZWRpcmVjdChocmVmKTtcbiAgICB0aGlzLnRyYW5zaXRpb25SZW1vdmVzKHJlbW92ZUVscyk7XG4gICAgdGhpcy5tYWluLmpvaW4oKGpvaW5Db3VudCwgb25Eb25lKSA9PiB7XG4gICAgICBpZiAoam9pbkNvdW50ID09PSAxICYmIHRoaXMuY29tbWl0UGVuZGluZ0xpbmsobGlua1JlZikpIHtcbiAgICAgICAgdGhpcy5yZXF1ZXN0RE9NVXBkYXRlKCgpID0+IHtcbiAgICAgICAgICAvLyByZW1vdmUgcGh4LXJlbW92ZSBlbHMgcmlnaHQgYmVmb3JlIHdlIHJlcGxhY2UgdGhlIG1haW4gZWxlbWVudFxuICAgICAgICAgIHJlbW92ZUVscy5mb3JFYWNoKChlbCkgPT4gZWwucmVtb3ZlKCkpO1xuICAgICAgICAgIHN0aWNraWVzLmZvckVhY2goKGVsKSA9PiBuZXdNYWluRWwuYXBwZW5kQ2hpbGQoZWwpKTtcbiAgICAgICAgICB0aGlzLm91dGdvaW5nTWFpbkVsLnJlcGxhY2VXaXRoKG5ld01haW5FbCk7XG4gICAgICAgICAgdGhpcy5vdXRnb2luZ01haW5FbCA9IG51bGw7XG4gICAgICAgICAgY2FsbGJhY2sgJiYgY2FsbGJhY2sobGlua1JlZik7XG4gICAgICAgICAgb25Eb25lKCk7XG4gICAgICAgIH0pO1xuICAgICAgfVxuICAgIH0pO1xuICB9XG5cbiAgdHJhbnNpdGlvblJlbW92ZXMoZWxlbWVudHMsIGNhbGxiYWNrKSB7XG4gICAgY29uc3QgcmVtb3ZlQXR0ciA9IHRoaXMuYmluZGluZyhcInJlbW92ZVwiKTtcbiAgICBjb25zdCBzaWxlbmNlRXZlbnRzID0gKGUpID0+IHtcbiAgICAgIGUucHJldmVudERlZmF1bHQoKTtcbiAgICAgIGUuc3RvcEltbWVkaWF0ZVByb3BhZ2F0aW9uKCk7XG4gICAgfTtcbiAgICBlbGVtZW50cy5mb3JFYWNoKChlbCkgPT4ge1xuICAgICAgLy8gcHJldmVudCBhbGwgbGlzdGVuZXJzIHdlIGNhcmUgYWJvdXQgZnJvbSBidWJibGluZyB0byB3aW5kb3dcbiAgICAgIC8vIHNpbmNlIHdlIGFyZSByZW1vdmluZyB0aGUgZWxlbWVudFxuICAgICAgZm9yIChjb25zdCBldmVudCBvZiB0aGlzLmJvdW5kRXZlbnROYW1lcykge1xuICAgICAgICBlbC5hZGRFdmVudExpc3RlbmVyKGV2ZW50LCBzaWxlbmNlRXZlbnRzLCB0cnVlKTtcbiAgICAgIH1cbiAgICAgIHRoaXMuZXhlY0pTKGVsLCBlbC5nZXRBdHRyaWJ1dGUocmVtb3ZlQXR0ciksIFwicmVtb3ZlXCIpO1xuICAgIH0pO1xuICAgIC8vIHJlbW92ZSB0aGUgc2lsZW5jZWQgbGlzdGVuZXJzIHdoZW4gdHJhbnNpdGlvbnMgYXJlIGRvbmUgaW5jYXNlIHRoZSBlbGVtZW50IGlzIHJlLXVzZWRcbiAgICAvLyBhbmQgY2FsbCBjYWxsZXIncyBjYWxsYmFjayBhcyBzb29uIGFzIHdlIGFyZSBkb25lIHdpdGggdHJhbnNpdGlvbnNcbiAgICB0aGlzLnJlcXVlc3RET01VcGRhdGUoKCkgPT4ge1xuICAgICAgZWxlbWVudHMuZm9yRWFjaCgoZWwpID0+IHtcbiAgICAgICAgZm9yIChjb25zdCBldmVudCBvZiB0aGlzLmJvdW5kRXZlbnROYW1lcykge1xuICAgICAgICAgIGVsLnJlbW92ZUV2ZW50TGlzdGVuZXIoZXZlbnQsIHNpbGVuY2VFdmVudHMsIHRydWUpO1xuICAgICAgICB9XG4gICAgICB9KTtcbiAgICAgIGNhbGxiYWNrICYmIGNhbGxiYWNrKCk7XG4gICAgfSk7XG4gIH1cblxuICBpc1BoeFZpZXcoZWwpIHtcbiAgICByZXR1cm4gZWwuZ2V0QXR0cmlidXRlICYmIGVsLmdldEF0dHJpYnV0ZShQSFhfU0VTU0lPTikgIT09IG51bGw7XG4gIH1cblxuICBuZXdSb290VmlldyhlbCwgZmxhc2gsIGxpdmVSZWZlcmVyKSB7XG4gICAgY29uc3QgdmlldyA9IG5ldyBWaWV3KGVsLCB0aGlzLCBudWxsLCBmbGFzaCwgbGl2ZVJlZmVyZXIpO1xuICAgIHRoaXMucm9vdHNbdmlldy5pZF0gPSB2aWV3O1xuICAgIHJldHVybiB2aWV3O1xuICB9XG5cbiAgb3duZXIoY2hpbGRFbCwgY2FsbGJhY2spIHtcbiAgICBsZXQgdmlldztcbiAgICBjb25zdCB2aWV3RWwgPSBET00uY2xvc2VzdFZpZXdFbChjaGlsZEVsKTtcbiAgICBpZiAodmlld0VsKSB7XG4gICAgICAvLyBpdCBjYW4gaGFwcGVuIHRoYXQgd2UgZmluZCBhIHZpZXcgdGhhdCBpcyBhbHJlYWR5IGRlc3Ryb3llZDtcbiAgICAgIC8vIGluIHRoYXQgY2FzZSB3ZSBETyBOT1Qgd2FudCB0byBmYWxsYmFjayB0byB0aGUgbWFpbiBlbGVtZW50XG4gICAgICB2aWV3ID0gdGhpcy5nZXRWaWV3QnlFbCh2aWV3RWwpO1xuICAgIH0gZWxzZSB7XG4gICAgICB2aWV3ID0gdGhpcy5tYWluO1xuICAgIH1cbiAgICByZXR1cm4gdmlldyAmJiBjYWxsYmFjayA/IGNhbGxiYWNrKHZpZXcpIDogdmlldztcbiAgfVxuXG4gIHdpdGhpbk93bmVycyhjaGlsZEVsLCBjYWxsYmFjaykge1xuICAgIHRoaXMub3duZXIoY2hpbGRFbCwgKHZpZXcpID0+IGNhbGxiYWNrKHZpZXcsIGNoaWxkRWwpKTtcbiAgfVxuXG4gIGdldFZpZXdCeUVsKGVsKSB7XG4gICAgY29uc3Qgcm9vdElkID0gZWwuZ2V0QXR0cmlidXRlKFBIWF9ST09UX0lEKTtcbiAgICByZXR1cm4gbWF5YmUodGhpcy5nZXRSb290QnlJZChyb290SWQpLCAocm9vdCkgPT5cbiAgICAgIHJvb3QuZ2V0RGVzY2VuZGVudEJ5RWwoZWwpLFxuICAgICk7XG4gIH1cblxuICBnZXRSb290QnlJZChpZCkge1xuICAgIHJldHVybiB0aGlzLnJvb3RzW2lkXTtcbiAgfVxuXG4gIGRlc3Ryb3lBbGxWaWV3cygpIHtcbiAgICBmb3IgKGNvbnN0IGlkIGluIHRoaXMucm9vdHMpIHtcbiAgICAgIHRoaXMucm9vdHNbaWRdLmRlc3Ryb3koKTtcbiAgICAgIGRlbGV0ZSB0aGlzLnJvb3RzW2lkXTtcbiAgICB9XG4gICAgdGhpcy5tYWluID0gbnVsbDtcbiAgfVxuXG4gIGRlc3Ryb3lWaWV3QnlFbChlbCkge1xuICAgIGNvbnN0IHJvb3QgPSB0aGlzLmdldFJvb3RCeUlkKGVsLmdldEF0dHJpYnV0ZShQSFhfUk9PVF9JRCkpO1xuICAgIGlmIChyb290ICYmIHJvb3QuaWQgPT09IGVsLmlkKSB7XG4gICAgICByb290LmRlc3Ryb3koKTtcbiAgICAgIGRlbGV0ZSB0aGlzLnJvb3RzW3Jvb3QuaWRdO1xuICAgIH0gZWxzZSBpZiAocm9vdCkge1xuICAgICAgcm9vdC5kZXN0cm95RGVzY2VuZGVudChlbC5pZCk7XG4gICAgfVxuICB9XG5cbiAgZ2V0QWN0aXZlRWxlbWVudCgpIHtcbiAgICByZXR1cm4gZG9jdW1lbnQuYWN0aXZlRWxlbWVudDtcbiAgfVxuXG4gIGRyb3BBY3RpdmVFbGVtZW50KHZpZXcpIHtcbiAgICBpZiAodGhpcy5wcmV2QWN0aXZlICYmIHZpZXcub3duc0VsZW1lbnQodGhpcy5wcmV2QWN0aXZlKSkge1xuICAgICAgdGhpcy5wcmV2QWN0aXZlID0gbnVsbDtcbiAgICB9XG4gIH1cblxuICByZXN0b3JlUHJldmlvdXNseUFjdGl2ZUZvY3VzKCkge1xuICAgIGlmIChcbiAgICAgIHRoaXMucHJldkFjdGl2ZSAmJlxuICAgICAgdGhpcy5wcmV2QWN0aXZlICE9PSBkb2N1bWVudC5ib2R5ICYmXG4gICAgICB0aGlzLnByZXZBY3RpdmUgaW5zdGFuY2VvZiBIVE1MRWxlbWVudFxuICAgICkge1xuICAgICAgdGhpcy5wcmV2QWN0aXZlLmZvY3VzKCk7XG4gICAgfVxuICB9XG5cbiAgYmx1ckFjdGl2ZUVsZW1lbnQoKSB7XG4gICAgdGhpcy5wcmV2QWN0aXZlID0gdGhpcy5nZXRBY3RpdmVFbGVtZW50KCk7XG4gICAgaWYgKFxuICAgICAgdGhpcy5wcmV2QWN0aXZlICE9PSBkb2N1bWVudC5ib2R5ICYmXG4gICAgICB0aGlzLnByZXZBY3RpdmUgaW5zdGFuY2VvZiBIVE1MRWxlbWVudFxuICAgICkge1xuICAgICAgdGhpcy5wcmV2QWN0aXZlLmJsdXIoKTtcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogQHBhcmFtIHt7ZGVhZD86IGJvb2xlYW59fSBbb3B0aW9ucz17fV1cbiAgICovXG4gIGJpbmRUb3BMZXZlbEV2ZW50cyh7IGRlYWQgfSA9IHt9KSB7XG4gICAgaWYgKHRoaXMuYm91bmRUb3BMZXZlbEV2ZW50cykge1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIHRoaXMuYm91bmRUb3BMZXZlbEV2ZW50cyA9IHRydWU7XG4gICAgLy8gZW50ZXIgZmFpbHNhZmUgcmVsb2FkIGlmIHNlcnZlciBoYXMgZ29uZSBhd2F5IGludGVudGlvbmFsbHksIHN1Y2ggYXMgXCJkaXNjb25uZWN0XCIgYnJvYWRjYXN0XG4gICAgdGhpcy5zZXJ2ZXJDbG9zZVJlZiA9IHRoaXMuc29ja2V0Lm9uQ2xvc2UoKGV2ZW50KSA9PiB7XG4gICAgICAvLyBmYWlsc2FmZSByZWxvYWQgaWYgbm9ybWFsIGNsb3N1cmUgYW5kIHdlIHN0aWxsIGhhdmUgYSBtYWluIExWXG4gICAgICBpZiAoZXZlbnQgJiYgZXZlbnQuY29kZSA9PT0gMTAwMCAmJiB0aGlzLm1haW4pIHtcbiAgICAgICAgcmV0dXJuIHRoaXMucmVsb2FkV2l0aEppdHRlcih0aGlzLm1haW4pO1xuICAgICAgfVxuICAgIH0pO1xuICAgIGRvY3VtZW50LmJvZHkuYWRkRXZlbnRMaXN0ZW5lcihcImNsaWNrXCIsIGZ1bmN0aW9uICgpIHt9KTsgLy8gZW5zdXJlIGFsbCBjbGljayBldmVudHMgYnViYmxlIGZvciBtb2JpbGUgU2FmYXJpXG4gICAgd2luZG93LmFkZEV2ZW50TGlzdGVuZXIoXG4gICAgICBcInBhZ2VzaG93XCIsXG4gICAgICAoZSkgPT4ge1xuICAgICAgICBpZiAoZS5wZXJzaXN0ZWQpIHtcbiAgICAgICAgICAvLyByZWxvYWQgcGFnZSBpZiBiZWluZyByZXN0b3JlZCBmcm9tIGJhY2svZm9yd2FyZCBjYWNoZVxuICAgICAgICAgIHRoaXMuZ2V0U29ja2V0KCkuZGlzY29ubmVjdCgpO1xuICAgICAgICAgIHRoaXMud2l0aFBhZ2VMb2FkaW5nKHsgdG86IHdpbmRvdy5sb2NhdGlvbi5ocmVmLCBraW5kOiBcInJlZGlyZWN0XCIgfSk7XG4gICAgICAgICAgd2luZG93LmxvY2F0aW9uLnJlbG9hZCgpO1xuICAgICAgICB9XG4gICAgICB9LFxuICAgICAgdHJ1ZSxcbiAgICApO1xuICAgIGlmICghZGVhZCkge1xuICAgICAgdGhpcy5iaW5kTmF2KCk7XG4gICAgfVxuICAgIHRoaXMuYmluZENsaWNrcygpO1xuICAgIGlmICghZGVhZCkge1xuICAgICAgdGhpcy5iaW5kRm9ybXMoKTtcbiAgICB9XG4gICAgdGhpcy5iaW5kKFxuICAgICAgeyBrZXl1cDogXCJrZXl1cFwiLCBrZXlkb3duOiBcImtleWRvd25cIiB9LFxuICAgICAgKGUsIHR5cGUsIHZpZXcsIHRhcmdldEVsLCBwaHhFdmVudCwgX3BoeFRhcmdldCkgPT4ge1xuICAgICAgICBjb25zdCBtYXRjaEtleSA9IHRhcmdldEVsLmdldEF0dHJpYnV0ZSh0aGlzLmJpbmRpbmcoUEhYX0tFWSkpO1xuICAgICAgICBjb25zdCBwcmVzc2VkS2V5ID0gZS5rZXkgJiYgZS5rZXkudG9Mb3dlckNhc2UoKTsgLy8gY2hyb21lIGNsaWNrZWQgYXV0b2NvbXBsZXRlcyBzZW5kIGEga2V5ZG93biB3aXRob3V0IGtleVxuICAgICAgICBpZiAobWF0Y2hLZXkgJiYgbWF0Y2hLZXkudG9Mb3dlckNhc2UoKSAhPT0gcHJlc3NlZEtleSkge1xuICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuXG4gICAgICAgIGNvbnN0IGRhdGEgPSB7IGtleTogZS5rZXksIC4uLnRoaXMuZXZlbnRNZXRhKHR5cGUsIGUsIHRhcmdldEVsKSB9O1xuICAgICAgICBKUy5leGVjKGUsIHR5cGUsIHBoeEV2ZW50LCB2aWV3LCB0YXJnZXRFbCwgW1wicHVzaFwiLCB7IGRhdGEgfV0pO1xuICAgICAgfSxcbiAgICApO1xuICAgIHRoaXMuYmluZChcbiAgICAgIHsgYmx1cjogXCJmb2N1c291dFwiLCBmb2N1czogXCJmb2N1c2luXCIgfSxcbiAgICAgIChlLCB0eXBlLCB2aWV3LCB0YXJnZXRFbCwgcGh4RXZlbnQsIHBoeFRhcmdldCkgPT4ge1xuICAgICAgICBpZiAoIXBoeFRhcmdldCkge1xuICAgICAgICAgIGNvbnN0IGRhdGEgPSB7IGtleTogZS5rZXksIC4uLnRoaXMuZXZlbnRNZXRhKHR5cGUsIGUsIHRhcmdldEVsKSB9O1xuICAgICAgICAgIEpTLmV4ZWMoZSwgdHlwZSwgcGh4RXZlbnQsIHZpZXcsIHRhcmdldEVsLCBbXCJwdXNoXCIsIHsgZGF0YSB9XSk7XG4gICAgICAgIH1cbiAgICAgIH0sXG4gICAgKTtcbiAgICB0aGlzLmJpbmQoXG4gICAgICB7IGJsdXI6IFwiYmx1clwiLCBmb2N1czogXCJmb2N1c1wiIH0sXG4gICAgICAoZSwgdHlwZSwgdmlldywgdGFyZ2V0RWwsIHBoeEV2ZW50LCBwaHhUYXJnZXQpID0+IHtcbiAgICAgICAgLy8gYmx1ciBhbmQgZm9jdXMgYXJlIHRyaWdnZXJlZCBvbiBkb2N1bWVudCBhbmQgd2luZG93LiBEaXNjYXJkIG9uZSB0byBhdm9pZCBkdXBzXG4gICAgICAgIGlmIChwaHhUYXJnZXQgPT09IFwid2luZG93XCIpIHtcbiAgICAgICAgICBjb25zdCBkYXRhID0gdGhpcy5ldmVudE1ldGEodHlwZSwgZSwgdGFyZ2V0RWwpO1xuICAgICAgICAgIEpTLmV4ZWMoZSwgdHlwZSwgcGh4RXZlbnQsIHZpZXcsIHRhcmdldEVsLCBbXCJwdXNoXCIsIHsgZGF0YSB9XSk7XG4gICAgICAgIH1cbiAgICAgIH0sXG4gICAgKTtcbiAgICB0aGlzLm9uKFwiZHJhZ292ZXJcIiwgKGUpID0+IGUucHJldmVudERlZmF1bHQoKSk7XG4gICAgdGhpcy5vbihcImRyb3BcIiwgKGUpID0+IHtcbiAgICAgIGUucHJldmVudERlZmF1bHQoKTtcbiAgICAgIGNvbnN0IGRyb3BUYXJnZXRJZCA9IG1heWJlKFxuICAgICAgICBjbG9zZXN0UGh4QmluZGluZyhlLnRhcmdldCwgdGhpcy5iaW5kaW5nKFBIWF9EUk9QX1RBUkdFVCkpLFxuICAgICAgICAodHJ1ZVRhcmdldCkgPT4ge1xuICAgICAgICAgIHJldHVybiB0cnVlVGFyZ2V0LmdldEF0dHJpYnV0ZSh0aGlzLmJpbmRpbmcoUEhYX0RST1BfVEFSR0VUKSk7XG4gICAgICAgIH0sXG4gICAgICApO1xuICAgICAgY29uc3QgZHJvcFRhcmdldCA9IGRyb3BUYXJnZXRJZCAmJiBkb2N1bWVudC5nZXRFbGVtZW50QnlJZChkcm9wVGFyZ2V0SWQpO1xuICAgICAgY29uc3QgZmlsZXMgPSBBcnJheS5mcm9tKGUuZGF0YVRyYW5zZmVyLmZpbGVzIHx8IFtdKTtcbiAgICAgIGlmIChcbiAgICAgICAgIWRyb3BUYXJnZXQgfHxcbiAgICAgICAgIShkcm9wVGFyZ2V0IGluc3RhbmNlb2YgSFRNTElucHV0RWxlbWVudCkgfHxcbiAgICAgICAgZHJvcFRhcmdldC5kaXNhYmxlZCB8fFxuICAgICAgICBmaWxlcy5sZW5ndGggPT09IDAgfHxcbiAgICAgICAgIShkcm9wVGFyZ2V0LmZpbGVzIGluc3RhbmNlb2YgRmlsZUxpc3QpXG4gICAgICApIHtcbiAgICAgICAgcmV0dXJuO1xuICAgICAgfVxuXG4gICAgICBMaXZlVXBsb2FkZXIudHJhY2tGaWxlcyhkcm9wVGFyZ2V0LCBmaWxlcywgZS5kYXRhVHJhbnNmZXIpO1xuICAgICAgZHJvcFRhcmdldC5kaXNwYXRjaEV2ZW50KG5ldyBFdmVudChcImlucHV0XCIsIHsgYnViYmxlczogdHJ1ZSB9KSk7XG4gICAgfSk7XG4gICAgdGhpcy5vbihQSFhfVFJBQ0tfVVBMT0FEUywgKGUpID0+IHtcbiAgICAgIGNvbnN0IHVwbG9hZFRhcmdldCA9IGUudGFyZ2V0O1xuICAgICAgaWYgKCFET00uaXNVcGxvYWRJbnB1dCh1cGxvYWRUYXJnZXQpKSB7XG4gICAgICAgIHJldHVybjtcbiAgICAgIH1cbiAgICAgIGNvbnN0IGZpbGVzID0gQXJyYXkuZnJvbShlLmRldGFpbC5maWxlcyB8fCBbXSkuZmlsdGVyKFxuICAgICAgICAoZikgPT4gZiBpbnN0YW5jZW9mIEZpbGUgfHwgZiBpbnN0YW5jZW9mIEJsb2IsXG4gICAgICApO1xuICAgICAgTGl2ZVVwbG9hZGVyLnRyYWNrRmlsZXModXBsb2FkVGFyZ2V0LCBmaWxlcyk7XG4gICAgICB1cGxvYWRUYXJnZXQuZGlzcGF0Y2hFdmVudChuZXcgRXZlbnQoXCJpbnB1dFwiLCB7IGJ1YmJsZXM6IHRydWUgfSkpO1xuICAgIH0pO1xuICB9XG5cbiAgZXZlbnRNZXRhKGV2ZW50TmFtZSwgZSwgdGFyZ2V0RWwpIHtcbiAgICBjb25zdCBjYWxsYmFjayA9IHRoaXMubWV0YWRhdGFDYWxsYmFja3NbZXZlbnROYW1lXTtcbiAgICByZXR1cm4gY2FsbGJhY2sgPyBjYWxsYmFjayhlLCB0YXJnZXRFbCkgOiB7fTtcbiAgfVxuXG4gIHNldFBlbmRpbmdMaW5rKGhyZWYpIHtcbiAgICB0aGlzLmxpbmtSZWYrKztcbiAgICB0aGlzLnBlbmRpbmdMaW5rID0gaHJlZjtcbiAgICB0aGlzLnJlc2V0UmVsb2FkU3RhdHVzKCk7XG4gICAgcmV0dXJuIHRoaXMubGlua1JlZjtcbiAgfVxuXG4gIC8vIGFueXRpbWUgd2UgYXJlIG5hdmlnYXRpbmcgb3IgY29ubmVjdGluZywgZHJvcCByZWxvYWQgY29va2llIGluIGNhc2VcbiAgLy8gd2UgaXNzdWUgdGhlIGNvb2tpZSBidXQgdGhlIG5leHQgcmVxdWVzdCB3YXMgaW50ZXJydXB0ZWQgYW5kIHRoZSBzZXJ2ZXIgbmV2ZXIgZHJvcHBlZCBpdFxuICByZXNldFJlbG9hZFN0YXR1cygpIHtcbiAgICBCcm93c2VyLmRlbGV0ZUNvb2tpZShQSFhfUkVMT0FEX1NUQVRVUyk7XG4gIH1cblxuICBjb21taXRQZW5kaW5nTGluayhsaW5rUmVmKSB7XG4gICAgaWYgKHRoaXMubGlua1JlZiAhPT0gbGlua1JlZikge1xuICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH0gZWxzZSB7XG4gICAgICB0aGlzLmhyZWYgPSB0aGlzLnBlbmRpbmdMaW5rO1xuICAgICAgdGhpcy5wZW5kaW5nTGluayA9IG51bGw7XG4gICAgICByZXR1cm4gdHJ1ZTtcbiAgICB9XG4gIH1cblxuICBnZXRIcmVmKCkge1xuICAgIHJldHVybiB0aGlzLmhyZWY7XG4gIH1cblxuICBoYXNQZW5kaW5nTGluaygpIHtcbiAgICByZXR1cm4gISF0aGlzLnBlbmRpbmdMaW5rO1xuICB9XG5cbiAgYmluZChldmVudHMsIGNhbGxiYWNrKSB7XG4gICAgZm9yIChjb25zdCBldmVudCBpbiBldmVudHMpIHtcbiAgICAgIGNvbnN0IGJyb3dzZXJFdmVudE5hbWUgPSBldmVudHNbZXZlbnRdO1xuXG4gICAgICB0aGlzLm9uKGJyb3dzZXJFdmVudE5hbWUsIChlKSA9PiB7XG4gICAgICAgIGNvbnN0IGJpbmRpbmcgPSB0aGlzLmJpbmRpbmcoZXZlbnQpO1xuICAgICAgICBjb25zdCB3aW5kb3dCaW5kaW5nID0gdGhpcy5iaW5kaW5nKGB3aW5kb3ctJHtldmVudH1gKTtcbiAgICAgICAgY29uc3QgdGFyZ2V0UGh4RXZlbnQgPVxuICAgICAgICAgIGUudGFyZ2V0LmdldEF0dHJpYnV0ZSAmJiBlLnRhcmdldC5nZXRBdHRyaWJ1dGUoYmluZGluZyk7XG4gICAgICAgIGlmICh0YXJnZXRQaHhFdmVudCkge1xuICAgICAgICAgIHRoaXMuZGVib3VuY2UoZS50YXJnZXQsIGUsIGJyb3dzZXJFdmVudE5hbWUsICgpID0+IHtcbiAgICAgICAgICAgIHRoaXMud2l0aGluT3duZXJzKGUudGFyZ2V0LCAodmlldykgPT4ge1xuICAgICAgICAgICAgICBjYWxsYmFjayhlLCBldmVudCwgdmlldywgZS50YXJnZXQsIHRhcmdldFBoeEV2ZW50LCBudWxsKTtcbiAgICAgICAgICAgIH0pO1xuICAgICAgICAgIH0pO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIERPTS5hbGwoZG9jdW1lbnQsIGBbJHt3aW5kb3dCaW5kaW5nfV1gLCAoZWwpID0+IHtcbiAgICAgICAgICAgIGNvbnN0IHBoeEV2ZW50ID0gZWwuZ2V0QXR0cmlidXRlKHdpbmRvd0JpbmRpbmcpO1xuICAgICAgICAgICAgdGhpcy5kZWJvdW5jZShlbCwgZSwgYnJvd3NlckV2ZW50TmFtZSwgKCkgPT4ge1xuICAgICAgICAgICAgICB0aGlzLndpdGhpbk93bmVycyhlbCwgKHZpZXcpID0+IHtcbiAgICAgICAgICAgICAgICBjYWxsYmFjayhlLCBldmVudCwgdmlldywgZWwsIHBoeEV2ZW50LCBcIndpbmRvd1wiKTtcbiAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICB9KTtcbiAgICAgICAgICB9KTtcbiAgICAgICAgfVxuICAgICAgfSk7XG4gICAgfVxuICB9XG5cbiAgYmluZENsaWNrcygpIHtcbiAgICB0aGlzLm9uKFwibW91c2Vkb3duXCIsIChlKSA9PiAodGhpcy5jbGlja1N0YXJ0ZWRBdFRhcmdldCA9IGUudGFyZ2V0KSk7XG4gICAgdGhpcy5iaW5kQ2xpY2soXCJjbGlja1wiLCBcImNsaWNrXCIpO1xuICB9XG5cbiAgYmluZENsaWNrKGV2ZW50TmFtZSwgYmluZGluZ05hbWUpIHtcbiAgICBjb25zdCBjbGljayA9IHRoaXMuYmluZGluZyhiaW5kaW5nTmFtZSk7XG4gICAgd2luZG93LmFkZEV2ZW50TGlzdGVuZXIoXG4gICAgICBldmVudE5hbWUsXG4gICAgICAoZSkgPT4ge1xuICAgICAgICBsZXQgdGFyZ2V0ID0gbnVsbDtcbiAgICAgICAgLy8gYSBzeW50aGV0aWMgY2xpY2sgZXZlbnQgKGRldGFpbCAwKSB3aWxsIG5vdCBoYXZlIGNhdXNlZCBhIG1vdXNlZG93biBldmVudCxcbiAgICAgICAgLy8gdGhlcmVmb3JlIHRoZSBjbGlja1N0YXJ0ZWRBdFRhcmdldCBpcyBzdGFsZVxuICAgICAgICBpZiAoZS5kZXRhaWwgPT09IDApIHRoaXMuY2xpY2tTdGFydGVkQXRUYXJnZXQgPSBlLnRhcmdldDtcbiAgICAgICAgY29uc3QgY2xpY2tTdGFydGVkQXRUYXJnZXQgPSB0aGlzLmNsaWNrU3RhcnRlZEF0VGFyZ2V0IHx8IGUudGFyZ2V0O1xuICAgICAgICAvLyB3aGVuIHNlYXJjaGluZyB0aGUgdGFyZ2V0IGZvciB0aGUgY2xpY2sgZXZlbnQsIHdlIGFsd2F5cyB3YW50IHRvXG4gICAgICAgIC8vIHVzZSB0aGUgYWN0dWFsIGV2ZW50IHRhcmdldCwgc2VlICMzMzcyXG4gICAgICAgIHRhcmdldCA9IGNsb3Nlc3RQaHhCaW5kaW5nKGUudGFyZ2V0LCBjbGljayk7XG4gICAgICAgIHRoaXMuZGlzcGF0Y2hDbGlja0F3YXkoZSwgY2xpY2tTdGFydGVkQXRUYXJnZXQpO1xuICAgICAgICB0aGlzLmNsaWNrU3RhcnRlZEF0VGFyZ2V0ID0gbnVsbDtcbiAgICAgICAgY29uc3QgcGh4RXZlbnQgPSB0YXJnZXQgJiYgdGFyZ2V0LmdldEF0dHJpYnV0ZShjbGljayk7XG4gICAgICAgIGlmICghcGh4RXZlbnQpIHtcbiAgICAgICAgICBpZiAoRE9NLmlzTmV3UGFnZUNsaWNrKGUsIHdpbmRvdy5sb2NhdGlvbikpIHtcbiAgICAgICAgICAgIHRoaXMudW5sb2FkKCk7XG4gICAgICAgICAgfVxuICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuXG4gICAgICAgIGlmICh0YXJnZXQuZ2V0QXR0cmlidXRlKFwiaHJlZlwiKSA9PT0gXCIjXCIpIHtcbiAgICAgICAgICBlLnByZXZlbnREZWZhdWx0KCk7XG4gICAgICAgIH1cblxuICAgICAgICAvLyBub29wIGlmIHdlIGFyZSBpbiB0aGUgbWlkZGxlIG9mIGF3YWl0aW5nIGFuIGFjayBmb3IgdGhpcyBlbCBhbHJlYWR5XG4gICAgICAgIGlmICh0YXJnZXQuaGFzQXR0cmlidXRlKFBIWF9SRUZfU1JDKSkge1xuICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuXG4gICAgICAgIHRoaXMuZGVib3VuY2UodGFyZ2V0LCBlLCBcImNsaWNrXCIsICgpID0+IHtcbiAgICAgICAgICB0aGlzLndpdGhpbk93bmVycyh0YXJnZXQsICh2aWV3KSA9PiB7XG4gICAgICAgICAgICBKUy5leGVjKGUsIFwiY2xpY2tcIiwgcGh4RXZlbnQsIHZpZXcsIHRhcmdldCwgW1xuICAgICAgICAgICAgICBcInB1c2hcIixcbiAgICAgICAgICAgICAgeyBkYXRhOiB0aGlzLmV2ZW50TWV0YShcImNsaWNrXCIsIGUsIHRhcmdldCkgfSxcbiAgICAgICAgICAgIF0pO1xuICAgICAgICAgIH0pO1xuICAgICAgICB9KTtcbiAgICAgIH0sXG4gICAgICBmYWxzZSxcbiAgICApO1xuICB9XG5cbiAgZGlzcGF0Y2hDbGlja0F3YXkoZSwgY2xpY2tTdGFydGVkQXQpIHtcbiAgICBjb25zdCBwaHhDbGlja0F3YXkgPSB0aGlzLmJpbmRpbmcoXCJjbGljay1hd2F5XCIpO1xuICAgIERPTS5hbGwoZG9jdW1lbnQsIGBbJHtwaHhDbGlja0F3YXl9XWAsIChlbCkgPT4ge1xuICAgICAgaWYgKCEoZWwuaXNTYW1lTm9kZShjbGlja1N0YXJ0ZWRBdCkgfHwgZWwuY29udGFpbnMoY2xpY2tTdGFydGVkQXQpKSkge1xuICAgICAgICB0aGlzLndpdGhpbk93bmVycyhlbCwgKHZpZXcpID0+IHtcbiAgICAgICAgICBjb25zdCBwaHhFdmVudCA9IGVsLmdldEF0dHJpYnV0ZShwaHhDbGlja0F3YXkpO1xuICAgICAgICAgIGlmIChKUy5pc1Zpc2libGUoZWwpICYmIEpTLmlzSW5WaWV3cG9ydChlbCkpIHtcbiAgICAgICAgICAgIEpTLmV4ZWMoZSwgXCJjbGlja1wiLCBwaHhFdmVudCwgdmlldywgZWwsIFtcbiAgICAgICAgICAgICAgXCJwdXNoXCIsXG4gICAgICAgICAgICAgIHsgZGF0YTogdGhpcy5ldmVudE1ldGEoXCJjbGlja1wiLCBlLCBlLnRhcmdldCkgfSxcbiAgICAgICAgICAgIF0pO1xuICAgICAgICAgIH1cbiAgICAgICAgfSk7XG4gICAgICB9XG4gICAgfSk7XG4gIH1cblxuICBiaW5kTmF2KCkge1xuICAgIGlmICghQnJvd3Nlci5jYW5QdXNoU3RhdGUoKSkge1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICBpZiAoaGlzdG9yeS5zY3JvbGxSZXN0b3JhdGlvbikge1xuICAgICAgaGlzdG9yeS5zY3JvbGxSZXN0b3JhdGlvbiA9IFwibWFudWFsXCI7XG4gICAgfVxuICAgIGxldCBzY3JvbGxUaW1lciA9IG51bGw7XG4gICAgd2luZG93LmFkZEV2ZW50TGlzdGVuZXIoXCJzY3JvbGxcIiwgKF9lKSA9PiB7XG4gICAgICBjbGVhclRpbWVvdXQoc2Nyb2xsVGltZXIpO1xuICAgICAgc2Nyb2xsVGltZXIgPSBzZXRUaW1lb3V0KCgpID0+IHtcbiAgICAgICAgQnJvd3Nlci51cGRhdGVDdXJyZW50U3RhdGUoKHN0YXRlKSA9PlxuICAgICAgICAgIE9iamVjdC5hc3NpZ24oc3RhdGUsIHsgc2Nyb2xsOiB3aW5kb3cuc2Nyb2xsWSB9KSxcbiAgICAgICAgKTtcbiAgICAgIH0sIDEwMCk7XG4gICAgfSk7XG4gICAgd2luZG93LmFkZEV2ZW50TGlzdGVuZXIoXG4gICAgICBcInBvcHN0YXRlXCIsXG4gICAgICAoZXZlbnQpID0+IHtcbiAgICAgICAgaWYgKCF0aGlzLnJlZ2lzdGVyTmV3TG9jYXRpb24od2luZG93LmxvY2F0aW9uKSkge1xuICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuICAgICAgICBjb25zdCB7IHR5cGUsIGJhY2tUeXBlLCBpZCwgc2Nyb2xsLCBwb3NpdGlvbiB9ID0gZXZlbnQuc3RhdGUgfHwge307XG4gICAgICAgIGNvbnN0IGhyZWYgPSB3aW5kb3cubG9jYXRpb24uaHJlZjtcblxuICAgICAgICAvLyBDb21wYXJlIHBvc2l0aW9ucyB0byBkZXRlcm1pbmUgZGlyZWN0aW9uXG4gICAgICAgIGNvbnN0IGlzRm9yd2FyZCA9IHBvc2l0aW9uID4gdGhpcy5jdXJyZW50SGlzdG9yeVBvc2l0aW9uO1xuICAgICAgICBjb25zdCBuYXZUeXBlID0gaXNGb3J3YXJkID8gdHlwZSA6IGJhY2tUeXBlIHx8IHR5cGU7XG5cbiAgICAgICAgLy8gVXBkYXRlIGN1cnJlbnQgcG9zaXRpb25cbiAgICAgICAgdGhpcy5jdXJyZW50SGlzdG9yeVBvc2l0aW9uID0gcG9zaXRpb24gfHwgMDtcbiAgICAgICAgdGhpcy5zZXNzaW9uU3RvcmFnZS5zZXRJdGVtKFxuICAgICAgICAgIFBIWF9MVl9ISVNUT1JZX1BPU0lUSU9OLFxuICAgICAgICAgIHRoaXMuY3VycmVudEhpc3RvcnlQb3NpdGlvbi50b1N0cmluZygpLFxuICAgICAgICApO1xuXG4gICAgICAgIERPTS5kaXNwYXRjaEV2ZW50KHdpbmRvdywgXCJwaHg6bmF2aWdhdGVcIiwge1xuICAgICAgICAgIGRldGFpbDoge1xuICAgICAgICAgICAgaHJlZixcbiAgICAgICAgICAgIHBhdGNoOiBuYXZUeXBlID09PSBcInBhdGNoXCIsXG4gICAgICAgICAgICBwb3A6IHRydWUsXG4gICAgICAgICAgICBkaXJlY3Rpb246IGlzRm9yd2FyZCA/IFwiZm9yd2FyZFwiIDogXCJiYWNrd2FyZFwiLFxuICAgICAgICAgIH0sXG4gICAgICAgIH0pO1xuICAgICAgICB0aGlzLnJlcXVlc3RET01VcGRhdGUoKCkgPT4ge1xuICAgICAgICAgIGNvbnN0IGNhbGxiYWNrID0gKCkgPT4ge1xuICAgICAgICAgICAgdGhpcy5tYXliZVNjcm9sbChzY3JvbGwpO1xuICAgICAgICAgIH07XG4gICAgICAgICAgaWYgKFxuICAgICAgICAgICAgdGhpcy5tYWluLmlzQ29ubmVjdGVkKCkgJiZcbiAgICAgICAgICAgIG5hdlR5cGUgPT09IFwicGF0Y2hcIiAmJlxuICAgICAgICAgICAgaWQgPT09IHRoaXMubWFpbi5pZFxuICAgICAgICAgICkge1xuICAgICAgICAgICAgdGhpcy5tYWluLnB1c2hMaW5rUGF0Y2goZXZlbnQsIGhyZWYsIG51bGwsIGNhbGxiYWNrKTtcbiAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgdGhpcy5yZXBsYWNlTWFpbihocmVmLCBudWxsLCBjYWxsYmFjayk7XG4gICAgICAgICAgfVxuICAgICAgICB9KTtcbiAgICAgIH0sXG4gICAgICBmYWxzZSxcbiAgICApO1xuICAgIHdpbmRvdy5hZGRFdmVudExpc3RlbmVyKFxuICAgICAgXCJjbGlja1wiLFxuICAgICAgKGUpID0+IHtcbiAgICAgICAgY29uc3QgdGFyZ2V0ID0gY2xvc2VzdFBoeEJpbmRpbmcoZS50YXJnZXQsIFBIWF9MSVZFX0xJTkspO1xuICAgICAgICBjb25zdCB0eXBlID0gdGFyZ2V0ICYmIHRhcmdldC5nZXRBdHRyaWJ1dGUoUEhYX0xJVkVfTElOSyk7XG4gICAgICAgIGlmICghdHlwZSB8fCAhdGhpcy5pc0Nvbm5lY3RlZCgpIHx8ICF0aGlzLm1haW4gfHwgRE9NLndhbnRzTmV3VGFiKGUpKSB7XG4gICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG5cbiAgICAgICAgLy8gV2hlbiB3cmFwcGluZyBhbiBTVkcgZWxlbWVudCBpbiBhbiBhbmNob3IgdGFnLCB0aGUgaHJlZiBjYW4gYmUgYW4gU1ZHQW5pbWF0ZWRTdHJpbmdcbiAgICAgICAgY29uc3QgaHJlZiA9XG4gICAgICAgICAgdGFyZ2V0LmhyZWYgaW5zdGFuY2VvZiBTVkdBbmltYXRlZFN0cmluZ1xuICAgICAgICAgICAgPyB0YXJnZXQuaHJlZi5iYXNlVmFsXG4gICAgICAgICAgICA6IHRhcmdldC5ocmVmO1xuXG4gICAgICAgIGNvbnN0IGxpbmtTdGF0ZSA9IHRhcmdldC5nZXRBdHRyaWJ1dGUoUEhYX0xJTktfU1RBVEUpO1xuICAgICAgICBlLnByZXZlbnREZWZhdWx0KCk7XG4gICAgICAgIGUuc3RvcEltbWVkaWF0ZVByb3BhZ2F0aW9uKCk7IC8vIGRvIG5vdCBidWJibGUgY2xpY2sgdG8gcmVndWxhciBwaHgtY2xpY2sgYmluZGluZ3NcbiAgICAgICAgaWYgKHRoaXMucGVuZGluZ0xpbmsgPT09IGhyZWYpIHtcbiAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cblxuICAgICAgICB0aGlzLnJlcXVlc3RET01VcGRhdGUoKCkgPT4ge1xuICAgICAgICAgIGlmICh0eXBlID09PSBcInBhdGNoXCIpIHtcbiAgICAgICAgICAgIHRoaXMucHVzaEhpc3RvcnlQYXRjaChlLCBocmVmLCBsaW5rU3RhdGUsIHRhcmdldCk7XG4gICAgICAgICAgfSBlbHNlIGlmICh0eXBlID09PSBcInJlZGlyZWN0XCIpIHtcbiAgICAgICAgICAgIHRoaXMuaGlzdG9yeVJlZGlyZWN0KGUsIGhyZWYsIGxpbmtTdGF0ZSwgbnVsbCwgdGFyZ2V0KTtcbiAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKFxuICAgICAgICAgICAgICBgZXhwZWN0ZWQgJHtQSFhfTElWRV9MSU5LfSB0byBiZSBcInBhdGNoXCIgb3IgXCJyZWRpcmVjdFwiLCBnb3Q6ICR7dHlwZX1gLFxuICAgICAgICAgICAgKTtcbiAgICAgICAgICB9XG4gICAgICAgICAgY29uc3QgcGh4Q2xpY2sgPSB0YXJnZXQuZ2V0QXR0cmlidXRlKHRoaXMuYmluZGluZyhcImNsaWNrXCIpKTtcbiAgICAgICAgICBpZiAocGh4Q2xpY2spIHtcbiAgICAgICAgICAgIHRoaXMucmVxdWVzdERPTVVwZGF0ZSgoKSA9PiB0aGlzLmV4ZWNKUyh0YXJnZXQsIHBoeENsaWNrLCBcImNsaWNrXCIpKTtcbiAgICAgICAgICB9XG4gICAgICAgIH0pO1xuICAgICAgfSxcbiAgICAgIGZhbHNlLFxuICAgICk7XG4gIH1cblxuICBtYXliZVNjcm9sbChzY3JvbGwpIHtcbiAgICBpZiAodHlwZW9mIHNjcm9sbCA9PT0gXCJudW1iZXJcIikge1xuICAgICAgcmVxdWVzdEFuaW1hdGlvbkZyYW1lKCgpID0+IHtcbiAgICAgICAgd2luZG93LnNjcm9sbFRvKDAsIHNjcm9sbCk7XG4gICAgICB9KTsgLy8gdGhlIGJvZHkgbmVlZHMgdG8gcmVuZGVyIGJlZm9yZSB3ZSBzY3JvbGwuXG4gICAgfVxuICB9XG5cbiAgZGlzcGF0Y2hFdmVudChldmVudCwgcGF5bG9hZCA9IHt9KSB7XG4gICAgRE9NLmRpc3BhdGNoRXZlbnQod2luZG93LCBgcGh4OiR7ZXZlbnR9YCwgeyBkZXRhaWw6IHBheWxvYWQgfSk7XG4gIH1cblxuICBkaXNwYXRjaEV2ZW50cyhldmVudHMpIHtcbiAgICBldmVudHMuZm9yRWFjaCgoW2V2ZW50LCBwYXlsb2FkXSkgPT4gdGhpcy5kaXNwYXRjaEV2ZW50KGV2ZW50LCBwYXlsb2FkKSk7XG4gIH1cblxuICB3aXRoUGFnZUxvYWRpbmcoaW5mbywgY2FsbGJhY2spIHtcbiAgICBET00uZGlzcGF0Y2hFdmVudCh3aW5kb3csIFwicGh4OnBhZ2UtbG9hZGluZy1zdGFydFwiLCB7IGRldGFpbDogaW5mbyB9KTtcbiAgICBjb25zdCBkb25lID0gKCkgPT5cbiAgICAgIERPTS5kaXNwYXRjaEV2ZW50KHdpbmRvdywgXCJwaHg6cGFnZS1sb2FkaW5nLXN0b3BcIiwgeyBkZXRhaWw6IGluZm8gfSk7XG4gICAgcmV0dXJuIGNhbGxiYWNrID8gY2FsbGJhY2soZG9uZSkgOiBkb25lO1xuICB9XG5cbiAgcHVzaEhpc3RvcnlQYXRjaChlLCBocmVmLCBsaW5rU3RhdGUsIHRhcmdldEVsKSB7XG4gICAgaWYgKCF0aGlzLmlzQ29ubmVjdGVkKCkgfHwgIXRoaXMubWFpbi5pc01haW4oKSkge1xuICAgICAgcmV0dXJuIEJyb3dzZXIucmVkaXJlY3QoaHJlZik7XG4gICAgfVxuXG4gICAgdGhpcy53aXRoUGFnZUxvYWRpbmcoeyB0bzogaHJlZiwga2luZDogXCJwYXRjaFwiIH0sIChkb25lKSA9PiB7XG4gICAgICB0aGlzLm1haW4ucHVzaExpbmtQYXRjaChlLCBocmVmLCB0YXJnZXRFbCwgKGxpbmtSZWYpID0+IHtcbiAgICAgICAgdGhpcy5oaXN0b3J5UGF0Y2goaHJlZiwgbGlua1N0YXRlLCBsaW5rUmVmKTtcbiAgICAgICAgZG9uZSgpO1xuICAgICAgfSk7XG4gICAgfSk7XG4gIH1cblxuICBoaXN0b3J5UGF0Y2goaHJlZiwgbGlua1N0YXRlLCBsaW5rUmVmID0gdGhpcy5zZXRQZW5kaW5nTGluayhocmVmKSkge1xuICAgIGlmICghdGhpcy5jb21taXRQZW5kaW5nTGluayhsaW5rUmVmKSkge1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIC8vIEluY3JlbWVudCBwb3NpdGlvbiBmb3IgbmV3IHN0YXRlXG4gICAgdGhpcy5jdXJyZW50SGlzdG9yeVBvc2l0aW9uKys7XG4gICAgdGhpcy5zZXNzaW9uU3RvcmFnZS5zZXRJdGVtKFxuICAgICAgUEhYX0xWX0hJU1RPUllfUE9TSVRJT04sXG4gICAgICB0aGlzLmN1cnJlbnRIaXN0b3J5UG9zaXRpb24udG9TdHJpbmcoKSxcbiAgICApO1xuXG4gICAgLy8gc3RvcmUgdGhlIHR5cGUgZm9yIGJhY2sgbmF2aWdhdGlvblxuICAgIEJyb3dzZXIudXBkYXRlQ3VycmVudFN0YXRlKChzdGF0ZSkgPT4gKHsgLi4uc3RhdGUsIGJhY2tUeXBlOiBcInBhdGNoXCIgfSkpO1xuXG4gICAgQnJvd3Nlci5wdXNoU3RhdGUoXG4gICAgICBsaW5rU3RhdGUsXG4gICAgICB7XG4gICAgICAgIHR5cGU6IFwicGF0Y2hcIixcbiAgICAgICAgaWQ6IHRoaXMubWFpbi5pZCxcbiAgICAgICAgcG9zaXRpb246IHRoaXMuY3VycmVudEhpc3RvcnlQb3NpdGlvbixcbiAgICAgIH0sXG4gICAgICBocmVmLFxuICAgICk7XG5cbiAgICBET00uZGlzcGF0Y2hFdmVudCh3aW5kb3csIFwicGh4Om5hdmlnYXRlXCIsIHtcbiAgICAgIGRldGFpbDogeyBwYXRjaDogdHJ1ZSwgaHJlZiwgcG9wOiBmYWxzZSwgZGlyZWN0aW9uOiBcImZvcndhcmRcIiB9LFxuICAgIH0pO1xuICAgIHRoaXMucmVnaXN0ZXJOZXdMb2NhdGlvbih3aW5kb3cubG9jYXRpb24pO1xuICB9XG5cbiAgaGlzdG9yeVJlZGlyZWN0KGUsIGhyZWYsIGxpbmtTdGF0ZSwgZmxhc2gsIHRhcmdldEVsKSB7XG4gICAgY29uc3QgY2xpY2tMb2FkaW5nID0gdGFyZ2V0RWwgJiYgZS5pc1RydXN0ZWQgJiYgZS50eXBlICE9PSBcInBvcHN0YXRlXCI7XG4gICAgaWYgKGNsaWNrTG9hZGluZykge1xuICAgICAgdGFyZ2V0RWwuY2xhc3NMaXN0LmFkZChcInBoeC1jbGljay1sb2FkaW5nXCIpO1xuICAgIH1cbiAgICBpZiAoIXRoaXMuaXNDb25uZWN0ZWQoKSB8fCAhdGhpcy5tYWluLmlzTWFpbigpKSB7XG4gICAgICByZXR1cm4gQnJvd3Nlci5yZWRpcmVjdChocmVmLCBmbGFzaCk7XG4gICAgfVxuXG4gICAgLy8gY29udmVydCB0byBmdWxsIGhyZWYgaWYgb25seSBwYXRoIHByZWZpeFxuICAgIGlmICgvXlxcLyR8XlxcL1teXFwvXSsuKiQvLnRlc3QoaHJlZikpIHtcbiAgICAgIGNvbnN0IHsgcHJvdG9jb2wsIGhvc3QgfSA9IHdpbmRvdy5sb2NhdGlvbjtcbiAgICAgIGhyZWYgPSBgJHtwcm90b2NvbH0vLyR7aG9zdH0ke2hyZWZ9YDtcbiAgICB9XG4gICAgY29uc3Qgc2Nyb2xsID0gd2luZG93LnNjcm9sbFk7XG4gICAgdGhpcy53aXRoUGFnZUxvYWRpbmcoeyB0bzogaHJlZiwga2luZDogXCJyZWRpcmVjdFwiIH0sIChkb25lKSA9PiB7XG4gICAgICB0aGlzLnJlcGxhY2VNYWluKGhyZWYsIGZsYXNoLCAobGlua1JlZikgPT4ge1xuICAgICAgICBpZiAobGlua1JlZiA9PT0gdGhpcy5saW5rUmVmKSB7XG4gICAgICAgICAgLy8gSW5jcmVtZW50IHBvc2l0aW9uIGZvciBuZXcgc3RhdGVcbiAgICAgICAgICB0aGlzLmN1cnJlbnRIaXN0b3J5UG9zaXRpb24rKztcbiAgICAgICAgICB0aGlzLnNlc3Npb25TdG9yYWdlLnNldEl0ZW0oXG4gICAgICAgICAgICBQSFhfTFZfSElTVE9SWV9QT1NJVElPTixcbiAgICAgICAgICAgIHRoaXMuY3VycmVudEhpc3RvcnlQb3NpdGlvbi50b1N0cmluZygpLFxuICAgICAgICAgICk7XG5cbiAgICAgICAgICAvLyBzdG9yZSB0aGUgdHlwZSBmb3IgYmFjayBuYXZpZ2F0aW9uXG4gICAgICAgICAgQnJvd3Nlci51cGRhdGVDdXJyZW50U3RhdGUoKHN0YXRlKSA9PiAoe1xuICAgICAgICAgICAgLi4uc3RhdGUsXG4gICAgICAgICAgICBiYWNrVHlwZTogXCJyZWRpcmVjdFwiLFxuICAgICAgICAgIH0pKTtcblxuICAgICAgICAgIEJyb3dzZXIucHVzaFN0YXRlKFxuICAgICAgICAgICAgbGlua1N0YXRlLFxuICAgICAgICAgICAge1xuICAgICAgICAgICAgICB0eXBlOiBcInJlZGlyZWN0XCIsXG4gICAgICAgICAgICAgIGlkOiB0aGlzLm1haW4uaWQsXG4gICAgICAgICAgICAgIHNjcm9sbDogc2Nyb2xsLFxuICAgICAgICAgICAgICBwb3NpdGlvbjogdGhpcy5jdXJyZW50SGlzdG9yeVBvc2l0aW9uLFxuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIGhyZWYsXG4gICAgICAgICAgKTtcblxuICAgICAgICAgIERPTS5kaXNwYXRjaEV2ZW50KHdpbmRvdywgXCJwaHg6bmF2aWdhdGVcIiwge1xuICAgICAgICAgICAgZGV0YWlsOiB7IGhyZWYsIHBhdGNoOiBmYWxzZSwgcG9wOiBmYWxzZSwgZGlyZWN0aW9uOiBcImZvcndhcmRcIiB9LFxuICAgICAgICAgIH0pO1xuICAgICAgICAgIHRoaXMucmVnaXN0ZXJOZXdMb2NhdGlvbih3aW5kb3cubG9jYXRpb24pO1xuICAgICAgICB9XG4gICAgICAgIC8vIGV4cGxpY2l0bHkgdW5kbyBjbGljay1sb2FkaW5nIGNsYXNzXG4gICAgICAgIC8vIChpbiBjYXNlIGl0IG9yaWdpbmF0ZWQgaW4gYSBzdGlja3kgbGl2ZSB2aWV3LCBvdGhlcndpc2UgaXQgd291bGQgYmUgcmVtb3ZlZCBhbnl3YXkpXG4gICAgICAgIGlmIChjbGlja0xvYWRpbmcpIHtcbiAgICAgICAgICB0YXJnZXRFbC5jbGFzc0xpc3QucmVtb3ZlKFwicGh4LWNsaWNrLWxvYWRpbmdcIik7XG4gICAgICAgIH1cbiAgICAgICAgZG9uZSgpO1xuICAgICAgfSk7XG4gICAgfSk7XG4gIH1cblxuICByZWdpc3Rlck5ld0xvY2F0aW9uKG5ld0xvY2F0aW9uKSB7XG4gICAgY29uc3QgeyBwYXRobmFtZSwgc2VhcmNoIH0gPSB0aGlzLmN1cnJlbnRMb2NhdGlvbjtcbiAgICBpZiAocGF0aG5hbWUgKyBzZWFyY2ggPT09IG5ld0xvY2F0aW9uLnBhdGhuYW1lICsgbmV3TG9jYXRpb24uc2VhcmNoKSB7XG4gICAgICByZXR1cm4gZmFsc2U7XG4gICAgfSBlbHNlIHtcbiAgICAgIHRoaXMuY3VycmVudExvY2F0aW9uID0gY2xvbmUobmV3TG9jYXRpb24pO1xuICAgICAgcmV0dXJuIHRydWU7XG4gICAgfVxuICB9XG5cbiAgYmluZEZvcm1zKCkge1xuICAgIGxldCBpdGVyYXRpb25zID0gMDtcbiAgICBsZXQgZXh0ZXJuYWxGb3JtU3VibWl0dGVkID0gZmFsc2U7XG5cbiAgICAvLyBkaXNhYmxlIGZvcm1zIG9uIHN1Ym1pdCB0aGF0IHRyYWNrIHBoeC1jaGFuZ2UgYnV0IHBlcmZvcm0gZXh0ZXJuYWwgc3VibWl0XG4gICAgdGhpcy5vbihcInN1Ym1pdFwiLCAoZSkgPT4ge1xuICAgICAgY29uc3QgcGh4U3VibWl0ID0gZS50YXJnZXQuZ2V0QXR0cmlidXRlKHRoaXMuYmluZGluZyhcInN1Ym1pdFwiKSk7XG4gICAgICBjb25zdCBwaHhDaGFuZ2UgPSBlLnRhcmdldC5nZXRBdHRyaWJ1dGUodGhpcy5iaW5kaW5nKFwiY2hhbmdlXCIpKTtcbiAgICAgIGlmICghZXh0ZXJuYWxGb3JtU3VibWl0dGVkICYmIHBoeENoYW5nZSAmJiAhcGh4U3VibWl0KSB7XG4gICAgICAgIGV4dGVybmFsRm9ybVN1Ym1pdHRlZCA9IHRydWU7XG4gICAgICAgIGUucHJldmVudERlZmF1bHQoKTtcbiAgICAgICAgdGhpcy53aXRoaW5Pd25lcnMoZS50YXJnZXQsICh2aWV3KSA9PiB7XG4gICAgICAgICAgdmlldy5kaXNhYmxlRm9ybShlLnRhcmdldCk7XG4gICAgICAgICAgLy8gc2FmYXJpIG5lZWRzIG5leHQgdGlja1xuICAgICAgICAgIHdpbmRvdy5yZXF1ZXN0QW5pbWF0aW9uRnJhbWUoKCkgPT4ge1xuICAgICAgICAgICAgaWYgKERPTS5pc1VubG9hZGFibGVGb3JtU3VibWl0KGUpKSB7XG4gICAgICAgICAgICAgIHRoaXMudW5sb2FkKCk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBlLnRhcmdldC5zdWJtaXQoKTtcbiAgICAgICAgICB9KTtcbiAgICAgICAgfSk7XG4gICAgICB9XG4gICAgfSk7XG5cbiAgICB0aGlzLm9uKFwic3VibWl0XCIsIChlKSA9PiB7XG4gICAgICBjb25zdCBwaHhFdmVudCA9IGUudGFyZ2V0LmdldEF0dHJpYnV0ZSh0aGlzLmJpbmRpbmcoXCJzdWJtaXRcIikpO1xuICAgICAgaWYgKCFwaHhFdmVudCkge1xuICAgICAgICBpZiAoRE9NLmlzVW5sb2FkYWJsZUZvcm1TdWJtaXQoZSkpIHtcbiAgICAgICAgICB0aGlzLnVubG9hZCgpO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybjtcbiAgICAgIH1cbiAgICAgIGUucHJldmVudERlZmF1bHQoKTtcbiAgICAgIGUudGFyZ2V0LmRpc2FibGVkID0gdHJ1ZTtcbiAgICAgIHRoaXMud2l0aGluT3duZXJzKGUudGFyZ2V0LCAodmlldykgPT4ge1xuICAgICAgICBKUy5leGVjKGUsIFwic3VibWl0XCIsIHBoeEV2ZW50LCB2aWV3LCBlLnRhcmdldCwgW1xuICAgICAgICAgIFwicHVzaFwiLFxuICAgICAgICAgIHsgc3VibWl0dGVyOiBlLnN1Ym1pdHRlciB9LFxuICAgICAgICBdKTtcbiAgICAgIH0pO1xuICAgIH0pO1xuXG4gICAgZm9yIChjb25zdCB0eXBlIG9mIFtcImNoYW5nZVwiLCBcImlucHV0XCJdKSB7XG4gICAgICB0aGlzLm9uKHR5cGUsIChlKSA9PiB7XG4gICAgICAgIGlmIChcbiAgICAgICAgICBlIGluc3RhbmNlb2YgQ3VzdG9tRXZlbnQgJiZcbiAgICAgICAgICAoZS50YXJnZXQgaW5zdGFuY2VvZiBIVE1MSW5wdXRFbGVtZW50IHx8XG4gICAgICAgICAgICBlLnRhcmdldCBpbnN0YW5jZW9mIEhUTUxTZWxlY3RFbGVtZW50IHx8XG4gICAgICAgICAgICBlLnRhcmdldCBpbnN0YW5jZW9mIEhUTUxUZXh0QXJlYUVsZW1lbnQpICYmXG4gICAgICAgICAgZS50YXJnZXQuZm9ybSA9PT0gdW5kZWZpbmVkXG4gICAgICAgICkge1xuICAgICAgICAgIC8vIHRocm93IG9uIGludmFsaWQgSlMuZGlzcGF0Y2ggdGFyZ2V0IGFuZCBub29wIGlmIEN1c3RvbUV2ZW50IHRyaWdnZXJlZCBvdXRzaWRlIEpTLmRpc3BhdGNoXG4gICAgICAgICAgaWYgKGUuZGV0YWlsICYmIGUuZGV0YWlsLmRpc3BhdGNoZXIpIHtcbiAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcihcbiAgICAgICAgICAgICAgYGRpc3BhdGNoaW5nIGEgY3VzdG9tICR7dHlwZX0gZXZlbnQgaXMgb25seSBzdXBwb3J0ZWQgb24gaW5wdXQgZWxlbWVudHMgaW5zaWRlIGEgZm9ybWAsXG4gICAgICAgICAgICApO1xuICAgICAgICAgIH1cbiAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cbiAgICAgICAgY29uc3QgcGh4Q2hhbmdlID0gdGhpcy5iaW5kaW5nKFwiY2hhbmdlXCIpO1xuICAgICAgICBjb25zdCBpbnB1dCA9IGUudGFyZ2V0O1xuICAgICAgICBpZiAodGhpcy5ibG9ja1BoeENoYW5nZVdoaWxlQ29tcG9zaW5nICYmIGUuaXNDb21wb3NpbmcpIHtcbiAgICAgICAgICBjb25zdCBrZXkgPSBgY29tcG9zaXRpb24tbGlzdGVuZXItJHt0eXBlfWA7XG4gICAgICAgICAgaWYgKCFET00ucHJpdmF0ZShpbnB1dCwga2V5KSkge1xuICAgICAgICAgICAgRE9NLnB1dFByaXZhdGUoaW5wdXQsIGtleSwgdHJ1ZSk7XG4gICAgICAgICAgICBpbnB1dC5hZGRFdmVudExpc3RlbmVyKFxuICAgICAgICAgICAgICBcImNvbXBvc2l0aW9uZW5kXCIsXG4gICAgICAgICAgICAgICgpID0+IHtcbiAgICAgICAgICAgICAgICAvLyB0cmlnZ2VyIGEgbmV3IGlucHV0L2NoYW5nZSBldmVudFxuICAgICAgICAgICAgICAgIGlucHV0LmRpc3BhdGNoRXZlbnQobmV3IEV2ZW50KHR5cGUsIHsgYnViYmxlczogdHJ1ZSB9KSk7XG4gICAgICAgICAgICAgICAgRE9NLmRlbGV0ZVByaXZhdGUoaW5wdXQsIGtleSk7XG4gICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAgIHsgb25jZTogdHJ1ZSB9LFxuICAgICAgICAgICAgKTtcbiAgICAgICAgICB9XG4gICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG4gICAgICAgIGNvbnN0IGlucHV0RXZlbnQgPSBpbnB1dC5nZXRBdHRyaWJ1dGUocGh4Q2hhbmdlKTtcbiAgICAgICAgY29uc3QgZm9ybUV2ZW50ID0gaW5wdXQuZm9ybSAmJiBpbnB1dC5mb3JtLmdldEF0dHJpYnV0ZShwaHhDaGFuZ2UpO1xuICAgICAgICBjb25zdCBwaHhFdmVudCA9IGlucHV0RXZlbnQgfHwgZm9ybUV2ZW50O1xuICAgICAgICBpZiAoIXBoeEV2ZW50KSB7XG4gICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG4gICAgICAgIGlmIChcbiAgICAgICAgICBpbnB1dC50eXBlID09PSBcIm51bWJlclwiICYmXG4gICAgICAgICAgaW5wdXQudmFsaWRpdHkgJiZcbiAgICAgICAgICBpbnB1dC52YWxpZGl0eS5iYWRJbnB1dFxuICAgICAgICApIHtcbiAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cblxuICAgICAgICBjb25zdCBkaXNwYXRjaGVyID0gaW5wdXRFdmVudCA/IGlucHV0IDogaW5wdXQuZm9ybTtcbiAgICAgICAgY29uc3QgY3VycmVudEl0ZXJhdGlvbnMgPSBpdGVyYXRpb25zO1xuICAgICAgICBpdGVyYXRpb25zKys7XG4gICAgICAgIGNvbnN0IHsgYXQ6IGF0LCB0eXBlOiBsYXN0VHlwZSB9ID1cbiAgICAgICAgICBET00ucHJpdmF0ZShpbnB1dCwgXCJwcmV2LWl0ZXJhdGlvblwiKSB8fCB7fTtcbiAgICAgICAgLy8gQnJvd3NlcnMgc2hvdWxkIGFsd2F5cyBmaXJlIGF0IGxlYXN0IG9uZSBcImlucHV0XCIgZXZlbnQgYmVmb3JlIGV2ZXJ5IFwiY2hhbmdlXCJcbiAgICAgICAgLy8gSWdub3JlIFwiY2hhbmdlXCIgZXZlbnRzLCB1bmxlc3MgdGhlcmUgd2FzIG5vIHByaW9yIFwiaW5wdXRcIiBldmVudC5cbiAgICAgICAgLy8gVGhpcyBjb3VsZCBoYXBwZW4gaWYgdXNlciBjb2RlIHRyaWdnZXJzIGEgXCJjaGFuZ2VcIiBldmVudCwgb3IgaWYgdGhlIGJyb3dzZXIgaXMgbm9uLWNvbmZvcm1pbmcuXG4gICAgICAgIGlmIChcbiAgICAgICAgICBhdCA9PT0gY3VycmVudEl0ZXJhdGlvbnMgLSAxICYmXG4gICAgICAgICAgdHlwZSA9PT0gXCJjaGFuZ2VcIiAmJlxuICAgICAgICAgIGxhc3RUeXBlID09PSBcImlucHV0XCJcbiAgICAgICAgKSB7XG4gICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG5cbiAgICAgICAgRE9NLnB1dFByaXZhdGUoaW5wdXQsIFwicHJldi1pdGVyYXRpb25cIiwge1xuICAgICAgICAgIGF0OiBjdXJyZW50SXRlcmF0aW9ucyxcbiAgICAgICAgICB0eXBlOiB0eXBlLFxuICAgICAgICB9KTtcblxuICAgICAgICB0aGlzLmRlYm91bmNlKGlucHV0LCBlLCB0eXBlLCAoKSA9PiB7XG4gICAgICAgICAgdGhpcy53aXRoaW5Pd25lcnMoZGlzcGF0Y2hlciwgKHZpZXcpID0+IHtcbiAgICAgICAgICAgIERPTS5wdXRQcml2YXRlKGlucHV0LCBQSFhfSEFTX0ZPQ1VTRUQsIHRydWUpO1xuICAgICAgICAgICAgSlMuZXhlYyhlLCBcImNoYW5nZVwiLCBwaHhFdmVudCwgdmlldywgaW5wdXQsIFtcbiAgICAgICAgICAgICAgXCJwdXNoXCIsXG4gICAgICAgICAgICAgIHsgX3RhcmdldDogZS50YXJnZXQubmFtZSwgZGlzcGF0Y2hlcjogZGlzcGF0Y2hlciB9LFxuICAgICAgICAgICAgXSk7XG4gICAgICAgICAgfSk7XG4gICAgICAgIH0pO1xuICAgICAgfSk7XG4gICAgfVxuICAgIHRoaXMub24oXCJyZXNldFwiLCAoZSkgPT4ge1xuICAgICAgY29uc3QgZm9ybSA9IGUudGFyZ2V0O1xuICAgICAgRE9NLnJlc2V0Rm9ybShmb3JtKTtcbiAgICAgIGNvbnN0IGlucHV0ID0gQXJyYXkuZnJvbShmb3JtLmVsZW1lbnRzKS5maW5kKChlbCkgPT4gZWwudHlwZSA9PT0gXCJyZXNldFwiKTtcbiAgICAgIGlmIChpbnB1dCkge1xuICAgICAgICAvLyB3YWl0IHVudGlsIG5leHQgdGljayB0byBnZXQgdXBkYXRlZCBpbnB1dCB2YWx1ZVxuICAgICAgICB3aW5kb3cucmVxdWVzdEFuaW1hdGlvbkZyYW1lKCgpID0+IHtcbiAgICAgICAgICBpbnB1dC5kaXNwYXRjaEV2ZW50KFxuICAgICAgICAgICAgbmV3IEV2ZW50KFwiaW5wdXRcIiwgeyBidWJibGVzOiB0cnVlLCBjYW5jZWxhYmxlOiBmYWxzZSB9KSxcbiAgICAgICAgICApO1xuICAgICAgICB9KTtcbiAgICAgIH1cbiAgICB9KTtcbiAgfVxuXG4gIGRlYm91bmNlKGVsLCBldmVudCwgZXZlbnRUeXBlLCBjYWxsYmFjaykge1xuICAgIGlmIChldmVudFR5cGUgPT09IFwiYmx1clwiIHx8IGV2ZW50VHlwZSA9PT0gXCJmb2N1c291dFwiKSB7XG4gICAgICByZXR1cm4gY2FsbGJhY2soKTtcbiAgICB9XG5cbiAgICBjb25zdCBwaHhEZWJvdW5jZSA9IHRoaXMuYmluZGluZyhQSFhfREVCT1VOQ0UpO1xuICAgIGNvbnN0IHBoeFRocm90dGxlID0gdGhpcy5iaW5kaW5nKFBIWF9USFJPVFRMRSk7XG4gICAgY29uc3QgZGVmYXVsdERlYm91bmNlID0gdGhpcy5kZWZhdWx0cy5kZWJvdW5jZS50b1N0cmluZygpO1xuICAgIGNvbnN0IGRlZmF1bHRUaHJvdHRsZSA9IHRoaXMuZGVmYXVsdHMudGhyb3R0bGUudG9TdHJpbmcoKTtcblxuICAgIHRoaXMud2l0aGluT3duZXJzKGVsLCAodmlldykgPT4ge1xuICAgICAgY29uc3QgYXN5bmNGaWx0ZXIgPSAoKSA9PlxuICAgICAgICAhdmlldy5pc0Rlc3Ryb3llZCgpICYmIGRvY3VtZW50LmJvZHkuY29udGFpbnMoZWwpO1xuICAgICAgRE9NLmRlYm91bmNlKFxuICAgICAgICBlbCxcbiAgICAgICAgZXZlbnQsXG4gICAgICAgIHBoeERlYm91bmNlLFxuICAgICAgICBkZWZhdWx0RGVib3VuY2UsXG4gICAgICAgIHBoeFRocm90dGxlLFxuICAgICAgICBkZWZhdWx0VGhyb3R0bGUsXG4gICAgICAgIGFzeW5jRmlsdGVyLFxuICAgICAgICAoKSA9PiB7XG4gICAgICAgICAgY2FsbGJhY2soKTtcbiAgICAgICAgfSxcbiAgICAgICk7XG4gICAgfSk7XG4gIH1cblxuICBzaWxlbmNlRXZlbnRzKGNhbGxiYWNrKSB7XG4gICAgdGhpcy5zaWxlbmNlZCA9IHRydWU7XG4gICAgY2FsbGJhY2soKTtcbiAgICB0aGlzLnNpbGVuY2VkID0gZmFsc2U7XG4gIH1cblxuICBvbihldmVudCwgY2FsbGJhY2spIHtcbiAgICB0aGlzLmJvdW5kRXZlbnROYW1lcy5hZGQoZXZlbnQpO1xuICAgIHdpbmRvdy5hZGRFdmVudExpc3RlbmVyKGV2ZW50LCAoZSkgPT4ge1xuICAgICAgaWYgKCF0aGlzLnNpbGVuY2VkKSB7XG4gICAgICAgIGNhbGxiYWNrKGUpO1xuICAgICAgfVxuICAgIH0pO1xuICB9XG5cbiAganNRdWVyeVNlbGVjdG9yQWxsKHNvdXJjZUVsLCBxdWVyeSwgZGVmYXVsdFF1ZXJ5KSB7XG4gICAgY29uc3QgYWxsID0gdGhpcy5kb21DYWxsYmFja3MuanNRdWVyeVNlbGVjdG9yQWxsO1xuICAgIHJldHVybiBhbGwgPyBhbGwoc291cmNlRWwsIHF1ZXJ5LCBkZWZhdWx0UXVlcnkpIDogZGVmYXVsdFF1ZXJ5KCk7XG4gIH1cbn1cblxuY2xhc3MgVHJhbnNpdGlvblNldCB7XG4gIGNvbnN0cnVjdG9yKCkge1xuICAgIHRoaXMudHJhbnNpdGlvbnMgPSBuZXcgU2V0KCk7XG4gICAgdGhpcy5wcm9taXNlcyA9IG5ldyBTZXQoKTtcbiAgICB0aGlzLnBlbmRpbmdPcHMgPSBbXTtcbiAgfVxuXG4gIHJlc2V0KCkge1xuICAgIHRoaXMudHJhbnNpdGlvbnMuZm9yRWFjaCgodGltZXIpID0+IHtcbiAgICAgIGNsZWFyVGltZW91dCh0aW1lcik7XG4gICAgICB0aGlzLnRyYW5zaXRpb25zLmRlbGV0ZSh0aW1lcik7XG4gICAgfSk7XG4gICAgdGhpcy5wcm9taXNlcy5jbGVhcigpO1xuICAgIHRoaXMuZmx1c2hQZW5kaW5nT3BzKCk7XG4gIH1cblxuICBhZnRlcihjYWxsYmFjaykge1xuICAgIGlmICh0aGlzLnNpemUoKSA9PT0gMCkge1xuICAgICAgY2FsbGJhY2soKTtcbiAgICB9IGVsc2Uge1xuICAgICAgdGhpcy5wdXNoUGVuZGluZ09wKGNhbGxiYWNrKTtcbiAgICB9XG4gIH1cblxuICBhZGRUcmFuc2l0aW9uKHRpbWUsIG9uU3RhcnQsIG9uRG9uZSkge1xuICAgIG9uU3RhcnQoKTtcbiAgICBjb25zdCB0aW1lciA9IHNldFRpbWVvdXQoKCkgPT4ge1xuICAgICAgdGhpcy50cmFuc2l0aW9ucy5kZWxldGUodGltZXIpO1xuICAgICAgb25Eb25lKCk7XG4gICAgICB0aGlzLmZsdXNoUGVuZGluZ09wcygpO1xuICAgIH0sIHRpbWUpO1xuICAgIHRoaXMudHJhbnNpdGlvbnMuYWRkKHRpbWVyKTtcbiAgfVxuXG4gIGFkZEFzeW5jVHJhbnNpdGlvbihwcm9taXNlKSB7XG4gICAgdGhpcy5wcm9taXNlcy5hZGQocHJvbWlzZSk7XG4gICAgcHJvbWlzZS50aGVuKCgpID0+IHtcbiAgICAgIHRoaXMucHJvbWlzZXMuZGVsZXRlKHByb21pc2UpO1xuICAgICAgdGhpcy5mbHVzaFBlbmRpbmdPcHMoKTtcbiAgICB9KTtcbiAgfVxuXG4gIHB1c2hQZW5kaW5nT3Aob3ApIHtcbiAgICB0aGlzLnBlbmRpbmdPcHMucHVzaChvcCk7XG4gIH1cblxuICBzaXplKCkge1xuICAgIHJldHVybiB0aGlzLnRyYW5zaXRpb25zLnNpemUgKyB0aGlzLnByb21pc2VzLnNpemU7XG4gIH1cblxuICBmbHVzaFBlbmRpbmdPcHMoKSB7XG4gICAgaWYgKHRoaXMuc2l6ZSgpID4gMCkge1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICBjb25zdCBvcCA9IHRoaXMucGVuZGluZ09wcy5zaGlmdCgpO1xuICAgIGlmIChvcCkge1xuICAgICAgb3AoKTtcbiAgICAgIHRoaXMuZmx1c2hQZW5kaW5nT3BzKCk7XG4gICAgfVxuICB9XG59XG4iLCAiLypcbj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG5QaG9lbml4IExpdmVWaWV3IEphdmFTY3JpcHQgQ2xpZW50XG49PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuXG5TZWUgdGhlIGhleGRvY3MgYXQgYGh0dHBzOi8vaGV4ZG9jcy5wbS9waG9lbml4X2xpdmVfdmlld2AgZm9yIGRvY3VtZW50YXRpb24uXG4qL1xuXG5pbXBvcnQgT3JpZ2luYWxMaXZlU29ja2V0LCB7IGlzVXNlZElucHV0IH0gZnJvbSBcIi4vbGl2ZV9zb2NrZXRcIjtcbmltcG9ydCBET00gZnJvbSBcIi4vZG9tXCI7XG5pbXBvcnQgeyBWaWV3SG9vayB9IGZyb20gXCIuL3ZpZXdfaG9va1wiO1xuaW1wb3J0IFZpZXcgZnJvbSBcIi4vdmlld1wiO1xuXG5pbXBvcnQgdHlwZSB7IExpdmVTb2NrZXRKU0NvbW1hbmRzIH0gZnJvbSBcIi4vanNfY29tbWFuZHNcIjtcbmltcG9ydCB0eXBlIHsgSG9vaywgSG9va3NPcHRpb25zIH0gZnJvbSBcIi4vdmlld19ob29rXCI7XG5pbXBvcnQgdHlwZSB7IFNvY2tldCBhcyBQaG9lbml4U29ja2V0IH0gZnJvbSBcInBob2VuaXhcIjtcblxuLyoqXG4gKiBPcHRpb25zIGZvciBjb25maWd1cmluZyB0aGUgTGl2ZVNvY2tldCBpbnN0YW5jZS5cbiAqL1xuZXhwb3J0IGludGVyZmFjZSBMaXZlU29ja2V0T3B0aW9ucyB7XG4gIC8qKlxuICAgKiBEZWZhdWx0cyBmb3IgcGh4LWRlYm91bmNlIGFuZCBwaHgtdGhyb3R0bGUuXG4gICAqL1xuICBkZWZhdWx0cz86IHtcbiAgICAvKiogVGhlIG1pbGxpc2Vjb25kIHBoeC1kZWJvdW5jZSB0aW1lLiBEZWZhdWx0cyAzMDAgKi9cbiAgICBkZWJvdW5jZT86IG51bWJlcjtcbiAgICAvKiogVGhlIG1pbGxpc2Vjb25kIHBoeC10aHJvdHRsZSB0aW1lLiBEZWZhdWx0cyAzMDAgKi9cbiAgICB0aHJvdHRsZT86IG51bWJlcjtcbiAgfTtcbiAgLyoqXG4gICAqIEFuIG9iamVjdCBvciBmdW5jdGlvbiBmb3IgcGFzc2luZyBjb25uZWN0IHBhcmFtcy5cbiAgICogVGhlIGZ1bmN0aW9uIHJlY2VpdmVzIHRoZSBlbGVtZW50IGFzc29jaWF0ZWQgd2l0aCBhIGdpdmVuIExpdmVWaWV3LiBGb3IgZXhhbXBsZTpcbiAgICpcbiAgICogICAgIChlbCkgPT4ge3ZpZXc6IGVsLmdldEF0dHJpYnV0ZShcImRhdGEtbXktdmlldy1uYW1lXCIsIHRva2VuOiB3aW5kb3cubXlUb2tlbn1cbiAgICpcbiAgICovXG4gIHBhcmFtcz86XG4gICAgfCAoKGVsOiBIVE1MRWxlbWVudCkgPT4geyBba2V5OiBzdHJpbmddOiBhbnkgfSlcbiAgICB8IHsgW2tleTogc3RyaW5nXTogYW55IH07XG4gIC8qKlxuICAgKiBUaGUgb3B0aW9uYWwgcHJlZml4IHRvIHVzZSBmb3IgYWxsIHBoeCBET00gYW5ub3RhdGlvbnMuXG4gICAqXG4gICAqIERlZmF1bHRzIHRvIFwicGh4LVwiLlxuICAgKi9cbiAgYmluZGluZ1ByZWZpeD86IHN0cmluZztcbiAgLyoqXG4gICAqIENhbGxiYWNrcyBmb3IgTGl2ZVZpZXcgaG9va3MuXG4gICAqXG4gICAqIFNlZSBbQ2xpZW50IGhvb2tzIHZpYSBgcGh4LWhvb2tgXShodHRwczovL2hleGRvY3MucG0vcGhvZW5peF9saXZlX3ZpZXcvanMtaW50ZXJvcC5odG1sI2NsaWVudC1ob29rcy12aWEtcGh4LWhvb2spIGZvciBtb3JlIGluZm9ybWF0aW9uLlxuICAgKi9cbiAgaG9va3M/OiBIb29rc09wdGlvbnM7XG4gIC8qKiBDYWxsYmFja3MgZm9yIExpdmVWaWV3IHVwbG9hZGVycy4gKi9cbiAgdXBsb2FkZXJzPzogeyBba2V5OiBzdHJpbmddOiBhbnkgfTsgLy8gVE9ETzogZGVmaW5lIG1vcmUgc3BlY2lmaWNhbGx5XG4gIC8qKiBEZWxheSBpbiBtaWxsaXNlY29uZHMgYmVmb3JlIGFwcGx5aW5nIGxvYWRpbmcgc3RhdGVzLiAqL1xuICBsb2FkZXJUaW1lb3V0PzogbnVtYmVyO1xuICAvKiogRGVsYXkgaW4gbWlsbGlzZWNvbmRzIGJlZm9yZSBleGVjdXRpbmcgcGh4LWRpc2Nvbm5lY3RlZCBjb21tYW5kcy4gKi9cbiAgZGlzY29ubmVjdGVkVGltZW91dD86IG51bWJlcjtcbiAgLyoqIE1heGltdW0gcmVsb2FkcyBiZWZvcmUgZW50ZXJpbmcgZmFpbHNhZmUgbW9kZS4gKi9cbiAgbWF4UmVsb2Fkcz86IG51bWJlcjtcbiAgLyoqIE1pbmltdW0gdGltZSBiZXR3ZWVuIG5vcm1hbCByZWxvYWQgYXR0ZW1wdHMuICovXG4gIHJlbG9hZEppdHRlck1pbj86IG51bWJlcjtcbiAgLyoqIE1heGltdW0gdGltZSBiZXR3ZWVuIG5vcm1hbCByZWxvYWQgYXR0ZW1wdHMuICovXG4gIHJlbG9hZEppdHRlck1heD86IG51bWJlcjtcbiAgLyoqIFRpbWUgYmV0d2VlbiByZWxvYWQgYXR0ZW1wdHMgaW4gZmFpbHNhZmUgbW9kZS4gKi9cbiAgZmFpbHNhZmVKaXR0ZXI/OiBudW1iZXI7XG4gIC8qKlxuICAgKiBGdW5jdGlvbiB0byBsb2cgZGVidWcgaW5mb3JtYXRpb24uIEZvciBleGFtcGxlOlxuICAgKlxuICAgKiAgICAgKHZpZXcsIGtpbmQsIG1zZywgb2JqKSA9PiBjb25zb2xlLmxvZyhgJHt2aWV3LmlkfSAke2tpbmR9OiAke21zZ30gLSBgLCBvYmopXG4gICAqL1xuICB2aWV3TG9nZ2VyPzogKHZpZXc6IFZpZXcsIGtpbmQ6IHN0cmluZywgbXNnOiBzdHJpbmcsIG9iajogYW55KSA9PiB2b2lkO1xuICAvKipcbiAgICogT2JqZWN0IG1hcHBpbmcgZXZlbnQgbmFtZXMgdG8gZnVuY3Rpb25zIGZvciBwb3B1bGF0aW5nIGV2ZW50IG1ldGFkYXRhLlxuICAgKlxuICAgKiAgICAgbWV0YWRhdGE6IHtcbiAgICogICAgICAgY2xpY2s6IChlLCBlbCkgPT4ge1xuICAgKiAgICAgICAgIHJldHVybiB7XG4gICAqICAgICAgICAgICBjdHJsS2V5OiBlLmN0cmxLZXksXG4gICAqICAgICAgICAgICBtZXRhS2V5OiBlLm1ldGFLZXksXG4gICAqICAgICAgICAgICBkZXRhaWw6IGUuZGV0YWlsIHx8IDEsXG4gICAqICAgICAgICAgfVxuICAgKiAgICAgICB9LFxuICAgKiAgICAgICBrZXlkb3duOiAoZSwgZWwpID0+IHtcbiAgICogICAgICAgICByZXR1cm4ge1xuICAgKiAgICAgICAgICAga2V5OiBlLmtleSxcbiAgICogICAgICAgICAgIGN0cmxLZXk6IGUuY3RybEtleSxcbiAgICogICAgICAgICAgIG1ldGFLZXk6IGUubWV0YUtleSxcbiAgICogICAgICAgICAgIHNoaWZ0S2V5OiBlLnNoaWZ0S2V5XG4gICAqICAgICAgICAgfVxuICAgKiAgICAgICB9XG4gICAqICAgICB9XG4gICAqXG4gICAqL1xuICBtZXRhZGF0YT86IHsgW2V2ZW50TmFtZTogc3RyaW5nXTogKGU6IEV2ZW50LCBlbDogSFRNTEVsZW1lbnQpID0+IG9iamVjdCB9O1xuICAvKipcbiAgICogQW4gb3B0aW9uYWwgU3RvcmFnZSBjb21wYXRpYmxlIG9iamVjdFxuICAgKiBVc2VmdWwgd2hlbiBMaXZlVmlldyB3b24ndCBoYXZlIGFjY2VzcyB0byBgc2Vzc2lvblN0b3JhZ2VgLiBGb3IgZXhhbXBsZSwgVGhpcyBjb3VsZFxuICAgKiBoYXBwZW4gaWYgYSBzaXRlIGxvYWRzIGEgY3Jvc3MtZG9tYWluIExpdmVWaWV3IGluIGFuIGlmcmFtZS5cbiAgICpcbiAgICogRXhhbXBsZSB1c2FnZTpcbiAgICpcbiAgICogICAgIGNsYXNzIEluTWVtb3J5U3RvcmFnZSB7XG4gICAqICAgICAgIGNvbnN0cnVjdG9yKCkgeyB0aGlzLnN0b3JhZ2UgPSB7fSB9XG4gICAqICAgICAgIGdldEl0ZW0oa2V5TmFtZSkgeyByZXR1cm4gdGhpcy5zdG9yYWdlW2tleU5hbWVdIHx8IG51bGwgfVxuICAgKiAgICAgICByZW1vdmVJdGVtKGtleU5hbWUpIHsgZGVsZXRlIHRoaXMuc3RvcmFnZVtrZXlOYW1lXSB9XG4gICAqICAgICAgIHNldEl0ZW0oa2V5TmFtZSwga2V5VmFsdWUpIHsgdGhpcy5zdG9yYWdlW2tleU5hbWVdID0ga2V5VmFsdWUgfVxuICAgKiAgICAgfVxuICAgKi9cbiAgc2Vzc2lvblN0b3JhZ2U/OiBTdG9yYWdlO1xuICAvKipcbiAgICogQW4gb3B0aW9uYWwgU3RvcmFnZSBjb21wYXRpYmxlIG9iamVjdFxuICAgKiBVc2VmdWwgd2hlbiBMaXZlVmlldyB3b24ndCBoYXZlIGFjY2VzcyB0byBgbG9jYWxTdG9yYWdlYC5cbiAgICpcbiAgICogU2VlIGBzZXNzaW9uU3RvcmFnZWAgZm9yIGFuIGV4YW1wbGUuXG4gICAqL1xuICBsb2NhbFN0b3JhZ2U/OiBTdG9yYWdlO1xuICAvKipcbiAgICogSWYgc2V0IHRvIGB0cnVlYCwgYHBoeC1jaGFuZ2VgIGV2ZW50cyB3aWxsIGJlIGJsb2NrZWQgKHdpbGwgbm90IGZpcmUpXG4gICAqIHdoaWxlIHRoZSB1c2VyIGlzIGNvbXBvc2luZyBpbnB1dCB1c2luZyBhbiBJTUUgKElucHV0IE1ldGhvZCBFZGl0b3IpLlxuICAgKiBUaGlzIGlzIGRldGVybWluZWQgYnkgdGhlIGBlLmlzQ29tcG9zaW5nYCBwcm9wZXJ0eSBvbiBrZXlib2FyZCBldmVudHMsXG4gICAqIHdoaWNoIGlzIGB0cnVlYCB3aGVuIHRoZSB1c2VyIGlzIGluIHRoZSBwcm9jZXNzIG9mIGVudGVyaW5nIGNvbXBvc2VkIGNoYXJhY3RlcnMgKGZvciBleGFtcGxlLFxuICAgKiB3aGVuIHR5cGluZyBKYXBhbmVzZSBvciBDaGluZXNlIHVzaW5nIHJvbWFqaSBvciBwaW55aW4gaW5wdXQgbWV0aG9kcykuXG4gICAqIEJ5IGRlZmF1bHQsIGBwaHgtY2hhbmdlYCB3aWxsIG5vdCBiZSBibG9ja2VkIGR1cmluZyBhIGNvbXBvc2l0aW9uIHNlc3Npb24sXG4gICAqIGJ1dCBub3RlIHRoYXQgdGhlcmUgd2VyZSBpc3N1ZXMgcmVwb3J0ZWQgaW4gb2xkZXIgdmVyc2lvbnMgb2YgU2FmYXJpLFxuICAgKiB3aGVyZSBhIExpdmVWaWV3IHBhdGNoIHRvIHRoZSBpbnB1dCBjYXVzZWQgdW5leHBlY3RlZCBiZWhhdmlvci5cbiAgICpcbiAgICogRm9yIG1vcmUgaW5mb3JtYXRpb24sIHNlZVxuICAgKiAtIGh0dHBzOi8vZGV2ZWxvcGVyLm1vemlsbGEub3JnL2VuLVVTL2RvY3MvV2ViL0FQSS9LZXlib2FyZEV2ZW50L2lzQ29tcG9zaW5nXG4gICAqIC0gaHR0cHM6Ly9naXRodWIuY29tL3Bob2VuaXhmcmFtZXdvcmsvcGhvZW5peF9saXZlX3ZpZXcvaXNzdWVzLzMzMjJcbiAgICpcbiAgICogRGVmYXVsdHMgdG8gYGZhbHNlYC5cbiAgICovXG4gIGJsb2NrUGh4Q2hhbmdlV2hpbGVDb21wb3Npbmc/OiBib29sZWFuO1xuICAvKiogRE9NIGNhbGxiYWNrcy4gKi9cbiAgZG9tPzoge1xuICAgIC8qKlxuICAgICAqIEFuIG9wdGlvbmFsIGZ1bmN0aW9uIHRvIG1vZGlmeSB0aGUgYmVoYXZpb3Igb2YgcXVlcnlpbmcgZWxlbWVudHMgaW4gSlMgY29tbWFuZHMuXG4gICAgICogQHBhcmFtIHNvdXJjZUVsIC0gVGhlIHNvdXJjZSBlbGVtZW50LCBlLmcuIHRoZSBidXR0b24gdGhhdCB3YXMgY2xpY2tlZC5cbiAgICAgKiBAcGFyYW0gcXVlcnkgLSBUaGUgcXVlcnkgdmFsdWUuXG4gICAgICogQHBhcmFtIGRlZmF1bHRRdWVyeSAtIEEgZGVmYXVsdCBxdWVyeSBmdW5jdGlvbiB0aGF0IGNhbiBiZSB1c2VkIGlmIG5vIGN1c3RvbSBxdWVyeSBzaG91bGQgYmUgYXBwbGllZC5cbiAgICAgKiBAcmV0dXJucyBBIGxpc3Qgb2YgRE9NIGVsZW1lbnRzLlxuICAgICAqL1xuICAgIGpzUXVlcnlTZWxlY3RvckFsbD86IChcbiAgICAgIHNvdXJjZUVsOiBIVE1MRWxlbWVudCxcbiAgICAgIHF1ZXJ5OiBzdHJpbmcsXG4gICAgICBkZWZhdWx0UXVlcnk6ICgpID0+IEVsZW1lbnRbXSxcbiAgICApID0+IEVsZW1lbnRbXTtcbiAgICAvKipcbiAgICAgKiBDYWxsZWQgaW1tZWRpYXRlbHkgYmVmb3JlIGEgRE9NIHBhdGNoIGlzIGFwcGxpZWQuXG4gICAgICovXG4gICAgb25QYXRjaFN0YXJ0PzogKGNvbnRhaW5lcjogSFRNTEVsZW1lbnQpID0+IHZvaWQ7XG4gICAgLyoqXG4gICAgICogQ2FsbGVkIGltbWVkaWF0ZWx5IGFmdGVyIGEgRE9NIHBhdGNoIGlzIGFwcGxpZWQuXG4gICAgICovXG4gICAgb25QYXRjaEVuZD86IChjb250YWluZXI6IEhUTUxFbGVtZW50KSA9PiB2b2lkO1xuICAgIC8qKlxuICAgICAqIENhbGxlZCB3aGVuIGEgbmV3IERPTSBub2RlIGlzIGFkZGVkLlxuICAgICAqL1xuICAgIG9uTm9kZUFkZGVkPzogKG5vZGU6IE5vZGUpID0+IHZvaWQ7XG4gICAgLyoqXG4gICAgICogQ2FsbGVkIGJlZm9yZSBhbiBlbGVtZW50IGlzIHVwZGF0ZWQuXG4gICAgICovXG4gICAgb25CZWZvcmVFbFVwZGF0ZWQ/OiAoZnJvbUVsOiBFbGVtZW50LCB0b0VsOiBFbGVtZW50KSA9PiB2b2lkO1xuICB9O1xuICAvKiogQWxsb3cgcGFzc3Rocm91Z2ggb2Ygb3RoZXIgb3B0aW9ucyB0byB0aGUgUGhvZW5peCBTb2NrZXQgY29uc3RydWN0b3IuICovXG4gIFtrZXk6IHN0cmluZ106IGFueTtcbn1cblxuLyoqXG4gKiBJbnRlcmZhY2UgZGVzY3JpYmluZyB0aGUgcHVibGljIEFQSSBvZiBhIExpdmVTb2NrZXQgaW5zdGFuY2UuXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgTGl2ZVNvY2tldEluc3RhbmNlSW50ZXJmYWNlIHtcbiAgLyoqXG4gICAqIFJldHVybnMgdGhlIHZlcnNpb24gb2YgdGhlIExpdmVWaWV3IGNsaWVudC5cbiAgICovXG4gIHZlcnNpb24oKTogc3RyaW5nO1xuICAvKipcbiAgICogUmV0dXJucyB0cnVlIGlmIHByb2ZpbGluZyBpcyBlbmFibGVkLiBTZWUgYGVuYWJsZVByb2ZpbGluZ2AgYW5kIGBkaXNhYmxlUHJvZmlsaW5nYC5cbiAgICovXG4gIGlzUHJvZmlsZUVuYWJsZWQoKTogYm9vbGVhbjtcbiAgLyoqXG4gICAqIFJldHVybnMgdHJ1ZSBpZiBkZWJ1Z2dpbmcgaXMgZW5hYmxlZC4gU2VlIGBlbmFibGVEZWJ1Z2AgYW5kIGBkaXNhYmxlRGVidWdgLlxuICAgKi9cbiAgaXNEZWJ1Z0VuYWJsZWQoKTogYm9vbGVhbjtcbiAgLyoqXG4gICAqIFJldHVybnMgdHJ1ZSBpZiBkZWJ1Z2dpbmcgaXMgZGlzYWJsZWQuIFNlZSBgZW5hYmxlRGVidWdgIGFuZCBgZGlzYWJsZURlYnVnYC5cbiAgICovXG4gIGlzRGVidWdEaXNhYmxlZCgpOiBib29sZWFuO1xuICAvKipcbiAgICogRW5hYmxlcyBkZWJ1Z2dpbmcuXG4gICAqXG4gICAqIFdoZW4gZGVidWdnaW5nIGlzIGVuYWJsZWQsIHRoZSBMaXZlVmlldyBjbGllbnQgd2lsbCBsb2cgZGVidWcgaW5mb3JtYXRpb24gdG8gdGhlIGNvbnNvbGUuXG4gICAqIFNlZSBbRGVidWdnaW5nIGNsaWVudCBldmVudHNdKGh0dHBzOi8vaGV4ZG9jcy5wbS9waG9lbml4X2xpdmVfdmlldy9qcy1pbnRlcm9wLmh0bWwjZGVidWdnaW5nLWNsaWVudC1ldmVudHMpIGZvciBtb3JlIGluZm9ybWF0aW9uLlxuICAgKi9cbiAgZW5hYmxlRGVidWcoKTogdm9pZDtcbiAgLyoqXG4gICAqIEVuYWJsZXMgcHJvZmlsaW5nLlxuICAgKlxuICAgKiBXaGVuIHByb2ZpbGluZyBpcyBlbmFibGVkLCB0aGUgTGl2ZVZpZXcgY2xpZW50IHdpbGwgbG9nIHByb2ZpbGluZyBpbmZvcm1hdGlvbiB0byB0aGUgY29uc29sZS5cbiAgICovXG4gIGVuYWJsZVByb2ZpbGluZygpOiB2b2lkO1xuICAvKipcbiAgICogRGlzYWJsZXMgZGVidWdnaW5nLlxuICAgKi9cbiAgZGlzYWJsZURlYnVnKCk6IHZvaWQ7XG4gIC8qKlxuICAgKiBEaXNhYmxlcyBwcm9maWxpbmcuXG4gICAqL1xuICBkaXNhYmxlUHJvZmlsaW5nKCk6IHZvaWQ7XG4gIC8qKlxuICAgKiBFbmFibGVzIGxhdGVuY3kgc2ltdWxhdGlvbi5cbiAgICpcbiAgICogV2hlbiBsYXRlbmN5IHNpbXVsYXRpb24gaXMgZW5hYmxlZCwgdGhlIExpdmVWaWV3IGNsaWVudCB3aWxsIGFkZCBhIGRlbGF5IHRvIHJlcXVlc3RzIGFuZCByZXNwb25zZXMgZnJvbSB0aGUgc2VydmVyLlxuICAgKiBTZWUgW1NpbXVsYXRpbmcgTGF0ZW5jeV0oaHR0cHM6Ly9oZXhkb2NzLnBtL3Bob2VuaXhfbGl2ZV92aWV3L2pzLWludGVyb3AuaHRtbCNzaW11bGF0aW5nLWxhdGVuY3kpIGZvciBtb3JlIGluZm9ybWF0aW9uLlxuICAgKi9cbiAgZW5hYmxlTGF0ZW5jeVNpbSh1cHBlckJvdW5kTXM6IG51bWJlcik6IHZvaWQ7XG4gIC8qKlxuICAgKiBEaXNhYmxlcyBsYXRlbmN5IHNpbXVsYXRpb24uXG4gICAqL1xuICBkaXNhYmxlTGF0ZW5jeVNpbSgpOiB2b2lkO1xuICAvKipcbiAgICogUmV0dXJucyB0aGUgY3VycmVudCBsYXRlbmN5IHNpbXVsYXRpb24gdXBwZXIgYm91bmQuXG4gICAqL1xuICBnZXRMYXRlbmN5U2ltKCk6IG51bWJlciB8IG51bGw7XG4gIC8qKlxuICAgKiBSZXR1cm5zIHRoZSBQaG9lbml4IFNvY2tldCBpbnN0YW5jZS5cbiAgICovXG4gIGdldFNvY2tldCgpOiBQaG9lbml4U29ja2V0O1xuICAvKipcbiAgICogQ29ubmVjdHMgdG8gdGhlIExpdmVWaWV3IHNlcnZlci5cbiAgICovXG4gIGNvbm5lY3QoKTogdm9pZDtcbiAgLyoqXG4gICAqIERpc2Nvbm5lY3RzIGZyb20gdGhlIExpdmVWaWV3IHNlcnZlci5cbiAgICovXG4gIGRpc2Nvbm5lY3QoY2FsbGJhY2s/OiAoKSA9PiB2b2lkKTogdm9pZDtcbiAgLyoqXG4gICAqIENhbiBiZSB1c2VkIHRvIHJlcGxhY2UgdGhlIHRyYW5zcG9ydCB1c2VkIGJ5IHRoZSB1bmRlcmx5aW5nIFBob2VuaXggU29ja2V0LlxuICAgKi9cbiAgcmVwbGFjZVRyYW5zcG9ydCh0cmFuc3BvcnQ6IGFueSk6IHZvaWQ7XG4gIC8qKlxuICAgKiBFeGVjdXRlcyBhbiBlbmNvZGVkIEpTIGNvbW1hbmQsIHRhcmdldGluZyB0aGUgZ2l2ZW4gZWxlbWVudC5cbiAgICpcbiAgICogU2VlIFtgUGhvZW5peC5MaXZlVmlldy5KU2BdKGh0dHBzOi8vaGV4ZG9jcy5wbS9waG9lbml4X2xpdmVfdmlldy9QaG9lbml4LkxpdmVWaWV3LkpTLmh0bWwpIGZvciBtb3JlIGluZm9ybWF0aW9uLlxuICAgKi9cbiAgZXhlY0pTKGVsOiBIVE1MRWxlbWVudCwgZW5jb2RlZEpTOiBzdHJpbmcsIGV2ZW50VHlwZT86IHN0cmluZyB8IG51bGwpOiB2b2lkO1xuICAvKipcbiAgICogUmV0dXJucyBhbiBvYmplY3Qgd2l0aCBtZXRob2RzIHRvIG1hbmlwbHVhdGUgdGhlIERPTSBhbmQgZXhlY3V0ZSBKYXZhU2NyaXB0LlxuICAgKiBUaGUgYXBwbGllZCBjaGFuZ2VzIGludGVncmF0ZSB3aXRoIHNlcnZlciBET00gcGF0Y2hpbmcuXG4gICAqXG4gICAqIFNlZSBbSmF2YVNjcmlwdCBpbnRlcm9wZXJhYmlsaXR5XShodHRwczovL2hleGRvY3MucG0vcGhvZW5peF9saXZlX3ZpZXcvanMtaW50ZXJvcC5odG1sKSBmb3IgbW9yZSBpbmZvcm1hdGlvbi5cbiAgICovXG4gIGpzKCk6IExpdmVTb2NrZXRKU0NvbW1hbmRzO1xufVxuXG4vKipcbiAqIEludGVyZmFjZSBkZXNjcmliaW5nIHRoZSBMaXZlU29ja2V0IGNvbnN0cnVjdG9yLlxuICovXG5leHBvcnQgaW50ZXJmYWNlIExpdmVTb2NrZXRDb25zdHJ1Y3RvciB7XG4gIC8qKlxuICAgKiBDcmVhdGVzIGEgbmV3IExpdmVTb2NrZXQgaW5zdGFuY2UuXG4gICAqXG4gICAqIEBwYXJhbSBlbmRwb2ludCAtIFRoZSBzdHJpbmcgV2ViU29ja2V0IGVuZHBvaW50LCBpZSwgYFwid3NzOi8vZXhhbXBsZS5jb20vbGl2ZVwiYCxcbiAgICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGBcIi9saXZlXCJgIChpbmhlcml0ZWQgaG9zdCAmIHByb3RvY29sKVxuICAgKiBAcGFyYW0gc29ja2V0IC0gdGhlIHJlcXVpcmVkIFBob2VuaXggU29ja2V0IGNsYXNzIGltcG9ydGVkIGZyb20gXCJwaG9lbml4XCIuIEZvciBleGFtcGxlOlxuICAgKlxuICAgKiAgICAgaW1wb3J0IHtTb2NrZXR9IGZyb20gXCJwaG9lbml4XCJcbiAgICogICAgIGltcG9ydCB7TGl2ZVNvY2tldH0gZnJvbSBcInBob2VuaXhfbGl2ZV92aWV3XCJcbiAgICogICAgIGxldCBsaXZlU29ja2V0ID0gbmV3IExpdmVTb2NrZXQoXCIvbGl2ZVwiLCBTb2NrZXQsIHsuLi59KVxuICAgKlxuICAgKiBAcGFyYW0gb3B0cyAtIE9wdGlvbmFsIGNvbmZpZ3VyYXRpb24uXG4gICAqL1xuICBuZXcgKFxuICAgIGVuZHBvaW50OiBzdHJpbmcsXG4gICAgc29ja2V0OiB0eXBlb2YgUGhvZW5peFNvY2tldCxcbiAgICBvcHRzPzogTGl2ZVNvY2tldE9wdGlvbnMsXG4gICk6IExpdmVTb2NrZXRJbnN0YW5jZUludGVyZmFjZTtcbn1cblxuLy8gYmVjYXVzZSBMaXZlU29ja2V0IGlzIGluIEpTIChmb3Igbm93KSwgd2UgY2FzdCBpdCB0byBvdXIgZGVmaW5lZCBUeXBlU2NyaXB0IGNvbnN0cnVjdG9yLlxuY29uc3QgTGl2ZVNvY2tldCA9IE9yaWdpbmFsTGl2ZVNvY2tldCBhcyB1bmtub3duIGFzIExpdmVTb2NrZXRDb25zdHJ1Y3RvcjtcblxuLyoqIENyZWF0ZXMgYSBob29rIGluc3RhbmNlIGZvciB0aGUgZ2l2ZW4gZWxlbWVudCBhbmQgY2FsbGJhY2tzLlxuICpcbiAqIEBwYXJhbSBlbCAtIFRoZSBlbGVtZW50IHRvIGFzc29jaWF0ZSB3aXRoIHRoZSBob29rLlxuICogQHBhcmFtIGNhbGxiYWNrcyAtIFRoZSBsaXN0IG9mIGhvb2sgY2FsbGJhY2tzLCBzdWNoIGFzIG1vdW50ZWQsXG4gKiAgIHVwZGF0ZWQsIGRlc3Ryb3llZCwgZXRjLlxuICpcbiAqICpOb3RlKjogYGNyZWF0ZUhvb2tgIG11c3QgYmUgY2FsbGVkIGZyb20gdGhlIGBjb25uZWN0ZWRDYWxsYmFja2AgbGlmZWN5Y2xlXG4gKiB3aGljaCBpcyB0cmlnZ2VyZWQgYWZ0ZXIgdGhlIGVsZW1lbnQgaGFzIGJlZW4gYWRkZWQgdG8gdGhlIERPTS4gSWYgeW91IHRyeVxuICogdG8gY2FsbCBgY3JlYXRlSG9va2AgZnJvbSB0aGUgY29uc3RydWN0b3IsIGFuIGVycm9yIHdpbGwgYmUgbG9nZ2VkLlxuICpcbiAqIEBleGFtcGxlXG4gKlxuICogY2xhc3MgTXlDb21wb25lbnQgZXh0ZW5kcyBIVE1MRWxlbWVudCB7XG4gKiAgIGNvbm5lY3RlZENhbGxiYWNrKCl7XG4gKiAgICAgbGV0IG9uTGl2ZVZpZXdNb3VudGVkID0gKCkgPT4gdGhpcy5ob29rLnB1c2hFdmVudCguLi4pKVxuICogICAgIHRoaXMuaG9vayA9IGNyZWF0ZUhvb2sodGhpcywge21vdW50ZWQ6IG9uTGl2ZVZpZXdNb3VudGVkfSlcbiAqICAgfVxuICogfVxuICpcbiAqIEByZXR1cm5zIFJldHVybnMgdGhlIEhvb2sgaW5zdGFuY2UgZm9yIHRoZSBjdXN0b20gZWxlbWVudC5cbiAqL1xuZnVuY3Rpb24gY3JlYXRlSG9vayhlbDogSFRNTEVsZW1lbnQsIGNhbGxiYWNrczogSG9vayk6IFZpZXdIb29rIHtcbiAgbGV0IGV4aXN0aW5nSG9vayA9IERPTS5nZXRDdXN0b21FbEhvb2soZWwpO1xuICBpZiAoZXhpc3RpbmdIb29rKSB7XG4gICAgcmV0dXJuIGV4aXN0aW5nSG9vaztcbiAgfVxuXG4gIGxldCBob29rID0gbmV3IFZpZXdIb29rKFZpZXcuY2xvc2VzdFZpZXcoZWwpLCBlbCwgY2FsbGJhY2tzKTtcbiAgRE9NLnB1dEN1c3RvbUVsSG9vayhlbCwgaG9vayk7XG4gIHJldHVybiBob29rO1xufVxuXG5leHBvcnQgeyBMaXZlU29ja2V0LCBpc1VzZWRJbnB1dCwgY3JlYXRlSG9vaywgVmlld0hvb2ssIEhvb2ssIEhvb2tzT3B0aW9ucyB9O1xuIiwgImltcG9ydCBcInBob2VuaXhfaHRtbFwiO1xuaW1wb3J0IHsgU29ja2V0IH0gZnJvbSBcInBob2VuaXhcIjtcbmltcG9ydCB7IExpdmVTb2NrZXQgfSBmcm9tIFwicGhvZW5peF9saXZlX3ZpZXdcIjtcbmltcG9ydCBDbGlwYm9hcmRKUyBmcm9tIFwiY2xpcGJvYXJkXCI7XG5pbXBvcnQgdG9wYmFyIGZyb20gXCJ0b3BiYXJcIjtcbmltcG9ydCB7aG9va3MgYXMgY29sb2NhdGVkSG9va3N9IGZyb20gXCJwaG9lbml4LWNvbG9jYXRlZC9saXZlX2FkbWluXCI7XG5cbnRvcGJhci5jb25maWcoe1xuICBiYXJDb2xvcnM6IHsgMDogXCJyZ2IoNjcsIDU2LCAyMDIpXCIgfSxcbiAgc2hhZG93Q29sb3I6IFwicmdiYSgwLCAwLCAwLCAuMylcIixcbiAgY2xhc3NOYW1lOiBcInRvcGJhclwiLFxufSk7XG53aW5kb3cuYWRkRXZlbnRMaXN0ZW5lcihcInBoeDpwYWdlLWxvYWRpbmctc3RhcnRcIiwgKGluZm8pID0+IHRvcGJhci5zaG93KCkpO1xud2luZG93LmFkZEV2ZW50TGlzdGVuZXIoXCJwaHg6cGFnZS1sb2FkaW5nLXN0b3BcIiwgKCkgPT4gdG9wYmFyLmhpZGUoKSk7XG5cbmxldCBIb29rcyA9IHt9O1xuXG5Ib29rcy5BcnJheUlucHV0ID0ge1xuICBtb3VudGVkKCkge1xuICAgIHRoaXMuZWwucXVlcnlTZWxlY3RvcihcImlucHV0XCIpLmFkZEV2ZW50TGlzdGVuZXIoXCJpbnB1dFwiLCBlID0+IGUuc3RvcFByb3BhZ2F0aW9uKCkpO1xuXG4gICAgdGhpcy5lbC5hZGRFdmVudExpc3RlbmVyKFwia2V5ZG93blwiLCBlID0+IHtcbiAgICAgIGlmIChlLmtleSA9PT0gXCJFbnRlclwiKSB7XG4gICAgICAgIGUudGFyZ2V0LmJsdXIoKVxuICAgICAgICBlLnByZXZlbnREZWZhdWx0KCk7XG4gICAgICB9XG4gICAgfSk7XG4gIH0sXG4gIHVwZGF0ZWQoKSB7XG4gICAgdGhpcy5lbC5xdWVyeVNlbGVjdG9yKFwiaW5wdXRcIikuYWRkRXZlbnRMaXN0ZW5lcihcImlucHV0XCIsIGUgPT4gZS5zdG9wUHJvcGFnYXRpb24oKSk7XG4gIH1cbn07XG5cbkhvb2tzLlNob3cgPSB7XG4gIHNldFRhYihlbCkge1xuICAgIGNvbnN0IHVybEhhc2ggPSB3aW5kb3cubG9jYXRpb24uaGFzaCB8fCAnI21haW4nO1xuXG4gICAgZm9yICh0YWJMaW5rIG9mIGVsLnF1ZXJ5U2VsZWN0b3JBbGwoJy50YWJzIGEnKSkge1xuICAgICAgY29uc3QgdGFyZ2V0ID0gdGFiTGluay5nZXRBdHRyaWJ1dGUoJ2hyZWYnKTtcbiAgICAgIGlmICh0YXJnZXQgPT09IHVybEhhc2gpIHtcbiAgICAgICAgdGFiTGluay5jbGFzc0xpc3QuYWRkKCdhY3RpdmUnKTtcbiAgICAgIH0gZWxzZSBpZiAodGFiTGluay5nZXRBdHRyaWJ1dGUoJ2hyZWYnKSAhPT0gXCIjbWFpblwiICYmIGVsLnF1ZXJ5U2VsZWN0b3IodGFyZ2V0KS5xdWVyeVNlbGVjdG9yKHVybEhhc2gpIHx8IChlbC5xdWVyeVNlbGVjdG9yKHRhcmdldCkucGFyZW50Tm9kZSA9PT0gZWwucXVlcnlTZWxlY3Rvcih1cmxIYXNoKS5wYXJlbnRFbGVtZW50ICYmICF0YWJMaW5rLnBhcmVudE5vZGUucXVlcnlTZWxlY3RvcihgOnNjb3BlID4gYVtocmVmPVwiJHt1cmxIYXNofVwiXWApKSkge1xuICAgICAgICB0YWJMaW5rLmNsYXNzTGlzdC5hZGQoJ2FjdGl2ZScpO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgdGFiTGluay5jbGFzc0xpc3QucmVtb3ZlKCdhY3RpdmUnKTtcbiAgICAgIH07XG4gICAgfTtcblxuICAgIGNvbnN0IGN1cnJlbnRUYWJDb250ZW50ID0gZWwucXVlcnlTZWxlY3Rvcih1cmxIYXNoKVxuXG4gICAgZm9yIChjb25zdCBmaWVsZFNldCBvZiBlbC5xdWVyeVNlbGVjdG9yQWxsKCcuY2FyZC1zZWN0aW9uJykpIHtcbiAgICAgIGlmIChmaWVsZFNldC5wYXJlbnROb2RlID09PSBjdXJyZW50VGFiQ29udGVudCkge1xuICAgICAgICBmaWVsZFNldC5zdHlsZS5yZW1vdmVQcm9wZXJ0eSgnZGlzcGxheScpXG4gICAgICB9IGVsc2Uge1xuICAgICAgICBmaWVsZFNldC5zdHlsZS5zZXRQcm9wZXJ0eSgnZGlzcGxheScsICdub25lJyk7XG4gICAgICB9XG4gICAgfTtcblxuICAgIGZvciAoY29uc3QgdGFiQ29udGVudCBvZiBjdXJyZW50VGFiQ29udGVudC5wYXJlbnROb2RlLnF1ZXJ5U2VsZWN0b3JBbGwoJy5kZXRhaWwtdmlldycpKSB7XG4gICAgICBpZiAodGFiQ29udGVudCA9PT0gY3VycmVudFRhYkNvbnRlbnQpIHtcbiAgICAgICAgdGFiQ29udGVudC5zdHlsZS5yZW1vdmVQcm9wZXJ0eSgnZGlzcGxheScpO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICB0YWJDb250ZW50LnN0eWxlLnNldFByb3BlcnR5KCdkaXNwbGF5JywgJ25vbmUnKTtcbiAgICAgIH1cbiAgICB9O1xuICB9LFxuICBtb3VudGVkKCkge1xuICAgIHRoaXMuc2V0VGFiKHRoaXMuZWwpO1xuXG4gICAgd2luZG93LmFkZEV2ZW50TGlzdGVuZXIoJ2hhc2hjaGFuZ2UnLCAoKSA9PiB0aGlzLnNldFRhYih0aGlzLmVsKSk7XG4gIH0sXG59XG5cbkhvb2tzLkZvcm0gPSB7XG4gIG1vdW50ZWQoKSB7XG4gICAgdGhpcy5lbC5hZGRFdmVudExpc3RlbmVyKCdkcmFnc3RhcnQnLCAoZSkgPT4ge1xuICAgICAgZS50YXJnZXQuY2xhc3NMaXN0LmFkZCgnZHJhZ2dpbmcnKTtcblxuICAgICAgZm9yIChjb25zdCBidG4gb2YgdGhpcy5lbC5xdWVyeVNlbGVjdG9yQWxsKCcuYWRkLXNlY3Rpb24tYnRuJykpIHtcbiAgICAgICAgYnRuLnN0eWxlLnNldFByb3BlcnR5KCdkaXNwbGF5JywgJ25vbmUnKTtcbiAgICAgIH07XG5cbiAgICAgIGZvciAoY29uc3Qgem9uZSBvZiB0aGlzLmVsLnF1ZXJ5U2VsZWN0b3JBbGwoYC5kcm9wLXpvbmU6bm90KFtkYXRhLWlkeD1cIiR7ZS50YXJnZXQuZGF0YXNldC5pZHh9XCJdKTpub3QoW2RhdGEtaWR4PVwiJHsoK2UudGFyZ2V0LmRhdGFzZXQuaWR4KSsxfVwiXSlgKSkge1xuICAgICAgICB6b25lLnN0eWxlLnNldFByb3BlcnR5KCdkaXNwbGF5JywgJ2ZsZXgnKTtcbiAgICAgIH07XG5cbiAgICAgIGUuZGF0YVRyYW5zZmVyLnNldERhdGEoJ3RleHQvcGxhaW4nLCBlLnRhcmdldC5kYXRhc2V0LmlkeCk7XG4gICAgfSk7XG5cblxuICB0aGlzLmVsLmFkZEV2ZW50TGlzdGVuZXIoJ2RyYWdlbmQnLCAoZSkgPT4ge1xuICAgIGUudGFyZ2V0LmNsYXNzTGlzdC5yZW1vdmUoJ2RyYWdnaW5nJyk7XG5cbiAgICBmb3IgKGNvbnN0IGJ0biBvZiB0aGlzLmVsLnF1ZXJ5U2VsZWN0b3JBbGwoJy5hZGQtc2VjdGlvbi1idG4nKSkge1xuICAgICAgYnRuLnN0eWxlLnJlbW92ZVByb3BlcnR5KCdkaXNwbGF5Jyk7XG4gICAgfTtcblxuICAgIGZvciAoY29uc3Qgem9uZSBvZiB0aGlzLmVsLnF1ZXJ5U2VsZWN0b3JBbGwoJy5kcm9wLXpvbmUnKSkge1xuICAgICAgem9uZS5zdHlsZS5yZW1vdmVQcm9wZXJ0eSgnZGlzcGxheScpO1xuICAgIH07XG4gIH0pO1xuXG4gIHRoaXMuZWwuYWRkRXZlbnRMaXN0ZW5lcihcImRyYWdvdmVyXCIsIGUgPT4ge1xuICAgIGlmIChlLnRhcmdldC5jbGFzc0xpc3QuY29udGFpbnMoJ2Ryb3Atem9uZScpKSB7XG4gICAgICBlLnRhcmdldC5zdHlsZS5zZXRQcm9wZXJ0eSgnb3BhY2l0eScsIDEpO1xuICAgICAgZS5wcmV2ZW50RGVmYXVsdCgpO1xuICAgIH1cbiAgfSk7XG5cbiAgdGhpcy5lbC5hZGRFdmVudExpc3RlbmVyKFwiZHJhZ2xlYXZlXCIsIGUgPT4ge1xuICAgIGlmIChlLnRhcmdldC5jbGFzc0xpc3QuY29udGFpbnMoJ2Ryb3Atem9uZScpKSB7XG4gICAgICBlLnRhcmdldC5zdHlsZS5yZW1vdmVQcm9wZXJ0eSgnb3BhY2l0eScpO1xuICAgICAgZS5wcmV2ZW50RGVmYXVsdCgpO1xuICAgIH1cbiAgfSk7XG5cbiAgdGhpcy5lbC5hZGRFdmVudExpc3RlbmVyKFwiZHJvcFwiLCBlID0+IHtcbiAgICAgaWYgKGUudGFyZ2V0LmNsYXNzTGlzdC5jb250YWlucygnZHJvcC16b25lJykpIHtcbiAgICAgICBlLnByZXZlbnREZWZhdWx0KCk7XG4gICAgICAgY29uc3QgZW1iZWQgPSBlLnRhcmdldC5wYXJlbnROb2RlLnF1ZXJ5U2VsZWN0b3IoYC5lbWJlZC1zZWN0aW9uW2RhdGEtaWR4PVwiJHtlLmRhdGFUcmFuc2Zlci5nZXREYXRhKFwidGV4dC9wbGFpblwiKX1cIl1gKVxuICAgICAgIGUudGFyZ2V0LmFmdGVyKGVtYmVkKTtcblxuICAgICAgdGhpcy5lbC5xdWVyeVNlbGVjdG9yKFwiaW5wdXRcIikuZGlzcGF0Y2hFdmVudChuZXcgRXZlbnQoXCJjaGFuZ2VcIiwgeyBidWJibGVzOiB0cnVlLCBjYW5jZWxhYmxlOiB0cnVlIH0pKTtcbiAgICB9O1xuICB9KTtcbiAgfVxufVxuXG5Ib29rcy5TZWFyY2hTZWxlY3QgPSB7XG4gIG1vdW50ZWQoKSB7XG4gICAgdGhpcy5oYW5kbGVFdmVudChcImNoYW5nZVwiLCAoKSA9PiB7XG4gICAgICB0aGlzLmVsXG4gICAgICAgIC5xdWVyeVNlbGVjdG9yKFwiaW5wdXRcIilcbiAgICAgICAgLmRpc3BhdGNoRXZlbnQobmV3IEV2ZW50KFwiaW5wdXRcIiwgeyBidWJibGVzOiB0cnVlLCBjYW5jZWxhYmxlOiB0cnVlIH0pKTtcbiAgICB9KTtcbiAgfSxcbn07XG5cbkhvb2tzLkNvcHlGaWVsZCA9IHtcbiAgbW91bnRlZCgpIHtcbiAgICBuZXcgQ2xpcGJvYXJkSlModGhpcy5lbC5xdWVyeVNlbGVjdG9yQWxsKCdbZGF0YS1jbGlwYm9hcmQtdGFyZ2V0XScpKVxuICB9LFxufVxuXG5Ib29rcy5JbmRleFBhZ2UgPSB7XG4gIG1vdW50ZWQoKSB7XG4gICAgdGhpcy5zZWxlY3RlZCA9IFtdO1xuXG4gICAgLy8gdGhpcy5lbC5hZGRFdmVudExpc3RlbmVyKFwibGl2ZV9hZG1pbjphY3Rpb25cIiwgKGUpID0+IHtcbiAgICAvLyAgIGlmIChlLnRhcmdldC50YWdOYW1lID09PSBcIkZPUk1cIikge1xuICAgIC8vICAgICBjb25zdCBwYXJhbXMgPSBbLi4ubmV3IEZvcm1EYXRhKGUudGFyZ2V0KV0ucmVkdWNlKFxuICAgIC8vICAgICAgIChwYXJhbXMsIFtrZXksIHZhbF0pID0+IHtcbiAgICAvLyAgICAgICAgIGlmIChrZXkgPT09IFwiYXJnc1tdXCIpIHtcbiAgICAvLyAgICAgICAgICAgcmV0dXJuIHsgLi4ucGFyYW1zLCBhcmdzOiBbLi4ucGFyYW1zLmFyZ3MsIHZhbF0gfTtcbiAgICAvLyAgICAgICAgIH0gZWxzZSB7XG4gICAgLy8gICAgICAgICAgIHJldHVybiB7IC4uLnBhcmFtcywgW2tleV06IHZhbCB9O1xuICAgIC8vICAgICAgICAgfVxuICAgIC8vICAgICAgIH0sXG4gICAgLy8gICAgICAgeyBhcmdzOiBbXSB9LFxuICAgIC8vICAgICApO1xuXG4gICAgLy8gICAgIHRoaXMucHVzaEV2ZW50VG8odGhpcy5lbCwgXCJhY3Rpb25cIiwgeyAuLi5wYXJhbXMsIGlkczogdGhpcy5zZWxlY3RlZCB9KTtcbiAgICAvLyAgIH0gZWxzZSB7XG4gICAgLy8gICAgIHRoaXMucHVzaEV2ZW50VG8odGhpcy5lbCwgXCJhY3Rpb25cIiwge1xuICAgIC8vICAgICAgIG5hbWU6IGUudGFyZ2V0LmRhdGFzZXQuYWN0aW9uLFxuICAgIC8vICAgICAgIGlkczogdGhpcy5zZWxlY3RlZCxcbiAgICAvLyAgICAgfSk7XG4gICAgLy8gICB9XG4gICAgLy8gfSk7XG5cbiAgICAvLyB0aGlzLmVsLmFkZEV2ZW50TGlzdGVuZXIoXCJsaXZlX2FkbWluOnRvZ2dsZV9zZWxlY3RcIiwgKGUpID0+IHtcbiAgICAvLyAgIGlmIChlLnRhcmdldC5pZCA9PT0gXCJzZWxlY3QtYWxsXCIpIHtcbiAgICAvLyAgICAgdGhpcy5lbFxuICAgIC8vICAgICAgIC5xdWVyeVNlbGVjdG9yQWxsKFwiLnJlc291cmNlX19zZWxlY3RcIilcbiAgICAvLyAgICAgICAuZm9yRWFjaCgoYm94KSA9PiAoYm94LmNoZWNrZWQgPSBlLnRhcmdldC5jaGVja2VkKSk7XG4gICAgLy8gICB9IGVsc2Uge1xuICAgIC8vICAgICB0aGlzLmVsLnF1ZXJ5U2VsZWN0b3IoXCIjc2VsZWN0LWFsbFwiKS5jaGVja2VkID0gZmFsc2U7XG4gICAgLy8gICB9XG5cbiAgICAvLyAgIHRoaXMuc2VsZWN0ZWQgPSBBcnJheS5mcm9tKFxuICAgIC8vICAgICB0aGlzLmVsLnF1ZXJ5U2VsZWN0b3JBbGwoXCJpbnB1dFtkYXRhLXJlY29yZC1rZXldOmNoZWNrZWRcIiksXG4gICAgLy8gICAgIChlKSA9PiBlLmRhdGFzZXQucmVjb3JkS2V5LFxuICAgIC8vICAgKTtcblxuICAgIC8vICAgaWYgKHRoaXMuc2VsZWN0ZWQubGVuZ3RoID4gMCkge1xuICAgIC8vICAgICBkb2N1bWVudC5nZXRFbGVtZW50QnlJZChcImZvb3Rlci1zZWxlY3RcIikuc3R5bGUucmVtb3ZlUHJvcGVydHkoXCJkaXNwbGF5XCIpO1xuICAgIC8vICAgICBkb2N1bWVudC5nZXRFbGVtZW50QnlJZChcImZvb3Rlci1uYXZcIikuc3R5bGUuZGlzcGxheSA9IFwibm9uZVwiO1xuICAgIC8vICAgfSBlbHNlIHtcbiAgICAvLyAgICAgZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoXCJmb290ZXItbmF2XCIpLnN0eWxlLnJlbW92ZVByb3BlcnR5KFwiZGlzcGxheVwiKTtcbiAgICAvLyAgICAgZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoXCJmb290ZXItc2VsZWN0XCIpLnN0eWxlLmRpc3BsYXkgPSBcIm5vbmVcIjtcbiAgICAvLyAgIH1cbiAgICAvLyB9KTtcbiAgfSxcbiAgdXBkYXRlZCgpIHtcbiAgICB0aGlzLnNlbGVjdGVkID0gW107XG4gIH0sXG59O1xuXG5sZXQgY3NyZlRva2VuID0gZG9jdW1lbnRcbiAgLnF1ZXJ5U2VsZWN0b3IoXCJtZXRhW25hbWU9J2NzcmYtdG9rZW4nXVwiKVxuICAuZ2V0QXR0cmlidXRlKFwiY29udGVudFwiKTtcbmxldCBsaXZlU29ja2V0ID0gbmV3IExpdmVTb2NrZXQoXCIvbGl2ZVwiLCBTb2NrZXQsIHtcbiAgaG9va3M6IHsuLi5Ib29rcywgLi4uY29sb2NhdGVkSG9va3N9LFxuICBwYXJhbXM6IHsgX2NzcmZfdG9rZW46IGNzcmZUb2tlbiB9LFxufSk7XG5cbi8vIENvbm5lY3QgaWYgdGhlcmUgYXJlIGFueSBMaXZlVmlld3Mgb24gdGhlIHBhZ2VcbmxpdmVTb2NrZXQuY29ubmVjdCgpO1xuXG5pZiAoRU5WID09IFwiZGV2XCIpIHtcbiAgbGl2ZVNvY2tldC5lbmFibGVEZWJ1ZygpO1xuICBsaXZlU29ja2V0LmVuYWJsZUxhdGVuY3lTaW0ocHJvY2Vzcy5lbnYuTEFURU5DWV9TSU0pO1xufVxuXG53aW5kb3cubGl2ZVNvY2tldCA9IGxpdmVTb2NrZXQ7XG4iLCAiXG4gIGV4cG9ydCBkZWZhdWx0IHtcbiAgICBtb3VudGVkKCkge1xuICAgICAgc2V0VGltZW91dCgoKSA9PiB7XG4gICAgICAgIGlmICh0aGlzLmVsLmRhdGFzZXRbJ3R5cGUnXSAhPT0gJ2Vycm9yJykge1xuICAgICAgICAgIHRoaXMucHVzaEV2ZW50KCdkaXNtaXNzJywge2luZGV4OiBwYXJzZUludCh0aGlzLmVsLmRhdGFzZXRbJ2luZGV4J10pfSk7XG4gICAgICAgIH1cbiAgICAgIH0sIDMwMDApO1xuICAgIH1cbiAgfVxuIiwgImNvbnN0IGpzID0ge307IGV4cG9ydCBkZWZhdWx0IGpzO1xuY29uc3QgaW1wX25ieHc2MjN0ID0ge307IGV4cG9ydCB7IGltcF9uYnh3NjIzdCBhcyBob29rcyB9O1xuaW1wb3J0IGpzX3BrcHU3ZXB1cTV1cHR4am92cmNpYWZ0M3B5IGZyb20gXCIuL0xpdmVBZG1pbi5Db21wb25lbnRzLkFsZXJ0QmFyLzIwXzZmam51YTVjcmh3bmlpbmlzM2I0cWx0ZDQ0LmpzXCI7IGltcF9uYnh3NjIzdFtcIkxpdmVBZG1pbi5Db21wb25lbnRzLkFsZXJ0QmFyLkFsZXJ0SXRlbVwiXSA9IGpzX3BrcHU3ZXB1cTV1cHR4am92cmNpYWZ0M3B5O1xuIl0sCiAgIm1hcHBpbmdzIjogIjs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7O0FBQUE7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V0FBSyxZQUFZLFVBQVUsTUFBTTtBQUMvQixhQUFLLEdBQ0YsY0FBYyxPQUFPLEVBQ3JCLGNBQWMsSUFBSSxNQUFNLFNBQVMsRUFBRSxTQUFTLE1BQU0sWUFBWSxLQUFLLENBQUMsQ0FBQztBQUFBLE1BQzFFLENBQUM7QUFBQSxJQUNIO0FBQUEsRUFDRjtBQUVBLEVBQUFBLE9BQU0sWUFBWTtBQUFBLElBQ2hCLFVBQVU7QUFDUixVQUFJLGlCQUFBQyxRQUFZLEtBQUssR0FBRyxpQkFBaUIseUJBQXlCLENBQUM7QUFBQSxJQUNyRTtBQUFBLEVBQ0Y7QUFFQSxFQUFBRCxPQUFNLFlBQVk7QUFBQSxJQUNoQixVQUFVO0FBQ1IsV0FBSyxXQUFXLENBQUM7QUFBQSxJQThDbkI7QUFBQSxJQUNBLFVBQVU7QUFDUixXQUFLLFdBQVcsQ0FBQztBQUFBLElBQ25CO0FBQUEsRUFDRjtBQUVBLE1BQUksWUFBWSxTQUNiLGNBQWMseUJBQXlCLEVBQ3ZDLGFBQWEsU0FBUztBQUN6QixNQUFJLGFBQWEsSUFBSSxZQUFXLFNBQVMsUUFBUTtBQUFBLElBQy9DLE9BQU8sa0NBQUlBLFNBQVU7QUFBQSxJQUNyQixRQUFRLEVBQUUsYUFBYSxVQUFVO0FBQUEsRUFDbkMsQ0FBQztBQUdELGFBQVcsUUFBUTtBQUVuQixNQUFJLE9BQU8sT0FBTztBQUNoQixlQUFXLFlBQVk7QUFDdkIsZUFBVyxpQkFBaUIsQ0FBdUI7QUFBQSxFQUNyRDtBQUVBLFNBQU8sYUFBYTsiLAogICJuYW1lcyI6IFsiX193ZWJwYWNrX3JlcXVpcmVfXyIsICJDbGlwYm9hcmRBY3Rpb25DdXQiLCAiQ2xpcGJvYXJkQWN0aW9uQ29weSIsICJfdHlwZW9mIiwgIm9iaiIsICJDbGlwYm9hcmRBY3Rpb25EZWZhdWx0IiwgIl9zZXRQcm90b3R5cGVPZiIsICJvIiwgInAiLCAic2VsZiIsICJfZ2V0UHJvdG90eXBlT2YiLCAiQ2xpcGJvYXJkIiwgImFjdGlvbiIsICJtb2R1bGUiLCAiZXhwb3J0cyIsICJyYW5nZSIsICJ3aW5kb3ciLCAiZG9jdW1lbnQiLCAidG9wYmFyIiwgIkN1c3RvbUV2ZW50IiwgImNsb3N1cmUiLCAibGl2ZVNvY2tldCIsICJjbG9zdXJlIiwgImRvYyIsICJlIiwgImlzRW1wdHkiLCAiZmlsZSIsICJtb3JwaEF0dHJzIiwgIm1vcnBoZG9tIiwgImNoaWxkcmVuT25seSIsICJ0YXJnZXRDb250YWluZXIiLCAiY2xvbmUiLCAiZWwiLCAiaW5wdXRzVW51c2VkIiwgIm9ubHlIaWRkZW5JbnB1dHMiLCAibG9jayIsICJsb2FkaW5nIiwgImVudHJ5IiwgImlucHV0IiwgImNsb3N1cmUiLCAiTGl2ZVNvY2tldCIsICJ0b3BiYXIiLCAiSG9va3MiLCAiQ2xpcGJvYXJkSlMiXQp9Cg== diff --git a/lib/live_admin.ex b/lib/live_admin.ex index 564602c6..d0b460e3 100644 --- a/lib/live_admin.ex +++ b/lib/live_admin.ex @@ -14,25 +14,23 @@ defmodule LiveAdmin do nav: [type: :atom], home: [type: :atom], session: [type: :atom], - new: [type: :atom], + create: [type: :atom], edit: [type: :atom], - list: [type: :atom], - view: [type: :atom] + index: [type: :atom], + show: [type: :atom] ] ], ecto_repo: [ type: :atom, type_doc: "Ecto Repo used to query resource" ], - list_with: [ + query_with: [ type: {:or, [:atom, {:tuple, [:atom, :atom]}]}, - type_doc: - "`t:func_ref/0` returning `{records, count}` used to fetch records in LiveAdmin :list component" + type_doc: "`t:func_ref/0` returning an Ecto queryable" ], render_with: [ type: {:or, [:atom, {:tuple, [:atom, :atom]}]}, - type_doc: - "`t:func_ref/0` used to convert field values to string in LiveAdmin :list component" + type_doc: "`t:func_ref/0` used to convert field values to strings when rendering" ], delete_with: [ type: {:or, [:atom, {:tuple, [:atom, :atom]}]}, @@ -131,6 +129,9 @@ defmodule LiveAdmin do key end + def announce(message, type, session), + do: LiveAdmin.PubSub.broadcast(session.id, {:announce, %{message: message, type: type}}) + def route_with_params(assigns, parts \\ []) do resource_path = parts[:resource_path] || assigns.key @@ -282,4 +283,12 @@ defmodule LiveAdmin do {:error, _} -> %{} end end + + def safe_render(val) when is_list(val), do: inspect(val, pretty: true) + + def safe_render(val) do + to_string(val) + rescue + _ -> inspect(val, pretty: true) + end end diff --git a/lib/live_admin/components.ex b/lib/live_admin/components.ex index e8170e64..8589670c 100644 --- a/lib/live_admin/components.ex +++ b/lib/live_admin/components.ex @@ -1,220 +1,548 @@ defmodule LiveAdmin.Components do use Phoenix.Component - import Phoenix.HTML.Form use PhoenixHTMLHelpers - alias LiveAdmin.Components.Container.Form - alias Phoenix.LiveView.JS + import Phoenix.HTML.Form + import LiveAdmin - slot(:inner_block, required: true) - slot(:control) - slot(:empty_label) + alias Phoenix.LiveView.JS + alias LiveAdmin.Components.Container.Form.{ArrayInput, SearchSelect} + attr(:id, :string, required: true) attr(:label, :string, required: true) - attr(:disabled, :boolean, default: false) - attr(:items, :list, default: []) - attr(:orientation, :atom, values: [:up, :down], default: :down) - attr(:id, :string, default: nil) - attr(:base_class, :string, default: "resource__action") + attr(:items, :list, required: true) + slot(:inner_block) - def dropdown(assigns) do + def drop_down(assigns) do ~H""" -
- <%= if @orientation == :up do %> - <.list items={@items} inner_block={@inner_block} /> - <% end %> - <%= if render_slot(@control) do %> - {render_slot(@control)} - <% else %> - - <% end %> - <%= if @orientation == :down do %> - <.list items={@items} inner_block={@inner_block} empty_label={@empty_label} /> - <% end %> -
+
+ {@label} +
+ <%= for item <- @items do %> + {render_slot(@inner_block, item)} + <% end %> +
+
""" end - def embed(assigns) do + def form_grid(assigns) do ~H""" -
"_container"} class="embed__group" phx-hook="EmbedComponent"> - <%= unless @disabled do %> - <.inputs_for :let={embed_form} field={@form[@field]} skip_hidden={true}> -
- <%= if match?({_, {_, %{cardinality: :many}}}, @type) do %> - "[]"} - value={embed_form.index} - class="embed__index" - phx-page-loading - /> - "[]"} - value={embed_form.index} - class="embed__drop" - phx-page-loading +
+
+ <%= for {field, type, opts} <- @fields, editable_inline?(@form, field, type) do %> +
+
+ {label(@form, field, field |> humanize() |> trans())} +
+ <%= if supported_type?(type) && !opts[:immutable] do %> + <.input + form={@form} + type={type} + field={field} + resource={@resource} + resources={@resources} + session={@session} + prefix={@prefix} + repo={@repo} + config={@config} + disabled={false} /> - - <%= if embed_form.index > 0 do %> - - <% end %> - <%= if embed_form.index < Enum.count(List.wrap(input_value(@form, @field))) - 1 do %> - - <% end %> <% else %> - + {textarea(@form, field, + rows: 1, + disabled: true, + value: @form[field].value + )} + <% end %> + + {Enum.map_join(@form[field].errors, ", ", &elem(&1, 0))} + +
+ <% end %> +
+ <%= for {field, {_,{Ecto.Embedded, embed}}, opts} <- @fields, {_, val} = Ecto.Changeset.fetch_field(@form.source, field) do %> + <.embed_form + field={field} + embed={embed} + form={@form} + value={val} + resource={@resource} + resources={@resources} + config={@config} + session={@session} + prefix={@prefix} + repo={@repo} + target={@target} + /> + <% end %> +
+ """ + end + + def embed_form(assigns) do + ~H""" +
+ <%= if @embed.cardinality == :many || (@form[@field].value in ["", nil]) do %> + + <% end %> """ end - def action_control(assigns) do - {name, _, _, arity, docs} = - LiveAdmin.fetch_function(assigns.resource, assigns.session, :actions, assigns.action) + defp sortable?(val) when is_list(val) and length(val) > 1, do: true + defp sortable?(_), do: false + + defp editable_inline?(form, field, type) when type in [:id, :binary_id], + do: form.data |> Ecto.primary_key() |> Keyword.keys() |> Enum.member?(field) |> Kernel.not() + + defp editable_inline?(_, _, {_, {Ecto.Embedded, _}}), do: false - extra_arg_count = arity - 2 + defp editable_inline?(_, _, :map), do: false - assigns = - assign(assigns, - extra_arg_count: extra_arg_count, - function_docs: docs, - modalize: extra_arg_count > 0 or Enum.any?(docs), - title: name |> to_string() |> humanize() + defp editable_inline?(_, _, _), do: true + + defp input(assigns = %{type: id}) when id in [:id, :binary_id] do + assoc_resource = + associated_resource( + LiveAdmin.fetch_config(assigns.resource, :schema, assigns.session), + assigns.field, + assigns.resources, + :resource ) + if assoc_resource do + value = assigns.form[assigns.field].value + + selected_option = + case value do + empty when empty in [nil, ""] -> + {nil, nil} + + key -> + assoc_record = + LiveAdmin.Resource.find!(key, assoc_resource, assigns.prefix, assigns.repo, assigns.config) + + {key, record_label(assoc_record, assoc_resource, assigns.config)} + end + + assigns = assign(assigns, selected_option: selected_option, resource: assoc_resource) + + ~H""" + <.live_component + module={SearchSelect} + id={@form[@field].id} + name={@form[@field].name} + disabled={@disabled} + selected_option={@selected_option} + options={{__MODULE__, :search_select_options, [@resource, @prefix, @session, @repo, @config]}} + /> + """ + else + ~H""" + + """ + end + end + + defp input(assigns = %{type: {:array, :string}}) do ~H""" - - <%= if @modalize do %> - <.modal id={"#{@action}-action-modal"}> - {@title} - <%= for {_lang, doc} <- @function_docs do %> - {doc} - <% end %> - <.form - for={Phoenix.Component.to_form(%{})} - phx-submit={JS.dispatch("live_admin:action") |> JS.hide(to: "##{@action}-action-modal")} + <.live_component + module={ArrayInput} + id={input_id(@form, @field)} + form={@form} + field={@field} + disabled={@disabled} + /> + """ + end + + defp input(assigns = %{type: :string}) do + ~H""" + + """ + end + + defp input(assigns = %{type: :boolean}) do + ~H""" + <% normalize_value(:boolean, @form[@field].value) %> +
+ "_left"} + checked={normalize_value("checkbox", @form[@field].value) == false} + value="false" + /> + "_center"} + checked={@form[@field].value in [nil, ""]} + value="" + /> + "_right"} + checked={normalize_value("checkbox", @form[@field].value) == true} + value="true" + /> + +
+
+
+
+
+
+
+ + + +
+
+ """ + end + + defp input(assigns = %{type: :date}) do + ~H""" + + """ + end + + defp input(assigns = %{type: number}) when number in [:integer, :id, :float] do + ~H""" + + """ + end + + defp input(assigns = %{type: type}) when type in [:naive_datetime, :utc_datetime] do + ~H""" + + """ + end + + defp input(assigns = %{type: {_, {Ecto.Enum, %{mappings: mappings}}}}) do + assigns = assign(assigns, :mappings, mappings) + + ~H""" + + """ + end + + defp input(assigns = %{type: {:array, {_, {Ecto.Enum, %{mappings: mappings}}}}}) do + assigns = assign(assigns, :mappings, mappings) + + ~H""" + + """ + end + + defp input(assigns) do + ~H""" + NO INPUT + """ + end + + def error(assigns) do + ~H""" +
+
+
+ + + + + +
+

{@title}

+
+ +

{@details}

+
+ """ + end + + def expand_modal(assigns) do + ~H""" +
+ <.modal id={@id <> "-modal"}> + <:title>{@title}{@field} +
{safe_render(@value)}
+ - - <%= if @extra_arg_count > 0 do %> - Arguments - <%= for num <- 1..@extra_arg_count do %> -
- - -
- <% end %> - <% end %> - - + + + + +
- <% end %> + + + + + + + + +
""" end + attr(:id, :string, required: true) + slot(:title) + slot(:inner_block) def modal(assigns) do ~H""" -